From cd04dc6b3438d6aa1d41c24465950ccc800e850f Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Tue, 14 Apr 2020 18:46:31 +0300 Subject: [PATCH] Pre-lags fix --- package-lock.json | 1822 ++++++++++++--------- package.json | 53 +- server.cert | 23 + server.js | 20 + server.key | 28 + src/components/bubbleGroups.ts | 162 ++ src/components/lazyLoadQueue.ts | 111 +- src/components/misc.ts | 143 +- src/components/pageIm.ts | 17 +- src/components/pageSignIn.ts | 11 +- src/components/preloader.ts | 15 +- src/components/scrollable.ts | 65 +- src/components/wrappers.ts | 102 +- src/lib/appManagers/appDialogsManager.ts | 94 +- src/lib/appManagers/appDocsManager.ts | 15 +- src/lib/appManagers/appImManager.ts | 784 +++++---- src/lib/appManagers/appMediaViewer.ts | 1 - src/lib/appManagers/appMessagesManager.ts | 27 +- src/lib/appManagers/appPhotosManager.ts | 140 +- src/lib/appManagers/appSidebarRight.ts | 105 +- src/lib/appManagers/appWebPagesManager.ts | 134 +- src/lib/appManagers/appWebpManager.ts | 23 +- src/lib/bin_utils.ts | 7 - src/lib/crypto/crypto.js | 223 +-- src/lib/crypto/crypto_utils.ts | 201 +-- src/lib/crypto/cryptoworker.ts | 56 - src/lib/idb.ts | 42 + src/lib/lottie.ts | 4 + src/lib/lottieLoader.ts | 78 +- src/lib/mtproto/apiFileManager.ts | 89 +- src/lib/mtproto/authorizer.ts | 3 +- src/lib/mtproto/mtproto.ts | 7 +- src/lib/mtproto/networker.ts | 6 +- src/lib/polyfill.ts | 7 +- src/lib/webp.ts | 28 +- src/scss/partials/_chat.scss | 20 +- src/scss/partials/_rightSIdebar.scss | 2 +- src/scss/style.scss | 119 +- src/tests/lol.test.ts | 8 +- tsconfig.json | 5 +- webpack.common.js | 6 +- 41 files changed, 2531 insertions(+), 2275 deletions(-) create mode 100644 server.cert create mode 100644 server.js create mode 100644 server.key create mode 100644 src/components/bubbleGroups.ts create mode 100644 src/lib/lottie.ts diff --git a/package-lock.json b/package-lock.json index 3e931485..5569c8b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,39 +14,108 @@ } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", "dev": true, "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "semver": "^5.5.0" } }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@babel/generator": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -57,12 +126,12 @@ } }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "ms": { @@ -104,52 +173,66 @@ "@babel/types": "^7.8.3" } }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, "@babel/helper-compilation-targets": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", - "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", "invariant": "^2.2.4", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", + "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", "dev": true, "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { @@ -221,17 +304,48 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { @@ -272,15 +386,89 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + }, + "dependencies": { + "@babel/generator": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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": { @@ -302,6 +490,12 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", @@ -315,14 +509,88 @@ } }, "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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": { @@ -383,14 +651,25 @@ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "@babel/plugin-proposal-object-rest-spread": { + "@babel/plugin-proposal-numeric-separator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -404,9 +683,9 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", @@ -414,12 +693,12 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-create-regexp-features-plugin": "^7.8.8", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -459,6 +738,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@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", @@ -544,19 +832,43 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { @@ -569,9 +881,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -607,9 +919,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", - "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -644,47 +956,47 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -717,12 +1029,11 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", - "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.8.3", "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } @@ -737,12 +1048,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", "dev": true, "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { @@ -793,18 +1104,18 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", - "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", + "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", @@ -823,27 +1134,29 @@ } }, "@babel/preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz", - "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", + "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.3", + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", "@babel/plugin-proposal-dynamic-import": "^7.8.3", "@babel/plugin-proposal-json-strings": "^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.5", "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", @@ -852,57 +1165,85 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.9.5", "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", "@babel/plugin-transform-reserved-words": "^7.8.3", "@babel/plugin-transform-shorthand-properties": "^7.8.3", "@babel/plugin-transform-spread": "^7.8.3", "@babel/plugin-transform-sticky-regex": "^7.8.3", "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.2", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.5", + "browserslist": "^4.9.1", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" + "@babel/plugin-transform-typescript": "^7.9.0" } }, "@babel/runtime": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.1.tgz", - "integrity": "sha512-SQ0sS7KUJDvgCI2cpZG0nJygO6002oTbhgSuw4WcocsnbxLwL5Q8I3fqbJdyBAc3uFrWZiR2JomseuxSuci3SQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { @@ -977,6 +1318,12 @@ "integrity": "sha512-QT/QL5R1UEXuTOl2+ADFPcpzUOuI2LW63qxWVYVvAjUMDzO5cxCYsrglQK5dVGoBEQYsRgCxPMal4KpCVt90bA==", "dev": true }, + "@cryptography/sha256": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@cryptography/sha256/-/sha256-0.2.0.tgz", + "integrity": "sha512-BptcDkQWplfUjMJAxewmMN/O8JD19cwJM6XUFQrqaCDMYt5e40Czm4S7BEFc+PN7dElNH79ik687/5aMk4uDSQ==", + "dev": true + }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", @@ -1170,9 +1517,9 @@ } }, "@types/aes-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/aes-js/-/aes-js-3.1.0.tgz", - "integrity": "sha512-zHvLJrMxaisU/kyPtfLCsEciFWSbAxmEGdBHta+Zarz/QcBewFTywoyG9HhT57aseDfPgG0dEcGlVU1+fN94ng==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/aes-js/-/aes-js-3.1.1.tgz", + "integrity": "sha512-SDSGgXT3LRCH6qMWk8OHT1vLSVNuHNvCpKCx2/TYtQMbMGGgxJC9fspwSkQjqzRagrWnCrxuLL3jMNXLXHHvSw==", "dev": true }, "@types/babel__core": { @@ -1216,12 +1563,6 @@ "@babel/types": "^7.3.0" } }, - "@types/cash": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/cash/-/cash-0.0.3.tgz", - "integrity": "sha512-gS24kdFuVwfo5h7IlStnXyBSIH4e9aFIhNHb4w+o5DwbYDeQJv+i9heh7u7nSvqnOP3v34tQMTe7VoJp2US08w==", - "dev": true - }, "@types/chrome": { "version": "0.0.91", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.91.tgz", @@ -1231,12 +1572,6 @@ "@types/filesystem": "*" } }, - "@types/crypto-js": { - "version": "3.1.43", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.43.tgz", - "integrity": "sha512-EHe/YKctU3IYNBsDmSOPX/7jLHPRlx8WaiDKSY9JCTnJ8XJeM4c0ZJvx+9Gxmr2s2ihI92R+3U/gNL1sq5oRuQ==", - "dev": true - }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -1293,54 +1628,23 @@ } }, "@types/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-dXvuABY9nM1xgsXlOtLQXJKdacxZJd7AtvLsKZ/0b57ruMXDKCOXAC/M75GbllQX6o1pcZ5hAG4JzYy7Z/wM2w==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", + "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", "dev": true, "requires": { "jest-diff": "^24.3.0" } }, - "@types/jquery": { - "version": "3.3.31", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.31.tgz", - "integrity": "sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg==", - "dev": true, - "requires": { - "@types/sizzle": "*" - } - }, - "@types/materialize-css": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/materialize-css/-/materialize-css-1.0.6.tgz", - "integrity": "sha512-H/QXdgih11880Rx+yhLU5mDCm3SVGF7CYyQjEmRYGrn/fGrPc+s2SQBwbB9gZCw2a/39bDkH/v+wyysj0nWXCQ==", - "dev": true, - "requires": { - "@types/cash": "*", - "@types/jquery": "*" - } - }, "@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": "13.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.7.tgz", - "integrity": "sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg==" - }, - "@types/overlayscrollbars": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/overlayscrollbars/-/overlayscrollbars-1.9.0.tgz", - "integrity": "sha512-U3t35G0IH39eCoWKI6auh+3NkeP8jrmLyeZhiL3fKn4foOvbl223Ccd9cfUb1vhcxDmpTNAfKphDvl5jYJOD3w==", - "dev": true - }, - "@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", - "dev": true + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", + "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==" }, "@types/stack-utils": { "version": "1.0.1", @@ -1364,178 +1668,177 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@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.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "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==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "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==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "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==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "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==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "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==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@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.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@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.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@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.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@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.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@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-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "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==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@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" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "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==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -1573,9 +1876,9 @@ } }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "acorn-globals": { @@ -2053,11 +2356,6 @@ "tweetnacl": "^0.14.3" } }, - "big-integer": { - "version": "1.6.47", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.47.tgz", - "integrity": "sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg==" - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2069,6 +2367,15 @@ "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" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -2079,9 +2386,9 @@ } }, "bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "bn.js": { @@ -2169,20 +2476,6 @@ } } }, - "broadcast-channel": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-2.3.2.tgz", - "integrity": "sha512-01yaxRPuB1+GN6jTBplZ2GpXnqKdqWQEnD7FBEerj65kMRRzOAwLBtf9TzJ91725gPCdxMHvID8afiUcIEDbdQ==", - "requires": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4", - "js-sha3": "0.8.0", - "microseconds": "0.1.0", - "nano-time": "1.0.0", - "rimraf": "2.6.3", - "unload": "2.2.0" - } - }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -2284,14 +2577,15 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "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.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "bs-logger": { @@ -2313,9 +2607,9 @@ } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -2352,9 +2646,9 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -2447,9 +2741,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001021", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz", - "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==", + "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": { @@ -2676,11 +2970,18 @@ } }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "mime-db": ">= 1.40.0 < 2" + "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": { @@ -3064,9 +3365,9 @@ } }, "css-loader": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", - "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", + "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -3074,24 +3375,38 @@ "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.17", + "postcss": "^7.0.27", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.0", + "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.0", - "schema-utils": "^2.0.0" + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.5", + "semver": "^6.3.0" }, "dependencies": { - "schema-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", - "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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 + }, + "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 } } }, @@ -3211,9 +3526,9 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -3315,9 +3630,9 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3488,15 +3803,15 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.336", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.336.tgz", - "integrity": "sha512-FtazvnXAizSVMxQNPqUcTv2UElY5r3uRPQwiU1Tyg/Yc2UFr+/3wqDoLIV9ES6ablW3IrCcR8uEK2ppxaNPWhw==", + "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.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -3542,18 +3857,6 @@ "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==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } } }, "entities": { @@ -3583,7 +3886,6 @@ "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", @@ -3602,7 +3904,6 @@ "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" } @@ -3613,7 +3914,6 @@ "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", @@ -3733,9 +4033,9 @@ "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, "eventsource": { @@ -4058,6 +4358,12 @@ } } }, + "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": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -4135,9 +4441,9 @@ } }, "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "requires": { "debug": "^3.0.0" }, @@ -4234,13 +4540,14 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "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": "^0.12.0" + "node-pre-gyp": "*" }, "dependencies": { "abbrev": { @@ -4282,7 +4589,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.4", "bundled": true, "optional": true }, @@ -4307,7 +4614,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "optional": true, "requires": { @@ -4330,11 +4637,11 @@ "optional": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.7", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -4358,7 +4665,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "optional": true, "requires": { @@ -4384,7 +4691,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "optional": true, "requires": { @@ -4401,7 +4708,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "optional": true }, @@ -4432,12 +4739,12 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "optional": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "optional": true, "requires": { @@ -4446,38 +4753,38 @@ } }, "minizlib": { - "version": "1.2.1", + "version": "1.3.3", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { - "version": "2.1.1", + "version": "2.1.2", "bundled": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.3.3", "bundled": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.12.0", + "version": "0.14.0", "bundled": true, "optional": true, "requires": { @@ -4490,11 +4797,11 @@ "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^4" + "tar": "^4.4.2" } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "optional": true, "requires": { @@ -4503,17 +4810,26 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.8", "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -4570,7 +4886,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "optional": true }, @@ -4583,17 +4899,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "optional": true, "requires": { @@ -4607,7 +4916,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "optional": true, "requires": { @@ -4630,7 +4939,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "optional": true }, @@ -4676,17 +4985,17 @@ "optional": true }, "tar": { - "version": "4.4.8", + "version": "4.4.13", "bundled": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -4708,7 +5017,7 @@ "optional": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, "optional": true } @@ -4948,9 +5257,9 @@ "dev": true }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "har-schema": { "version": "2.0.0", @@ -5001,8 +5310,7 @@ "has-symbols": { "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==", - "dev": true + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "has-unicode": { "version": "2.0.1", @@ -5325,11 +5633,6 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -5438,9 +5741,9 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "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-absolute-url": { "version": "3.0.3", @@ -5492,8 +5795,7 @@ "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 + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "2.0.0", @@ -5627,11 +5929,11 @@ } }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-stream": { @@ -5643,7 +5945,6 @@ "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" } @@ -6249,11 +6550,6 @@ "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", "dev": true }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6377,9 +6673,9 @@ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", @@ -6414,9 +6710,9 @@ "dev": true }, "levenary": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", - "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "dev": true, "requires": { "leven": "^3.1.0" @@ -6432,14 +6728,6 @@ "type-check": "~0.3.2" } }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -6478,14 +6766,6 @@ "json5": "^1.0.1" } }, - "localforage": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.7.3.tgz", - "integrity": "sha512-1TulyYfc4udS7ECSBT2vwJksWbkwwTX8BzeUIiq8Y07Riy7bDAAnxDaPU/tWyOVmQAcWJIEIFP9lPfBGqVoPgQ==", - "requires": { - "lie": "3.1.1" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -6513,9 +6793,9 @@ "dev": true }, "loglevel": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", - "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" }, "loose-envify": { "version": "1.4.0", @@ -6527,9 +6807,9 @@ } }, "lottie-web": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.6.4.tgz", - "integrity": "sha512-eU+21Wo/RSi4i260S7fDUxfhNJ9PhfzUJMVQpip0yZd19oJ18jrNCoSQKVUzjC2TzOjqumlLZXR636ezKoWNQg==", + "version": "5.6.8", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.6.8.tgz", + "integrity": "sha512-2b7KDEIzpp3Y+u9BtFMHBkUFWe6TFgVdYvXvpfmbbxAL9XiwHUywAoWH1GhCCMmGqWqkxw8v4IxnOq/3hiOtJg==", "dev": true }, "loud-rejection": { @@ -6583,12 +6863,6 @@ "tmpl": "1.0.x" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -6616,11 +6890,6 @@ "object-visit": "^1.0.0" } }, - "materialize-css": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/materialize-css/-/materialize-css-1.0.0.tgz", - "integrity": "sha512-4/oecXl8y/1i8RDZvyvwAICyqwNoKU4or5uf8uoAd74k76KzZ0Llym4zhJ5lLNUskcqjO0AuMcvNyDkpz8Z6zw==" - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -6648,9 +6917,10 @@ } }, "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=", + "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": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -6710,11 +6980,6 @@ "to-regex": "^3.0.2" } }, - "microseconds": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.1.0.tgz", - "integrity": "sha1-R9x7z2IXG4Aw4hUv2C8SpolKcRk=" - }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -6726,9 +6991,9 @@ } }, "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.40.0", @@ -6768,10 +7033,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.1", @@ -6855,18 +7119,11 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -6907,14 +7164,6 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, - "nano-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", - "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=", - "requires": { - "big-integer": "^1.6.16" - } - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -7068,21 +7317,10 @@ } }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", - "dev": true, - "requires": { - "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 - } - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true }, "node-sass": { "version": "4.13.1", @@ -7188,9 +7426,9 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.1.tgz", - "integrity": "sha512-2hi3UF7g5VL8VKm46Bx5GAW28DPb8BJZbj2uONMBMhY8XkJ56lSmHJNFcjTQr7KHZqWqiBT5BugaQEy+Y/4T2g==", + "version": "6.14.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz", + "integrity": "sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -7221,10 +7459,10 @@ "fs-vacuum": "~1.2.10", "fs-write-stream-atomic": "~1.0.10", "gentle-fs": "^2.3.0", - "glob": "^7.1.4", + "glob": "^7.1.6", "graceful-fs": "^4.2.3", "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.7", + "hosted-git-info": "^2.8.8", "iferr": "^1.0.2", "imurmurhash": "*", "infer-owner": "^1.0.4", @@ -7259,9 +7497,9 @@ "lru-cache": "^5.1.1", "meant": "~1.0.1", "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", + "mkdirp": "^0.5.4", "move-concurrently": "^1.0.1", - "node-gyp": "^5.0.7", + "node-gyp": "^5.1.0", "nopt": "~4.0.1", "normalize-package-data": "^2.5.0", "npm-audit-report": "^1.3.2", @@ -7271,7 +7509,7 @@ "npm-package-arg": "^6.1.1", "npm-packlist": "^1.4.8", "npm-pick-manifest": "^3.0.2", - "npm-profile": "^4.0.2", + "npm-profile": "^4.0.4", "npm-registry-fetch": "^4.0.3", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", @@ -7293,7 +7531,7 @@ "readdir-scoped-modules": "^1.1.0", "request": "^2.88.0", "retry": "^0.12.0", - "rimraf": "^2.6.3", + "rimraf": "^2.7.1", "safe-buffer": "^5.1.2", "semver": "^5.7.1", "sha": "^3.0.0", @@ -7900,7 +8138,7 @@ "dev": true }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true }, @@ -8399,7 +8637,7 @@ } }, "glob": { - "version": "7.1.4", + "version": "7.1.6", "bundled": true, "dev": true, "requires": { @@ -8487,7 +8725,7 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.7", + "version": "2.8.8", "bundled": true, "dev": true }, @@ -8623,11 +8861,11 @@ "dev": true }, "is-ci": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "requires": { - "ci-info": "^1.0.0" + "ci-info": "^1.5.0" }, "dependencies": { "ci-info": { @@ -8699,7 +8937,7 @@ } }, "is-retry-allowed": { - "version": "1.1.0", + "version": "1.2.0", "bundled": true, "dev": true }, @@ -9171,11 +9409,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "minizlib": { "version": "1.3.3", "bundled": true, @@ -9213,11 +9446,18 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.4", "bundled": true, "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + } } }, "move-concurrently": { @@ -9266,7 +9506,7 @@ } }, "node-gyp": { - "version": "5.0.7", + "version": "5.1.0", "bundled": true, "dev": true, "requires": { @@ -9400,7 +9640,7 @@ } }, "npm-profile": { - "version": "4.0.2", + "version": "4.0.4", "bundled": true, "dev": true, "requires": { @@ -9845,18 +10085,18 @@ "dev": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { - "version": "1.2.0", + "version": "1.2.5", "bundled": true, "dev": true } @@ -9936,7 +10176,7 @@ } }, "registry-auth-token": { - "version": "3.3.2", + "version": "3.4.0", "bundled": true, "dev": true, "requires": { @@ -10000,7 +10240,7 @@ "dev": true }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "dev": true, "requires": { @@ -10619,7 +10859,7 @@ } }, "widest-line": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "dev": true, "requires": { @@ -10808,13 +11048,12 @@ "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 + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" }, "object-keys": { "version": "1.1.1", @@ -10839,7 +11078,6 @@ "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", @@ -10972,9 +11210,9 @@ } }, "overlayscrollbars": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.10.0.tgz", - "integrity": "sha512-SFGaq9wmR6jkwb5L7Wx0JIyGrQOT2/7ZD4F0srMN0KyYRbsdQ1nzdLF+JLp7QIQT2U1lsG1c16aMjxMtwzHA3Q==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.12.0.tgz", + "integrity": "sha512-zJGYLeBfaPx2VmiDfBMNTPzm9N8w8wZ6M7dm1ee8TGuet8tsK4nxOzGvEEu0SmueqMHQxhLsstf7iTWCGiYa9Q==", "dev": true }, "p-defer": { @@ -11042,9 +11280,9 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parallel-transform": { @@ -11193,9 +11431,9 @@ "dev": true }, "picomatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.0.tgz", - "integrity": "sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pify": { @@ -11233,6 +11471,60 @@ "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 + } + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -11310,9 +11602,9 @@ } }, "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "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": "^7.0.6", @@ -11341,9 +11633,9 @@ } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, "prelude-ls": { @@ -11408,12 +11700,12 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "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.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -11645,26 +11937,28 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "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.0" } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", "dev": true, "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" } }, "regex-not": { @@ -11683,25 +11977,26 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "requires": { - "define-properties": "^1.1.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "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.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.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.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { @@ -11711,9 +12006,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "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" @@ -11987,11 +12282,6 @@ "inherits": "^2.0.1" } }, - "roboto-fontface": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -12007,11 +12297,6 @@ "aproba": "^1.1.1" } }, - "rusha": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", - "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -12202,28 +12487,18 @@ } }, "sass-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", - "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "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": { "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", "neo-async": "^2.6.1", - "schema-utils": "^2.1.0", + "schema-utils": "^2.6.1", "semver": "^6.3.0" }, "dependencies": { - "schema-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", - "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -12239,13 +12514,33 @@ "dev": true }, "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==", + "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": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "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 + } } }, "scss-tokenizer": { @@ -12307,6 +12602,11 @@ "statuses": "~1.5.0" }, "dependencies": { + "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.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -12681,9 +12981,9 @@ "dev": true }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -12734,9 +13034,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "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", @@ -12866,15 +13166,15 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "streamsaver": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/streamsaver/-/streamsaver-2.0.3.tgz", - "integrity": "sha512-IpXeZ67YxcsrfZHe3yg/IyZ5KPfRSn1teDy5mRX2e8M6K410NcJNcR+SFQ2Z92DO36VBUArQP4Vy3Qu33MwIOQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/streamsaver/-/streamsaver-2.0.4.tgz", + "integrity": "sha512-rGES0zmHIPxinV32H2Dz55qgOE5dXui8yfu+JEjPAI294cDmwX4Oe7tCZLrnhjc/1z7hyIv9H6TMH2kqN2Tdqw==", "dev": true }, "strictdom": { @@ -12925,7 +13225,6 @@ "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" @@ -12935,7 +13234,6 @@ "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" @@ -12982,25 +13280,13 @@ } }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", "dev": true, "requires": { "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" - }, - "dependencies": { - "schema-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", - "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + "schema-utils": "^2.6.4" } }, "supports-color": { @@ -13034,21 +13320,10 @@ "inherits": "2" } }, - "tdweb": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/tdweb/-/tdweb-1.5.0.tgz", - "integrity": "sha512-WHLONE4LK4Sb9XZdFJCQLkGl1o0Ka28d9YNL0aSQFA6xdXYbLMLUcDExKIvQZ62xUTnpbZtYilJLItrmL3Bv/A==", - "requires": { - "@babel/runtime": "^7.4.3", - "broadcast-channel": "^2.1.12", - "localforage": "^1.7.3", - "uuid": "^3.3.2" - } - }, "terser": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", - "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", + "version": "4.6.11", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.11.tgz", + "integrity": "sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -13081,11 +13356,16 @@ "worker-farm": "^1.7.0" }, "dependencies": { - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "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", @@ -13357,9 +13637,9 @@ } }, "ts-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", - "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz", + "integrity": "sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==", "dev": true, "requires": { "chalk": "^2.3.0", @@ -13421,9 +13701,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tty-browserify": { @@ -13478,9 +13758,9 @@ "dev": true }, "typescript": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", - "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "uglify-js": { @@ -13524,15 +13804,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "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": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "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": { @@ -13570,15 +13850,6 @@ "imurmurhash": "^0.1.4" } }, - "unload": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", - "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "requires": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13661,32 +13932,14 @@ } }, "url-loader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.2.0.tgz", - "integrity": "sha512-G8nk3np8ZAnwhHXas1JxJEwJyQdqFXAKJehfgZ/XrC48volFBRtO+FIKtF2u0Ma3bw+4vnDVjHPAQYlF9p2vsw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", "dev": true, "requires": { "loader-utils": "^1.2.3", "mime": "^2.4.4", - "schema-utils": "^2.4.1" - }, - "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "schema-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", - "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + "schema-utils": "^2.5.0" } }, "url-parse": { @@ -13810,12 +14063,12 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" } @@ -13829,9 +14082,9 @@ } }, "web-streams-polyfill": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-2.0.6.tgz", - "integrity": "sha512-nXOi4fBykO4LzyQhZX3MAGib635KGZBoNTkNXrNIkz0zthEf2QokEWxRb0H632xNLDWtHFb1R6dFGzksjYMSDw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-2.1.0.tgz", + "integrity": "sha512-ZgJ7lsxTM0GR77Nwzt950NHd/CjWzVEct2DH48Dy8/u+3r4TD9o8Bo1VNFK04QajgcEjr0CZPlRhau8LtR3YHQ==", "dev": true }, "webidl-conversions": { @@ -13847,15 +14100,15 @@ "dev": true }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.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.2.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", @@ -13867,20 +14120,43 @@ "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "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.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" + }, + "dependencies": { + "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=", + "dev": true, + "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==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", "dev": true, "requires": { "chalk": "2.4.2", @@ -13906,6 +14182,16 @@ "memory-fs": "^0.4.0", "tapable": "^1.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=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } } } }, @@ -13921,17 +14207,21 @@ "webpack-log": "^2.0.0" }, "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "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" + } } } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -13948,7 +14238,7 @@ "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.4", + "loglevel": "^1.6.6", "opn": "^5.5.0", "p-retry": "^3.0.1", "portfinder": "^1.0.25", @@ -14021,6 +14311,16 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, + "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" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", diff --git a/package.json b/package.json index 2d840f7a..56feba86 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "start": "webpack-dev-server --open --config webpack.dev.js", - "serve": "webpack-dev-server --open --config webpack.prod.js", + "start-production": "webpack-dev-server --open --config webpack.prod.js", + "serve-serve": "webpack-serve --compress --port 9001 --host localhost --no-watch --static ./public --config webpack.prod.js", "build": "webpack --config webpack.prod.js", "test": "jest --config=jest.config.js", "profile": "webpack --profile --json > stats.json --config webpack.prod.js" @@ -14,52 +15,48 @@ "license": "ISC", "dependencies": { "jsbn": "^1.1.0", - "materialize-css": "^1.0.0", - "roboto-fontface": "^0.10.0", - "rusha": "^0.8.13", - "tdweb": "^1.5.0", - "webpack-dev-server": "^3.9.0" + "webpack-dev-server": "^3.10.3" }, "devDependencies": { - "@babel/core": "^7.8.3", - "@babel/preset-env": "^7.8.3", - "@babel/preset-typescript": "^7.8.3", + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@babel/preset-typescript": "^7.9.0", "@cryptography/sha1": "^0.1.0", - "@types/aes-js": "^3.1.0", + "@cryptography/sha256": "^0.2.0", + "@types/aes-js": "^3.1.1", "@types/chrome": "0.0.91", - "@types/crypto-js": "^3.1.43", - "@types/jest": "^24.9.0", - "@types/materialize-css": "^1.0.6", - "@types/overlayscrollbars": "^1.9.0", + "@types/jest": "^24.9.1", "aes-js": "^3.1.2", "babel-jest": "^24.9.0", + "compression": "^1.7.4", "compression-webpack-plugin": "^3.1.0", - "css-loader": "^3.2.0", + "css-loader": "^3.5.1", + "express": "^4.17.1", "fastdom": "^1.0.9", "file-loader": "^4.3.0", "html-webpack-plugin": "^3.2.0", "install": "^0.13.0", "jest": "^24.9.0", "leemon": "^6.2.0", - "lottie-web": "^5.6.4", + "lottie-web": "^5.6.8", "node-sass": "^4.13.1", - "npm": "^6.14.1", + "npm": "^6.14.4", "offscreen-canvas": "^0.1.1", "on-build-webpack": "^0.1.0", - "overlayscrollbars": "^1.10.0", - "pako": "^1.0.10", + "overlayscrollbars": "^1.12.0", + "pako": "^1.0.11", "resolve-url-loader": "^3.1.1", - "sass-loader": "^8.0.0", - "streamsaver": "^2.0.3", - "style-loader": "^1.0.0", + "sass-loader": "^8.0.2", + "streamsaver": "^2.0.4", + "style-loader": "^1.1.3", "ts-jest": "^24.3.0", - "ts-loader": "^6.2.1", - "typescript": "^3.7.2", - "url-loader": "^2.2.0", - "web-streams-polyfill": "^2.0.6", + "ts-loader": "^6.2.2", + "typescript": "^3.8.3", + "url-loader": "^2.3.0", + "web-streams-polyfill": "^2.1.0", "webp-hero": "0.0.0-dev.24", - "webpack": "^4.41.2", - "webpack-cli": "^3.3.10", + "webpack": "^4.42.1", + "webpack-cli": "^3.3.11", "webpack-merge": "^4.2.2", "worker-loader": "^2.0.0" } diff --git a/server.cert b/server.cert new file mode 100644 index 00000000..af09b06d --- /dev/null +++ b/server.cert @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDwDCCAqigAwIBAgIJAOqEYb8IH1NQMA0GCSqGSIb3DQEBCwUAMHUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDEaMBgGCSqGSIb3DQEJ +ARYLcXdlQGFzZC5jb20wHhcNMjAwNDEwMTc0OTU3WhcNMjAwNTEwMTc0OTU3WjB1 +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRIwEAYDVQQDDAlsb2NhbGhvc3QxGjAYBgkq +hkiG9w0BCQEWC3F3ZUBhc2QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAxxzMhd/vxT84pEcRIIZwYKe6C00OaRZq8VErgNoOQVr8hejj7FueGjAu +io841OcJjUHCgD7Bda/cu5FLs0ATxAkBow7K9+Qzx3Gnl87ZKkxlt4xFZ6mWvDiY +hovliUL+I+ll29l2cF2PXhl8q/VEsOl0+M45d5rzT/qy3PD3H/5CwqCVnovCXe5H +BEFCf82qYAEe+J/w5KjtiqgT4fx/n0XNXES0KO/ot2PWyjGnzs+V52yf2eChmfIr +Ae7+ykRM60YwIR3HHvCiVO5XtEqB3x207ADwcQGpC0oOvuj8YB8Jj76QUfLm559/ +pNjkZR07jMReX6Pzuuf7bEsQvfkMmwIDAQABo1MwUTAdBgNVHQ4EFgQUpn8Hwa3D +qFgdzvB62FYygrvZSlcwHwYDVR0jBBgwFoAUpn8Hwa3DqFgdzvB62FYygrvZSlcw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQYb7MFbTQ7i6bwoc +j6jQ67S3RkK1svqXVgoqjYHY69BEhO94vNQZeOgTJWRk1YjKfTwQAdLru8U2BjtA +gh76OiMsTXhnhOv/TPGBRFUwPt2BSY5G/aa6ZJ0XB/exsOo0z/34k9IIGCO3g/g6 +BpphITMjOJ8LbA8v0PBeHQD9d9u1ViuafgzvD6WwvmAkDKhGXDMyYDn5zjGo6L+w +rjmGjOn4c0rJAxPGEMABaGusuxhRFrFLxolohru3jSvvjjZ/zbXo3V6bR+Ta2IIC +cewd/gPI0odv1ObXNwdI/Dvu/1ymxcg8aVgjuMHtonkOAfxw9ghIuDfNtbV0Nb15 +SEzY5w== +-----END CERTIFICATE----- diff --git a/server.js b/server.js new file mode 100644 index 00000000..2b0277d8 --- /dev/null +++ b/server.js @@ -0,0 +1,20 @@ +const compression = require('compression'); +const express = require('express'); +const https = require('https'); +const fs = require('fs'); + +const app = express(); + +app.use(compression()); +app.use(express.static('public')); + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/public/index.html'); +}); + +https.createServer({ + key: fs.readFileSync(__dirname + '/server.key'), + cert: fs.readFileSync(__dirname + '/server.cert') +}, app).listen(9001, () => { + console.log('Listening...'); +}); \ No newline at end of file diff --git a/server.key b/server.key new file mode 100644 index 00000000..df8fc0c8 --- /dev/null +++ b/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHHMyF3+/FPzik +RxEghnBgp7oLTQ5pFmrxUSuA2g5BWvyF6OPsW54aMC6KjzjU5wmNQcKAPsF1r9y7 +kUuzQBPECQGjDsr35DPHcaeXztkqTGW3jEVnqZa8OJiGi+WJQv4j6WXb2XZwXY9e +GXyr9USw6XT4zjl3mvNP+rLc8Pcf/kLCoJWei8Jd7kcEQUJ/zapgAR74n/DkqO2K +qBPh/H+fRc1cRLQo7+i3Y9bKMafOz5XnbJ/Z4KGZ8isB7v7KREzrRjAhHcce8KJU +7le0SoHfHbTsAPBxAakLSg6+6PxgHwmPvpBR8ubnn3+k2ORlHTuMxF5fo/O65/ts +SxC9+QybAgMBAAECggEAdWzciU9p3k/MncVzqlTezYHdTHDjQMKBy1Ntbo4qvgxk +xKx2Tpwxf4xOxlR01cpzbaUMigl4mmleqhekJ1Bw17ngB0PgG5Wvm73BctwAYtuv +WTIWdG4lgVd3TFIQyoSB0LgC5Ec5fEcRGBO73MXG/vaPj3Q/m/P77n0RIw/RDkIg +mZjPOAeVpaJxRInVgpEAfzPAB+yPyk1qxHzbBzQziyzZLxycF26vlHcGWbjWeOBA +0CLVwAHeoctLpxPYSTlEc1PCZvn0Lm4kMFuuUnf03Tc/nlvGD0iQ2s6ThdUs2dNV +uie5JzrgsZuRPQ2vxYGLAZZI4455HA+gENvQQd160QKBgQDsAwtAF1S4fAiuR9hY +Nh5PEM3MRb9FMaRN5p4PdinnCmkymrUoW/LKotyU7ASwKnmALUzQ0eUoIjvRC85B +rW5NpuK/GjURZYd6+AzrqoWcnuDe7ugj0G1U0yyBbtMbp+KELB30UMJexV7ovHPM +rCi5mz1EUy0SUTj1CyWEazco5wKBgQDX+b3xu3gtOxbDi0hGJ1u/TAvJGndHXDBK +yzaY0I8BIbPC6IWTiWkCImuogFoV7TruLpGJJa9QDzhBi2mkRGvS6XWDKEoRe/tb +l8BhGFbNqdDyMb6tNh8k8cpYSDLlzMgK1/5S6gUsr5jWA0fFegXRcexYmj0r+ibN +5AP1mZrELQKBgQCE5SXlnf2XsEgXEt+QtFCWxuiLWM7eQJi7QNvJ6winT2ZzF0hh +BH2PeutodAojxJcMBPYXM8mssrIqAVLQCr9svEc7wp8VP61tIdXsseVwjsoi3jYb +TJbzx8Fs1KHNFdjoAguP8hWw1cSemtc97cc01GRIX+mmQdQnr3IdwV2bCwKBgCiV +cl7pRmThdJ6cHqGoJbJlvNU2VvGe3ig/1WuTzTt+NMRMY0VdDdFr3GUWcVcrc+Zr +88ccwLu/kGeopdpLTSOd4QobWQe+D3afpnPYWf9diLjqJhVwVRvhH4/FSWMrPu/i +tJSqCvzhpkuY5DS0gEFiMfJYUWRhJkeMMD5HdfClAoGBANTEaSrZhmw2HgdXD4iE +sscOyh84+kJG77T+0B5jj+Oa5laulRwIjxZfndoSFlspQ+z1hDE9iqWGv+qd5u0u +yWWf6LB88hBAcLTg82AUuPTQXsOtkzBeb1Ny+xoKCL73nGcHCydoih0AA8+4oQWT +ecQb07xZUbaNB5HKRzcmalf6 +-----END PRIVATE KEY----- diff --git a/src/components/bubbleGroups.ts b/src/components/bubbleGroups.ts new file mode 100644 index 00000000..fc02cb92 --- /dev/null +++ b/src/components/bubbleGroups.ts @@ -0,0 +1,162 @@ +import { generatePathData } from "../lib/utils"; + +export default class BubbleGroups { + bubblesByGroups: Array<{timestamp: number, fromID: number, mid: number, group: HTMLDivElement[]}> = []; // map to group + groups: Array = []; + //updateRAFs: Map = new Map(); + newGroupDiff = 120; + + removeBubble(bubble: HTMLDivElement, mid: number) { + let details = this.bubblesByGroups.findAndSplice(g => g.mid == mid); + if(details && details.group.length) { + details.group.findAndSplice(d => d == bubble); + if(!details.group.length) { + this.groups.findAndSplice(g => g == details.group); + } + } + } + + addBubble(bubble: HTMLDivElement, message: any, reverse: boolean) { + let timestamp = message.date; + let fromID = message.fromID; + let group: HTMLDivElement[]; + + // try to find added + //this.removeBubble(message.mid); + + if(this.bubblesByGroups.length) { + if(reverse) { + let g = this.bubblesByGroups[0]; + if(g.fromID == fromID && (g.timestamp - timestamp) < this.newGroupDiff) { + group = g.group; + group.unshift(bubble); + } else { + this.groups.unshift(group = [bubble]); + } + } else { + let g = this.bubblesByGroups[this.bubblesByGroups.length - 1]; + if(g.fromID == fromID && (timestamp - g.timestamp) < this.newGroupDiff) { + group = g.group; + group.push(bubble); + } else { + this.groups.push(group = [bubble]); + } + } + } else { + this.groups.push(group = [bubble]); + } + + //console.log('addBubble', bubble, message.mid, fromID, reverse, group); + + this.bubblesByGroups[reverse ? 'unshift' : 'push']({timestamp, fromID, mid: message.mid, group}); + this.updateGroup(group, reverse); + } + + setClipIfNeeded(bubble: HTMLDivElement, remove = false) { + //console.log('setClipIfNeeded', bubble, remove); + if(bubble.classList.contains('is-message-empty')/* && !bubble.classList.contains('is-reply') */ + && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) { + let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement; + //console.log('setClipIfNeeded', bubble, remove, container); + if(!container) return; + + Array.from(container.children).forEach(object => { + if(object instanceof SVGDefsElement) return; + + if(remove) { + object.removeAttributeNS(null, 'clip-path'); + } else { + let clipID = container.dataset.clipID; + let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement; + let width = +object.getAttributeNS(null, 'width'); + let height = +object.getAttributeNS(null, 'height'); + let isOut = bubble.classList.contains('is-out'); + let isReply = bubble.classList.contains('is-reply'); + let d = ''; + + //console.log('setClipIfNeeded', object, width, height, isOut); + + let tr: number, tl: number; + if(bubble.classList.contains('forwarded') || isReply) { + tr = tl = 0; + } else if(isOut) { + tr = bubble.classList.contains('is-group-first') ? 12 : 6; + tl = 12; + } else { + tr = 12; + tl = bubble.classList.contains('is-group-first') ? 12 : 6; + } + + if(isOut) { + d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12); + } else { + d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0); + } + + path.setAttributeNS(null, 'd', d); + object.setAttributeNS(null, 'clip-path', 'url(#' + clipID + ')'); + } + }); + } + } + + updateGroup(group: HTMLDivElement[], reverse = false) { + /* if(this.updateRAFs.has(group)) { + window.cancelAnimationFrame(this.updateRAFs.get(group)); + this.updateRAFs.delete(group); + } */ + + //this.updateRAFs.set(group, window.requestAnimationFrame(() => { + //this.updateRAFs.delete(group); + + if(!group.length) { + return; + } + + let first = group[0]; + + //appImManager.scrollPosition.prepareFor(reverse ? 'up' : 'down'); + + //console.log('updateGroup', group, first); + + if(group.length == 1) { + first.classList.add('is-group-first', 'is-group-last'); + this.setClipIfNeeded(first); + return; + } else { + first.classList.remove('is-group-last'); + first.classList.add('is-group-first'); + this.setClipIfNeeded(first, true); + } + + let length = group.length - 1; + for(let i = 1; i < length; ++i) { + let bubble = group[i]; + bubble.classList.remove('is-group-last', 'is-group-first'); + this.setClipIfNeeded(bubble, true); + } + + let last = group[group.length - 1]; + last.classList.remove('is-group-first'); + last.classList.add('is-group-last'); + this.setClipIfNeeded(last); + + //appImManager.scrollPosition.restore(); + //})); + } + + updateGroupByMessageID(mid: number) { + let details = this.bubblesByGroups.find(g => g.mid == mid); + if(details) { + this.updateGroup(details.group); + } + } + + cleanup() { + this.bubblesByGroups = []; + /* for(let value of this.updateRAFs.values()) { + window.cancelAnimationFrame(value); + } + this.updateRAFs.clear(); */ + } +} \ No newline at end of file diff --git a/src/components/lazyLoadQueue.ts b/src/components/lazyLoadQueue.ts index 915017ed..05fb8121 100644 --- a/src/components/lazyLoadQueue.ts +++ b/src/components/lazyLoadQueue.ts @@ -1,11 +1,20 @@ import { isElementInViewport } from "../lib/utils"; +type LazyLoadElement = { + div: HTMLDivElement, + load: () => Promise, + wasSeen?: boolean +}; + export default class LazyLoadQueue { - private lazyLoadMedia: Array<{div: HTMLDivElement, load: () => Promise, wasSeen?: boolean}> = []; + private lazyLoadMedia: Array = []; private loadingMedia = 0; private tempID = 0; - constructor(private parallelLimit = 0) { + private lockPromise: Promise = null; + private unlockResolve: () => void = null; + + constructor(private parallelLimit = 5) { } @@ -15,27 +24,34 @@ export default class LazyLoadQueue { this.loadingMedia = 0; } + public length() { + return this.lazyLoadMedia.length + this.loadingMedia; + } + + public lock() { + if(this.lockPromise) return; + this.lockPromise = new Promise((resolve, reject) => { + this.unlockResolve = resolve; + }); + } + + public unlock() { + if(!this.unlockResolve) return; + this.lockPromise = null; + this.unlockResolve(); + this.unlockResolve = null; + } + public async processQueue(id?: number) { if(this.parallelLimit > 0 && this.loadingMedia >= this.parallelLimit) return; - let item: {div: HTMLDivElement, load: () => Promise, wasSeen?: boolean}; + let item: LazyLoadElement; let index: number; - /* if(id) item = this.lazyLoadMedia.splice(id, 1) as any; - else item = this.lazyLoadMedia.pop(); */ if(id !== undefined) item = this.lazyLoadMedia.splice(id, 1)[0]; else { - index = this.lazyLoadMedia.findIndex(i => isElementInViewport(i.div)); - if(index !== -1) { - item = this.lazyLoadMedia.splice(index, 1)[0]; - } else { - //index = this.lazyLoadMedia.findIndex(i => i.wasSeen); - //if(index !== -1) { - //item = this.lazyLoadMedia.splice(index, 1)[0]; - /*} else { - item = this.lazyLoadMedia.pop(); - } */ - + item = this.lazyLoadMedia.findAndSplice(i => isElementInViewport(i.div)); + if(!item) { let length = this.lazyLoadMedia.length; for(index = length - 1; index >= 0; --index) { if(this.lazyLoadMedia[index].wasSeen) { @@ -51,7 +67,16 @@ export default class LazyLoadQueue { let tempID = this.tempID; + console.log('lazyLoadQueue: will load media', this.lockPromise); + try { + if(this.lockPromise) { + let perf = performance.now(); + await this.lockPromise; + console.log('lazyLoadQueue: waited lock:', performance.now() - perf); + } + + await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve))); await item.load(); } catch(err) { console.error('loadMediaQueue error:', err, item, id, index); @@ -61,6 +86,8 @@ export default class LazyLoadQueue { this.loadingMedia--; } + console.log('lazyLoadQueue: loaded media'); + if(this.lazyLoadMedia.length) { this.processQueue(); } @@ -68,31 +95,9 @@ export default class LazyLoadQueue { } public check(id?: number) { - /* if(id !== undefined) { - let {div, load} = this.lazyLoadMedia[id]; - if(isElementInViewport(div)) { - //console.log('will load div by id:', div, div.getBoundingClientRect()); - load(); - this.lazyLoadMedia.splice(id, 1); - } - - return; - } - - let length = this.lazyLoadMedia.length; - for(let i = length - 1; i >= 0; --i) { - let {div, load} = this.lazyLoadMedia[i]; - - if(isElementInViewport(div)) { - console.log('will load div:', div); - load(); - this.lazyLoadMedia.splice(i, 1); - } - } */ - if(id !== undefined) { - let {div} = this.lazyLoadMedia[id]; - if(isElementInViewport(div)) { + let {div, wasSeen} = this.lazyLoadMedia[id]; + if(!wasSeen && isElementInViewport(div)) { //console.log('will load div by id:', div, div.getBoundingClientRect()); this.lazyLoadMedia[id].wasSeen = true; this.processQueue(id); @@ -103,31 +108,25 @@ export default class LazyLoadQueue { let length = this.lazyLoadMedia.length; for(let i = length - 1; i >= 0; --i) { - let {div} = this.lazyLoadMedia[i]; + let {div, wasSeen} = this.lazyLoadMedia[i]; - if(isElementInViewport(div)) { + if(!wasSeen && isElementInViewport(div)) { //console.log('will load div:', div); this.lazyLoadMedia[i].wasSeen = true; this.processQueue(i); //this.lazyLoadMedia.splice(i, 1); } } - - /* this.lazyLoadMedia = this.lazyLoadMedia.filter(({div, load}) => { - if(isElementInViewport(div)) { - //console.log('will load div:', div, div.getBoundingClientRect()); - load(); - return false; - } - - return true; - }); */ } - public push(el: {div: HTMLDivElement, load: () => Promise, wasSeen?: boolean}) { - el.wasSeen = false; + public push(el: LazyLoadElement) { let id = this.lazyLoadMedia.push(el) - 1; - - this.check(id); + + if(el.wasSeen) { + this.processQueue(id); + } else { + el.wasSeen = false; + this.check(id); + } } } diff --git a/src/components/misc.ts b/src/components/misc.ts index f520a123..83969f67 100644 --- a/src/components/misc.ts +++ b/src/components/misc.ts @@ -1,55 +1,95 @@ -import apiManager from "../lib/mtproto/apiManager"; import { whichChild, findUpTag } from "../lib/utils"; -let onRippleClick = function(this: HTMLElement, e: MouseEvent) { - var $circle = this.firstElementChild as HTMLSpanElement; - - var rect = this.parentElement.getBoundingClientRect(); - var x = e.clientX - rect.left; //x position within the element. - var y = e.clientY - rect.top; - - /* var x = e.pageX - this.parentElement.offsetLeft; - var y = e.pageY - this.parentElement.offsetTop - this.parentElement.scrollHeight; */ - - $circle.style.top = y + 'px'; - $circle.style.left = x + 'px'; - - this.classList.add('active'); - - //console.log('onrippleclick', e/* e.pageY, this.parentElement.offsetTop */); -}; - -export function ripple(elem: Element) { - /* elem.addEventListener('click', function(e) { - var $circle = elem.querySelector('.c-ripple__circle') as HTMLSpanElement; - - var x = e.pageX - elem.offsetLeft; - var y = e.pageY - elem.offsetTop; - - $circle.style.top = y + 'px'; - $circle.style.left = x + 'px'; - - elem.classList.add('active'); - }); */ - +let rippleClickID = 0; +export function ripple(elem: HTMLElement, callback: (id: number) => Promise = () => Promise.resolve(), onEnd: (id: number) => void = null) { let r = document.createElement('div'); r.classList.add('c-ripple'); - - let span = document.createElement('span'); - span.classList.add('c-ripple__circle'); - - r.append(span); + elem.append(r); + + elem.addEventListener('mousedown', (e) => { + let startTime = Date.now(); + let span = document.createElement('span'); + + let clickID = rippleClickID++; + + let handler = () => { + let elapsedTime = Date.now() - startTime; + if(elapsedTime < 700) { + let delay = Math.max(700 - elapsedTime, 350); + setTimeout(() => span.classList.add('hiding'), Math.max(delay - 350, 0)); + + setTimeout(() => { + //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime); + span.remove(); + if(onEnd) onEnd(clickID); + }, delay); + } else { + span.classList.add('hiding'); + setTimeout(() => { + //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime); + span.remove(); + if(onEnd) onEnd(clickID); + }, 350); + } + }; + + callback && callback(clickID); + + /* callback().then((bad) => { + if(bad) { + span.remove(); + return; + } */ + + //console.log('ripple after promise', Date.now() - startTime); + //console.log('ripple tooSlow:', tooSlow); + /* if(tooSlow) { + span.remove(); + return; + } */ + + window.requestAnimationFrame(() => { + span.classList.add('c-ripple__circle'); + let rect = r.getBoundingClientRect(); + + let clickX = e.clientX - rect.left; + let clickY = e.clientY - rect.top; + + let size: number, clickPos: number; + if(rect.width > rect.height) { + size = rect.width; + clickPos = clickX; + } else { + size = rect.height; + clickPos = clickY; + } + + let offsetFromCenter = clickPos > (size / 2) ? size - clickPos : clickPos; + size = size - offsetFromCenter; + size *= 1.1; + + // center of circle + let x = clickX - size / 2; + let y = clickY - size / 2; + + //console.log('ripple click', offsetFromCenter, size, clickX, clickY); + + span.style.width = span.style.height = size + 'px'; + span.style.left = x + 'px'; + span.style.top = y + 'px'; - r.addEventListener('click', onRippleClick); - - let onEnd = () => { - r.classList.remove('active'); - }; - - for(let type of ['animationend', 'webkitAnimationEnd', 'oanimationend', 'MSAnimationEnd']) { - r.addEventListener(type, onEnd); - } + r.append(span); + //r.classList.add('active'); + //handler(); + }); + //}); + + window.addEventListener('mouseup', () => { + //console.time('appImManager: pre render start'); + handler(); + }, {once: true}); + }); } export function putPreloader(elem: Element, returnDiv = false) { @@ -156,17 +196,6 @@ export function horizontalMenu(tabs: HTMLUListElement, content: HTMLDivElement, }); } -export function getNearestDc() { - return apiManager.invokeApi('help.getNearestDc').then((nearestDcResult: any) => { - if(nearestDcResult.nearest_dc != nearestDcResult.this_dc) { - //MTProto.apiManager.baseDcID = nearestDcResult.nearest_dc; - apiManager.getNetworker(nearestDcResult.nearest_dc); - } - - return nearestDcResult; - }); -} - export function formatPhoneNumber(str: string) { str = str.replace(/\D/g, ''); let phoneCode = str.slice(0, 6); diff --git a/src/components/pageIm.ts b/src/components/pageIm.ts index 02fa25f4..327583d7 100644 --- a/src/components/pageIm.ts +++ b/src/components/pageIm.ts @@ -1,6 +1,6 @@ //import { appImManager, appMessagesManager, appDialogsManager, apiUpdatesManager, appUsersManager } from "../lib/services"; import { openBtnMenu } from "./misc"; -import {stackBlurImage} from '../lib/StackBlur'; +//import {stackBlurImage} from '../lib/StackBlur'; import appSidebarLeft from "../lib/appManagers/appSidebarLeft"; export default () => import('../lib/services').then(services => { @@ -130,7 +130,7 @@ export default () => import('../lib/services').then(services => { } }); */ - fetch('assets/img/camomile.jpg') + /* fetch('assets/img/camomile.jpg') .then(res => res.blob()) .then(blob => { let img = new Image(); @@ -139,7 +139,11 @@ export default () => import('../lib/services').then(services => { img.onload = () => { let id = 'chat-background-canvas'; var canvas = document.getElementById(id) as HTMLCanvasElement; - URL.revokeObjectURL(url); + //URL.revokeObjectURL(url); + + let elements = ['.chat-container'].map(selector => { + return document.querySelector(selector) as HTMLDivElement; + }); stackBlurImage(img, id, 15, 0); @@ -147,13 +151,12 @@ export default () => import('../lib/services').then(services => { //let dataUrl = canvas.toDataURL('image/jpeg', 1); let dataUrl = URL.createObjectURL(blob); - [/* '.chat-background', '#chat-closed' */'.chat-container'].forEach(selector => { - let bg = document.querySelector(selector) as HTMLDivElement; - bg.style.backgroundImage = 'url(' + dataUrl + ')'; + elements.forEach(el => { + el.style.backgroundImage = 'url(' + dataUrl + ')'; }); }, 'image/jpeg', 1); }; - }); + }); */ /* toggleEmoticons.onclick = (e) => { if(!emoticonsDropdown) { diff --git a/src/components/pageSignIn.ts b/src/components/pageSignIn.ts index 7e1cc530..b094b31a 100644 --- a/src/components/pageSignIn.ts +++ b/src/components/pageSignIn.ts @@ -1,4 +1,4 @@ -import { putPreloader, getNearestDc, formatPhoneNumber } from "./misc"; +import { putPreloader, formatPhoneNumber } from "./misc"; import Scrollable from './scrollable'; import {RichTextProcessor} from '../lib/richtextprocessor'; import * as Config from '../lib/config'; @@ -237,7 +237,14 @@ export default () => { }); let tryAgain = () => { - getNearestDc().then((nearestDcResult: any) => { + apiManager.invokeApi('help.getNearestDc').then((nearestDcResult: any) => { + if(nearestDcResult.nearest_dc != nearestDcResult.this_dc) { + //MTProto.apiManager.baseDcID = nearestDcResult.nearest_dc; + apiManager.getNetworker(nearestDcResult.nearest_dc); + } + + return nearestDcResult; + }).then((nearestDcResult: any) => { let country = countries.find((c) => c.code == nearestDcResult.country); if(country) { if(!selectCountryCode.value.length && !telEl.value.length) { diff --git a/src/components/preloader.ts b/src/components/preloader.ts index db9fca3e..65d51e31 100644 --- a/src/components/preloader.ts +++ b/src/components/preloader.ts @@ -7,6 +7,7 @@ export default class ProgressivePreloader { private progress = 0; private promise: CancellablePromise = null; private tempID = 0; + private detached = true; constructor(elem?: Element, private cancelable = true) { this.preloader = document.createElement('div'); this.preloader.classList.add('preloader-container'); @@ -68,7 +69,12 @@ export default class ProgressivePreloader { this.setProgress(0); } - elem.append(this.preloader); + this.detached = false; + window.requestAnimationFrame(() => { + if(this.detached) return; + this.detached = false; + elem.append(this.preloader); + }); /* let isIn = isInDOM(this.preloader); if(isIn && this.progress != this.defaultProgress) { @@ -83,8 +89,13 @@ export default class ProgressivePreloader { } public detach() { + this.detached = true; if(this.preloader.parentElement) { - this.preloader.parentElement.removeChild(this.preloader); + window.requestAnimationFrame(() => { + if(!this.detached) return; + this.detached = true; + this.preloader.parentElement.removeChild(this.preloader); + }); } } diff --git a/src/components/scrollable.ts b/src/components/scrollable.ts index 8ef62c9c..48e935c5 100644 --- a/src/components/scrollable.ts +++ b/src/components/scrollable.ts @@ -90,11 +90,16 @@ export default class Scrollable { private disableHoverTimeout: number = 0; private log: ReturnType; - private debug = true; + private debug = false; private measureMutex: CancellablePromise; private prependLocked = false; private appendLocked = false; + + private prependFragment: DocumentFragment = null; + private appendFragment: DocumentFragment = null; + private prependFragmentId = 0; + private appendFragmentId = 0; constructor(public el: HTMLElement, axis: 'y' | 'x' = 'y', public splitOffset = 300, logPrefix = '', public appendTo = el, public onScrollOffset = splitOffset) { this.container = document.createElement('div'); @@ -194,11 +199,11 @@ export default class Scrollable { el.append(this.container); - setTimeout(() => { + window.requestAnimationFrame(() => { // @ts-ignore this.size = this.container[this.clientSize]; this.resize(); - }, 0); + }); this.container.parentElement.append(this.thumb); } @@ -763,7 +768,8 @@ export default class Scrollable { } } else { this.appendTo.prepend(element); - this.onScroll(); + this.visibleElements.unshift({element, height: 0}); + //this.onScroll(); } //this.onScroll(); @@ -812,11 +818,52 @@ export default class Scrollable { } } else { this.appendTo.append(element); - this.onScroll(); + this.visibleElements.push({element, height: 0}); + //this.onScroll(); } //this.onScroll(); } + + public prependByBatch(element: HTMLElement) { + let perf = performance.now(); + let fragment = this.prependFragment ?? (this.prependFragment = document.createDocumentFragment()); + fragment.prepend(element); + + if(this.prependFragmentId) window.cancelAnimationFrame(this.prependFragmentId); + this.prependFragmentId = window.requestAnimationFrame(() => { + this.prependFragment = null; + this.prependFragmentId = 0; + + for(let length = fragment.childElementCount, i = length - 1; i >= 0; --i) { + let element = fragment.children[i]; + this.visibleElements.unshift({element, height: 0}); + } + + this.log('prependByBatch perf:', performance.now() - perf, fragment.childElementCount); + this.appendTo.prepend(fragment); + //this.onScroll(); + }); + } + + public appendByBatch(element: HTMLElement) { + let fragment = this.appendFragment ?? (this.appendFragment = document.createDocumentFragment()); + fragment.append(element); + + if(this.appendFragmentId) window.cancelAnimationFrame(this.appendFragmentId); + this.appendFragmentId = window.requestAnimationFrame(() => { + this.appendFragment = null; + this.appendFragmentId = 0; + + for(let i = 0, length = fragment.childElementCount; i < length; ++i) { + let element = fragment.children[i]; + this.visibleElements.push({element, height: 0}); + } + + this.appendTo.append(fragment); + //this.onScroll(); + }); + } public contains(element: Element) { if(!this.splitUp) { @@ -985,9 +1032,9 @@ export default class Scrollable { } set scrollTop(y: number) { - fastdom.mutate(() => { + //fastdom.mutate(() => { this.container.scrollTop = y; - }); + //}); } get scrollTop() { @@ -997,6 +1044,10 @@ export default class Scrollable { get scrollHeight() { return this.container.scrollHeight; } + + get innerHeight() { + return this.size; + } get parentElement() { return this.container.parentElement; diff --git a/src/components/wrappers.ts b/src/components/wrappers.ts index cbbf39ba..8f3fddbd 100644 --- a/src/components/wrappers.ts +++ b/src/components/wrappers.ts @@ -42,9 +42,7 @@ export type MTPhotoSize = { size?: number, type?: string, // i, m, x, y, w by asc location?: any, - bytes?: Uint8Array, // if type == 'i' - - preloaded?: boolean // custom added + bytes?: Uint8Array // if type == 'i' }; export function wrapVideo(this: AppImManager, doc: MTDocument, container: HTMLDivElement, message: any, justLoader = true, preloader?: ProgressivePreloader, controls = true, round = false, boxWidth = 380, boxHeight = 380, withTail = false, isOut = false) { @@ -129,7 +127,7 @@ export function wrapVideo(this: AppImManager, doc: MTDocument, container: HTMLDi }; if(doc.type == 'gif' || true) { // extra fix - return this.loadMediaQueuePush(loadVideo); + return this.lazyLoadQueue.push({div: container, load: loadVideo, wasSeen: true}); } /* else { // if video let load = () => appPhotosManager.preloadPhoto(doc).then((blob) => { if((this.peerID ? this.peerID : this.currentMessageID) != peerID) { @@ -430,46 +428,24 @@ export function wrapAudio(doc: MTDocument, withTime = false): HTMLDivElement { function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, container: HTMLDivElement, boxWidth: number, boxHeight: number, isOut: boolean) { let svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in'); + + let image = document.createElementNS("http://www.w3.org/2000/svg", "image"); + svg.append(image); - let size = appPhotosManager.setAttachmentSize(photo.type ? photo : photo.id, svg, boxWidth, boxHeight); - let image = svg.firstElementChild as SVGImageElement || document.createElementNS("http://www.w3.org/2000/svg", "image"); + let size = appPhotosManager.setAttachmentSize(photo.type ? photo : photo.id, svg, boxWidth, boxHeight, false); let width = +svg.getAttributeNS(null, 'width'); let height = +svg.getAttributeNS(null, 'height'); - - //container.style.width = (width - 9) + 'px'; // maybe return - + let clipID = 'clip' + message.mid; svg.dataset.clipID = clipID; - //image.setAttributeNS(null, 'clip-path', `url(#${clipID})`); - if(!svg.contains(image)) { - image.setAttributeNS(null, 'width', '' + width); - image.setAttributeNS(null, 'height', '' + height); - svg.append(image); - } let defs = document.createElementNS("http://www.w3.org/2000/svg", 'defs'); - let clipPathHTML: string = '';/* = ` - - - `; */ - - //window.getComputedStyle(container).getPropertyValue('border-radius'); + let clipPathHTML: string = ''; if(message.message) { //clipPathHTML += ``; } else { - /* if(isOut) { - clipPathHTML += ` - - - `; - } else { - clipPathHTML += ` - - - `; - } */ if(isOut) { clipPathHTML += ` @@ -482,18 +458,7 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, `; } } - - /* if(isOut) { // top-right, bottom-right - clipPathHTML += ` - - - ` - } else { // top-left, bottom-left - clipPathHTML += ` - - - `; - } */ + defs.innerHTML = `${clipPathHTML}`; svg.prepend(defs); @@ -502,15 +467,17 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, return image; } -export function wrapPhoto(this: AppImManager, photo: any, message: any, container: HTMLDivElement, boxWidth = 380, boxHeight = 380, withTail = true, isOut = false) { +export async function wrapPhoto(this: AppImManager, photoID: string, message: any, container: HTMLDivElement, boxWidth = 380, boxHeight = 380, withTail = true, isOut = false) { let peerID = this.peerID; - + + let photo = appPhotosManager.getPhoto(photoID); + let size: MTPhotoSize; let image: SVGImageElement | HTMLImageElement; if(withTail) { image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut); - } else { - size = appPhotosManager.setAttachmentSize(photo.id, container, boxWidth, boxHeight); + } else { // means webpage's preview + size = appPhotosManager.setAttachmentSize(photoID, container, boxWidth, boxHeight, false); image = container.firstElementChild as HTMLImageElement || new Image(); @@ -518,12 +485,17 @@ export function wrapPhoto(this: AppImManager, photo: any, message: any, containe container.appendChild(image); } } - - let preloader = new ProgressivePreloader(container, false); + + console.log('wrapPhoto downloaded:', photo, photo.downloaded, container); + + let preloader: ProgressivePreloader; + if(!photo.downloaded) preloader = new ProgressivePreloader(container, false); let load = () => { - let promise = appPhotosManager.preloadPhoto(photo.id, size); + let promise = appPhotosManager.preloadPhoto(photoID, size); - preloader.attach(container, true, promise); + if(preloader) { + preloader.attach(container, true, promise); + } return promise.then((blob) => { if(this.peerID != peerID) { @@ -541,11 +513,15 @@ export function wrapPhoto(this: AppImManager, photo: any, message: any, containe /////////console.log('wrapPhoto', load, container, image); - return this.loadMediaQueue ? this.loadMediaQueuePush(load) : load(); + return photo.downloaded ? load() : this.lazyLoadQueue.push({div: container, load: load, wasSeen: true}); } export function wrapSticker(doc: MTDocument, div: HTMLDivElement, middleware?: () => boolean, lazyLoadQueue?: LazyLoadQueue, group?: string, canvas?: boolean, play = false, onlyThumb = false) { let stickerType = doc.mime_type == "application/x-tgsticker" ? 2 : (doc.mime_type == "image/webp" ? 1 : 0); + + if(stickerType == 2 && !LottieLoader.loaded) { + LottieLoader.loadLottie(); + } if(!stickerType) { console.error('wrong doc for wrapSticker!', doc, div); @@ -601,17 +577,21 @@ export function wrapSticker(doc: MTDocument, div: HTMLDivElement, middleware?: ( //console.log('loaded sticker:', blob, div); if(middleware && !middleware()) return; - if(div.firstElementChild) { + /* if(div.firstElementChild) { div.firstElementChild.remove(); - } + } */ if(stickerType == 2) { const reader = new FileReader(); reader.addEventListener('loadend', async(e) => { + console.time('decompress sticker' + doc.id); + console.time('render sticker' + doc.id); // @ts-ignore const text = e.srcElement.result; let json = await CryptoWorker.gzipUncompress(text, true); + + console.timeEnd('decompress sticker' + doc.id); let animation = await LottieLoader.loadAnimation({ container: div, @@ -620,6 +600,12 @@ export function wrapSticker(doc: MTDocument, div: HTMLDivElement, middleware?: ( animationData: JSON.parse(json), renderer: canvas ? 'canvas' : 'svg' }, group); + + console.timeEnd('render sticker' + doc.id); + + if(div.firstElementChild && div.firstElementChild.tagName != 'CANVAS') { + div.firstElementChild.remove(); + } if(!canvas) { div.addEventListener('mouseover', (e) => { @@ -663,7 +649,11 @@ export function wrapSticker(doc: MTDocument, div: HTMLDivElement, middleware?: ( } else if(stickerType == 1) { let img = new Image(); - appWebpManager.polyfillImage(img, blob); + appWebpManager.polyfillImage(img, blob).then(() => { + if(div.firstElementChild && div.firstElementChild != img) { + div.firstElementChild.remove(); + } + }); //img.src = URL.createObjectURL(blob); diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts index e53e3ca0..d256d3b0 100644 --- a/src/lib/appManagers/appDialogsManager.ts +++ b/src/lib/appManagers/appDialogsManager.ts @@ -1,7 +1,7 @@ import apiManager from "../mtproto/apiManager"; import apiFileManager from '../mtproto/apiFileManager'; -import { $rootScope, findUpTag, langPack, findUpClassName } from "../utils"; -import appImManager from "./appImManager"; +import { $rootScope, langPack, findUpClassName } from "../utils"; +import appImManager, { AppImManager } from "./appImManager"; import appPeersManager from './appPeersManager'; import appMessagesManager from "./appMessagesManager"; import appUsersManager from "./appUsersManager"; @@ -38,6 +38,10 @@ export class AppDialogsManager { public savedAvatarURLs: {[peerID: number]: string} = {}; + private rippleCallback: (value?: boolean | PromiseLike) => void = null; + private lastClickID = 0; + private lastGoodClickID = 0; + constructor() { this.pinnedDelimiter = document.createElement('div'); this.pinnedDelimiter.classList.add('pinned-delimiter'); @@ -52,6 +56,13 @@ export class AppDialogsManager { this.myID = userAuth ? userAuth.id : 0; }); + $rootScope.$on('history_request', () => { // will call at history request api or cache RENDERED! + if(this.rippleCallback) { + this.rippleCallback(); + this.rippleCallback = null; + } + }); + //let chatClosedDiv = document.getElementById('chat-closed'); this.setListClickListener(this.chatList); @@ -60,6 +71,8 @@ export class AppDialogsManager { public setListClickListener(list: HTMLUListElement, onFound?: () => void) { list.addEventListener('click', (e: Event) => { + //return; + console.log('dialogs click list'); let target = e.target as HTMLElement; let elem = target.classList.contains('rp') ? target : findUpClassName(target, 'rp'); @@ -69,10 +82,15 @@ export class AppDialogsManager { elem = elem.parentElement; - if(this.lastActiveListElement) { + let samePeer = this.lastActiveListElement == elem; + + if(this.lastActiveListElement && !samePeer) { this.lastActiveListElement.classList.remove('active'); } + let startTime = Date.now(); + let result: ReturnType; + //console.log('appDialogsManager: lock lazyLoadQueue'); if(elem) { /* if(chatClosedDiv) { chatClosedDiv.style.display = 'none'; @@ -81,14 +99,46 @@ export class AppDialogsManager { if(onFound) onFound(); let peerID = +elem.getAttribute('data-peerID'); - let lastMsgID = +elem.getAttribute('data-mid'); - appImManager.setPeer(peerID, lastMsgID); - elem.classList.add('active'); - this.lastActiveListElement = elem; + let lastMsgID = +elem.dataset.mid; + + if(!samePeer) { + elem.classList.add('active'); + this.lastActiveListElement = elem; + } + + result = appImManager.setPeer(peerID, lastMsgID, false, true); + + if(result instanceof Promise) { + this.lastGoodClickID = this.lastClickID; + appImManager.lazyLoadQueue.lock(); + } } else /* if(chatClosedDiv) */ { - appImManager.setPeer(0); + result = appImManager.setPeer(0); //chatClosedDiv.style.display = ''; } + + /* if(!(result instanceof Promise)) { // if click on same dialog + this.rippleCallback(); + this.rippleCallback = null; + } */ + + /* promise.then(() => { + appImManager.lazyLoadQueue.unlock(); + }); */ + + /* promise.then(() => { + let length = appImManager.lazyLoadQueue.length(); + console.log('pre ripple callback', length); + + if(length) { + setTimeout(() => { + this.rippleCallback(); + }, length * 25); + } else { + let elapsedTime = Date.now() - startTime; + this.rippleCallback(elapsedTime > 200); + } + }); */ }); } @@ -110,6 +160,7 @@ export class AppDialogsManager { div.style.backgroundColor = ''; div.classList.add('tgico-savedmessages'); + div.classList.remove('tgico-avatar_deletedaccount'); return true; } @@ -171,7 +222,10 @@ export class AppDialogsManager { div.innerHTML = ''; //div.style.fontSize = '0'; // need //div.style.backgroundColor = ''; - div.append(img); + + window.requestAnimationFrame(() => { + div.append(img); + }); return true; } @@ -364,7 +418,8 @@ export class AppDialogsManager { str = sender.first_name || sender.last_name || sender.username; } - senderBold.innerText = str + ': '; + //senderBold.innerText = str + ': '; + senderBold.innerHTML = RichTextProcessor.wrapRichText(str, {noLinebreakers: true}) + ': '; //console.log(sender, senderBold.innerText); dom.lastMessageSpan.prepend(senderBold); } //////// else console.log('no sender', lastMessage, peerID); @@ -505,12 +560,25 @@ export class AppDialogsManager { //captionDiv.append(titleSpan); //captionDiv.append(span); - - let paddingDiv = document.createElement('div'); paddingDiv.classList.add('rp'); paddingDiv.append(avatarDiv, captionDiv); - ripple(paddingDiv); + + ripple(paddingDiv, (id) => { + console.log('dialogs click element'); + this.lastClickID = id; + + return new Promise((resolve, reject) => { + this.rippleCallback = resolve; + //setTimeout(() => resolve(), 100); + //window.requestAnimationFrame(() => window.requestAnimationFrame(() => resolve())); + }); + }, (id) => { + //console.log('appDialogsManager: ripple onEnd called!'); + if(id == this.lastGoodClickID) { + appImManager.lazyLoadQueue.unlock(); + } + }); let li = document.createElement('li'); li.append(paddingDiv); diff --git a/src/lib/appManagers/appDocsManager.ts b/src/lib/appManagers/appDocsManager.ts index 1b1d2b66..e943b9b3 100644 --- a/src/lib/appManagers/appDocsManager.ts +++ b/src/lib/appManagers/appDocsManager.ts @@ -6,17 +6,16 @@ import { CancellablePromise } from '../polyfill'; class AppDocsManager { private docs: any = {}; - - constructor() { - - } - + public saveDoc(apiDoc: /* MTDocument */any, context?: any) { + console.log('saveDoc', apiDoc, this.docs[apiDoc.id]); + if(this.docs[apiDoc.id]) return this.docs[apiDoc.id]; + this.docs[apiDoc.id] = apiDoc; - if(context) { + /* if(context) { Object.assign(apiDoc, context); - } + } */ if(apiDoc.thumb && apiDoc.thumb._ == 'photoCachedSize') { apiFileManager.saveSmallFile(apiDoc.thumb.location, apiDoc.thumb.bytes); @@ -125,6 +124,8 @@ class AppDocsManager { if(apiDoc._ == 'documentEmpty') { apiDoc.size = 0; } + + return apiDoc; } public getDoc(docID: string) { diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index eb3bc3fd..39f35766 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -1,7 +1,7 @@ import apiManager from '../mtproto/apiManager'; -import { $rootScope, isElementInViewport, numberWithCommas, findUpClassName, formatNumber, placeCaretAtEnd, calcImageInBox, findUpTag, langPack, generatePathData } from "../utils"; +import { $rootScope, isElementInViewport, numberWithCommas, findUpClassName, formatNumber, placeCaretAtEnd, calcImageInBox, findUpTag, langPack } from "../utils"; import appUsersManager from "./appUsersManager"; -import appMessagesManager from "./appMessagesManager"; +import appMessagesManager, { HistoryResult } from "./appMessagesManager"; import appPeersManager from "./appPeersManager"; import appProfileManager from "./appProfileManager"; import appDialogsManager from "./appDialogsManager"; @@ -21,6 +21,8 @@ import ProgressivePreloader from '../../components/preloader'; import { openBtnMenu } from '../../components/misc'; import { ChatInput } from '../../components/chatInput'; import Scrollable from '../../components/scrollable'; +import BubbleGroups from '../../components/bubbleGroups'; +import LazyLoadQueue from '../../components/lazyLoadQueue'; console.log('appImManager included!'); @@ -39,6 +41,8 @@ class ScrollPosition { } restore(callback?: () => void) { + return; + let setScrollTop = this.container.scrollHeight - this.previousScrollHeightMinusTop; if(this.debug) appImManager.log('scrollPosition restore', this.readyFor, this.container.scrollHeight, setScrollTop, this.container, this.container.parentElement.classList.contains('scrolled-down')); @@ -70,6 +74,7 @@ class ScrollPosition { } prepareFor(direction = 'up') { + return; //if(this.prepared) return; if(this.rAF) { @@ -93,165 +98,6 @@ class ScrollPosition { } } -class BubbleGroups { - bubblesByGroups: Array<{timestamp: number, fromID: number, mid: number, group: HTMLDivElement[]}> = []; // map to group - groups: Array = []; - updateRAFs: Map = new Map(); - newGroupDiff = 120; - - removeBubble(bubble: HTMLDivElement, mid: number) { - let details = this.bubblesByGroups.findAndSplice(g => g.mid == mid); - if(details && details.group.length) { - details.group.findAndSplice(d => d == bubble); - if(!details.group.length) { - this.groups.findAndSplice(g => g == details.group); - } - } - } - - addBubble(bubble: HTMLDivElement, message: any, reverse: boolean) { - let timestamp = message.date; - let fromID = message.fromID; - let group: HTMLDivElement[]; - - // try to find added - //this.removeBubble(message.mid); - - if(this.bubblesByGroups.length) { - if(reverse) { - let g = this.bubblesByGroups[0]; - if(g.fromID == fromID && (g.timestamp - timestamp) < this.newGroupDiff) { - group = g.group; - group.unshift(bubble); - } else { - this.groups.unshift(group = [bubble]); - } - } else { - let g = this.bubblesByGroups[this.bubblesByGroups.length - 1]; - if(g.fromID == fromID && (timestamp - g.timestamp) < this.newGroupDiff) { - group = g.group; - group.push(bubble); - } else { - this.groups.push(group = [bubble]); - } - } - } else { - this.groups.push(group = [bubble]); - } - - //console.log('addBubble', bubble, message.mid, fromID, reverse, group); - - this.bubblesByGroups[reverse ? 'unshift' : 'push']({timestamp, fromID, mid: message.mid, group}); - this.updateGroup(group, reverse); - } - - setClipIfNeeded(bubble: HTMLDivElement, remove = false) { - if(bubble.classList.contains('is-message-empty')/* && !bubble.classList.contains('is-reply') */ - && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) { - let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement; - if(!container) return; - - Array.from(container.children).forEach(object => { - if(object instanceof SVGDefsElement) return; - - if(remove) { - object.removeAttributeNS(null, 'clip-path'); - } else { - let clipID = container.dataset.clipID; - let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement; - let width = +object.getAttributeNS(null, 'width'); - let height = +object.getAttributeNS(null, 'height'); - let isOut = bubble.classList.contains('is-out'); - let isReply = bubble.classList.contains('is-reply'); - let d = ''; - - console.log('setClipIfNeeded', object, width, height, isOut); - - let tr: number, tl: number; - if(bubble.classList.contains('forwarded') || isReply) { - tr = tl = 0; - } else if(isOut) { - tr = bubble.classList.contains('is-group-first') ? 12 : 6; - tl = 12; - } else { - tr = 12; - tl = bubble.classList.contains('is-group-first') ? 12 : 6; - } - - if(isOut) { - d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12); - } else { - d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0); - } - - path.setAttributeNS(null, 'd', d); - object.setAttributeNS(null, 'clip-path', 'url(#' + clipID + ')'); - } - }); - } - } - - updateGroup(group: HTMLDivElement[], reverse = false) { - if(this.updateRAFs.has(group)) { - window.cancelAnimationFrame(this.updateRAFs.get(group)); - this.updateRAFs.delete(group); - } - - //this.updateRAFs.set(group, window.requestAnimationFrame(() => { - //this.updateRAFs.delete(group); - - if(!group.length) { - return; - } - - let first = group[0]; - - //appImManager.scrollPosition.prepareFor(reverse ? 'up' : 'down'); - - //console.log('updateGroup', group, first); - - if(group.length == 1) { - first.classList.add('is-group-first', 'is-group-last'); - this.setClipIfNeeded(first); - return; - } else { - first.classList.remove('is-group-last'); - first.classList.add('is-group-first'); - this.setClipIfNeeded(first, true); - } - - let length = group.length - 1; - for(let i = 1; i < length; ++i) { - let bubble = group[i]; - bubble.classList.remove('is-group-last', 'is-group-first'); - this.setClipIfNeeded(bubble, true); - } - - let last = group[group.length - 1]; - last.classList.remove('is-group-first'); - last.classList.add('is-group-last'); - this.setClipIfNeeded(last); - - //appImManager.scrollPosition.restore(); - //})); - } - - updateGroupByMessageID(mid: number) { - let details = this.bubblesByGroups.find(g => g.mid == mid); - if(details) { - this.updateGroup(details.group); - } - } - - cleanup() { - this.bubblesByGroups = []; - for(let value of this.updateRAFs.values()) { - window.cancelAnimationFrame(value); - } - this.updateRAFs.clear(); - } -} - export class AppImManager { public pageEl = document.querySelector('.page-chats') as HTMLDivElement; public btnMute = this.pageEl.querySelector('.tool-mute') as HTMLButtonElement; @@ -292,8 +138,7 @@ export class AppImManager { private firstTopMsgID = 0; - public loadMediaQueue: Array<() => Promise> = []; - private loadingMedia = 0; + public lazyLoadQueue = new LazyLoadQueue(); public scroll: HTMLDivElement = null; public scrollable: Scrollable = null; @@ -328,6 +173,10 @@ export class AppImManager { public bubbleGroups = new BubbleGroups(); constructor() { + /* if(!lottieLoader.loaded) { + lottieLoader.loadLottie(); + } */ + this.log = logger('IM'); this.chatInputC = new ChatInput(); @@ -849,35 +698,6 @@ export class AppImManager { }); } - public loadMediaQueuePush(cb: () => Promise) { - this.loadMediaQueue.push(cb); - this.loadMediaQueueProcess(); - } - - public async loadMediaQueueProcess(): Promise { - if(this.loadingMedia >= 5/* || 1 == 1 */) return; - - let item = this.loadMediaQueue.pop(); - if(item) { - this.loadingMedia++; - - let peerID = this.peerID; - - let promise = item(); - try { - await promise; - } catch(err) { - this.log.error('loadMediaQueue error:', err); - } - - if(peerID == this.peerID) { - this.loadingMedia--; - } - } - - if(this.loadMediaQueue.length) return this.loadMediaQueueProcess(); - } - public updateStatus() { if(!this.myID) return Promise.resolve(); @@ -887,7 +707,7 @@ export class AppImManager { public loadMoreHistory(top: boolean) { this.log('loadMoreHistory', top); - if(!this.peerID || testScroll || (top && this.getHistoryTopPromise) || (!top && this.getHistoryBottomPromise)) return; + if(!this.peerID || testScroll || this.setPeerPromise || (top && this.getHistoryTopPromise) || (!top && this.getHistoryBottomPromise)) return; let history = Object.keys(this.bubbles).map(id => +id).sort(); if(!history.length) return; @@ -908,11 +728,7 @@ export class AppImManager { if(top && !this.scrolledAll) { this.scrollable.lock('both'); this.log('Will load more (up) history by id:', history[0], 'maxID:', history[history.length - 1], history); - /* false && */this.getHistory(history[0], true).then(() => { - this.onScroll(); - }).catch(err => { - this.log.warn('Could not load more history, err:', err); - }); + /* false && */this.getHistory(history[0], true); } if(this.scrolledAllDown) return; @@ -927,11 +743,7 @@ export class AppImManager { if(!top && (!dialog || history.indexOf(dialog.top_message) === -1)) { this.scrollable.lock('both'); this.log('Will load more (down) history by maxID:', history[history.length - 1], history); - /* false && */this.getHistory(history[history.length - 1], false, true).then(() => { - this.onScroll(); - }).catch(err => { - this.log.warn('Could not load more history, err:', err); - }); + /* false && */this.getHistory(history[history.length - 1], false, true); } } @@ -978,7 +790,7 @@ export class AppImManager { this.bubblesContainer.append(this.goDownBtn); - this.scrollable.setVirtualContainer(this.chatInner); + //this.scrollable.setVirtualContainer(this.chatInner); this.scrollable.onScrolledTop = () => this.loadMoreHistory(true); this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false); @@ -987,20 +799,21 @@ export class AppImManager { this.scroll.parentElement.classList.add('scrolled-down'); } - public setPeerStatus() { + public setPeerStatus(needClear = false) { if(!this.myID) return; - - // set subtitle - this.subtitleEl.innerText = appSidebarRight.profileElements.subtitle.innerText = ''; - this.subtitleEl.classList.remove('online'); - appSidebarRight.profileElements.subtitle.classList.remove('online'); - + if(this.peerID < 0) { // not human let chat = appPeersManager.getPeer(this.peerID); let isChannel = appPeersManager.isChannel(this.peerID) && !appPeersManager.isMegagroup(this.peerID); + this.subtitleEl.classList.remove('online'); + appSidebarRight.profileElements.subtitle.classList.remove('online'); ///////this.log('setPeerStatus', chat); - + + if(needClear) { + this.subtitleEl.innerText = appSidebarRight.profileElements.subtitle.innerText = ''; + } + Promise.all([ appPeersManager.isMegagroup(this.peerID) ? apiManager.invokeApi('messages.getOnlines', { peer: appPeersManager.getInputPeerByID(this.peerID) @@ -1031,39 +844,43 @@ export class AppImManager { } else if(!appUsersManager.isBot(this.peerID)) { // user let user = appUsersManager.getUser(this.peerID); - //this.subtitleEl.classList.remove('online'); - - if(user && user.status && this.myID != this.peerID) { + if(this.myID == this.peerID) { + this.subtitleEl.innerText = appSidebarRight.profileElements.subtitle.innerText = ''; + } else if(user && user.status) { let subtitle = ''; switch(user.status._) { - case 'userStatusRecently': - subtitle += 'last seen recently'; - break; - case 'userStatusOffline': - subtitle = 'last seen '; - - let date = user.status.was_online; - let now = Date.now() / 1000; - - if((now - date) < 60) { - subtitle += ' just now'; - } else if((now - date) < 3600) { - subtitle += ((now - date) / 60 | 0) + ' minutes ago'; - } else if(now - date < 86400) { - subtitle += ((now - date) / 3600 | 0) + ' hours ago'; - } else { - let d = new Date(date * 1000); - subtitle += ('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + ' at ' + - ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2); + case 'userStatusRecently': { + subtitle += 'last seen recently'; + break; } - break; + case 'userStatusOffline': { + subtitle = 'last seen '; - case 'userStatusOnline': - this.subtitleEl.classList.add('online'); - appSidebarRight.profileElements.subtitle.classList.add('online'); - subtitle = 'online'; - break; + let date = user.status.was_online; + let now = Date.now() / 1000; + + if((now - date) < 60) { + subtitle += ' just now'; + } else if((now - date) < 3600) { + subtitle += ((now - date) / 60 | 0) + ' minutes ago'; + } else if(now - date < 86400) { + subtitle += ((now - date) / 3600 | 0) + ' hours ago'; + } else { + let d = new Date(date * 1000); + subtitle += ('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + ' at ' + + ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2); + } + + break; + } + + case 'userStatusOnline': { + this.subtitleEl.classList.add('online'); + appSidebarRight.profileElements.subtitle.classList.add('online'); + subtitle = 'online'; + break; + } } appSidebarRight.profileElements.subtitle.innerText = subtitle; @@ -1071,31 +888,36 @@ export class AppImManager { if(this.typingUsers[this.peerID] == this.peerID) { this.subtitleEl.innerText = 'typing...'; this.subtitleEl.classList.add('online'); - } else this.subtitleEl.innerText = subtitle; + } else { + this.subtitleEl.innerText = subtitle; + + if(subtitle != 'online') { + this.subtitleEl.classList.remove('online'); + appSidebarRight.profileElements.subtitle.classList.remove('online'); + } + } } } } public cleanup() { + ////console.time('appImManager cleanup'); this.peerID = $rootScope.selectedPeerID = 0; this.scrolledAll = false; this.scrolledAllDown = false; this.muted = false; - for(let i in this.bubbles) { + /* for(let i in this.bubbles) { let bubble = this.bubbles[i]; bubble.remove(); - } + } */ this.bubbles = {}; this.dateMessages = {}; this.bubbleGroups.cleanup(); this.unreaded = []; this.unreadOut = []; - this.loadMediaQueue = []; - this.loadingMedia = 0; this.needUpdate.length = 0; - - lottieLoader.checkAnimations(false, 'chat', true); + this.lazyLoadQueue.clear(); // clear input this.chatInputC.messageInput.innerHTML = ''; @@ -1103,16 +925,25 @@ export class AppImManager { // clear messages this.chatInner.innerHTML = ''; + + lottieLoader.checkAnimations(false, 'chat', true); + + this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined; - this.scrollable.setVirtualContainer(this.chatInner); + //this.scrollable.setVirtualContainer(this.chatInner); + + ////console.timeEnd('appImManager cleanup'); } - public setPeer(peerID: number, lastMsgID = 0, forwarding = false) { + public setPeer(peerID: number, lastMsgID = 0, forwarding = false, fromClick = false) { + //console.time('appImManager setPeer'); + //console.time('appImManager setPeer pre promise'); + ////console.time('appImManager: pre render start'); if(peerID == 0) { appSidebarRight.toggleSidebar(false); this.topbar.style.display = this.chatInput.style.display = this.goDownBtn.style.display = 'none'; this.cleanup(); - return Promise.resolve(false); + return false; } let samePeer = this.peerID == peerID; @@ -1125,7 +956,7 @@ export class AppImManager { if(samePeer) { if(!testScroll && !lastMsgID) { - return Promise.resolve(true); + return true; } if(this.bubbles[lastMsgID]) { @@ -1139,7 +970,7 @@ export class AppImManager { this.scrollable.scrollIntoView(this.bubbles[lastMsgID]); } - return Promise.resolve(true); + return true; } } @@ -1155,61 +986,62 @@ export class AppImManager { return Promise.reject(); } */ - this.pinnedMessageContainer.style.display = 'none'; - - this.preloader.attach(this.bubblesContainer); - let dialog = appMessagesManager.getDialogByPeerID(this.peerID)[0] || null; //////this.log('setPeer peerID:', this.peerID, dialog, lastMsgID); appDialogsManager.loadDialogPhoto(this.avatarEl, this.peerID); appDialogsManager.loadDialogPhoto(appSidebarRight.profileElements.avatar, this.peerID); - if(!samePeer && appDialogsManager.lastActiveListElement) { - appDialogsManager.lastActiveListElement.classList.remove('active'); - } - let dom = appDialogsManager.getDialogDom(this.peerID); - if(dom) { - appDialogsManager.lastActiveListElement = dom.listEl; - dom.listEl.classList.add('active'); - } - this.firstTopMsgID = dialog ? dialog.top_message : 0; - this.setPeerStatus(); - - let title = ''; - if(this.peerID == this.myID) { - title = 'Saved Messages'; - } else { - title = appPeersManager.getPeerTitle(this.peerID); - } - //this.titleEl.innerHTML = appSidebarRight.profileElements.name.innerHTML = dom.titleSpan.innerHTML; - this.titleEl.innerHTML = appSidebarRight.profileElements.name.innerHTML = title; - - this.topbar.style.display = this.goDownBtn.style.display = ''; - //appSidebarRight.toggleSidebar(true); - - this.chatInput.style.display = appPeersManager.isChannel(peerID) && !appPeersManager.isMegagroup(peerID) ? 'none' : ''; + window.requestAnimationFrame(() => { + this.chatInner.style.visibility = 'hidden'; + + let title = ''; + if(this.peerID == this.myID) title = 'Saved Messages'; + else title = appPeersManager.getPeerTitle(this.peerID); + //this.titleEl.innerHTML = appSidebarRight.profileElements.name.innerHTML = dom.titleSpan.innerHTML; + this.titleEl.innerHTML = appSidebarRight.profileElements.name.innerHTML = title; + this.pinnedMessageContainer.style.display = 'none'; + this.topbar.style.display = this.goDownBtn.style.display = ''; + //appSidebarRight.toggleSidebar(true); + this.chatInput.style.display = appPeersManager.isChannel(peerID) && !appPeersManager.isMegagroup(peerID) ? 'none' : ''; + + if(appPeersManager.isAnyGroup(peerID)) this.chatInner.classList.add('is-chat'); + else this.chatInner.classList.remove('is-chat'); + + if(!fromClick) { + if(!samePeer && appDialogsManager.lastActiveListElement) { + appDialogsManager.lastActiveListElement.classList.remove('active'); + } - if(appPeersManager.isAnyGroup(peerID)) { - this.chatInner.classList.add('is-chat'); - } else { - this.chatInner.classList.remove('is-chat'); - } + let dom = appDialogsManager.getDialogDom(this.peerID); + if(dom) { + appDialogsManager.lastActiveListElement = dom.listEl; + dom.listEl.classList.add('active'); + } + } + + this.setPeerStatus(true); + }); + + // add last message, bc in getHistory will load < max_id + let additionMsgID = 0; + if(lastMsgID && !forwarding) additionMsgID = lastMsgID; + else if(dialog && dialog.top_message) additionMsgID = dialog.top_message; + + /* this.setPeerPromise = null; + this.preloader.detach(); + return true; */ - //this.scroll.scrollTop = this.scroll.scrollHeight; + //////appSidebarRight.toggleSidebar(true); + //console.timeEnd('appImManager setPeer pre promise'); + this.preloader.attach(this.bubblesContainer); return this.setPeerPromise = Promise.all([ - this.getHistory(forwarding ? lastMsgID + 1 : lastMsgID, true).then(() => { + this.getHistory(forwarding ? lastMsgID + 1 : lastMsgID, true, false, additionMsgID).then(() => { ////this.log('setPeer removing preloader'); if(lastMsgID) { - if(!forwarding) { - let message = appMessagesManager.getMessage(lastMsgID); - //////this.log('setPeer render last message:', message, lastMsgID); - this.renderMessage(message, false, true); - } - if(!dialog || lastMsgID != dialog.top_message) { let bubble = this.bubbles[lastMsgID]; @@ -1219,19 +1051,19 @@ export class AppImManager { this.log('will scroll down 2'); this.scroll.scrollTop = this.scroll.scrollHeight; } - } else if(dialog && dialog.top_message) { // add last message, bc in getHistory will load < max_id - this.renderMessage(appMessagesManager.getMessage(dialog.top_message), false, true); - //this.scroll.scrollTop = this.scroll.scrollHeight; } - this.onScroll(); - this.scrollable.onScroll(); + /* this.onScroll(); + this.scrollable.onScroll();*/ this.preloader.detach(); + this.chatInner.style.visibility = ''; + + //console.timeEnd('appImManager setPeer'); //setTimeout(() => { //appSidebarRight.fillProfileElements(); - appSidebarRight.loadSidebarMedia(true); + //appSidebarRight.loadSidebarMedia(true); //}, 500); return true; @@ -1239,21 +1071,18 @@ export class AppImManager { this.log.error(err); }) */, - appSidebarRight.fillProfileElements() - ]).then(() => { - if(this.peerID == peerID) { - this.setPeerPromise = null; - } - - return true; - }).catch(err => { - if(this.peerID == peerID) { - this.setPeerPromise = null; - } - + appSidebarRight.fillProfileElements()/* , + appSidebarRight.loadSidebarMedia(true) */ + ]).catch(err => { this.log.error('setPeer promises error:', err); this.preloader.detach(); return false; + }).then(res => { + if(this.peerID == peerID) { + this.setPeerPromise = null; + } + + return !!res; }); } @@ -1359,6 +1188,8 @@ export class AppImManager { //bubble.innerHTML = ''; } + bubble.dataset.mid = message.mid; + if(message._ == 'messageService') { bubble.className = 'bubble service'; @@ -1378,11 +1209,17 @@ export class AppImManager { let str = (name.innerText ? name.outerHTML + ' ' : '') + langPack[_]; bubbleContainer.innerHTML = `
${str}
`; - if(!multipleRender) { - this.scrollPosition.restore(); // лагает из-за этого - } + /* if(!updatePosition) { + if(!multipleRender) { + this.scrollPosition.restore(); // лагает из-за этого + } + } else if(reverse) { + this.scrollable.prepend(bubble); + } else { + this.scrollable.append(bubble); + } */ - return; + return bubble; } // time section @@ -1437,8 +1274,6 @@ export class AppImManager { messageDiv.innerHTML = richText; } - //messageDiv.innerHTML = 'samsung samsung samsung'; - timeSpan.appendChild(timeInner); messageDiv.append(timeSpan); bubbleContainer.prepend(messageDiv); @@ -1452,7 +1287,9 @@ export class AppImManager { bubble.classList.add(status); } else { //this.log('not our message', message, message.pFlags.unread); - if(message.pFlags.unread) this.unreaded.push(message.mid); + if(message.pFlags.unread) { + this.unreaded.push(message.mid); + } } // media @@ -1513,7 +1350,7 @@ export class AppImManager { bubble.classList.add('hide-name', 'photo'); - wrapPhoto.call(this, photo, message, attachmentDiv, undefined, undefined, true, our); + wrapPhoto.call(this, photo.id, message, attachmentDiv, undefined, undefined, true, our); break; } @@ -1567,7 +1404,7 @@ export class AppImManager { bubble.classList.add('photo'); //appPhotosManager.savePhoto(webpage.photo); // hot-fix because no webpage manager - wrapPhoto.call(this, webpage.photo, message, preview, 380, 300, false); + wrapPhoto.call(this, webpage.photo.id, message, preview, 380, 300, false); } if(preview) { @@ -1603,7 +1440,7 @@ export class AppImManager { break; } */ - ////////this.log('messageMediaDocument', doc); + this.log('messageMediaDocument', doc, bubble); if(doc.sticker && doc.size <= 1e6) { bubble.classList.add('sticker'); @@ -1613,7 +1450,7 @@ export class AppImManager { } appPhotosManager.setAttachmentSize(doc, attachmentDiv, undefined, undefined, true); - let preloader = new ProgressivePreloader(attachmentDiv, false); + //let preloader = new ProgressivePreloader(attachmentDiv, false); bubbleContainer.style.height = attachmentDiv.style.height; bubbleContainer.style.width = attachmentDiv.style.width; //appPhotosManager.setAttachmentSize(doc, bubble); @@ -1625,12 +1462,12 @@ export class AppImManager { return true; }, null, 'chat', false, !!message.pending || !multipleRender).then(() => { - preloader.detach(); + //preloader.detach(); /* attachmentDiv.style.width = ''; attachmentDiv.style.height = ''; */ }); - this.loadMediaQueuePush(load); + this.lazyLoadQueue.push({div: bubble, load: load, wasSeen: true}); break; } else if(doc.mime_type == 'video/mp4' && doc.size <= 20e6) { @@ -1769,16 +1606,27 @@ export class AppImManager { bubble.classList.add('hide-name'); } - bubble.dataset.mid = message.mid; bubble.classList.add(our ? 'is-out' : 'is-in'); if(updatePosition) { this.bubbleGroups.addBubble(bubble, message, reverse); - if(reverse) { - this.scrollable.prepend(bubble); - } else { - this.scrollable.append(bubble); - } + //window.requestAnimationFrame(() => { + /* if(reverse) { + this.scrollable.prependByBatch(bubble); + } else { + this.scrollable.appendByBatch(bubble); + } */ + /* if(reverse) { + this.scrollable.prepend(bubble); + + if(!this.scrollable.scrollTop) { + let height = bubble.scrollHeight; + this.scrollable.scrollTop += height; + } + } else { + this.scrollable.append(bubble); + } */ + //}); let justDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); let dateTimestamp = justDate.getTime(); @@ -1822,11 +1670,11 @@ export class AppImManager { let dateMessage = this.dateMessages[dateTimestamp]; if(needUpdatePos && !dateMessage.timeout) { - dateMessage.timeout = setTimeout(() => { + //dateMessage.timeout = setTimeout(() => { delete dateMessage.timeout; - this.scrollable.insertBefore(dateMessage.div, dateMessage.bubble); - }, 0); + //this.scrollable.insertBefore(dateMessage.div, dateMessage.bubble); + //}, 0); } } else { this.bubbleGroups.updateGroupByMessageID(message.mid); @@ -1841,27 +1689,180 @@ export class AppImManager { if(!multipleRender) { this.scrollPosition.restore(); // лагает из-за этого } + + return bubble; + } + + public performHistoryResult(history: number[], reverse: boolean, isBackLimit: boolean, additionMsgID: number, resetPromises = false) { + // commented bot getProfile in getHistory! + if(!history/* .filter((id: number) => id > 0) */.length) { + if(!isBackLimit) { + this.scrolledAll = true; + } else { + this.scrolledAllDown = true; + } + } + + if(additionMsgID) { + history.unshift(additionMsgID); + } + + //let method = reverse ? result.history.forEach : result.history.forEachReverse; + let method = reverse ? Array.prototype.forEach : Array.prototype.forEachReverse; + method = method.bind(history); + + //console.time('appImManager render history'); + + this.log('getHistory method', method); + + if(!isBackLimit) { + this.scrollPosition.prepareFor(reverse ? 'up' : 'down'); + } + + let peerID = this.peerID; + return new Promise((resolve, reject) => { + let resolved = false; + /* let bubbles: HTMLDivElement[] = []; + method((msgID) => { + let message = appMessagesManager.getMessage(msgID); + let bubble = this.renderMessage(message, reverse, true); + bubbles.push(bubble); + }); */ + + //let innerHeight = this.scrollable.innerHeight; + + //console.timeEnd('appImManager: pre render start'); + + let renderedFirstScreen = false; + let r = () => { + //let bubble = bubbles.shift(); + //if(!bubble && !resolved) return resolve(); + //if(!history.length) return resolve(true); + + /* let msgID = result.history.shift(); + if(!msgID && !resolved) return resolve(); + let message = appMessagesManager.getMessage(msgID); */ + + if(this.peerID != peerID) { + return reject('peer changed'); + } + + //let startTime = Date.now(); + //let elapsedTime = 0; + //do { + let msgID = history.shift(); + if(!msgID) { + if(resetPromises) { + (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined); + } + + this.scrollable.unlock('both'); + + if(!resolved) { + resolve(true); + } + + return; + } + + let message = appMessagesManager.getMessage(msgID); + let bubble = this.renderMessage(message, reverse, true); + if(bubble) { + if(reverse) { + this.scrollable.prepend(bubble); + + //console.log('innerHeight', innerHeight, this.scrollable.scrollTop); + + /* if(innerHeight >= 0) { + let height = bubble.scrollHeight; + innerHeight -= height; + this.scrollable.scrollTop += height; + } */ + + if(!renderedFirstScreen) { + if(!this.scrollable.scrollTop) { + let height = bubble.scrollHeight; + //let height = Math.ceil(bubble.getBoundingClientRect().height); + this.scrollable.scrollTop += height; + //innerHeight -= height; + } else { + renderedFirstScreen = true; + resolve(); + resolved = true; + } + } + } else { + this.scrollable.append(bubble); + } + } + //} while(cached && !this.scrollable.scrollTop); + //} while((elapsedTime = Date.now() - startTime) < 3); + + /* let bubble = this.renderMessage(message, reverse, true); + if(!bubble) return r(); + + if(reverse) { + this.scrollable.prepend(bubble); + + if(!this.scrollable.scrollTop) { + let height = bubble.scrollHeight; + this.scrollable.scrollTop += height; + //innerHeight -= height; + } else if(!resolved) { + resolve(); + resolved = true; + } + } else { + this.scrollable.append(bubble); + } */ + + window.requestAnimationFrame(r); + }; + + window.requestAnimationFrame(r); + //r(); + /* method((msgID) => { + let message = appMessagesManager.getMessage(msgID); + + window.requestAnimationFrame(() => { + this.renderMessage(message, reverse, true); + }); + }); */ + })/* .then(() => { + if(!isBackLimit) { + this.scrollPosition.restore(() => { + this.scrollable.unlock('both'); + }); + } else { + this.scrollable.unlock('both'); + } + + //console.timeEnd('appImManager render history'); + + return true; + }) */; } // reverse means scroll up - public getHistory(maxID = 0, reverse = false, isBackLimit = false) { + public getHistory(maxID = 0, reverse = false, isBackLimit = false, additionMsgID = 0) { let peerID = this.peerID; + + //console.time('appImManager call getHistory'); let dialog = appMessagesManager.getDialogByPeerID(peerID)[0]; if(!maxID && dialog && dialog.top_message) { maxID = dialog.top_message/* + 1 */; } - let loadCount = Object.keys(this.bubbles).length > 0 ? 20 : this.scrollable.container.parentElement.scrollHeight / 30 * 1.25 | 0; + let loadCount = Object.keys(this.bubbles).length > 0 ? 20 : this.scrollable.container.parentElement.scrollHeight / 30/* * 1.25 */ | 0; /* if(testScroll) { - loadCount = 1; + loadCount = 5; if(Object.keys(this.bubbles).length > 0) return Promise.resolve(true); } */ - //console.time('render getHistory'); - //console.time('render history total'); + ////console.time('render history total'); let backLimit = 0; if(isBackLimit) { @@ -1870,85 +1871,38 @@ export class AppImManager { maxID += 1; } - let promise = appMessagesManager.getHistory(this.peerID, maxID, loadCount, backLimit) - .then((result) => { - this.log('getHistory result by maxID:', maxID, reverse, isBackLimit, result); - - (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined); - - //console.timeEnd('render getHistory'); - - if(this.peerID != peerID) { - this.log.warn('peer changed'); - //console.timeEnd('render history total'); - return Promise.reject(); - } - - if(!result || !result.history) { - //console.timeEnd('render history total'); - return true; - } - - // commented bot getProfile in getHistory! - if(!result.history/* .filter((id: number) => id > 0) */.length) { - if(!isBackLimit) { - this.scrolledAll = true; - } else { - this.scrolledAllDown = true; + let result = appMessagesManager.getHistory(this.peerID, maxID, loadCount, backLimit); + /* if(!(result instanceof Promise)) { + let _result = result; + $rootScope.$broadcast('history_request'); // for ripple + result = new Promise((resolve, reject) => setTimeout(() => resolve(_result), 150)); + } */ + if(result instanceof Promise) { + let promise = result.then((result) => { + this.log('getHistory result by maxID:', maxID, reverse, isBackLimit, result); + + //console.timeEnd('appImManager call getHistory'); + + if(this.peerID != peerID) { + this.log.warn('peer changed'); + ////console.timeEnd('render history total'); + return Promise.reject(); } - } - - //this.chatInner.innerHTML = ''; - - //let method = reverse ? result.history.forEach : result.history.forEachReverse; - let method = reverse ? Array.prototype.forEach : Array.prototype.forEachReverse; - method = method.bind(result.history); - - //console.time('render history'); - - this.log('getHistory method', method); - - if(!isBackLimit) { - this.scrollPosition.prepareFor(reverse ? 'up' : 'down'); - } - - if(testScroll) { - for(let i = 0; i < 25; ++i) method((msgID) => { - let message = appMessagesManager.getMessage(msgID); - - this.renderMessage(message, reverse, true); - }); - } else { - method((msgID) => { - let message = appMessagesManager.getMessage(msgID); - - this.renderMessage(message, reverse, true); - }); - } - - if(!isBackLimit) { - this.scrollPosition.restore(() => { - this.scrollable.unlock('both'); - }); - } else { + + ////console.timeEnd('render history total'); + + return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true); + }, (err) => { + this.log.error('getHistory error:', err); + (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined); this.scrollable.unlock('both'); - } - - //console.timeEnd('render history'); - - //console.timeEnd('render history total'); - - return true; - }, () => { - (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined); - this.scrollable.unlock('both'); - return false; - })/* .then(res => { - this.scrollable.unlock(reverse); - return res; - }) */; - - return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise); + return false; + }); + + return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise); + } else { + return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true); + } } public setMutedState(muted = false) { diff --git a/src/lib/appManagers/appMediaViewer.ts b/src/lib/appManagers/appMediaViewer.ts index 875f0a23..dda61041 100644 --- a/src/lib/appManagers/appMediaViewer.ts +++ b/src/lib/appManagers/appMediaViewer.ts @@ -5,7 +5,6 @@ import appMessagesManager from "./appMessagesManager"; import { RichTextProcessor } from "../richtextprocessor"; import { logger } from "../polyfill"; import ProgressivePreloader from "../../components/preloader"; -import { wrapVideo } from "../../components/wrappers"; import { findUpClassName, $rootScope, generatePathData } from "../utils"; import appDocsManager from "./appDocsManager"; import { wrapPlayer } from "../ckin"; diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index ead6a76a..42aaa3b7 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -21,13 +21,20 @@ import apiManager from "../mtproto/apiManager"; import appWebPagesManager from "./appWebPagesManager"; import { CancellablePromise, deferredPromise } from "../polyfill"; -type HistoryStorage = { +export type HistoryStorage = { count: number | null, history: number[], pending: number[], readPromise?: any }; +export type HistoryResult = { + count: number, + history: number[], + unreadOffset: number, + unreadSkip: boolean +}; + export class AppMessagesManager { public messagesStorage: any = {}; public messagesForHistory: any = {}; @@ -1137,7 +1144,7 @@ export class AppMessagesManager { if(apiMessage.media.ttl_seconds) { apiMessage.media = {_: 'messageMediaUnsupportedWeb'}; } else { - appDocsManager.saveDoc(apiMessage.media.document, mediaContext); + apiMessage.media.document = appDocsManager.saveDoc(apiMessage.media.document, mediaContext); // 11.04.2020 warning } break; case 'messageMediaWebPage': @@ -3017,12 +3024,7 @@ export class AppMessagesManager { }); } - public getHistory(peerID: number, maxID = 0, limit = 0, backLimit?: number, prerendered?: number): Promise<{ - count: number, - history: number[], - unreadOffset: number, - unreadSkip: boolean - }> { + public getHistory(peerID: number, maxID = 0, limit = 0, backLimit?: number, prerendered?: number) { if(this.migratedFromTo[peerID]) { peerID = this.migratedFromTo[peerID]; } @@ -3095,10 +3097,12 @@ export class AppMessagesManager { } else { limit = limit || (offset ? 20 : (prerendered || 5)); } + var history = historyStorage.history.slice(offset, offset + limit); if(!maxID && historyStorage.pending.length) { history = historyStorage.pending.slice().concat(history); } + return this.wrapHistoryResult(peerID, { count: historyStorage.count, history: history, @@ -3230,7 +3234,7 @@ export class AppMessagesManager { }); } - public wrapHistoryResult(peerID: number, result: any) { + public wrapHistoryResult(peerID: number, result: HistoryResult) { var unreadOffset = result.unreadOffset; if(unreadOffset) { var i; @@ -3243,7 +3247,8 @@ export class AppMessagesManager { } } } - return Promise.resolve(result); + return result; + //return Promise.resolve(result); } public requestHistory(peerID: number, maxID: number, limit: number, offset = 0) { @@ -3251,6 +3256,8 @@ export class AppMessagesManager { //console.trace('requestHistory', peerID, maxID, limit, offset); + $rootScope.$broadcast('history_request'); + return apiManager.invokeApi('messages.getHistory', { peer: AppPeersManager.getInputPeerByID(peerID), offset_id: maxID ? appMessagesIDsManager.getMessageLocalID(maxID) : 0, diff --git a/src/lib/appManagers/appPhotosManager.ts b/src/lib/appManagers/appPhotosManager.ts index b1273b9c..9754645c 100644 --- a/src/lib/appManagers/appPhotosManager.ts +++ b/src/lib/appManagers/appPhotosManager.ts @@ -5,10 +5,6 @@ import { bytesFromHex } from "../bin_utils"; import { MTPhotoSize } from "../../components/wrappers"; import apiFileManager from "../mtproto/apiFileManager"; import apiManager from "../mtproto/apiManager"; -//import { MTPhotoSize } from "../../components/misc"; - -//import fastdom from "fastdom"; -//import 'fastdom/fastdom-strict'; // exclude in production type MTPhoto = { _: 'photo', @@ -20,7 +16,9 @@ type MTPhoto = { date: number, sizes: Array, dc_id: number, - user_id: number + user_id: number, + + downloaded?: boolean }; export class AppPhotosManager { @@ -35,36 +33,32 @@ export class AppPhotosManager { constructor() { window.addEventListener('resize', (e) => { - //fastdom.measure(() => { this.windowW = document.body.scrollWidth; this.windowH = document.body.scrollHeight; - //}); - //console.log(`Set windowW, windowH: ${this.windowW}x${this.windowH}`); }); - //fastdom.measure(() => { - console.log('measure works'); this.windowW = document.body.scrollWidth; this.windowH = document.body.scrollHeight; - //}); } - public savePhoto(apiPhoto: any, context?: any) { - if(context) { - Object.assign(apiPhoto, context); - } + public savePhoto(photo: MTPhoto, context?: any) { + if(this.photos[photo.id]) return this.photos[photo.id]; + + /* if(context) { + Object.assign(photo, context); + } */ // warning - if(!apiPhoto.id) { - console.warn('no apiPhoto.id', apiPhoto); - } else this.photos[apiPhoto.id] = apiPhoto; + if(!photo.id) { + console.warn('no apiPhoto.id', photo); + } else this.photos[photo.id] = photo; - if(!('sizes' in apiPhoto)) return; + if(!('sizes' in photo)) return; - apiPhoto.sizes.forEach((photoSize: any) => { + photo.sizes.forEach((photoSize: any) => { if(photoSize._ == 'photoCachedSize') { apiFileManager.saveSmallFile(photoSize.location, photoSize.bytes); - console.log('clearing photo cached size', apiPhoto); + console.log('clearing photo cached size', photo); // Memory photoSize.size = photoSize.bytes.length; @@ -72,6 +66,25 @@ export class AppPhotosManager { photoSize._ = 'photoSize'; } }); + + /* if(!photo.downloaded) { + photo.downloaded = apiFileManager.isFileExists({ + _: 'inputPhotoFileLocation', + id: photo.id, + access_hash: photo.access_hash, + file_reference: photo.file_reference + }); + // apiFileManager.isFileExists({ + // _: 'inputPhotoFileLocation', + // id: photo.id, + // access_hash: photo.access_hash, + // file_reference: photo.file_reference + // }).then(downloaded => { + // photo.downloaded = downloaded; + // }); + } */ + + return photo; } public choosePhotoSize(photo: any, width = 0, height = 0) { @@ -140,9 +153,6 @@ export class AppPhotosManager { } public setAttachmentPreview(bytes: Uint8Array, element: HTMLElement | SVGSVGElement, isSticker = false, background = false) { - //image.src = "data:image/jpeg;base64," + bytesToBase64(photo.sizes[0].bytes); - //photo.sizes[0].bytes = new Uint8Array([...photo.sizes[0].bytes].reverse()); - let arr: Uint8Array; if(!isSticker) { arr = AppPhotosManager.jf.concat(bytes.slice(3), AppPhotosManager.Df); @@ -157,12 +167,18 @@ export class AppPhotosManager { let blob = new Blob([arr], {type: "image/jpeg"}); if(background) { - element.style.backgroundImage = 'url(' + URL.createObjectURL(blob) + ')'; + let url = URL.createObjectURL(blob); + let img = new Image(); + img.src = url; + img.onload = () => { + element.style.backgroundImage = 'url(' + url + ')'; + }; + + //element.style.backgroundImage = 'url(' + url + ')'; } else { if(element instanceof SVGSVGElement) { - let image = document.createElementNS("http://www.w3.org/2000/svg", "image"); + let image = element.firstElementChild as SVGImageElement || document.createElementNS("http://www.w3.org/2000/svg", "image"); image.setAttributeNS(null, 'href', URL.createObjectURL(blob)); - //image.setAttributeNS(null, 'preserveAspectRatio', 'xMinYMin slice'); element.append(image); } else { let image = new Image(); @@ -189,7 +205,7 @@ export class AppPhotosManager { //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div); let sizes = photo.sizes || photo.thumbs; - if(sizes && sizes[0].bytes) { + if((!photo.downloaded || isSticker) && sizes && sizes[0].bytes) { this.setAttachmentPreview(sizes[0].bytes, element, isSticker); } @@ -221,7 +237,7 @@ export class AppPhotosManager { return photoSize; } - public async preloadPhoto(photoID: any, photoSize?: MTPhotoSize): Promise { + public preloadPhoto(photoID: any, photoSize?: MTPhotoSize): Promise { let photo: any = null; if(typeof(photoID) === 'string') { @@ -239,8 +255,6 @@ export class AppPhotosManager { } if(photoSize && photoSize._ != 'photoSizeEmpty') { - photoSize.preloaded = true; - // maybe it's a thumb let isPhoto = photoSize.size && photo.access_hash && photo.file_reference; let location = isPhoto ? { @@ -250,34 +264,29 @@ export class AppPhotosManager { file_reference: photo.file_reference, thumb_size: photoSize.type } : photoSize.location; - - /* if(overwrite) { - await apiFileManager.deleteFile(location); - console.log('Photos deleted file!'); - } */ - + + let promise: Promise; + if(isPhoto/* && photoSize.size >= 1e6 */) { //console.log('Photos downloadFile exec', photo); - /* let promise = apiFileManager.downloadFile(photo.dc_id, location, photoSize.size); - - let blob = await promise; - if(blob.size < photoSize.size && overwrite) { - await apiFileManager.deleteFile(location); - console.log('Photos deleted file!'); - return apiFileManager.downloadFile(photo.dc_id, location, photoSize.size); - } - - return blob; */ - return apiFileManager.downloadFile(photo.dc_id, location, photoSize.size); + promise = apiFileManager.downloadFile(photo.dc_id, location, photoSize.size); } else { //console.log('Photos downloadSmallFile exec', photo, location); - return apiFileManager.downloadSmallFile(location); + promise = apiFileManager.downloadSmallFile(location); } + + if(typeof(photoID) === 'string') { + promise.then(() => { + this.photos[photoID].downloaded = true; + }); + } + + return promise; } else return Promise.reject('no photoSize'); } public getPhoto(photoID: string) { - return this.photos[photoID] || {_: 'photoEmpty'}; + return this.photos[photoID] || {_: 'photoEmpty'} as unknown as Partial; } public wrapForHistory(photoID: string, options: any = {}) { @@ -311,36 +320,7 @@ export class AppPhotosManager { return photo; } - - /* public wrapForFull(photoID: string) { - var photo = this.wrapForHistory(photoID); - var fullWidth = document.body.scrollWidth - (Config.Mobile ? 0 : 32); - var fullHeight = document.body.scrollHeight - (Config.Mobile ? 0 : 116); - if (!Config.Mobile && fullWidth > 800) { - fullWidth -= 208; - } - var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight); - var full: any = {}; - - full.width = fullWidth; - full.height = fullHeight; - - if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') { - var wh = calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, true); - full.width = wh.w; - full.height = wh.h; - - full.modalWidth = Math.max(full.width, Math.min(400, fullWidth)); - - full.location = fullPhotoSize.location; - full.size = fullPhotoSize.size; - } - - photo.full = full; - - return photo; - } */ - + public downloadPhoto(photoID: string) { var photo = this.photos[photoID]; var ext = 'jpg'; diff --git a/src/lib/appManagers/appSidebarRight.ts b/src/lib/appManagers/appSidebarRight.ts index 5456d3ca..76e27a93 100644 --- a/src/lib/appManagers/appSidebarRight.ts +++ b/src/lib/appManagers/appSidebarRight.ts @@ -289,17 +289,24 @@ class AppSidebarRight { let div = document.createElement('div'); //console.log(message, photo); - - let sizes = media.sizes || media.thumbs; - if(sizes && sizes[0].bytes) { - appPhotosManager.setAttachmentPreview(sizes[0].bytes, div, false, true); - } /* else { - this.log('no stripped size', message, media); - } */ + + let isPhoto = media._ == 'photo'; + + let photo = isPhoto ? appPhotosManager.getPhoto(media.id) : null; + if(!photo || !photo.downloaded) { + //this.log('inputMessagesFilterPhotoVideo', message, media, photo, div); + + let sizes = media.sizes || media.thumbs; + if(sizes && sizes[0].bytes) { + appPhotosManager.setAttachmentPreview(sizes[0].bytes, div, false, true); + } /* else { + this.log('no stripped size', message, media); + } */ + } //this.log('inputMessagesFilterPhotoVideo', message, media); - let load = () => appPhotosManager.preloadPhoto(media, appPhotosManager.choosePhotoSize(media, 200, 200)) + let load = () => appPhotosManager.preloadPhoto(isPhoto ? media.id : media, appPhotosManager.choosePhotoSize(media, 200, 200)) .then((blob) => { if($rootScope.selectedPeerID != peerID) { this.log.warn('peer changed'); @@ -308,13 +315,20 @@ class AppSidebarRight { let url = URL.createObjectURL(blob); this.urlsToRevoke.push(url); + + let img = new Image(); + img.src = url; + img.onload = () => { + div.style.backgroundImage = 'url(' + url + ')'; + }; - div.style.backgroundImage = 'url(' + url + ')'; + //div.style.backgroundImage = 'url(' + url + ')'; }); div.dataset.mid = '' + message.mid; - this.lazyLoadQueueSidebar.push({div, load}); + if(photo && photo.downloaded) load(); + else this.lazyLoadQueueSidebar.push({div, load}); this.lastSharedMediaDiv.append(div); if(this.lastSharedMediaDiv.childElementCount == 3) { @@ -444,9 +458,9 @@ class AppSidebarRight { } if(elemsToAppend.length) { - window.requestAnimationFrame(() => { + //window.requestAnimationFrame(() => { elemsToAppend.forEach(el => this.scroll.append(el)); - }); + //}); } if(sharedMediaDiv) { @@ -477,28 +491,37 @@ class AppSidebarRight { this.lastSharedMediaDiv = document.createElement('div'); //this.log('fillProfileElements'); - - this.profileContentEl.parentElement.scrollTop = 0; - this.profileElements.bio.style.display = 'none'; - this.profileElements.phone.style.display = 'none'; - this.profileElements.username.style.display = 'none'; - this.profileElements.notificationsRow.style.display = ''; - this.profileElements.notificationsCheckbox.checked = true; - this.profileElements.notificationsStatus.innerText = 'Enabled'; + + window.requestAnimationFrame(() => { + this.profileContentEl.parentElement.scrollTop = 0; + this.profileElements.bio.style.display = 'none'; + this.profileElements.phone.style.display = 'none'; + this.profileElements.username.style.display = 'none'; + this.profileElements.notificationsRow.style.display = ''; + this.profileElements.notificationsCheckbox.checked = true; + this.profileElements.notificationsStatus.innerText = 'Enabled'; + + Object.keys(this.sharedMedia).forEach(key => { + this.sharedMedia[key].innerHTML = ''; + + let parent = this.sharedMedia[key].parentElement; + if(!parent.querySelector('.preloader')) { + putPreloader(parent, true); + } + }); + + this.savedVirtualStates = {}; + this.prevTabID = -1; + this.scroll.setVirtualContainer(null); + (this.profileTabs.children[1] as HTMLLIElement).click(); // set media + + this.loadSidebarMedia(true); + }); this.mediaDivsByIDs = {}; this.lazyLoadQueueSidebar.clear(); - Object.keys(this.sharedMedia).forEach(key => { - this.sharedMedia[key].innerHTML = ''; - - let parent = this.sharedMedia[key].parentElement; - if(!parent.querySelector('.preloader')) { - putPreloader(parent, true); - } - }); - this.urlsToRevoke.forEach(url => { URL.revokeObjectURL(url); }); @@ -509,20 +532,18 @@ class AppSidebarRight { this.cleared[type] = true; }); - this.savedVirtualStates = {}; - this.prevTabID = -1; - this.scroll.setVirtualContainer(null); - (this.profileTabs.children[1] as HTMLLIElement).click(); // set media - let setText = (text: string, el: HTMLDivElement) => { - el.style.display = ''; - if(el.childElementCount > 1) { - el.firstElementChild.remove(); - } - - let p = document.createElement('p'); - p.innerHTML = text; - el.prepend(p); + window.requestAnimationFrame(() => { + if(el.childElementCount > 1) { + el.firstElementChild.remove(); + } + + let p = document.createElement('p'); + p.innerHTML = text; + el.prepend(p); + + el.style.display = ''; + }); }; // username diff --git a/src/lib/appManagers/appWebPagesManager.ts b/src/lib/appManagers/appWebPagesManager.ts index f0b80af1..181d1ea1 100644 --- a/src/lib/appManagers/appWebPagesManager.ts +++ b/src/lib/appManagers/appWebPagesManager.ts @@ -1,4 +1,4 @@ -import { $rootScope, safeReplaceObject, calcImageInBox, encodeEntities, copy } from "../utils"; +import { $rootScope, safeReplaceObject, copy } from "../utils"; import appPhotosManager from "./appPhotosManager"; import appDocsManager from "./appDocsManager"; import { RichTextProcessor } from "../richtextprocessor"; @@ -11,80 +11,86 @@ class AppWebPagesManager { $rootScope.$on('apiUpdate', (e: CustomEvent) => { let update = e.detail; - switch (update._) { + switch(update._) { case 'updateWebPage': - this.saveWebPage(update.webpage) - break + this.saveWebPage(update.webpage); + break; } - }) + }); } saveWebPage(apiWebPage: any, messageID?: number, mediaContext?: any) { - if (apiWebPage.photo && apiWebPage.photo._ === 'photo') { - appPhotosManager.savePhoto(apiWebPage.photo, mediaContext) + if(apiWebPage.photo && apiWebPage.photo._ === 'photo') { + appPhotosManager.savePhoto(apiWebPage.photo, mediaContext); } else { - delete apiWebPage.photo + delete apiWebPage.photo; } - if (apiWebPage.document && apiWebPage.document._ === 'document') { - appDocsManager.saveDoc(apiWebPage.document, mediaContext) + + if(apiWebPage.document && apiWebPage.document._ === 'document') { + apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext); // warning 11.04.2020 } else { - if (apiWebPage.type == 'document') { - delete apiWebPage.type + if(apiWebPage.type == 'document') { + delete apiWebPage.type; } - delete apiWebPage.document + + delete apiWebPage.document; } - var siteName = apiWebPage.site_name - var shortTitle = apiWebPage.title || apiWebPage.author || siteName || '' - if (siteName && shortTitle == siteName) { - delete apiWebPage.site_name + var siteName = apiWebPage.site_name; + var shortTitle = apiWebPage.title || apiWebPage.author || siteName || ''; + if(siteName && shortTitle == siteName) { + delete apiWebPage.site_name; } - if (shortTitle.length > 100) { - shortTitle = shortTitle.substr(0, 80) + '...' + + if(shortTitle.length > 100) { + shortTitle = shortTitle.substr(0, 80) + '...'; } - apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true}) - var contextHashtag = '' - if (siteName == 'GitHub') { - var matches = apiWebPage.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/) - if (matches) { - contextHashtag = matches[0] + '/issues/{1}' + + apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true}); + var contextHashtag = ''; + if(siteName == 'GitHub') { + var matches = apiWebPage.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/); + if(matches) { + contextHashtag = matches[0] + '/issues/{1}'; } } + // delete apiWebPage.description - var shortDescriptionText = (apiWebPage.description || '') - if (shortDescriptionText.length > 180) { - shortDescriptionText = shortDescriptionText.substr(0, 150).replace(/(\n|\s)+$/, '') + '...' + var shortDescriptionText = (apiWebPage.description || ''); + if(shortDescriptionText.length > 180) { + shortDescriptionText = shortDescriptionText.substr(0, 150).replace(/(\n|\s)+$/, '') + '...'; } apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, { contextSite: siteName || 'external', contextHashtag: contextHashtag }); - if (apiWebPage.type != 'photo' && + if(apiWebPage.type != 'photo' && apiWebPage.type != 'video' && apiWebPage.type != 'gif' && apiWebPage.type != 'document' && !apiWebPage.description && apiWebPage.photo) { - apiWebPage.type = 'photo' + apiWebPage.type = 'photo'; } - if (messageID) { - if (this.pendingWebPages[apiWebPage.id] === undefined) { - this.pendingWebPages[apiWebPage.id] = {} + if(messageID) { + if(this.pendingWebPages[apiWebPage.id] === undefined) { + this.pendingWebPages[apiWebPage.id] = {}; } - this.pendingWebPages[apiWebPage.id][messageID] = true - this.webpages[apiWebPage.id] = apiWebPage + + this.pendingWebPages[apiWebPage.id][messageID] = true; + this.webpages[apiWebPage.id] = apiWebPage; } - if (this.webpages[apiWebPage.id] === undefined) { - this.webpages[apiWebPage.id] = apiWebPage + if(this.webpages[apiWebPage.id] === undefined) { + this.webpages[apiWebPage.id] = apiWebPage; } else { - safeReplaceObject(this.webpages[apiWebPage.id], apiWebPage) + safeReplaceObject(this.webpages[apiWebPage.id], apiWebPage); } - if (!messageID && this.pendingWebPages[apiWebPage.id] !== undefined) { - var msgs = [] + if(!messageID && this.pendingWebPages[apiWebPage.id] !== undefined) { + var msgs = []; for(let msgID in this.pendingWebPages[apiWebPage.id]) { msgs.push(msgID); } @@ -92,58 +98,22 @@ class AppWebPagesManager { $rootScope.$broadcast('webpage_updated', { id: apiWebPage.id, msgs: msgs - }) + }); } } - wrapForHistory (webPageID: number) { - var webPage = copy(this.webpages[webPageID]) || {_: 'webPageEmpty'} + wrapForHistory(webPageID: number) { + var webPage = copy(this.webpages[webPageID]) || {_: 'webPageEmpty'}; - if (webPage.photo && webPage.photo.id) { - webPage.photo = appPhotosManager.wrapForHistory(webPage.photo.id, {website: webPage.type != 'photo' && webPage.type != 'video'}) + if(webPage.photo && webPage.photo.id) { + webPage.photo = appPhotosManager.wrapForHistory(webPage.photo.id, {website: webPage.type != 'photo' && webPage.type != 'video'}); } /* if (webPage.document && webPage.document.id) { webPage.document = appDocsManager.wrapForHistory(webPage.document.id) } */ // warning - return webPage - } - - wrapForFull (webPageID: number) { - var webPage = this.wrapForHistory(webPageID) - - if (!webPage.embed_url) { - return webPage - } - - var fullWidth = window.innerWidth; - var fullHeight = window.innerHeight; - - var full: any = { - width: fullWidth, - height: fullHeight - } - - if (!webPage.embed_width || !webPage.embed_height) { - full.height = full.width = Math.min(fullWidth, fullHeight) - } else { - var wh = calcImageInBox(webPage.embed_width, webPage.embed_height, fullWidth, fullHeight) - full.width = wh.w - full.height = wh.h - } - - var embedTag = Config.Modes.chrome_packed ? 'webview' : 'iframe' - - var embedType = webPage.embed_type != 'iframe' ? webPage.embed_type || 'text/html' : 'text/html' - - var embedHtml = '<' + embedTag + ' src="' + encodeEntities(webPage.embed_url) + '" type="' + encodeEntities(embedType) + '" frameborder="0" border="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="' + full.width + '" height="' + full.height + '" style="width: ' + full.width + 'px; height: ' + full.height + 'px;">' - - full.html = embedHtml; - - webPage.full = full - - return webPage + return webPage; } } diff --git a/src/lib/appManagers/appWebpManager.ts b/src/lib/appManagers/appWebpManager.ts index c3d1eab2..8305ce28 100644 --- a/src/lib/appManagers/appWebpManager.ts +++ b/src/lib/appManagers/appWebpManager.ts @@ -5,7 +5,7 @@ class AppWebpManager { public webpMachine: any = null; public loaded: Promise; public busyPromise: Promise; - public queue: {bytes: Uint8Array, img: HTMLImageElement}[] = []; + public queue: {bytes: Uint8Array, img: HTMLImageElement, callback: () => void}[] = []; //public worker: any; public webpSupport: Promise = null; @@ -56,7 +56,7 @@ class AppWebpManager { this.busyPromise = Promise.resolve(''); - let {img, bytes} = this.queue.pop(); + let {img, bytes, callback} = this.queue.pop(); if(!this.loaded) { this.loadWebpHero(); @@ -66,6 +66,7 @@ class AppWebpManager { this.busyPromise = this.convert(bytes); img.src = await this.busyPromise; + callback(); this.busyPromise = null; @@ -97,15 +98,17 @@ class AppWebpManager { return; } - const reader = new FileReader(); - reader.addEventListener('loadend', async(e) => { - // @ts-ignore - let bytes = new Uint8Array(e.srcElement.result); - - this.queue.push({bytes, img}); - this.processQueue(); + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.addEventListener('loadend', (e) => { + // @ts-ignore + let bytes = new Uint8Array(e.srcElement.result); + + this.queue.push({bytes, img, callback: resolve}); + this.processQueue(); + }); + reader.readAsArrayBuffer(blob); }); - reader.readAsArrayBuffer(blob); } } diff --git a/src/lib/bin_utils.ts b/src/lib/bin_utils.ts index 8e36c68f..6fb9c573 100644 --- a/src/lib/bin_utils.ts +++ b/src/lib/bin_utils.ts @@ -10,13 +10,6 @@ import {BigInteger, SecureRandom} from 'jsbn'; // @ts-ignore import pako from 'pako/dist/pako_inflate.min.js'; -//import { dT } from './utils.js'; - -/* import './closure_long.js'; -//var goog = window ? window.goog as any : this.goog; -var goog = typeof(window) !== 'undefined' ? window.goog : this.goog; */ - - var _logTimer = (new Date()).getTime() export function dT () { return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']' diff --git a/src/lib/crypto/crypto.js b/src/lib/crypto/crypto.js index d4567fd9..472ace38 100644 --- a/src/lib/crypto/crypto.js +++ b/src/lib/crypto/crypto.js @@ -716,14 +716,11 @@ var CryptoJS /* = this.CryptoJS = globalThis.CryptoJS */ = CryptoJS || (function */ var C_algo = C.algo = {}; - return C; -}(Math)); -module.exports = CryptoJS; -(function (undefined) { + + // X-64 // Shortcuts - var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var X32WordArray = C_lib.WordArray; @@ -1004,20 +1001,11 @@ module.exports = CryptoJS; return clone; } }); -}()); -/* -CryptoJS v3.1.2 -code.google.com/p/crypto-js -(c) 2009-2013 by Jeff Mott. All rights reserved. -code.google.com/p/crypto-js/wiki/License -*/ -/** - * Cipher core components. - */ -CryptoJS.lib.Cipher || (function (undefined) { + + // CIPHER + // Shortcuts - var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; @@ -1979,20 +1967,13 @@ CryptoJS.lib.Cipher || (function (undefined) { return plaintext; } }); -}()); -/* -CryptoJS v3.1.2 -code.google.com/p/crypto-js -(c) 2009-2013 by Jeff Mott. All rights reserved. -code.google.com/p/crypto-js/wiki/License -*/ -(function () { + + // AES // Shortcuts - var C = CryptoJS; var C_lib = C.lib; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; @@ -2196,192 +2177,8 @@ code.google.com/p/crypto-js/wiki/License * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); */ C.AES = BlockCipher._createHelper(AES); -}()); - - - -/* -CryptoJS v3.1.2 -code.google.com/p/crypto-js -(c) 2009-2013 by Jeff Mott. All rights reserved. -code.google.com/p/crypto-js/wiki/License -*/ -(function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Initialization and round constants tables - var H = []; - var K = []; - - // Compute constants - (function () { - function isPrime(n) { - var sqrtN = Math.sqrt(n); - for (var factor = 2; factor <= sqrtN; factor++) { - if (!(n % factor)) { - return false; - } - } - - return true; - } - function getFractionalBits(n) { - return ((n - (n | 0)) * 0x100000000) | 0; - } - - var n = 2; - var nPrime = 0; - while (nPrime < 64) { - if (isPrime(n)) { - if (nPrime < 8) { - H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); - } - K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); - - nPrime++; - } - - n++; - } - }()); - - // Reusable object - var W = []; - - /** - * SHA-256 hash algorithm. - */ - var SHA256 = C_algo.SHA256 = Hasher.extend({ - _doReset: function () { - this._hash = new WordArray.init(H.slice(0)); - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var H = this._hash.words; - - // Working variables - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - var f = H[5]; - var g = H[6]; - var h = H[7]; - - // Computation - for (var i = 0; i < 64; i++) { - if (i < 16) { - W[i] = M[offset + i] | 0; - } else { - var gamma0x = W[i - 15]; - var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ - ((gamma0x << 14) | (gamma0x >>> 18)) ^ - (gamma0x >>> 3); - - var gamma1x = W[i - 2]; - var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ - ((gamma1x << 13) | (gamma1x >>> 19)) ^ - (gamma1x >>> 10); - - W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; - } - - var ch = (e & f) ^ (~e & g); - var maj = (a & b) ^ (a & c) ^ (b & c); - - var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); - var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); - - var t1 = h + sigma1 + ch + K[i] + W[i]; - var t2 = sigma0 + maj; - - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - - // Intermediate hash value - H[0] = (H[0] + a) | 0; - H[1] = (H[1] + b) | 0; - H[2] = (H[2] + c) | 0; - H[3] = (H[3] + d) | 0; - H[4] = (H[4] + e) | 0; - H[5] = (H[5] + f) | 0; - H[6] = (H[6] + g) | 0; - H[7] = (H[7] + h) | 0; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Return final computed hash - return this._hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA256('message'); - * var hash = CryptoJS.SHA256(wordArray); - */ - C.SHA256 = Hasher._createHelper(SHA256); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA256(message, key); - */ - C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + return C; }(Math)); + +module.exports = CryptoJS; diff --git a/src/lib/crypto/crypto_utils.ts b/src/lib/crypto/crypto_utils.ts index 801c87b7..80aad7f9 100644 --- a/src/lib/crypto/crypto_utils.ts +++ b/src/lib/crypto/crypto_utils.ts @@ -1,4 +1,5 @@ import sha1 from '@cryptography/sha1'; +import sha256 from '@cryptography/sha256'; import {str2bigInt, bpe, equalsInt, greater, copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero, @@ -16,6 +17,21 @@ export function bytesFromLeemonBigInt(bigInt: BigInteger) { return bytesFromHex(str); } +export function bytesToWordss(input: ArrayBuffer | Uint8Array) { + let bytes: Uint8Array; + if(input instanceof ArrayBuffer) bytes = new Uint8Array(input); + else bytes = input; + + var len = bytes.length; + var words: number[] = []; + var i; + for(i = 0; i < len; i++) { + words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8); + } + + return new Uint32Array(words); +} + export function bytesToWords(bytes: any) { if(bytes instanceof ArrayBuffer) { bytes = new Uint8Array(bytes); @@ -46,23 +62,30 @@ export function sha1HashSync(bytes: number[] | ArrayBuffer | Uint8Array) { return new Uint8Array(hashBytes); } -export function sha256HashSync(bytes: any) { - // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length) - var hashWords = CryptoJS.SHA256(bytesToWords(bytes)); - // console.log(dT(), 'SHA-2 hash finish') +export function sha256HashSync(bytes: Uint8Array | ArrayBuffer) { + //console.log(dT(), 'SHA-256 hash start'); - var hashBytes = bytesFromWords(hashWords); + let words = bytesToWordss(bytes); + let hash = sha256(words); - return hashBytes; + // bytesFromWords below + var o = []; + for(var i = 0; i < hash.length * 4; i++) { + o.push((hash[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff); + } + + //console.log(dT(), 'SHA-256 hash finish'); + + return o; } -export function aesEncryptSync(bytes: any, keyBytes: any, ivBytes: any, _mode = 'IGE') { +export function aesEncryptSync(bytes: any, keyBytes: any, ivBytes: any) { // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/) // console.log('aes before padding bytes:', bytesToHex(bytes)); bytes = addPadding(bytes); // console.log('aes after padding bytes:', bytesToHex(bytes)); - let mode = CryptoJS.mode[_mode]; + let mode = CryptoJS.mode.IGE; let encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), { iv: bytesToWords(ivBytes), @@ -76,9 +99,9 @@ export function aesEncryptSync(bytes: any, keyBytes: any, ivBytes: any, _mode = return encryptedBytes; } -export function aesDecryptSync(encryptedBytes: any, keyBytes: any, ivBytes: any, _mode = 'IGE') { +export function aesDecryptSync(encryptedBytes: any, keyBytes: any, ivBytes: any) { - let mode = CryptoJS.mode[_mode]; + let mode = CryptoJS.mode.IGE; // console.log(dT(), 'AES decrypt start', encryptedBytes.length) var decryptedWords = CryptoJS.AES.decrypt({ciphertext: bytesToWords(encryptedBytes)}, bytesToWords(keyBytes), { iv: bytesToWords(ivBytes), @@ -98,11 +121,6 @@ export function rsaEncrypt(publicKey: {modulus: string, exponent: string}, bytes bytes = addPadding(bytes, 255); - /* var N = new BigInteger(publicKey.modulus, 16); - var E = new BigInteger(publicKey.exponent, 16); - var X = new BigInteger(bytes); - var encryptedBigInt = X.modPowInt(E, N), - encryptedBytes = bytesFromBigInt(encryptedBigInt, 256); */ var N = str2bigInt(publicKey.modulus, 16); var E = str2bigInt(publicKey.exponent, 16); var X = str2bigInt(bytesToHex(bytes), 16); @@ -110,7 +128,7 @@ export function rsaEncrypt(publicKey: {modulus: string, exponent: string}, bytes var encryptedBigInt = powMod(X, E, N); var encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16)); - console.log(dT(), 'RSA encrypt finish'/* , encryptedBytes *//* , bigInt2str(encryptedBigInt, 16) */); + console.log(dT(), 'RSA encrypt finish'); return encryptedBytes; } @@ -172,162 +190,11 @@ export function pqPrimeFactorization(pqBytes: any) { console.error('Pq leemon Exception', e); } - /* if(result === false && what.bitLength() <= 64) { - console.time('PQ long'); - try { - result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16)); - } catch (e) { - console.error('Pq long Exception', e); - } - console.timeEnd('PQ long'); - } - // console.log(result) - - if(result === false) { - console.time('pq BigInt'); - result = pqPrimeBigInteger(what); - console.timeEnd('pq BigInt'); - } */ - console.log(dT(), 'PQ finish'); return result; } -/* export function pqPrimeBigInteger(what: any) { - var it = 0, - g; - for(var i = 0; i < 3; i++) { - var q = (nextRandomInt(128) & 15) + 17; - var x = bigint(nextRandomInt(1000000000) + 1); - var y = x.clone(); - var lim = 1 << (i + 18); - - for(var j = 1; j < lim; j++) { - ++it; - var a = x.clone(); - var b = x.clone(); - var c = bigint(q); - - while(!b.equals(BigInteger.ZERO)) { - if(!b.and(BigInteger.ONE).equals(BigInteger.ZERO)) { - c = c.add(a); - if(c.compareTo(what) > 0) { - c = c.subtract(what); - } - } - a = a.add(a); - if(a.compareTo(what) > 0) { - a = a.subtract(what); - } - b = b.shiftRight(1); - } - - x = c.clone(); - var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y); - g = z.gcd(what); - if(!g.equals(BigInteger.ONE)) { - break; - } - if((j & (j - 1)) == 0) { - y = x.clone(); - } - } - if(g.compareTo(BigInteger.ONE) > 0) { - break; - } - } - - var f = what.divide(g), P, Q; - - if(g.compareTo(f) > 0) { - P = f; - Q = g; - } else { - P = g; - Q = f; - } - - return [bytesFromBigInt(P), bytesFromBigInt(Q), it]; -} */ - -/* export function gcdLong(a: any, b: any) { - while(a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) { - while(b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) { - b = b.shiftRight(1); - } - - while(a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) { - a = a.shiftRight(1); - } - - if(a.compare(b) > 0) { - a = a.subtract(b); - } else { - b = b.subtract(a); - } - } - - return b.equals(goog.math.Long.ZERO) ? a : b; -} */ - -/* export function pqPrimeLong(what: any) { - var it = 0, - g; - for (var i = 0; i < 3; i++) { - var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17); - var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1); - var y = x; - var lim = 1 << (i + 18); - - for(var j = 1; j < lim; j++) { - ++it; - var a = x; - var b = x; - var c = q; - - while(b.notEquals(goog.math.Long.ZERO)) { - if(b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) { - c = c.add(a); - if (c.compare(what) > 0) { - c = c.subtract(what); - } - } - a = a.add(a); - if(a.compare(what) > 0) { - a = a.subtract(what); - } - b = b.shiftRight(1); - } - - x = c; - var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y); - g = gcdLong(z, what); - if(g.notEquals(goog.math.Long.ONE)) { - break; - } - if((j & (j - 1)) == 0) { - y = x; - } - } - if(g.compare(goog.math.Long.ONE) > 0) { - break; - } - } - - var f = what.div(g), P, Q; - - if(g.compare(f) > 0) { - P = f; - Q = g; - } else { - P = g; - Q = f; - } - - return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it]; -} */ - export function pqPrimeLeemon(what: any) { var minBits = 64; var minLen = Math.ceil(minBits / bpe) + 1; diff --git a/src/lib/crypto/cryptoworker.ts b/src/lib/crypto/cryptoworker.ts index 070daf49..88b5973c 100644 --- a/src/lib/crypto/cryptoworker.ts +++ b/src/lib/crypto/cryptoworker.ts @@ -22,11 +22,6 @@ class CryptoWorker { private pending: Array = []; private debug = false; - // @ts-ignore - // private webCrypto = Config.Modes.webcrypto && window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle); /* || window.msCrypto && window.msCrypto.subtle*/ - // private useSha1Crypto = this.webCrypto && this.webCrypto.digest !== undefined; - // private useSha256Crypto = this.webCrypto && this.webCrypto.digest !== undefined; - constructor() { console.log(dT(), 'CW constructor'); @@ -96,57 +91,18 @@ class CryptoWorker { //if(this.webWorker) { return this.performTaskWorker('sha1-hash', bytes); //} - - /* if(this.useSha1Crypto) { - console.error('usesha1crypto'); - // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one. webCrypto.digest supports typed array - return new Promise((resolve, reject) => { - var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes; - // console.log(dT(), 'Native sha1 start') - - this.webCrypto.digest({name: 'SHA-1'}, bytesTyped).then((digest: ArrayBuffer) => { - // console.log(dT(), 'Native sha1 done') - resolve(digest); - }, (e: ErrorEvent) => { - console.error('Crypto digest error', e); - this.useSha1Crypto = false; - resolve(sha1HashSync(bytes)); - }) - }); - } - - return Promise.resolve(sha1HashSync(bytes)); */ } public sha256Hash(bytes: any) { //if(this.webWorker) { return this.performTaskWorker('sha256-hash', bytes); //} - - /* if(this.useSha256Crypto) { - return new Promise((resolve, reject) => { - var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes; - // console.log(dT(), 'Native sha1 start') - this.webCrypto.digest({name: 'SHA-256'}, bytesTyped).then((digest: ArrayBuffer) => { - // console.log(dT(), 'Native sha1 done') - resolve(digest); - }, (e: ErrorEvent) => { - console.error('Crypto digest error', e); - this.useSha256Crypto = false; - resolve(sha256HashSync(bytes)); - }) - }); - } - - return Promise.resolve(sha256HashSync(bytes)); */ } public pbkdf2(buffer: Uint8Array, salt: Uint8Array, iterations: number) { //if(this.webWorker) { return this.performTaskWorker('pbkdf2', buffer, salt, iterations); //} - - //return hash_pbkdf2(buffer, salt, iterations); } public aesEncrypt(bytes: any, keyBytes: any, ivBytes: any) { @@ -154,8 +110,6 @@ class CryptoWorker { return this.performTaskWorker('aes-encrypt', convertToArrayBuffer(bytes), convertToArrayBuffer(keyBytes), convertToArrayBuffer(ivBytes)); //} - - //return Promise.resolve(convertToArrayBuffer(aesEncryptSync(bytes, keyBytes, ivBytes))); } public aesDecrypt(encryptedBytes: any, keyBytes: any, ivBytes: any): Promise { @@ -164,8 +118,6 @@ class CryptoWorker { encryptedBytes, keyBytes, ivBytes) .then(bytes => convertToArrayBuffer(bytes)); //} - - //return Promise.resolve(convertToArrayBuffer(aesDecryptSync(encryptedBytes, keyBytes, ivBytes))); } public rsaEncrypt(publicKey: {modulus: string, exponent: string}, bytes: any): Promise { @@ -178,29 +130,21 @@ class CryptoWorker { //if(this.webWorker) { return this.performTaskWorker<[number[], number[], number]>('factorize', bytes); //} - - //return Promise.resolve(pqPrimeFactorization(bytes)); } public modPow(x: any, y: any, m: any) { //if(this.webWorker) { return this.performTaskWorker('mod-pow', x, y, m); //} - - //return Promise.resolve(bytesModPow(x, y, m)); } public gzipUncompress(bytes: ArrayBuffer, toString?: boolean) { //if(this.webWorker) { return this.performTaskWorker('unzip', bytes, toString); //} - - //return Promise.resolve(gzipUncompress(bytes, toString) as T); } } const cryptoWorker = new CryptoWorker(); - (window as any).CryptoWorker = cryptoWorker; - export default cryptoWorker; diff --git a/src/lib/idb.ts b/src/lib/idb.ts index 43f87d26..992a48bb 100644 --- a/src/lib/idb.ts +++ b/src/lib/idb.ts @@ -254,6 +254,48 @@ class IdbFileStorage { }); } + public getAllKeys(): Promise> { + console.time('getAllEntries'); + return this.openDatabase().then((db) => { + // @ts-ignore + var objectStore = db.transaction([this.dbStoreName], IDBTransaction.READ || 'readonly') + .objectStore(this.dbStoreName); + var request = objectStore.getAllKeys(); + + return new Promise((resolve, reject) => { + request.onsuccess = function(event) { + // @ts-ignore + var result = event.target.result; + resolve(result); + console.timeEnd('getAllEntries'); + } + + request.onerror = reject; + }); + }); + } + + public isFileExists(fileName: string): Promise { + console.time('isFileExists'); + return this.openDatabase().then((db) => { + // @ts-ignore + var objectStore = db.transaction([this.dbStoreName], IDBTransaction.READ || 'readonly') + .objectStore(this.dbStoreName); + var request = objectStore.openCursor(fileName); + + return new Promise((resolve, reject) => { + request.onsuccess = function(event) { + // @ts-ignore + var cursor = event.target.result; + resolve(!!cursor); + console.timeEnd('isFileExists'); + } + + request.onerror = reject; + }); + }); + } + public getFileWriter(fileName: string, mimeType: string) { var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob: any) => { this.saveFile(fileName, blob); diff --git a/src/lib/lottie.ts b/src/lib/lottie.ts new file mode 100644 index 00000000..07e3f68f --- /dev/null +++ b/src/lib/lottie.ts @@ -0,0 +1,4 @@ +// @ts-ignore +import LottiePlayer from "lottie-web/build/player/lottie_canvas.min.js"; + +(window as any).lottie = LottiePlayer; \ No newline at end of file diff --git a/src/lib/lottieLoader.ts b/src/lib/lottieLoader.ts index 7ebcd1d4..e4ef2526 100644 --- a/src/lib/lottieLoader.ts +++ b/src/lib/lottieLoader.ts @@ -1,14 +1,11 @@ -//import LottiePlayer, { AnimationConfigWithPath, AnimationConfigWithData, AnimationItem } from "lottie-web"; -// @ts-ignore -import LottiePlayer, { AnimationConfigWithPath, AnimationConfigWithData, AnimationItem } from "lottie-web/build/player/lottie_canvas.min.js"; -//import LottiePlayer, { AnimationConfigWithPath, AnimationConfigWithData, AnimationItem } from "lottie-web/build/player/lottie_light.min.js"; import { isElementInViewport, isInDOM } from "./utils"; +import LottiePlayer, { AnimationConfigWithPath, AnimationConfigWithData, AnimationItem } from "lottie-web/build/player/lottie.d"; class LottieLoader { - public lottie: /* any */ typeof LottiePlayer = null; + private lottie: /* any */ typeof LottiePlayer = null; private animations: { [group: string]: { - animation: AnimationItem, + animation: /* any */AnimationItem, container: HTMLDivElement, paused: boolean, autoplay: boolean, @@ -16,6 +13,28 @@ class LottieLoader { }[] } = {}; private debug = false; + public loaded: Promise; + private lastTimeLoad = 0; + private waitingTimeouts = 0; + + public loadLottie() { + if(this.loaded) return this.loaded; + + this.loaded = new Promise((resolve, reject) => { + (window as any).lottieLoaded = () => { + console.log('lottie loaded'); + this.lottie = (window as any).lottie; + resolve(); + }; + + let sc = document.createElement('script'); + sc.src = 'npm.lottie-web.chunk.js'; + sc.async = true; + sc.onload = (window as any).lottieLoaded; + + document.body.appendChild(sc); + }); + } public checkAnimations(blurred?: boolean, group?: string, destroy = false) { let groups = group ? [group] : Object.keys(this.animations); @@ -33,6 +52,13 @@ class LottieLoader { for(let i = length - 1; i >= 0; --i) { let {animation, container, paused, autoplay, canvas} = animations[i]; + if(destroy && !isInDOM(container)) { + this.debug && console.log('destroy animation'); + animation.destroy(); + animations.splice(i, 1); + continue; + } + if(canvas) { let c = container.firstElementChild as HTMLCanvasElement; if(!c.height && !c.width && isElementInViewport(container)) { @@ -41,16 +67,9 @@ class LottieLoader { } } - if(destroy && !isInDOM(container)) { - this.debug && console.log('destroy animation'); - animation.destroy(); - animations.splice(i, 1); - continue; - } - if(!autoplay) continue; - if(!isElementInViewport(container) || blurred) { + if(blurred || !isElementInViewport(container)) { if(!paused) { this.debug && console.log('pause animation', isElementInViewport(container), container); animation.pause(); @@ -66,16 +85,10 @@ class LottieLoader { } public async loadAnimation(params: /* any */AnimationConfigWithPath | AnimationConfigWithData, group = '') { - /* if(!this.lottie) { - this.lottie = (await import( - 'lottie-web')).default; - this.lottie.setQuality('low'); - } */ - //params.autoplay = false; params.renderer = 'canvas'; params.rendererSettings = { - //context: canvasContext, // the canvas context + //context: context, // the canvas context //preserveAspectRatio: 'xMinYMin slice', // Supports the same options as the svg element's preserveAspectRatio property clearCanvas: true, progressiveLoad: true, // Boolean, only svg renderer, loads dom elements when needed. Might speed up initialization for large number of elements. @@ -83,12 +96,27 @@ class LottieLoader { }; if(!this.lottie) { - this.lottie = LottiePlayer; - //this.lottie.setQuality('low'); - this.lottie.setQuality(10); + if(!this.loaded) this.loadLottie(); + await this.loaded; + + this.lottie.setQuality('low'); + //this.lottie.setQuality(10); + } + + let time = Date.now(); + let diff = time - this.lastTimeLoad; + let delay = 150; + if(diff < delay) { + delay *= ++this.waitingTimeouts; + console.log('lottieloader delay:', delay); + //await new Promise((resolve) => setTimeout(resolve, delay)); + this.waitingTimeouts--; } let animation = this.lottie.loadAnimation(params); + + this.lastTimeLoad = Date.now(); + if(!this.animations[group]) this.animations[group] = []; this.animations[group].push({ animation, @@ -101,7 +129,7 @@ class LottieLoader { if(params.autoplay) { this.checkAnimations(); } - + return animation; } diff --git a/src/lib/mtproto/apiFileManager.ts b/src/lib/mtproto/apiFileManager.ts index 4aea2d5a..202725d0 100644 --- a/src/lib/mtproto/apiFileManager.ts +++ b/src/lib/mtproto/apiFileManager.ts @@ -6,8 +6,6 @@ import apiManager from "./apiManager"; import { logger, deferredPromise, CancellablePromise } from "../polyfill"; export class ApiFileManager { - public cachedFs = false; - public cachedFsPromise = false; public cachedSavePromises: { [fileName: string]: Promise } = {}; @@ -18,6 +16,9 @@ export class ApiFileManager { [fileName: string]: any } = {}; + /* public indexedKeys: Set = new Set(); + private keysLoaded = false; */ + public downloadPulls: { [x: string]: Array<{ cb: () => Promise, @@ -93,8 +94,8 @@ export class ApiFileManager { var fileName = (location.file_name as string || '').split('.'); var ext: string = fileName[fileName.length - 1] || ''; - if(location.stickerType == 1 /* && !WebpManager.isWebpSupported() */) { // warning - ext += 'webp'; /* 'png'; */ + if(location.stickerType == 1) { + ext += 'webp'; } else if(location.stickerType == 2) { ext += 'tgs'; } @@ -109,13 +110,13 @@ export class ApiFileManager { var ext: string = 'jpg'; if(location.stickerType == 1) { - ext = 'webp'/* WebpManager.isWebpSupported() ? 'webp' : 'png'*/; + ext = 'webp'; } else if(location.stickerType == 2) { ext += 'tgs'; } if(location.volume_id) { - return location.volume_id + '_' + location.local_id /* + '_' + location.secret */ + '.' + ext; + return location.volume_id + '_' + location.local_id + '.' + ext; } else { return location.id + '_' + location.access_hash + '.' + ext; } @@ -138,19 +139,16 @@ export class ApiFileManager { } public getFileStorage(): typeof IdbFileStorage { - if(!Config.Modes.memory_only) { - /* if(TmpfsFileStorage.isAvailable()) { - return TmpfsFileStorage; - } */ - - if(IdbFileStorage.isAvailable()) { - return IdbFileStorage; - } - } - - return IdbFileStorage/* MemoryFileStorage */; + return IdbFileStorage; } + /* public isFileExists(location: any) { + var fileName = this.getFileName(location); + + return this.cachedDownloads[fileName] || this.indexedKeys.has(fileName); + //return this.cachedDownloads[fileName] || this.indexedKeys.has(fileName) ? Promise.resolve(true) : this.getFileStorage().isFileExists(fileName); + } */ + public saveSmallFile(location: any, bytes: Uint8Array) { var fileName = this.getFileName(location); @@ -172,6 +170,10 @@ export class ApiFileManager { return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'}); } + /* if(!this.keysLoaded) { + this.getIndexedKeys(); + } */ + //this.log('downloadSmallFile', location, options); let dcID = options.dcID || location.dc_id; @@ -243,6 +245,14 @@ export class ApiFileManager { return fileStorage.getFile(fileName, size); } + /* public getIndexedKeys() { + this.keysLoaded = true; + this.getFileStorage().getAllKeys().then(keys => { + this.indexedKeys.clear(); + this.indexedKeys = new Set(keys); + }); + } */ + public downloadFile(dcID: number, location: any, size: number, options: { mimeType?: string, dcID?: number, @@ -253,14 +263,8 @@ export class ApiFileManager { return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'}); } - /* var processSticker = false; - if(location.sticker && !WebpManager.isWebpSupported()) { - if(options.toFileEntry || size > 524288) { - delete location.sticker; - } else { - processSticker = true; - options.mime = 'image/png'; - } + /* if(!this.keysLoaded) { + this.getIndexedKeys(); } */ // this.log('Dload file', dcID, location, size) @@ -273,8 +277,6 @@ export class ApiFileManager { if(cachedPromise) { if(toFileEntry) { - /* let blob = await cachedPromise; - return FileManager.copy(blob, toFileEntry) as Promise; */ return cachedPromise.then((blob: any) => { return FileManager.copy(blob, toFileEntry); }); @@ -283,13 +285,6 @@ export class ApiFileManager { //this.log('downloadFile cachedPromise'); if(size) { - /* let blob = await cachedPromise; - if(blob.size < size) { - this.log('downloadFile need to deleteFile, wrong size:', blob.size, size); - await this.deleteFile(location); - } else { - return cachedPromise; - } */ return cachedPromise.then((blob: Blob) => { if(blob.size < size) { this.log('downloadFile need to deleteFile, wrong size:', blob.size, size); @@ -300,7 +295,6 @@ export class ApiFileManager { return this.downloadFile(dcID, location, size, options); }); } else { - //return cachedPromise; return blob; } }); @@ -309,13 +303,8 @@ export class ApiFileManager { } } - //this.log('arriba'); - - //var deferred = $q.defer() let deferred = deferredPromise(); - //return; - var canceled = false; var resolved = false; var mimeType = options.mimeType || 'image/jpeg', @@ -345,7 +334,6 @@ export class ApiFileManager { } else { deferred.resolve(this.cachedDownloads[fileName] = blob); } - //}, () => { }).catch(() => { //this.log('not i wanted'); //var fileWriterPromise = toFileEntry ? FileManager.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType); @@ -496,7 +484,6 @@ export class ApiFileManager { var totalParts = Math.ceil(fileSize / partSize); var fileID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)]; - //var deferred = $q.defer(); var _part = 0, resultInputFile = { @@ -507,23 +494,6 @@ export class ApiFileManager { md5_checksum: '' }; - /* let deferred: { - then?: any, - resolve?: (input: typeof resultInputFile) => void, - reject?: (error: any) => void, - promise?: any, - - cancel?: () => void, - notify?: (details: {done: number, total: number}) => void - } = { - - }; - - deferred.promise = new Promise((resolve, reject) => { - deferred.resolve = resolve; - deferred.reject = reject; - }); */ - let deferredHelper: { resolve?: (input: typeof resultInputFile) => void, reject?: (error: any) => void, @@ -538,7 +508,6 @@ export class ApiFileManager { deferredHelper.resolve = resolve; deferredHelper.reject = reject; - //return Promise.resolve(); }); Object.assign(deferred, deferredHelper); diff --git a/src/lib/mtproto/authorizer.ts b/src/lib/mtproto/authorizer.ts index cb69b733..e7ce5a92 100644 --- a/src/lib/mtproto/authorizer.ts +++ b/src/lib/mtproto/authorizer.ts @@ -408,7 +408,8 @@ export class Authorizer { var gBytes = bytesFromHex(auth.g.toString(16)); auth.b = new Array(256); - MTProto.secureRandom.nextBytes(auth.b); + auth.b = [...new Uint8Array(auth.b.length).randomize()]; + //MTProto.secureRandom.nextBytes(auth.b); try { var gB = await CryptoWorker.modPow(gBytes, auth.b, auth.dhPrime); diff --git a/src/lib/mtproto/mtproto.ts b/src/lib/mtproto/mtproto.ts index a09d07a6..74eb0376 100644 --- a/src/lib/mtproto/mtproto.ts +++ b/src/lib/mtproto/mtproto.ts @@ -54,14 +54,9 @@ export class TelegramMeWebService { export const telegramMeWebService = new TelegramMeWebService(); -// @ts-ignore -import {SecureRandom} from 'jsbn'; - export namespace MTProto { //$($window).on('click keydown', rng_seed_time); // WARNING! - export const secureRandom = new SecureRandom(); - export const passwordManager = PasswordManager; export const dcConfigurator = DcConfigurator; export const rsaKeysManager = RSAKeysManager; @@ -73,4 +68,4 @@ export namespace MTProto { export const serverTimeManager = ServerTimeManager; } -//(window as any).MTProto = MTProto; +(window as any).MTProto = MTProto; diff --git a/src/lib/mtproto/networker.ts b/src/lib/mtproto/networker.ts index 4ccb2d19..fae0b9eb 100644 --- a/src/lib/mtproto/networker.ts +++ b/src/lib/mtproto/networker.ts @@ -128,7 +128,8 @@ class MTPNetworker { this.seqNo = 0; this.prevSessionID = this.sessionID; this.sessionID = new Array(8); - MTProto.secureRandom.nextBytes(this.sessionID); + this.sessionID = [...new Uint8Array(this.sessionID.length).randomize()]; + //MTProto.secureRandom.nextBytes(this.sessionID); } public setupMobileSleep() { @@ -789,7 +790,8 @@ class MTPNetworker { var paddingLength = (16 - (data.offset % 16)) + 16 * (1 + nextRandomInt(5)); var padding = new Array(paddingLength); - MTProto.secureRandom.nextBytes(padding); + padding = [...new Uint8Array(padding.length).randomize()]; + //MTProto.secureRandom.nextBytes(padding); var dataWithPadding = bufferConcat(dataBuffer, padding); // this.log('Adding padding', dataBuffer, padding, dataWithPadding) diff --git a/src/lib/polyfill.ts b/src/lib/polyfill.ts index 764f40a6..712a20fd 100644 --- a/src/lib/polyfill.ts +++ b/src/lib/polyfill.ts @@ -1,5 +1,8 @@ import { bytesToHex, bytesFromHex, dT, bufferConcats } from "./bin_utils"; -import { MTProto } from "./mtproto/mtproto"; +// @ts-ignore +import {SecureRandom} from 'jsbn'; + +export const secureRandom = new SecureRandom(); export function logger(prefix: string) { function Log(...args: any[]) { @@ -69,7 +72,7 @@ Object.defineProperty(Uint8Array.prototype, 'hex', { }); Uint8Array.prototype.randomize = function() { - MTProto.secureRandom.nextBytes(this); + secureRandom.nextBytes(this); return this; }; diff --git a/src/lib/webp.ts b/src/lib/webp.ts index 9b02a281..23794367 100644 --- a/src/lib/webp.ts +++ b/src/lib/webp.ts @@ -1,4 +1,3 @@ - import {Webp} from "webp-hero/libwebp/dist/webp.js" import {detectWebpSupport} from "webp-hero/dist/detect-webp-support.js" @@ -30,22 +29,21 @@ export class WebpMachine { * Decode raw webp data into a png data url */ async decode(webpData: Uint8Array): Promise { - if (this.busy) throw new WebpMachineError("cannot decode when already busy") - this.busy = true + if(this.busy) throw new WebpMachineError("cannot decode when already busy"); + this.busy = true; try { - await relax() - const canvas = document.createElement("canvas") - this.webp.setCanvas(canvas) - this.webp.webpToSdl(webpData, webpData.length) - this.busy = false - return canvas.toDataURL() - } - catch (error) { - this.busy = false - error.name = WebpMachineError.name - error.message = `failed to decode webp image: ${error.message}` - throw error + await relax(); + const canvas = document.createElement("canvas"); + this.webp.setCanvas(canvas); + this.webp.webpToSdl(webpData, webpData.length); + this.busy = false; + return canvas.toDataURL(); + } catch(error) { + this.busy = false; + error.name = WebpMachineError.name; + error.message = `failed to decode webp image: ${error.message}`; + throw error; } } } diff --git a/src/scss/partials/_chat.scss b/src/scss/partials/_chat.scss index f7384a5b..0cdb7c9f 100644 --- a/src/scss/partials/_chat.scss +++ b/src/scss/partials/_chat.scss @@ -7,7 +7,8 @@ overflow: hidden; flex-direction: column; position: relative; - background-image: url('../../../public/assets/img/camomile.jpg'); + /* background-image: url('../../../public/assets/img/camomile.jpg'); */ + background-image: url('../../../public/assets/img/camomile_blurred.jpg'); background-size: cover; background-position: center center; @@ -120,6 +121,8 @@ bottom: 0; left: 0; + display: flex; // for end + /* display: flex; flex-direction: column; justify-content: flex-end; */ @@ -155,6 +158,7 @@ box-sizing: border-box; /* min-height: 100%; */ justify-content: flex-end; + flex: 1; &.is-chat { .is-in .bubble__container { @@ -237,6 +241,10 @@ &.service { display: block; padding: 1rem 0; + + .bubble__container { + max-width: 100%; + } } &.forwarded { @@ -264,8 +272,12 @@ } } + /* &.is-group-first { + padding-top: 10px; + } */ + &.is-group-last { - padding-bottom: 2.5px; + padding-bottom: 5px; } &:not(.forwarded) { @@ -328,6 +340,7 @@ height: 18px; width: 18px; margin: 0 .05rem; + vertical-align: bottom; } span.emoji { @@ -738,7 +751,8 @@ &__container > .name { /* padding: .2675rem .6rem 0 .6rem; */ - padding: .32rem .6rem 0 .6rem; + /* padding: .32rem .6rem 0 .6rem; */ + padding: 5px .6rem 0 .6rem; font-weight: 500; /* padding-bottom: 4px; */ color: $darkblue; diff --git a/src/scss/partials/_rightSIdebar.scss b/src/scss/partials/_rightSIdebar.scss index c5cb18ff..23106583 100644 --- a/src/scss/partials/_rightSIdebar.scss +++ b/src/scss/partials/_rightSIdebar.scss @@ -185,7 +185,7 @@ background-position: center center; display: flex; - background-color: #cecece; + //background-color: #000; justify-content: center; align-items: center; diff --git a/src/scss/style.scss b/src/scss/style.scss index 423d5352..da45de98 100644 --- a/src/scss/style.scss +++ b/src/scss/style.scss @@ -29,8 +29,8 @@ $bg: #ffffff; $text-size: 16px; $time-size: 12px; -//$large-screen: 1680px; -$large-screen: 16800px; +$large-screen: 1680px; +//$large-screen: 16800px; @import "partials/ico"; @import "partials/chatlist"; @@ -66,15 +66,6 @@ button, input, optgroup, select, textarea, html { //min-width: 100%; margin: 0 auto; max-width: $large-screen; - - @media (min-width: $large-screen) { - border-top-width: 0; - border-bottom-width: 0; - border-left-width: 1px; - border-right-width: 1px; - border-style: solid; - border-color: #DADCE0; - } } .disable-hover, @@ -336,84 +327,47 @@ input { position: absolute; top: 0; left: 0; + bottom: 0; + right: 0; width: 100%; height: 100%; overflow: hidden; background: transparent; border-radius: inherit; -} - -.c-ripple__circle { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - opacity: 0; - width: 0; - height: 0; - border-radius: 50%; - /* background: rgba(255, 255, 255, 0.25); */ - background: rgba(112, 117, 121, .08); -} -.c-ripple.active .c-ripple__circle { - //-webkit-animation: a-ripple 750ms ease-in; - //animation: a-ripple 750ms ease-in-out; - will-change: padding-bottom, width, opacity; - -webkit-animation: a-ripple 625ms ease-in-out; - animation: a-ripple 625ms ease-in-out; -} -/** - * Animation: Ripple - * -------------------------------------------------- - */ -@-webkit-keyframes a-ripple { - 0% { - opacity: 0; - //opacity: 1; - } - 25% { - opacity: 1; + &__circle { + background-color: rgba(0,0,0,.08); + display: block; + position: absolute; + transform: scale(0); + border-radius: 50%; + animation: ripple-effect .7s forwards; + transition: .35s opacity; + overflow: hidden; } - 100% { - width: 200%; - padding-bottom: 200%; + + &__circle.hiding { opacity: 0; } } -@keyframes a-ripple { + +@keyframes ripple-effect { 0% { - opacity: 0; - //opacity: 1; + //transform: translate(-50%, -50%) scale(0); + transform: scale(0); } - 25% { + + /* 50% { opacity: 1; - } - 100% { - width: 200%; - padding-bottom: 200%; - opacity: 0; - } -} + } */ -/* .ripple { - background-color: rgba(112, 117, 121, .08); - width: 1rem; - height: 1rem; - position: absolute; - border-radius: 50%; - transform: translateX(-100%) translateY(-100%); - mix-blend-mode: screen; - animation: ripple 750ms ease-out forwards; + to { + transform: scale(2); + //transform: translate(-50%, -50%) scale(2); + //opacity: 0; + } } -@keyframes ripple { - 0% { transform: translate(-100%, -100%); } - 80% { transform: translate(-100%, -100%) scale(50); } - 100% { transform: translate(-100%, -100%) scale(50); } -} */ - .document { padding-left: 4.5rem; height: 70px; @@ -810,6 +764,10 @@ input { font-size: 24px; line-height: 1; } + + .scrollable { + position: relative; + } } .phone-code { @@ -1313,7 +1271,7 @@ span.popup-close { } } -/* div.scrollable::-webkit-scrollbar { +div.scrollable::-webkit-scrollbar { width: 0; height: 0; } @@ -1330,7 +1288,7 @@ div.scrollable::-webkit-scrollbar-thumb { } ::-webkit-scrollbar-corner { background-color: transparent; -} */ +} .scrollable { width: 100%; @@ -1395,7 +1353,7 @@ div.scrollable::-webkit-scrollbar-thumb { transition-duration: .2s; transition-timing-function: ease-in-out; - display: none; + //display: none; border-radius: $border-radius; z-index: 2; @@ -1622,6 +1580,15 @@ div.scrollable::-webkit-scrollbar-thumb { stroke: $button-primary-background; } } + + @media (min-width: $large-screen) { + border-top-width: 0; + border-bottom-width: 0; + border-left-width: 1px; + border-right-width: 1px; + border-style: solid; + border-color: #DADCE0; + } } .page-password { diff --git a/src/tests/lol.test.ts b/src/tests/lol.test.ts index 450778c4..ebce2a04 100644 --- a/src/tests/lol.test.ts +++ b/src/tests/lol.test.ts @@ -3,7 +3,7 @@ import { bytesFromHex, bytesFromArrayBuffer } from '../lib/bin_utils'; test('factorize', () => { for(let i = 0; i < 10; ++i) { - CryptoWorker.factorize(new Uint8Array([20, 149, 30, 137, 202, 169, 105, 69])).then((pAndQ: any) => { + CryptoWorker.factorize(new Uint8Array([20, 149, 30, 137, 202, 169, 105, 69])).then(pAndQ => { pAndQ.pop(); expect(pAndQ).toEqual([[59, 165, 190, 67], [88, 86, 117, 215]]); }); @@ -25,6 +25,12 @@ test('sha1', () => { }); }); +test('sha256', () => { + CryptoWorker.sha256Hash(new Uint8Array([112, 20, 211, 20, 106, 249, 203, 252, 39, 107, 106, 194, 63, 60, 13, 130, 51, 78, 107, 6, 110, 156, 214, 65, 205, 10, 30, 150, 79, 10, 145, 194, 232, 240, 127, 55, 146, 103, 248, 227, 160, 172, 30, 153, 122, 189, 110, 162, 33, 86, 174, 117])).then(bytes => { + expect(bytes).toEqual(new Uint8Array([158, 59, 39, 247, 130, 244, 235, 160, 16, 249, 34, 114, 67, 171, 203, 208, 187, 72, 217, 106, 253, 62, 195, 242, 52, 118, 99, 72, 221, 29, 203, 95])); + }); +}); + test('pbkdf2', () => { /* const crypto = require('crypto'); diff --git a/tsconfig.json b/tsconfig.json index b345a110..97ea0fd7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -65,9 +65,10 @@ "node_modules", "public", "coverage", - /* "./src/lib/StackBlur.js", + "./src/lib/ckin.js", + "./src/lib/StackBlur.js", "./src/lib/*.js", "./src/*.js", - "*.js", */ + "*.js", ] } diff --git a/webpack.common.js b/webpack.common.js index 455f694c..47e0e799 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -54,7 +54,8 @@ module.exports = { //entry: './src/index.ts', entry: { index: './src/index.ts', - webp: './src/lib/webp.ts' + webp: './src/lib/webp.ts', + lottie: './src/lib/lottie.ts' }, /* entry: { index: './src/index.ts', @@ -72,6 +73,7 @@ module.exports = { contentBase: path.join(__dirname, 'public'), watchContentBase: true, compress: true, + http2: true, port: 9000 }, @@ -93,7 +95,7 @@ module.exports = { minifyURLs: true }, */ chunks: "all", - excludeChunks: ['npm.webp-hero'] + excludeChunks: ['npm.webp-hero', 'npm.lottie-web'] }) ], };