diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 98736cc9d51..00000000000 --- a/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "presets": [ - "module:metro-react-native-babel-preset" - ] -} diff --git a/.clj-kondo/babashka/fs/config.edn b/.clj-kondo/babashka/fs/config.edn new file mode 100644 index 00000000000..23f36094841 --- /dev/null +++ b/.clj-kondo/babashka/fs/config.edn @@ -0,0 +1 @@ +{:lint-as {babashka.fs/with-temp-dir clojure.core/let}} diff --git a/.clj-kondo/babashka/sci/config.edn b/.clj-kondo/babashka/sci/config.edn new file mode 100644 index 00000000000..60ea30d04f3 --- /dev/null +++ b/.clj-kondo/babashka/sci/config.edn @@ -0,0 +1 @@ +{:hooks {:macroexpand {sci.core/copy-ns sci.core/copy-ns}}} diff --git a/.clj-kondo/babashka/sci/sci/core.clj b/.clj-kondo/babashka/sci/sci/core.clj new file mode 100644 index 00000000000..ac324eecad5 --- /dev/null +++ b/.clj-kondo/babashka/sci/sci/core.clj @@ -0,0 +1,9 @@ +(ns sci.core) + +(defmacro copy-ns + ([ns-sym sci-ns] + `(copy-ns ~ns-sym ~sci-ns nil)) + ([ns-sym sci-ns opts] + `[(quote ~ns-sym) + ~sci-ns + (quote ~opts)])) diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 710f75b97aa..c653dc1048d 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -1,6 +1,113 @@ -{:lint-as {status-im.utils.views/defview clojure.core/defn - status-im.utils.views/letsubs clojure.core/let - status-im.utils.fx/defn clojure.core/defn - status-im.utils.styles/def clojure.core/def - status-im.utils.styles/defn clojure.core/defn} - :linters {:invalid-arity {:skip-args [status-im.utils.fx/defn]}}} +{:config-paths ["status-im"] + :output {:exclude-files ["src/user.cljs" "src/dev/user.cljs"]} + :lint-as {legacy.status-im.utils.views/defview clojure.core/defn + legacy.status-im.utils.views/letsubs clojure.core/let + reagent.core/with-let clojure.core/let + legacy.status-im.utils.fx/defn clj-kondo.lint-as/def-catch-all + utils.re-frame/defn clojure.core/defn + quo.react/with-deps-check clojure.core/fn + quo.previews.preview/list-comp clojure.core/for + legacy.status-im.utils.styles/def clojure.core/def + legacy.status-im.utils.styles/defn clojure.core/defn + test-helpers.unit/deftest-sub clojure.core/defn + test-helpers.unit/deftest-event clojure.core/defn + + taoensso.tufte/defnp clojure.core/defn} + :linters {:clojure-lsp/unused-public-var {:exclude-when-defined-by #{utils.re-frame/defn} + :exclude #{ + ;; even if we are not + ;; using color now, we + ;; will need it later + quo.foundations.colors + + ;; same for funcs from + ;; native-module + native-module.core + + ;; some funcs used + ;; temporarily during + ;; development + test-helpers.component + test-helpers.unit + + ;; not sure if unused + ;; functions here should + ;; be removed: + keycard.keycard + react-native.fs}} + :case-duplicate-test {:level :error} + :case-quoted-test {:level :error} + :case-symbol-test {:level :error} + :clj-kondo-config {:level :error} + :cond-else {:level :error} + :condition-always-true {:level :error} + :conflicting-alias {:level :error} + :consistent-alias {:level :error + :aliases {clojure.set set + clojure.string string + clojure.walk walk + malli.core malli + malli.dev.pretty malli.pretty + malli.dev.virhe malli.virhe + malli.error malli.error + malli.generator malli.generator + malli.transform malli.transform + malli.util malli.util + promesa.core promesa + schema.core schema + status-im.feature-flags ff + taoensso.timbre log}} + :deprecated-namespace {:level :warning} + :docstring-blank {:level :error} + :equals-true {:level :error} + :inline-def {:level :error} + :invalid-arity {:skip-args [legacy.status-im.utils.fx/defn + utils.re-frame/defn + utils.re-frame/merge]} + :loop-without-recur {:level :error} + :minus-one {:level :error} + :misplaced-docstring {:level :error} + :missing-body-in-when {:level :error} + :missing-clause-in-try {:level :error} + :missing-else-branch {:level :error} + :multiple-async-in-deftest {:level :error} + :not-empty? {:level :error} + :plus-one {:level :error} + :redundant-do {:level :error} + :redundant-let {:level :error} + :refer-all {:level :error} + ;; ignore error in config itself saying that `:shadowed-fn-param` is unknown + #_{:clj-kondo/ignore [:clj-kondo-config]} + :shadowed-fn-param {:level :error} + :shadowed-var {:level :error + ;; We temporarily use :include to define an + ;; allowlist of core Clojure vars. In the + ;; future, as we progressively fix shadowed + ;; vars, we should be able to delete this + ;; option and lint all vars. + :exclude [type name]} + :self-requiring-namespace {:level :error} + :single-operand-comparison {:level :error} + :syntax {:level :error} + :unbound-destructuring-default {:level :error} + :underscore-in-namespace {:level :error} + :uninitialized-var {:level :error} + :unknown-require-option {:level :error} + :unreachable-code {:level :error} + :unresolved-namespace {:level :error} + ;; TODO remove number when this is fixed + ;; https://github.com/borkdude/clj-kondo/issues/867 + :unresolved-symbol {:exclude [PersistentPriorityMap.EMPTY + number + legacy.status-im.test-helpers/restore-app-db + (cljs.test/is [match-strict?])]} + :unresolved-var {:level :error} + :unsorted-required-namespaces {:level :error} + :unused-alias {:level :warning} + :unused-binding {:level :error} + :unused-import {:level :error} + :unused-namespace {:level :error} + :unused-private-var {:level :error} + :unused-referred-var {:level :error} + :use {:level :error}} + :config-in-ns {mocks.js-dependencies {:linters {:clojure-lsp/unused-public-var {:level :off}}}}} diff --git a/.clj-kondo/funcool/promesa/config.edn b/.clj-kondo/funcool/promesa/config.edn new file mode 100644 index 00000000000..1844f77c5a6 --- /dev/null +++ b/.clj-kondo/funcool/promesa/config.edn @@ -0,0 +1,9 @@ +{:lint-as {promesa.core/-> clojure.core/-> + promesa.core/->> clojure.core/->> + promesa.core/as-> clojure.core/as-> + promesa.core/let clojure.core/let + promesa.core/plet clojure.core/let + promesa.core/loop clojure.core/loop + promesa.core/recur clojure.core/recur + promesa.core/with-redefs clojure.core/with-redefs + promesa.core/doseq clojure.core/doseq}} diff --git a/.clj-kondo/metosin/malli/config.edn b/.clj-kondo/metosin/malli/config.edn new file mode 100644 index 00000000000..0f8b25ccfd9 --- /dev/null +++ b/.clj-kondo/metosin/malli/config.edn @@ -0,0 +1,2 @@ +{:lint-as {malli.experimental/defn schema.core/defn} + :linters {:unresolved-symbol {:exclude [(malli.core/=>)]}}} diff --git a/.clj-kondo/nubank/matcher-combinators/config.edn b/.clj-kondo/nubank/matcher-combinators/config.edn new file mode 100644 index 00000000000..ea4ded7232f --- /dev/null +++ b/.clj-kondo/nubank/matcher-combinators/config.edn @@ -0,0 +1,4 @@ +{:linters + {:unresolved-symbol + {:exclude [(cljs.test/is [match? thrown-match?]) + (clojure.test/is [match? thrown-match?])]}}} diff --git a/.clj-kondo/rewrite-clj/rewrite-clj/config.edn b/.clj-kondo/rewrite-clj/rewrite-clj/config.edn new file mode 100644 index 00000000000..19ecae96a0f --- /dev/null +++ b/.clj-kondo/rewrite-clj/rewrite-clj/config.edn @@ -0,0 +1,5 @@ +{:lint-as + {rewrite-clj.zip/subedit-> clojure.core/-> + rewrite-clj.zip/subedit->> clojure.core/->> + rewrite-clj.zip/edit-> clojure.core/-> + rewrite-clj.zip/edit->> clojure.core/->>}} diff --git a/.clj-kondo/status-im/cljs/test.clj b/.clj-kondo/status-im/cljs/test.clj new file mode 100644 index 00000000000..6e3fa07f487 --- /dev/null +++ b/.clj-kondo/status-im/cljs/test.clj @@ -0,0 +1,21 @@ +(ns cljs.test + (:require [clj-kondo.hooks-api :as hooks])) + +(defn deftest + "Verify test name passed to `cljs.test/deftest` is suffixed with -test and not + prefixed with test-." + [{:keys [node]}] + (let [[_ test-name-node & _] (:children node) + test-name (str (hooks/sexpr test-name-node))] + (when (and (hooks/token-node? test-name-node) + (or (not (re-find #"^.*-test$" test-name)) + (re-find #"^test-.*$" test-name))) + (hooks/reg-finding! (assoc (meta test-name-node) + :message "Test name should be suffixed with -test" + :type :status-im.linter/inconsistent-test-name))))) + +(comment + ;; Invalid + (deftest {:node (hooks/parse-string "(deftest foo-tes (println :hello))")}) + (deftest {:node (hooks/parse-string "(deftest test-foo-test (println :hello))")}) +) diff --git a/.clj-kondo/status-im/config.edn b/.clj-kondo/status-im/config.edn new file mode 100644 index 00000000000..e2af52c1949 --- /dev/null +++ b/.clj-kondo/status-im/config.edn @@ -0,0 +1,11 @@ +{:hooks + {:analyze-call + {utils.i18n/label utils.i18n/label + test-helpers.component/get-all-by-translation-text utils.i18n/label + test-helpers.component/get-by-translation-text utils.i18n/label + test-helpers.component/query-all-by-translation-text utils.i18n/label + test-helpers.component/query-by-translation-text utils.i18n/label + + cljs.test/deftest cljs.test/deftest}} + :linters {:status-im.linter/invalid-translation-keyword {:level :error} + :status-im.linter/inconsistent-test-name {:level :error}}} diff --git a/.clj-kondo/status-im/utils/i18n.clj b/.clj-kondo/status-im/utils/i18n.clj new file mode 100644 index 00000000000..bde1603bae5 --- /dev/null +++ b/.clj-kondo/status-im/utils/i18n.clj @@ -0,0 +1,26 @@ +(ns utils.i18n + (:require [clj-kondo.hooks-api :as hooks])) + +(defn label + "Verify call to `utils.i18n/label` pass the translation keyword qualified with `t`." + [{:keys [node]}] + (let [[_ translation-key-node & _] (:children node)] + (when (and (hooks/keyword-node? translation-key-node) + (not= "t" (-> translation-key-node hooks/sexpr namespace))) + (hooks/reg-finding! (assoc (meta translation-key-node) + :message "Translation keyword should be qualified with \"t\"" + :type :status-im.linter/invalid-translation-keyword))))) + +(comment + ;; Valid + (label {:node (hooks/parse-string "(i18n/label :t/foo {:var \"hello\"})") + :cljc false + :lang :cljs + :filename "" + :config {} + :ns "" + :context nil}) + + ;; Invalid + (label {:node (hooks/parse-string "(i18n/label :foo)")}) +) diff --git a/.clj-kondo/taoensso/encore/config.edn b/.clj-kondo/taoensso/encore/config.edn new file mode 100644 index 00000000000..7b0ff3c2b7b --- /dev/null +++ b/.clj-kondo/taoensso/encore/config.edn @@ -0,0 +1 @@ +{:hooks {:analyze-call {taoensso.encore/defalias taoensso.encore/defalias}}} diff --git a/.clj-kondo/taoensso/encore/taoensso/encore.clj b/.clj-kondo/taoensso/encore/taoensso/encore.clj new file mode 100644 index 00000000000..7f6d30ac94e --- /dev/null +++ b/.clj-kondo/taoensso/encore/taoensso/encore.clj @@ -0,0 +1,16 @@ +(ns taoensso.encore + (:require + [clj-kondo.hooks-api :as hooks])) + +(defn defalias [{:keys [node]}] + (let [[sym-raw src-raw] (rest (:children node)) + src (if src-raw src-raw sym-raw) + sym (if src-raw + sym-raw + (symbol (name (hooks/sexpr src))))] + {:node (with-meta + (hooks/list-node + [(hooks/token-node 'def) + (hooks/token-node (hooks/sexpr sym)) + (hooks/token-node (hooks/sexpr src))]) + (meta src))})) diff --git a/.dependabot/config.yml b/.dependabot/config.yml index a3bb4ef68c8..e94d38dc945 100755 --- a/.dependabot/config.yml +++ b/.dependabot/config.yml @@ -13,7 +13,7 @@ update_configs: update_type: "security" # Keep /mobile/js_files/yarn.lock up to date, batching pull requests weekly - package_manager: "javascript" - directory: "/mobile/js_files" + directory: "/" update_schedule: "weekly" allowed_updates: - match: diff --git a/.env b/.env index 2d8d4e1d17e..75cb04aac3a 100644 --- a/.env +++ b/.env @@ -1,15 +1,10 @@ CACHED_WEBVIEWS_ENABLED=1 DEBUG_WEBVIEW=1 -DEFAULT_NETWORK=mainnet_rpc DEV_BUILD=1 -ERC20_CONTRACT_WARNINGS=0 ETHEREUM_DEV_CLUSTER=1 EXTENSIONS=0 -FLEET=eth.prod GROUP_CHATS_ENABLED=1 -HARDWALLET_ENABLED=1 -LOG_LEVEL_STATUS_GO=info -LOG_LEVEL=debug +LOG_LEVEL=info MAILSERVER_CONFIRMATIONS_ENABLED=1 PFS_ENCRYPTION_ENABLED=1 PFS_TOGGLE_VISIBLE=1 @@ -19,6 +14,29 @@ SNOOPY=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=1 STATUS_GO_PROTOCOL=0 STATUS_GO_ENABLE_NIMBUS=0 +KEYCARD_TEST_MENU=0 +QR_READ_TEST_MENU=1 +ENABLE_ROOT_ALERT=1 +DEBUG_OR_PR_BUILD=1 +APN_TOPIC=im.status.ethereum.pr +COMMUNITIES_ENABLED=1 +DATABASE_MANAGEMENT_ENABLED=1 +DELETE_MESSAGE_ENABLED=1 +COMMANDS_ENABLED=1 +TWO_MINUTES_SYNCING=1 +SWAP_ENABLED=1 +STICKERS_TEST_ENABLED=1 +LOCAL_PAIRING_ENABLED=1 +TEST_STATEOFUS=1 +FAST_CREATE_COMMUNITY_ENABLED=1 +TEST_NETWORKS_ENABLED=1 +SHOW_NOT_IMPLEMENTED_FEATURES=0 +ENABLE_ALERT_BANNER=0 +FLAG_WALLET_CONNECT_ENABLED=1 +API_LOGGING_ENABLED=1 +SENTRY_ENABLED=0 +SENTRY_ENVIRONMENT=ci-main +USE_PUBLIC_LOG_DIR=0 +FLAG_MARKET_ENABLED=0 diff --git a/.env.e2e b/.env.e2e index cf5fb81a44b..17e9982f543 100644 --- a/.env.e2e +++ b/.env.e2e @@ -1,11 +1,8 @@ DEBUG_WEBVIEW=1 -DEFAULT_NETWORK=testnet_rpc -ERC20_CONTRACT_WARNINGS=1 ETHEREUM_DEV_CLUSTER=1 EXTENSIONS=0 -FLEET=eth.prod +FLEET=status.staging GROUP_CHATS_ENABLED=1 -LOG_LEVEL_STATUS_GO=info LOG_LEVEL=debug MAILSERVER_CONFIRMATIONS_ENABLED=0 PAIRING_POPUP_DISABLED=1 @@ -17,7 +14,33 @@ SNOOPY=0 STICKERS_ENABLED=1 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=1 BLANK_PREVIEW=0 TOOLTIP_EVENTS=1 COMMANDS_ENABLED=1 +KEYCARD_TEST_MENU=1 +QR_READ_TEST_MENU=1 +ENABLE_ROOT_ALERT=0 +APN_TOPIC=im.status.ethereum.pr +VERIFY_TRANSACTION_CHAIN_ID=11155111 +VERIFY_ENS_CHAIN_ID=11155111 +TEST_STATEOFUS=1 +DATABASE_MANAGEMENT_ENABLED=1 +COMMUNITIES_ENABLED=1 +COMMUNITIES_MANAGEMENT_ENABLED=1 +DELETE_MESSAGE_ENABLED=1 +TWO_MINUTES_SYNCING=1 +STICKERS_TEST_ENABLED=1 +LOCAL_PAIRING_ENABLED=1 +FAST_CREATE_COMMUNITY_ENABLED=1 +TEST_NETWORKS_ENABLED=1 +SHOW_NOT_IMPLEMENTED_FEATURES=1 +DELETE_MESSAGE_FOR_ME_UNDO_TIME_LIMIT=10000 +DELETE_MESSAGE_UNDO_TIME_LIMIT=10000 +ENABLE_ALERT_BANNER=1 +FLAG_WALLET_CONNECT_ENABLED=1 +MOBILE_DATA_SYNCING_TOGGLE_ENABLE=0 +API_LOGGING_ENABLED=1 +SENTRY_ENABLED=0 +SENTRY_ENVIRONMENT=ci-main +USE_PUBLIC_LOG_DIR=1 +VIEW_ID_TRACKER=1 diff --git a/.env.jenkins b/.env.jenkins index 0dbea682b47..05d2b95ab84 100644 --- a/.env.jenkins +++ b/.env.jenkins @@ -1,13 +1,8 @@ CACHED_WEBVIEWS_ENABLED=1 DEBUG_WEBVIEW=1 -DEFAULT_NETWORK=mainnet_rpc -ERC20_CONTRACT_WARNINGS=0 ETHEREUM_DEV_CLUSTER=1 EXTENSIONS=0 -FLEET=eth.prod GROUP_CHATS_ENABLED=1 -HARDWALLET_ENABLED=1 -LOG_LEVEL_STATUS_GO=info LOG_LEVEL=debug MAILSERVER_CONFIRMATIONS_ENABLED=1 MAINNET_WARNING_ENABLED=1 @@ -19,5 +14,31 @@ SNOOPY=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=1 STATUS_GO_ENABLE_NIMBUS=0 +COMMANDS_ENABLED=1 +KEYCARD_TEST_MENU=0 +ENABLE_ROOT_ALERT=1 +DISABLE_WALLET_ON_MOBILE_NETWORK=1 +APN_TOPIC=im.status.ethereum.pr +VERIFY_TRANSACTION_CHAIN_ID=11155111 +VERIFY_ENS_CHAIN_ID=11155111 +TEST_STATEOFUS=1 +BLANK_PREVIEW=0 +DATABASE_MANAGEMENT_ENABLED=1 +COMMUNITIES_ENABLED=1 +COMMUNITIES_MANAGEMENT_ENABLED=1 +DELETE_MESSAGE_ENABLED=1 +TWO_MINUTES_SYNCING=1 +DEBUG_OR_PR_BUILD=1 +STICKERS_TEST_ENABLED=1 +LOCAL_PAIRING_ENABLED=1 +FAST_CREATE_COMMUNITY_ENABLED=1 +TEST_NETWORKS_ENABLED=1 +ENABLE_ALERT_BANNER=1 +FLAG_WALLET_CONNECT_ENABLED=1 +API_LOGGING_ENABLED=1 +SENTRY_ENABLED=0 +SENTRY_ENVIRONMENT=ci-main +USE_PUBLIC_LOG_DIR=0 +VIEW_ID_TRACKER=1 +GOOGLE_FREE=0 diff --git a/.env.nightly b/.env.nightly index cd28b859e4b..c6c4471d072 100644 --- a/.env.nightly +++ b/.env.nightly @@ -1,11 +1,7 @@ DEBUG_WEBVIEW=1 -DEFAULT_NETWORK=mainnet_rpc -ERC20_CONTRACT_WARNINGS=0 ETHEREUM_DEV_CLUSTER=1 EXTENSIONS=0 -FLEET=eth.prod GROUP_CHATS_ENABLED=1 -LOG_LEVEL_STATUS_GO=info LOG_LEVEL=debug MAILSERVER_CONFIRMATIONS_ENABLED=1 MAINNET_WARNING_ENABLED=1 @@ -14,8 +10,20 @@ PFS_TOGGLE_VISIBLE=1 POW_TARGET=0.002 POW_TIME=1 SNOOPY=0 +KEYCARD_TEST_MENU=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=1 -HARDWALLET_ENABLED=1 +ENABLE_ROOT_ALERT=1 +BLANK_PREVIEW=0 +COMMUNITIES_ENABLED=1 +DATABASE_MANAGEMENT_ENABLED=1 +DELETE_MESSAGE_ENABLED=1 +FAST_CREATE_COMMUNITY_ENABLED=0 +TEST_NETWORKS_ENABLED=0 +ENABLE_ALERT_BANNER=1 +FLAG_WALLET_CONNECT_ENABLED=1 +API_LOGGING_ENABLED=1 +SENTRY_ENABLED=1 +SENTRY_ENVIRONMENT=ci-nightly +USE_PUBLIC_LOG_DIR=0 diff --git a/.env.release b/.env.release index f8dfc5113c2..74a88a0409a 100644 --- a/.env.release +++ b/.env.release @@ -1,12 +1,8 @@ DEBUG_WEBVIEW=0 -DEFAULT_NETWORK=mainnet_rpc -ERC20_CONTRACT_WARNINGS=0 ETHEREUM_DEV_CLUSTER=0 EXTENSIONS=0 -FLEET=eth.prod -GROUP_CHATS_ENABLED=0 -LOG_LEVEL_STATUS_GO= -LOG_LEVEL=info +GROUP_CHATS_ENABLED=1 +LOG_LEVEL=error MAILSERVER_CONFIRMATIONS_ENABLED=1 MAINNET_WARNING_ENABLED=1 PFS_ENCRYPTION_ENABLED=1 @@ -14,7 +10,17 @@ PFS_TOGGLE_VISIBLE=0 POW_TARGET=0.002 POW_TIME=1 SNOOPY=0 +KEYCARD_TEST_MENU=0 RPC_NETWORKS_ONLY=1 PARTITIONED_TOPIC=0 -MOBILE_UI_FOR_DESKTOP=1 -LOCAL_NOTIFICATIONS=0 +ENABLE_ROOT_ALERT=1 +MAX_IMAGES_BATCH=1 +DELETE_MESSAGE_ENABLED=1 +FAST_CREATE_COMMUNITY_ENABLED=0 +TEST_NETWORKS_ENABLED=0 +STATUS_PROXY_STAGE_NAME=prod +FLAG_WALLET_CONNECT_ENABLED=1 +API_LOGGING_ENABLED=0 +SENTRY_ENABLED=1 +SENTRY_ENVIRONMENT=production +USE_PUBLIC_LOG_DIR=0 diff --git a/.envrc b/.envrc index 8ffb4255bbd..a8a760658e1 100644 --- a/.envrc +++ b/.envrc @@ -1 +1 @@ -layout node \ No newline at end of file +layout node diff --git a/.eslintrc.js b/.eslintrc.js index 78ef8071d22..187894b6af2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { - root: true, - extends: '@react-native-community', - }; + root: true, + extends: '@react-native', +}; diff --git a/.flowconfig b/.flowconfig index 46679f2b3ff..9beb474135b 100644 --- a/.flowconfig +++ b/.flowconfig @@ -94,4 +94,4 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]* suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy [version] -^0.105.0 +^0.122.0 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d3c6b44f81f..5a2cd5ee9e0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,8 +5,6 @@ # the repo. Unless a later match takes precedence, # @global-owner1 and @global-owner2 will be requested for # review when someone opens a pull request. -* @status-im/status-core - /ci @jakubgs /fastlane @jakubgs /scripts @jakubgs @@ -24,12 +22,4 @@ /components @status-im/status-core-ui -desktop/ @vkjr -modules/react-native-desktop*/ @vkjr -modules/react-native-desktop*/ @vkjr - -/doc @oskarth @yenda @jeluard - -/deployment @vkjr - -/test/appium/ @antdanchenko @churik +/test/appium/ @churik diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d60eb4f2c9c..a7c860c6d29 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,10 +8,9 @@ These are just guidelines, not rules. Use your best judgment, and feel free to p #### What should I know before I get started? -* [Mission and Core Values](https://status.im/contribute) -* [Principles](https://status.im/contribute/our_principles.html) +* [Mission and Principles](https://status.im/about) * [Read our FAQ](https://status.im/docs/FAQs.html) * [Join our Chat](http://join.status.im/chat/public/status-core-dev) * [Developer Introduction](https://status.im/developer_tools/) -* [Build Status Yourself](https://status.im/build_status) +* [Build Status Yourself](https://status.im/technical/build_status) * [Find issues to work on](https://github.com/status-im/) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index ce3ccf0f0b9..eb3ab87db83 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -43,4 +43,4 @@ As a , I want to so that . [comment]: # (if on Android please replicate bug whilst running adb logcat) ``` ... -``` \ No newline at end of file +``` diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 4e31b68db93..b8c3f5b25a7 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -2,53 +2,33 @@ name: Bug Report about: Bug Report title: '' -labels: bug +type: 'Bug' assignees: '' --- # Bug Report -## Problem -An overview of the background required to understand the problem. -A problem description. +## Problem +[comment]: # (A problem description) + #### Expected behavior -[comment]: # (Describe what you expected to happen. Please include designs if possible.) #### Actual behavior -[comment]: # (Describe what actually happened. Please include screenshots if possible.) - -#### Notes - -For the developer who will be investigating. Is it related to another PR? Tips on where to start? - -#### Acceptance Criteria - -Rules for the future PR to be accepted. ### Reproduction -[comment]: # (Describe how we can replicate the bug step by step.) - -- Open Status -- ... -- Step 3, etc. +1. ### Additional Information -[comment]: # (Please do your best to fill this out.) -- Status version: ... -[comment]: # (Android or iOS.) -- Operating System: +- Status version: nightly +- Operating System: Android, iOS -#### Logs -[comment]: # (if on Android please replicate bug whilst running adb logcat) +[comment]: # (Please, add logs/notes if necessary) -``` -... -``` diff --git a/.github/ISSUE_TEMPLATE/release-issue.md b/.github/ISSUE_TEMPLATE/release-issue.md new file mode 100644 index 00000000000..cb095713d18 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/release-issue.md @@ -0,0 +1,77 @@ +--- +name: Release umbrella issue +about: Release Issue +title: 'Mobile release ' +labels: release +assignees: '' + +--- +Issue to manage mobile release + +### Scope +[comment]: # (Add milestone from github) +https://github.com/status-im/status-mobile/milestone/ + +- release notes: +- release branch: + + +### Testing info +[comment]: # (TestRail info, added by QA) +Main test suite: +Upgrade (e2e): + +### Builds in TestFlight and PlayStore to push as a release +[comment]: # (Will be added by QA after testing approving of build) + +### Process +#### 1) Kick-off +- [ ] 1. Translation PRs is merged before cutting branch (Jinho) +- [ ] 2. Prepare scope of visible changes based on commits history, started from previous release branch cut ([guide](https://notes.status.im/how-to-prepare-release-notes)) +- [ ] 3. Update [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) with release notes (make PR based on previous step) +- [ ] 4. Create release branch using this [guide](https://github.com/status-im/status-mobile/blob/develop/doc/RELEASE_GUIDE.md), bump VERSION (merge created PR ([example](https://github.com/status-im/status-mobile/pull/12504) ) to develop) and get successful release builds (so, testing can be started) +- [ ] 5. Based on release scope, ask for comms (Jonny) +- [ ] 6. Make sure that assets (screenshots, video) in stores are up-to-date, more info [here](https://notes.status.im/how-to-update-assets) + +#### 2) Testing +[comment]: # (Section will be maintained by QA) +- [ ] Dogfooding (add notes, if it was held) +- [ ] Regression testing for release candidate build +- [ ] Upgrade tests +- [ ] Fix known blocker(s) found during regression testing + +##### Blockers +[comment]: # (Section for blocker issues; should be fixed and merged by release-manager. Remove if no blockers found) +- [ ] 1 blocker: + +============================================================================================= + +- [ ] Cherry-pick fix(es) to the release branch +- [ ] Verify fix(es) on new release candidate build +- [ ] Retest +- [ ] Keep release build forever (button in Jenkins) + +#### 3) Submission + +- [ ] 1. Prepare PR for F-droid build ([instruction]( https://github.com/status-im/status-mobile/blob/develop/doc/FDROID.md)) +- [ ] 2. Release notes written and added (500 character limit for updates (Android) and PR for [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) is ready to be merged (from 1.3 step) +- [ ] 3. Submit beta version for Android (Open Testing in Play Store) +- [ ] 4. Submit iOS build to Apple review ([instruction](https://drive.google.com/file/d/10Cl7PBB7TFPkZiVbfzdFGpfMRP9bxXuq/view?usp=sharing), be careful - low quality of audio) +- [ ] 5. Play store content reviewed and updated +- [ ] 6. Privacy policy reviewed and updated (ask in channel) +- [ ] 7. Countries to be excluded (ask in channel) +- [ ] 8. Changes to our FAQ made (should be checked and if any changes needed, ask Jakub to made them) + + +#### 4) Before publishing +- [ ] 1. Translations for comms available (marketing, ask in the channel) +- [ ] 2. Promotional content ready (marketing, ask in channel) +- [ ] 3. Upload builds for DO store, https://dev.status.im/ (Jakub) + +#### 5) At time of publishing +- [ ] 1. Notify marketing to push comms and blog post (Jonny + get review on blog from QA team) +- [ ] 2. Publish release to app store and playstore +- [ ] 3. Final push to update prod site https://status.im/, [instructions](https://github.com/status-im/infra-docs/blob/master/articles/status_release_upload.md) (Jakub - requires credentials to upload) +- [ ] 4. Add the link to the post about the release and publish the release: https://github.com/status-im/status-mobile/releases (Jakub) +- [ ] 5. Merge PR for updating [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) (from 1.3 step) + diff --git a/.github/ISSUE_TEMPLATE/wont-fix-bug.md b/.github/ISSUE_TEMPLATE/wont-fix-bug.md new file mode 100644 index 00000000000..d42b0b959dc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/wont-fix-bug.md @@ -0,0 +1,30 @@ +--- +name: Wont fix Report +about: to facilitate future handling, identify and address non-urgent issues that won't be prioritized in the near future +title: '' +labels: likely_wont_fix +assignees: '' + +--- + +## Problem + + +#### Expected behavior + + +#### Actual behavior + + +### Reproduction + +1. + +### Additional Information + +- Status version: release +- Operating System: Android, iOS + + +[comment]: # (Please, add logs/notes if necessary) + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3b6e6619624..e0c1425a1a7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,39 +1,26 @@ -[comment]: # (Please replace ... with your information. Remove < and >) [comment]: # (To auto-close issue on merge, please insert the related issue number after # i.e fixes #566) - -If you submit PR for issue with bounty then write here Fixes #NN where NN is issue number - -*otherwise* - fixes #... -### Summary - +## Summary [comment]: # (Summarise the problem and how the pull request solves it) ... - -Documentation change PR (review please): https://github.com/status-im/status.im/pull/xxx +## Review notes +[comment]: # (Optional. Specify if something in particular should be looked at, or ignored, during review) -### Review notes - +## Testing notes +[comment]: # (Optional) -### Testing notes - - -#### Platforms - +### Platforms +[comment]: # (Optional. Specify which platforms should be tested) - Android - iOS -- macOS -- Linux -- Windows -#### Areas that maybe impacted - +### Areas that may be impacted +[comment]: # (Optional. Specify if some specific areas need to be tested, such as 1-1 chats) -##### Functional +#### Functional - 1-1 chats - public chats @@ -48,19 +35,36 @@ Documentation change PR (review please): https://github.com/status-im/status.im/ - fleet - bootnodes -##### Non-functional +#### Non-functional - battery performance - CPU performance / speed of the app - network consumption -### Steps to test - +## Steps to test +[comment]: # (Specify exact steps to test if there are such) - Open Status - ... - Step 3, etc. - -status: ready +[comment]: # (Can be ready or wip) +status: ready + + + diff --git a/.github/github-bot.yml b/.github/github-bot.yml index 7cc39517159..a9398013a9f 100644 --- a/.github/github-bot.yml +++ b/.github/github-bot.yml @@ -9,21 +9,9 @@ project-board: test-column-name: 'E2E Tests' automated-tests: - repo-full-name: 'status-im/status-react' - job-full-name: 'end-to-end-tests/status-app-prs' + repo-full-name: 'status-im/status-mobile' + job-full-name: 'status-mobile/e2e/status-app-prs' kickoff-column-name: 'E2E Tests' github-team: slug: 'clojure' - -prchecklist: - title: Pull Request Checklist - checklist: - - '**Docs**: Updated the [documentation](https://status.im/build_status/), if affected' - - '**Docs**: Added or updated inline comments explaining intention of the code' - - '**Tests**: Ensured that all new UI elements have been assigned accessibility IDs' - - '**Tests**: Signaled need for E2E tests with label, if applicable' - - '**Tests**: Briefly described what was tested and what platforms were used' - - '**UI**: In case of UI changes, ensured that UI matches [Figma](https://www.figma.com/)' - - '**UI**: In case of UI changes, requested review from a Core UI designer' - - '**UI**: In case of UI changes, included screenshots of implementation' diff --git a/.gitignore b/.gitignore index df73eb6a655..41a0f621bd0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ # Xcode # +/ios/.xcode.env.local +/component-spec result/ build/ *.pbxuser @@ -25,7 +27,6 @@ DerivedData *.ipa *.xcuserstate project.xcworkspace -xcshareddata # Android/IJ # @@ -35,13 +36,17 @@ xcshareddata **/android/.project **/android/.settings/org.eclipse.buildship.core.prefs local.properties +*.hprof +.cxx/ +*.keystore +!debug.keystore # Atom .tags* # VS Code -.vscode/ipch/ -.vscode/settings.json +.vscode/ +workspace.code-workspace # node.js # @@ -68,9 +73,6 @@ env/dev/env/config.cljs externs/ shim.js -# Desktop build -index.desktop.js - # Generated by lein voom # /pom.xml @@ -81,11 +83,17 @@ index.desktop.js figwheel_server.log .nrepl-port +# FlowStorm (Clojure debugger) +repl-client-debug + # Lein # .lein-failures .lein-repl-history +# Shadow +.shadow-cljs + ## Doo # out @@ -96,9 +104,11 @@ doo-index.html # Status Statusgo.framework +Statusgo.xcframework #ios /ios/Pods/ +/ios/logs/ /ios/StatusIm.xcworkspace .ruby-version status-e2e/ @@ -120,15 +130,14 @@ fastlane/README.md # Clj .cpcache/ +src/user.cljs +src/dev/user.cljs # emacs .dir-locals.el -#ignore platform-specific files in the root since they are only symlinks to files in folders 'desktop/js_files' and 'mobile/js_files' +# We don't use NPM /package-lock.json -/package.json -/metro.config.js -/yarn.lock /.re-natal /re-natal @@ -136,27 +145,6 @@ fastlane/README.md pkg /BUILD_NUMBER -# Status Desktop -cmake_install.cmake -CMakeCache.txt -**/CMakeFiles/ -/StatusImPackage/* -*.AppImage -Status-Windows-x86_64.exe -/desktop/bin/* -/desktop/lib/* -/desktop/modules/* -/desktop/Makefile -/desktop/graph_info.json -/desktop/run-app.bat -/desktop/run-app.sh -/desktop/CMakeFiles/ -/desktop/reportApp/Makefile -/deployment/windows/Status.rc -*_autogen/ -CompleteBundleWin.cmake -logger_settings.ini - # Conan conan*.txt conanbuildinfo.* @@ -184,4 +172,33 @@ status-modules/resources /fiddle/target/ /fiddle/resources/public/images/ -trace.edn \ No newline at end of file +trace.edn + +/app/ +project.clj + +##appium +test/appium/report/ +result.xml +test/appium/tests/users.py + +##node bindings +/bin/ +/lib/ + +## visual tests +/artifacts + +/.calva/ + +## component-tests +*.log + +## local xcode env introduced in react-native 0.69 +.xcode.env.local + +## git hooks +lefthook.yml + +## build time logs +/logs/*.log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..560ca6c0c68 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "legal-docs"] + path = legal-docs + url = https://github.com/status-im/status-software-legal-documents.git diff --git a/.lsp/config.edn b/.lsp/config.edn new file mode 100644 index 00000000000..232387f7bf2 --- /dev/null +++ b/.lsp/config.edn @@ -0,0 +1 @@ +{:clean {:ns-inner-blocks-indentation :keep}} diff --git a/.nycrc b/.nycrc index b25df1eb109..e648fc1158d 100644 --- a/.nycrc +++ b/.nycrc @@ -1,10 +1,10 @@ { "include": [ - "target/test/status_im/**" + "target/test/legacy/status_im/**" ], "exclude": [ - "target/test/status_im/test/**", - "target/test/status_im/ui/**" + "target/test/legacy/status_im/test/**", + "target/test/legacy/status_im/ui/**" ], "report-dir": "./coverage-report", "all": true, @@ -14,4 +14,4 @@ "exclude-after-remap": false, "extension": [".js"], "reporter": ["lcovonly"] -} \ No newline at end of file +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..238132a6987 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,15 @@ +/* + +# Format top-level js files. +!*.js + +# Ignore all except src/js/**/*.js +!/src/ +/src/* +!/src/js +!/src/js/**/*.js + +# Ignore all except translations/en.json +!/translations/ +/translations/* +!/translations/en.json diff --git a/.prettierrc.js b/.prettierrc.js index 23fee66cf11..a000e79b5ca 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,6 +1,13 @@ module.exports = { - bracketSpacing: false, - jsxBracketSameLine: true, - singleQuote: true, - trailingComma: 'all', - }; \ No newline at end of file + arrowParens: 'always', + printWidth: 120, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'all', + useTabs: false, + + // JSON sorting + jsonSortOrder: '{ "/.*/": "caseInsensitiveLexical" } ', + plugins: ['prettier-plugin-sort-json'], +}; diff --git a/.vscode/settings.example.json b/.vscode/settings.example.json new file mode 100644 index 00000000000..f81330dbc5b --- /dev/null +++ b/.vscode/settings.example.json @@ -0,0 +1,12 @@ +{ + "editor.formatOnSave": true, + "clojure.format.enable": false, + "[clojure]": { + "editor.defaultFormatter": "rflagreca.vscode-clj-zprint" + }, + "vscode-clj-zprint.IgnoreExternalFiles": false, + "vscode-clj-zprint.CommunityFormatting": false, + "vscode-clj-zprint.OptionsMap": "", + "vscode-clj-zprint.width": "", + "vscode-clj-zprint.Styles.UseOnlyTheseStyles": false +} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index fcc1f3c8196..00000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "files.associations": { - "*.android": "groovy", - "*.ios": "groovy", - "*.linux": "groovy", - "*.macos": "groovy", - "*.windows": "groovy", - "*.nix-cache": "groovy", - }, -} diff --git a/.watchmanconfig b/.watchmanconfig index be5ad0c4733..6712d024ced 100644 --- a/.watchmanconfig +++ b/.watchmanconfig @@ -1,6 +1,8 @@ { "ignore_dirs": [ "android/build", - "target" + "target", + ".clj-kondo", + ".shadow-cljs" ] } \ No newline at end of file diff --git a/.zprintrc b/.zprintrc new file mode 100644 index 00000000000..f7764fa3c4c --- /dev/null +++ b/.zprintrc @@ -0,0 +1,64 @@ +;; -*- mode: clojure -*- +;; vi: ft=clojure +{:width 105 + :remove {:fn-force-nl #{:noarg1-body}} + + :style + [;; community style https://github.com/kkinnear/zprint/blob/main/doc/reference.md#community + :community + + ;; no comma in map + :no-comma + + :custom-justify + + ;; respect all newlines https://github.com/kkinnear/zprint/blob/main/doc/reference.md#respect-nl + :respect-nl + + ;; respect blank line https://github.com/kkinnear/zprint/blob/main/doc/reference.md#respect-bl + :respect-bl + + ;; hang multiline left-hand-thing https://github.com/kkinnear/zprint/issues/273 + :multi-lhs-hang] + + :fn-map + {"reg-sub" :arg1-pair + "h/describe" :arg1-body + "h/describe-skip" :arg1-body + "h/describe-only" :arg1-body + "h/test" :arg1-body + "h/test-skip" :arg1-body + "h/test-only" :arg1-body + "test/async" :arg1-body + "test/use-fixtures" :arg1-body + "global.describe" :arg1-body + "global.test" :arg1-body + "list-comp" :binding + "defview" :arg1-body + "letsubs" :binding + "with-let" "let" + "reg-event-fx" :arg1-pair + "reg-fx" :arg1-pair + "testing" :arg1-body + "deftest-sub" :arg1-body + "deftest-event" :arg1-body + "test-async" :arg1-body + "wait-for" :arg1-body + "with-deps-check" :arg1-body + "schema/=>" :arg1-body + "->" [:noarg1-body + {:list {:constant-pair? false :force-nl? false} + :next-inner-restore [[:list :constant-pair?]]}] + "set!" "reset!" + "assoc-when" "assoc" + "assoc-some" "assoc" + "conj-when" "conj" + "conj-some" "conj"} + + :style-map + {:no-comma {:map {:comma? false}} + :custom-justify + {:doc "Justify everything using pre-1.1.2 approach" + :binding {:justify? true :justify {:max-variance 1000}} + :map {:justify? true :justify {:max-variance 1000}} + :pair {:justify? true :justify {:max-variance 1000}}}}} diff --git a/ICONS.md b/ICONS.md deleted file mode 100644 index 58e6fcc8ffd..00000000000 --- a/ICONS.md +++ /dev/null @@ -1,28 +0,0 @@ -# new icons - -## Export icons - -![](./export-icons.gif) - -## android -1. copy files to corresponding directories at `/Users/romanvolosovskyi/clj/status-react/android/app/src/main/res` (one of `drawable-hdpi`, `drawable-mdpi`, `drawable-xhdpi`, `drawable-xxhdpi`, `drawable-xxxhdpi` for corresponding resolution) -If you only have 3 pngs 1x, 2x and 3x put them in mdpi, xhdpi and xxhdpi -3. if necessary, rename file so that filename contains only lower case chars, and dashes instead of hyphens, e.g. `"Icon-Name.png"` should be renamed to `"icon_name.png"`. -4. In the app `icon_name.png` still can be accessed as `icon-name`, so in order to use can add the next code: - ```clojure - ;; icon_name.png - [vector-icons/icon :icon-name {:color ...}] - ``` - -## ios -1. open xcode (on macos run `open ios/StatusIm.xcworkspace` from project's root dir) -2. go to `StatusIm/StatusIm/Images.xcassets` in xcode -![](https://notes.status.im/uploads/upload_be25e49db97cb114ff4aa0c9d94422fa.png) -3. add images there -4. if necessary, rename file so that filename contains only lower case chars, e.g. `"Icon-Name.png"` should be renamed to `"icon-name"`. -5. **IMPORTANT** there is no need to replace hyphens with dashes, and if you do so you will need to use names with dashes in both android and ios versions. So use dashes for android resources names and hyphens for ios. -6. And now `"icon-name"` can be added in app the same way as it was added for android version - ```clojure - ;; icon-name - [vector-icons/icon :icon-name {:color ...}] - ``` diff --git a/Makefile b/Makefile index 4c8a1bda5c3..1a27ab282f9 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: nix-add-gcroots clean nix-clean disable-githooks react-native-android react-native-ios react-native-desktop test release _list _fix-node-perms _tmpdir-mk _tmpdir-rm +.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-rm help: SHELL := /bin/sh help: ##@other Show this help @@ -14,17 +14,17 @@ WHITE := $(shell tput -Txterm setaf 7) YELLOW := $(shell tput -Txterm setaf 3) RESET := $(shell tput -Txterm sgr0) HELP_FUN = \ - %help; \ - while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \ - print "Usage: make [target]\n\n"; \ - for (sort keys %help) { \ - print "${WHITE}$$_:${RESET}\n"; \ - for (@{$$help{$$_}}) { \ - $$sep = " " x (32 - length $$_->[0]); \ - print " ${YELLOW}$$_->[0]${RESET}$$sep${GREEN}$$_->[1]${RESET}\n"; \ - }; \ - print "\n"; \ - } + %help; \ + while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \ + print "Usage: make [target]\n\nSee STARTING_GUIDE.md for more info.\n\n"; \ + for (sort keys %help) { \ + print "${WHITE}$$_:${RESET}\n"; \ + for (@{$$help{$$_}}) { \ + $$sep = " " x (32 - length $$_->[0]); \ + print " ${YELLOW}$$_->[0]${RESET}$$sep${GREEN}$$_->[1]${RESET}\n"; \ + }; \ + print "\n"; \ + } HOST_OS := $(shell uname | tr '[:upper:]' '[:lower:]') # This can come from Jenkins @@ -32,45 +32,36 @@ ifndef BUILD_TAG export BUILD_TAG := $(shell git rev-parse --short HEAD) endif -# We don't want to use /run/user/$UID because it runs out of space too easilly -export TMPDIR = /tmp/tmp-status-react-$(BUILD_TAG) -# this has to be specified for both the Node.JS server process and the Qt process +# We don't want to use /run/user/$UID because it runs out of space too easily. +export TMPDIR = /tmp/tmp-status-mobile-$(BUILD_TAG) +# This has to be specified for both the Node.JS server process and the Qt process. export REACT_SERVER_PORT ?= 5001 - -# Our custom config is located in nix/nix.conf -export NIX_CONF_DIR = $(PWD)/nix +# Default metro port used by scripts/run-android.sh. +export RCT_METRO_PORT ?= 8081 +# Fix for ERR_OSSL_EVP_UNSUPPORTED error. +export NODE_OPTIONS += --openssl-legacy-provider +# The path can be anything, but home is usually safest. +export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore + +# Location of symlinks to derivations that should not be garbage collected +export _NIX_GCROOTS = ./.nix-gcroots # Defines which variables will be kept for Nix pure shell, use semicolon as divider -export _NIX_KEEP ?= TMPDIR,BUILD_ENV,STATUS_GO_SRC_OVERRIDE,NIMBUS_SRC_OVERRIDE -export _NIX_ROOT = /nix -# legacy TARGET_OS variable support -ifdef TARGET_OS -export TARGET ?= $(TARGET_OS) -endif +export _NIX_KEEP ?= TMPDIR,BUILD_ENV,\ + BUILD_TYPE,BUILD_NUMBER,COMMIT_HASH,\ + ANDROID_GRADLE_OPTS,ANDROID_ABI_SPLIT,ANDROID_ABI_INCLUDE,\ + STATUS_GO_SRC_OVERRIDE,STATUS_GO_IPFS_GATEWAY_URL -# Useful for checking if we are on NixOS -OS_NAME := $(shell awk -F= '/^NAME/{print $2}' /etc/os-release) - -# Useful for Andoird release builds +# Useful for Android release builds TMP_BUILD_NUMBER := $(shell ./scripts/version/gen_build_no.sh | cut -c1-10) -# MacOS root is read-only, read nix/README.md for details -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Darwin) -export NIX_IGNORE_SYMLINK_STORE=1 -export _NIX_ROOT = /opt/nix -endif - #---------------- # Nix targets #---------------- -# WARNING: This has to be located right before the targets -ifdef IN_NIX_SHELL -SHELL := env bash -else +# WARNING: This has to be located right before all the targets. SHELL := ./nix/scripts/shell.sh -endif +shell: export TARGET ?= default shell: ##@prepare Enter into a pre-configured shell ifndef IN_NIX_SHELL @ENTER_NIX_SHELL @@ -78,32 +69,42 @@ else @echo "${YELLOW}Nix shell is already active$(RESET)" endif -nix-gc: ##@nix Garbage collect all packages older than 20 days from /nix/store - nix-collect-garbage --delete-old --delete-older-than 20d +nix-repl: SHELL := /bin/sh +nix-repl: ##@nix Start an interactive Nix REPL + nix repl default.nix + +nix-gc-protected: SHELL := /bin/sh +nix-gc-protected: + @echo -e "$(YELLOW)The following paths are protected:$(RESET)" && \ + ls -1 $(_NIX_GCROOTS) | sed 's/^/ - /' -nix-clean: ##@nix Remove all status-react build artifacts from /nix/store +nix-upgrade: SHELL := /bin/sh +nix-upgrade: ##@nix Upgrade Nix interpreter to current version. + nix/scripts/upgrade.sh + +nix-gc: export TARGET := nix +nix-gc: nix-gc-protected ##@nix Garbage collect all packages older than 20 days from /nix/store + nix-store --gc + +nix-clean: export TARGET := default +nix-clean: ##@nix Remove all status-mobile build artifacts from /nix/store nix/scripts/clean.sh nix-purge: SHELL := /bin/sh -nix-purge: ##@nix Completely remove the complete Nix setup -ifeq ($(OS_NAME), NixOS) - $(error $(RED)You should not purge Nix files on NixOS!$(RESET)) -else - sudo rm -rf $(_NIX_ROOT)/* ~/.nix-profile ~/.nix-defexpr ~/.nix-channels ~/.cache/nix ~/.status .nix-gcroots -endif - -nix-add-gcroots: export TARGET := default -nix-add-gcroots: ##@nix Add Nix GC roots to avoid status-react expressions being garbage collected - nix/scripts/gcroots.sh +nix-purge: ##@nix Completely remove Nix setup, including /nix directory + nix/scripts/purge.sh +nix-update-gradle: export TARGET := gradle +nix-update-gradle: export ORG_GRADLE_PROJECT_hermesEnabled := false +nix-update-gradle: export ORG_GRADLE_PROJECT_universalApk := false nix-update-gradle: ##@nix Update maven nix expressions based on current gradle setup - nix/mobile/android/maven-and-npm-deps/maven/generate-nix.sh + nix/deps/gradle/generate.sh -nix-update-lein: export TARGET := lein -nix-update-lein: ##@nix Update maven nix expressions based on current lein setup - nix/tools/lein/generate-nix.sh nix/lein +nix-update-clojure: export TARGET := clojure +nix-update-clojure: ##@nix Update maven Nix expressions based on current clojure setup + nix/deps/clojure/generate.sh -nix-update-gems: export TARGET := lein +nix-update-gems: export TARGET := fastlane nix-update-gems: ##@nix Update Ruby gems in fastlane/Gemfile.lock and fastlane/gemset.nix fastlane/update.sh @@ -120,270 +121,397 @@ _fix-node-perms: ##@prepare Fix permissions so that directory can be cleaned $(shell test -d node_modules && chmod -R 744 node_modules) $(shell test -d node_modules.tmp && chmod -R 744 node_modules.tmp) -_tmpdir-mk: SHELL := /bin/sh -_tmpdir-mk: ##@prepare Create a TMPDIR for temporary files +$(TMPDIR): SHELL := /bin/sh +$(TMPDIR): ##@prepare Create a TMPDIR for temporary files @mkdir -p "$(TMPDIR)" # Make sure TMPDIR exists every time make is called +_tmpdir-mk: $(TMPDIR) -include _tmpdir-mk _tmpdir-rm: SHELL := /bin/sh _tmpdir-rm: ##@prepare Remove TMPDIR rm -fr "$(TMPDIR)" +_install-hooks: SHELL := /bin/sh +_install-hooks: ##@prepare Create prepare-commit-msg git hook symlink + @ln -s -f ../../scripts/hooks/prepare-commit-msg .git/hooks +-include _install-hooks + +# Remove directories and ignored files clean: SHELL := /bin/sh -clean: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders +clean: _fix-node-perms _tmpdir-rm ios-clean android-clean ##@prepare Remove all output folders + git clean -dXf + +# Remove directories, ignored and non-ignored files +purge: SHELL := /bin/sh +purge: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders git clean -dxf + watchman-clean: export TARGET := watchman watchman-clean: ##@prepare Delete repo directory from watchman - watchman watch-del $${STATUS_REACT_HOME} - -disable-githooks: SHELL := /bin/sh -disable-githooks: ##@prepare Disables lein githooks - @rm -f ${env.WORKSPACE}/.git/hooks/pre-commit && \ - sed -i'~' -e 's|\[rasom/lein-githooks|;; [rasom/lein-githooks|' \ - -e 's|:githooks|;; :githooks|' \ - -e 's|:pre-commit|;; :pre-commit|' project.clj; \ - rm project.clj~ + watchman watch-del $${STATUS_MOBILE_HOME} pod-install: export TARGET := ios pod-install: ##@prepare Run 'pod install' to install podfiles and update Podfile.lock cd ios && pod install; cd -- +FLEETS_FILE := ./resources/config/fleets.json update-fleets: ##@prepare Download up-to-date JSON file with current fleets state curl -s https://fleets.status.im/ \ - | jq --indent 4 --sort-keys . \ - > resources/config/fleets.json + | sed 's/"warning": "/"warning": "DO NOT EDIT! /' \ + > $(FLEETS_FILE) + echo >> $(FLEETS_FILE) -keystore: export TARGET := keytool -keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore -keystore: ##@prepare Generate a Keystore for signing Android APKs +$(KEYSTORE_PATH): export TARGET := keytool +$(KEYSTORE_PATH): @./scripts/generate-keystore.sh +keystore: $(KEYSTORE_PATH) ##@prepare Generate a Keystore for signing Android APKs + +fdroid-max-watches: SHELL := /bin/sh +fdroid-max-watches: ##@prepare Bump max_user_watches to avoid ENOSPC errors + sysctl fs.inotify.max_user_watches=524288 + +fdroid-nix-dir: SHELL := /bin/sh +fdroid-nix-dir: ##@prepare Create /nix directory for F-Droid Vagrant builders + mkdir -m 0755 /nix + chown vagrant /nix + +fdroid-fix-tmp: SHELL := /bin/sh +fdroid-fix-tmp: ##@prepare Fix TMPDIR permissions so Vagrant user is the owner + chown -R vagrant "$(TMPDIR)" + +fdroid-build-env: fdroid-max-watches fdroid-nix-dir fdroid-fix-tmp ##@prepare Setup build environment for F-Droud build + +fdroid-pr: export TARGET := android-sdk +fdroid-pr: ##@prepare Create F-Droid release PR +ifndef APK + $(error APK env var not defined) +endif + scripts/fdroid-pr.sh "$(APK)" + +xcode-clean: SHELL := /bin/sh +xcode-clean: XCODE_HOME := $(HOME)/Library/Developer/Xcode +xcode-clean: ##@prepare Clean XCode derived data and archives + rm -fr $(XCODE_HOME)/DerivedData/StatusIm-* $(XCODE_HOME)/Archives/*/StatusIm* + +ios-simulator-cache-clean: SHELL := /bin/sh +ios-simulator-cache-clean: ##@prepare Clean iOS Simulator Caches + rm -rf ~/Library/Developer/CoreSimulator/Cache + #---------------- # Release builds #---------------- -release: release-android release-ios ##@build build release for Android and iOS - -release-android: export TARGET := android -release-android: export BUILD_ENV ?= prod -release-android: export BUILD_TYPE ?= nightly -release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER) +release: release-android release-ios ##@build Build release for Android and iOS + +build-fdroid: export BUILD_ENV = prod +build-fdroid: export BUILD_TYPE = release +build-fdroid: export ANDROID_ABI_SPLIT = false +build-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64 +build-fdroid: export ANDROID_STORE = fdroid +build-fdroid: ##@build Build release for F-Droid + @scripts/google-free.sh + @scripts/build-android.sh + +build-android: export BUILD_ENV ?= prod +build-android: export BUILD_TYPE ?= nightly +build-android: export ORG_GRADLE_PROJECT_versionCode ?= $(TMP_BUILD_NUMBER) +build-android: ##@build Build unsigned Android APK + @scripts/build-android.sh + +release-android: export TARGET := keytool release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore -release-android: export ANDROID_ABI_SPLIT ?= false -release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86 -release-android: keystore ##@build build release for Android - scripts/release-android.sh +release-android: keystore build-android ##@build Build signed Android APK + @scripts/sign-android.sh result/app-arm64-v8a-release-unsigned.apk -release-ios: export TARGET ?= ios +release-ios: export TARGET := ios +release-ios: export IOS_STATUS_GO_TARGETS := ios/arm64 release-ios: export BUILD_ENV ?= prod -release-ios: watchman-clean ##@build build release for iOS release - @git clean -dxf -f target/ios && \ - $(MAKE) jsbundle-ios && \ - scripts/copy-translations.sh && \ - xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration Release -destination 'generic/platform=iOS' -UseModernBuildSystem=N clean archive - -release-desktop: export TARGET ?= $(HOST_OS) -release-desktop: ##@build build release for desktop release based on TARGET - @$(MAKE) jsbundle-desktop && \ - scripts/copy-translations.sh && \ - scripts/build-desktop.sh; \ - $(MAKE) watchman-clean - -release-windows-desktop: export TARGET ?= windows -release-windows-desktop: ##@build build release for windows desktop release - @$(MAKE) jsbundle-desktop && \ - scripts/copy-translations.sh && \ - scripts/build-desktop.sh; \ - $(MAKE) watchman-clean - -prod-build-android: jsbundle-android ##@legacy temporary legacy alias for jsbundle-android - @echo "${YELLOW}This a deprecated target name, use jsbundle-android.$(RESET)" - -jsbundle-android: SHELL := /bin/sh -jsbundle-android: export TARGET ?= android -jsbundle-android: export BUILD_ENV ?= prod -jsbundle-android: ##@jsbundle Compile JavaScript and Clojure into index.android.js - # Call nix-build to build the 'targets.mobile.android.jsbundle' attribute and copy the index.android.js file to the project root - @git clean -dxf ./index.$(TARGET).js - nix/scripts/build.sh targets.mobile.android.jsbundle && \ - mv result/index.$(TARGET).js ./ - -prod-build-ios: jsbundle-ios ##@legacy temporary legacy alias for jsbundle-ios - @echo "${YELLOW}This a deprecated target name, use jsbundle-ios.$(RESET)" - -jsbundle-ios: export TARGET ?= ios -jsbundle-ios: export BUILD_ENV ?= prod -jsbundle-ios: ##@jsbundle Compile JavaScript and Clojure into index.ios.js - @git clean -dxf -f ./index.$(TARGET).js && \ - lein jsbundle-ios && \ - node prepare-modules.js - -prod-build-desktop: jsbundle-desktop ##@legacy temporary legacy alias for jsbundle-desktop - @echo "${YELLOW}This a deprecated target name, use jsbundle-desktop.$(RESET)" - -jsbundle-desktop: export TARGET ?= $(HOST_OS) -jsbundle-desktop: export BUILD_ENV ?= prod -jsbundle-desktop: ##@jsbundle Compile JavaScript and Clojure into index.desktop.js - git clean -qdxf -f ./index.desktop.js desktop/ && \ - lein jsbundle-desktop && \ - node prepare-modules.js +release-ios: watchman-clean ios-clean jsbundle ##@build Build release for iOS release + xcodebuild \ + -scheme StatusIm \ + -configuration Release \ + -workspace ios/StatusIm.xcworkspace \ + -destination 'generic/platform=iOS' \ + -UseModernBuildSystem=N clean archive + +jsbundle: SHELL := /bin/sh +jsbundle: export BUILD_ENV ?= prod +jsbundle: ##@build Build JavaScript and Clojurescript bundle for iOS and Android + nix/scripts/build.sh targets.mobile.jsbundle #-------------- -# REPL -# ------------- - -_watch-%: ##@watch Start development for device - $(eval SYSTEM := $(word 2, $(subst -, , $@))) - $(eval DEVICE := $(word 3, $(subst -, , $@))) - clj -R:dev build.clj watch --platform $(SYSTEM) --$(SYSTEM)-device $(DEVICE) +# status-go lib +#-------------- -watch-ios-real: export TARGET := ios -watch-ios-real: _watch-ios-real ##@watch Start development for iOS real device +status-go-android: SHELL := /bin/sh +status-go-android: ##@status-go Compile status-go for Android app + nix/scripts/build.sh targets.status-go.mobile.android -watch-ios-simulator: export TARGET := ios -watch-ios-simulator: _watch-ios-simulator ##@watch Start development for iOS simulator +status-go-ios: SHELL := /bin/sh +status-go-ios: ##@status-go Compile status-go for iOS app + nix/scripts/build.sh targets.status-go.mobile.ios -watch-android-real: export TARGET := android -watch-android-real: _watch-android-real ##@watch Start development for Android real device +status-go-library: SHELL := /bin/sh +status-go-library: ##@status-go Compile status-go for node-js + nix/scripts/build.sh targets.status-go.library -watch-android-avd: export TARGET := android -watch-android-avd: _watch-android-avd ##@watch Start development for Android AVD +#-------------- +# Watch, Build & Review changes +#-------------- -watch-android-genymotion: export TARGET ?= android -watch-android-genymotion: _watch-android-genymotion ##@watch Start development for Android Genymotion +run-clojure: export TARGET := clojure +run-clojure: ##@run Watch for and build Clojure changes for mobile + yarn shadow-cljs watch mobile -watch-desktop: export TARGET ?= $(HOST_OS) -watch-desktop: ##@watch Start development for Desktop - clj -R:dev build.clj watch --platform desktop +run-metro: export TARGET := clojure +run-metro: ##@run Start Metro to build React Native changes + @scripts/run-metro.sh -desktop-server: export TARGET ?= $(HOST_OS) -desktop-server: - node ubuntu-server.js +export RE_FRISK_PORT ?= 4567 -#-------------- -# Run -# ------------- -_run-%: - $(eval SYSTEM := $(word 2, $(subst -, , $@))) - npx react-native run-$(SYSTEM) +run-re-frisk: export TARGET := clojure +run-re-frisk: ##@run Start re-frisk server + yarn shadow-cljs run re-frisk-remote.core/start ${RE_FRISK_PORT} # TODO: Migrate this to a Nix recipe, much the same way as nix/mobile/android/targets/release-android.nix run-android: export TARGET := android -run-android: ##@run Run Android build - npx react-native run-android --appIdSuffix debug +# Disabled for debug builds to avoid 'maximum call stack exceeded' errors. +# https://github.com/status-im/status-mobile/issues/18493 +run-android: export ORG_GRADLE_PROJECT_hermesEnabled := false +run-android: export ORG_GRADLE_PROJECT_universalApk := false +run-android: ##@run Build Android APK and start it on the device + @scripts/run-android.sh + +SIMULATOR=iPhone 13 +# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded +run-ios: export TARGET := ios +run-ios: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64 +run-ios: ##@run Build iOS app and start it in on the simulator + @scripts/run-ios.sh "${SIMULATOR}" -run-desktop: export TARGET ?= $(HOST_OS) -run-desktop: _run-desktop ##@run Run Desktop build +show-ios-devices: ##@other shows connected ios device and its name + xcrun xctrace list devices -SIMULATOR= -run-ios: export TARGET := ios -run-ios: ##@run Run iOS build -ifneq ("$(SIMULATOR)", "") - npx react-native run-ios --simulator="$(SIMULATOR)" -else - npx react-native run-ios -endif +# TODO: fix IOS_STATUS_GO_TARGETS to be either amd64 or arm64 when RN is upgraded +run-ios-device: export TARGET := ios +run-ios-device: export IOS_STATUS_GO_TARGETS := ios/arm64;iossimulator/amd64 +run-ios-device: ##@run iOS app and start it on the first connected iPhone + @scripts/run-ios-device.sh #-------------- # Tests #-------------- -lint: export TARGET := lein -lint: ##@test Run code style checks - lein cljfmt check +# Get all clojure files, including untracked, excluding removed +define find_all_clojure_files +$$(comm -23 <(sort <(git ls-files --cached --others --exclude-standard)) <(sort <(git ls-files --deleted)) | grep -E '((\.clj-kondo\/status-im)|(src).*\.clj[sc]?$$)|((\.clj-kondo\/(status-im|config))|(src).*\.edn$$)|shadow-cljs\.edn') +endef -lint-fix: export TARGET := lein +lint: export TARGET := clojure +lint: export CLJ_LINTER_PRINT_WARNINGS ?= false +lint: ##@test Run code style checks + @sh scripts/lint/re-frame-in-quo-components.sh && \ + sh scripts/lint/direct-require-component-outside-quo.sh && \ + sh scripts/lint/require-i18n-resource-first.sh && \ + clj-kondo --config .clj-kondo/config.edn --cache false --fail-level error --lint src $(if $(filter $(CLJ_LINTER_PRINT_WARNINGS),true),,| grep -v ': warning: ') && \ + ALL_CLOJURE_FILES=$(call find_all_clojure_files) && \ + scripts/lint/translations.clj && \ + zprint '{:search-config? true}' -sfc $$ALL_CLOJURE_FILES && \ + sh scripts/lint/trailing-newline.sh && \ + node_modules/.bin/prettier --check . + +# NOTE: We run the linter twice because of https://github.com/kkinnear/zprint/issues/271 +lint-fix: export TARGET := clojure lint-fix: ##@test Run code style checks and fix issues - lein cljfmt fix - -test: export TARGET := lein -test: ##@test Run tests once in NodeJS - lein with-profile test doo node test once - -test-auto: export TARGET := lein -test-auto: ##@test Run tests in interactive (auto) mode in NodeJS - lein with-profile test doo node test + ALL_CLOJURE_FILES=$(call find_all_clojure_files) && \ + zprint '{:search-config? true}' -sw $$ALL_CLOJURE_FILES && \ + zprint '{:search-config? true}' -sw $$ALL_CLOJURE_FILES && \ + clojure-lsp --ns-exclude-regex ".*/\.clj-kondo/.*|.*/src/status_im/core\.cljs|.*/src/test_helpers/component_tests_preload\.cljs$$" clean-ns && \ + sh scripts/lint/trailing-newline.sh --fix && \ + node_modules/.bin/prettier --write . + +lint-commits: + @sh scripts/lint/donotmerge-git-commits.sh + +shadow-server: export TARGET := clojure +shadow-server:##@ Start shadow-cljs in server mode for watching + yarn shadow-cljs server + +_test-clojure: export TARGET := clojure +_test-clojure: export WATCH ?= false +_test-clojure: status-go-library +_test-clojure: +ifeq ($(WATCH), true) + yarn node-pre-gyp rebuild && \ + yarn shadow-cljs compile mocks && \ + nodemon --exec "yarn shadow-cljs compile test && node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO" -e cljs +else + yarn node-pre-gyp rebuild && \ + yarn shadow-cljs compile mocks && \ + yarn shadow-cljs compile test && \ + node --require ./test-resources/override.js "$$SHADOW_OUTPUT_TO" +endif -coverage: ##@test Run tests once in NodeJS generating coverage - @scripts/run-coverage.sh +test: export SHADOW_OUTPUT_TO := target/test/test.js +test: export SHADOW_NS_REGEXP := .*-test$$ +test: ##@test Run all Clojure tests +test: _test-clojure + +# Note: we need to override the :output-to and :ns-regexp options because +# shadow-cljs has a bug where it will not read from the env vars to expand the +# configuration when the shadow-cljs mobile target is already running. +test-watch-for-repl: export TARGET := default +test-watch-for-repl: export SHADOW_OUTPUT_TO := target/test/test.js +test-watch-for-repl: export SHADOW_NS_REGEXP := .*-test$$ +test-watch-for-repl: ##@test Watch all Clojure tests and support REPL connections + rm -f "$$SHADOW_OUTPUT_TO" && \ + yarn install && shadow-cljs compile mocks && \ + concurrently --kill-others --prefix-colors 'auto' --names 'build,repl' \ + "yarn shadow-cljs watch test --verbose --config-merge '{:output-to \"$(SHADOW_OUTPUT_TO)\" :ns-regexp \"$(SHADOW_NS_REGEXP)\"}'" \ + "until [ -f $$SHADOW_OUTPUT_TO ] ; do sleep 1 ; done ; node --require ./test-resources/override.js $$SHADOW_OUTPUT_TO --repl" + +test-unit: export SHADOW_OUTPUT_TO := target/unit_test/test.js +test-unit: export SHADOW_NS_REGEXP := ^(?!tests\.integration-test)(?!tests\.contract-test).*-test$$ +test-unit: ##@test Run unit tests +test-unit: _test-clojure + +test-integration: export SHADOW_OUTPUT_TO := target/integration_test/test.js +test-integration: export SHADOW_NS_REGEXP := ^tests\.integration-test.*$$ +test-integration: ##@test Run integration tests +test-integration: _test-clojure + +test-contract: export SHADOW_OUTPUT_TO := target/contract_test/test.js +test-contract: export SHADOW_NS_REGEXP := ^tests\.contract-test.*$$ +test-contract: ##@test Run contract tests +test-contract: _test-clojure + +test-android: jsbundle +test-android: export TARGET := android +test-android: ##@test Android Gradle test + cd android && ./gradlew test + +test-component-watch: export TARGET := clojure +test-component-watch: export COMPONENT_TEST := true +test-component-watch: export BABEL_ENV := test +test-component-watch: export JEST_USE_SILENT_REPORTER := false +test-component-watch: ##@ Watch tests and re-run no changes to cljs files + @scripts/check-metro-shadow-process.sh + rm -rf ./component-spec + nodemon --exec 'yarn shadow-cljs compile component-test && jest --config=test/jest/jest.config.js --testEnvironment node ' -e cljs + +test-component: export TARGET := clojure +test-component: export COMPONENT_TEST := true +test-component: export BABEL_ENV := test +test-component: export JEST_USE_SILENT_REPORTER := false +test-component: ##@test Run component tests once in NodeJS + @scripts/check-metro-shadow-process.sh + rm -rf ./component-spec + yarn shadow-cljs compile component-test && \ + jest --clearCache && jest --config=test/jest/jest.config.js --testEnvironment node + +# Reference: https://flow-storm.github.io/flow-storm-debugger/user_guide.html#_debugging_react_native_applications +run-flow-storm: export SHADOW_CLJS_BUILD_ID := :mobile +run-flow-storm: export TARGET := clojure +run-flow-storm: export GDK_DPI_SCALE := 1.0 +run-flow-storm: ##@run Start FlowStorm debugger + clj -Sforce -Sdeps '{:deps {com.github.jpmonettas/flow-storm-dbg {:mvn/version "3.7.5"}}}' \ + -X flow-storm.debugger.main/start-debugger \ + :port 7888 \ + :repl-type :shadow \ + :build-id $(SHADOW_CLJS_BUILD_ID) #-------------- # Other #-------------- -react-native-desktop: export TARGET ?= $(HOST_OS) -react-native-desktop: export _NIX_PURE ?= true -react-native-desktop: ##@other Start react native packager - @scripts/start-react-native.sh - -react-native-android: export TARGET := android -react-native-android: export _NIX_PURE ?= true -react-native-android: ##@other Start react native packager for Android client - @scripts/start-react-native.sh - -react-native-ios: export TARGET := ios -react-native-ios: export _NIX_PURE ?= true -react-native-ios: ##@other Start react native packager for Android client - @scripts/start-react-native.sh - -geth-connect: export TARGET := adb + +geth-connect: export TARGET := android-sdk geth-connect: ##@other Connect to Geth on the device adb forward tcp:8545 tcp:8545 && \ build/bin/geth attach http://localhost:8545 +ios-clean: SHELL := /bin/sh +ios-clean: ios-simulator-cache-clean +ios-clean: ##@prepare Clean iOS build artifacts + git clean -dxf -f target/ios + +android-clean: SHELL := /bin/sh android-clean: ##@prepare Clean Gradle state - git clean -dxf -f ./android/app/build - [ -d android/.gradle ] && cd android && ./gradlew clean + git clean -dxf -f ./android/app/build; \ + rm -rf android/.gradle \ + rm -rf android/build \ + rm -rf ~/.gradle + -android-ports: export TARGET := adb +android-ports: export FLOWSTORM_PORT ?= 7722 +android-ports: export TARGET := android-sdk +android-ports: export RCT_METRO_PORT ?= 8081 android-ports: ##@other Add proxies to Android Device/Simulator - adb reverse tcp:8081 tcp:8081 && \ + adb reverse tcp:$(RCT_METRO_PORT) tcp:$(RCT_METRO_PORT) && \ adb reverse tcp:3449 tcp:3449 && \ - adb reverse tcp:4567 tcp:4567 && \ + adb reverse tcp:$(RE_FRISK_PORT) tcp:$(RE_FRISK_PORT) && \ + adb reverse tcp:$(FLOWSTORM_PORT) tcp:$(FLOWSTORM_PORT) && \ adb forward tcp:5561 tcp:5561 -android-devices: export TARGET := adb +android-devices: export TARGET := android-sdk android-devices: ##@other Invoke adb devices adb devices -android-logcat: export TARGET := adb -android-logcat: ##@other Read status-react logs from Android phone using adb +android-pull-geth: export TARGET := android-sdk +android-pull-geth: export VERSION ?= debug +android-pull-geth: + adb pull "/storage/emulated/0/Android/data/im.status.ethereum$$( [ "$(VERSION)" = "release" ] || echo ".$(VERSION)" )/files/Download/geth.log" + +android-tail-geth: export TARGET := android-sdk +android-tail-geth: export VERSION ?= debug +android-tail-geth: + adb shell 'while true; do cat; sleep 1; done < /storage/emulated/0/Android/data/im.status.ethereum$$( [ "$(VERSION)" = "release" ] || echo ".$(VERSION)" )/files/Download/geth.log' + +android-clean-geth: export TARGET := android-sdk +android-clean-geth: export VERSION ?= debug +android-clean-geth: + adb shell 'rm /storage/emulated/0/Android/data/im.status.ethereum$$( [ "$(VERSION)" = "release" ] || echo ".$(VERSION)" )/files/Download/geth.log' + + +android-logcat: export TARGET := android-sdk +android-logcat: ##@other Read status-mobile logs from Android phone using adb adb logcat | grep -e RNBootstrap -e ReactNativeJS -e ReactNative -e StatusModule -e StatusNativeLogs -e 'F DEBUG :' -e 'Go :' -e 'GoLog :' -e 'libc :' -android-install: export TARGET := adb +android-install: export TARGET := android-sdk android-install: export BUILD_TYPE ?= release -android-install: +android-install: ##@other Install APK on device using adb adb install result/app-$(BUILD_TYPE).apk _list: SHELL := /bin/sh _list: @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' -_unknown-startdev-target-%: SHELL := /bin/sh -_unknown-startdev-target-%: - @ echo "Unknown target device '$*'. Supported targets:"; \ - ${MAKE} _list | grep "watch-" | sed s/watch-/startdev-/; \ - exit 1 - -_startdev-%: SHELL := /bin/sh -_startdev-%: - $(eval SYSTEM := $(word 2, $(subst -, , $@))) - $(eval DEVICE := $(word 3, $(subst -, , $@))) - @ if [ -z "$(DEVICE)" ]; then \ - $(MAKE) watch-$(SYSTEM) || $(MAKE) _unknown-startdev-target-$@; \ - else \ - $(MAKE) watch-$(SYSTEM)-$(DEVICE) || $(MAKE) _unknown-startdev-target-$@; \ - fi - -startdev-android-avd: export TARGET = android -startdev-android-avd: _startdev-android-avd -startdev-android-genymotion: export TARGET = android -startdev-android-genymotion: _startdev-android-genymotion -startdev-android-real: export TARGET = android -startdev-android-real: _startdev-android-real -startdev-desktop: export TARGET ?= $(HOST_OS) -startdev-desktop: _startdev-desktop -startdev-ios-real: export TARGET = ios -startdev-ios-real: _startdev-ios-real -startdev-ios-simulator: export TARGET = ios -startdev-ios-simulator: _startdev-ios-simulator +patch-file: export TARGET := default +patch-file: ##@other Generates patch file for npm deps + @scripts/patch-npm-lib.sh + +#-------------- +# REPLs +#-------------- + +repl-clojure: export TARGET := clojure +repl-clojure: ##@repl Start Clojure repl for mobile App + yarn shadow-cljs cljs-repl mobile + +repl-nix: nix-repl ##@repl Start an interactive Nix REPL + +#-------------- +# Dev Automation Flows +#-------------- + +auto-login: export TARGET := default +auto-login: ##@auto runs flow for login or onboarding app on simulator/emulator + maestro test "maestro/create-account-or-login.yaml" + +auto-custom: export TARGET := default +auto-custom: ##@auto runs any custom maestro automation flow on simulator/emulator +ifndef FLOW + $(error Usage: make automate FLOW=your-maestro-flow-file.yaml) +endif + maestro test "$(FLOW)" diff --git a/README.md b/README.md index 30bffd544c4..46dd4decd17 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,66 @@ +> [!WARNING] +> **This repository is archived and this codebase is deprecated.** +> The new mobile codebase lives at [status-im/status-app](https://github.com/status-im/status-app). # Status - a Mobile Ethereum Operating System -Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middle men and `go-ethereum` running directly on your device. +[Get it on Google Play](https://play.google.com/store/apps/details?id=im.status.ethereum) +[Get it on F-Droid](https://f-droid.org/packages/im.status.ethereum/) + + +[Get it on Github](https://github.com/status-im/status-mobile/releases) + +Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middlemen and `go-ethereum` running directly on your device. [![Getting started with Status](https://i.imgur.com/C0aZZEL.jpg)](https://www.youtube.com/watch?v=oDCSEmS9c3o "Getting started with Status") ## Why? -We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems. +We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems. -We want to take responsibility for our data, the way we conduct ourselves privately and promote this way of life to a mass audience. +We want to take responsibility for our data, and the way we conduct ourselves privately and promote this way of life to a mass audience. -We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provides us a path forward. +We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provide us with a path forward. If this interests you, **help us make Status a reality** - anyone can contribute and we need everyone at any skill level to participate. ## How to Contribute? -Go straight to the [docs](https://status.im/docs) or [join our chat](https://join.status.im/chat/public/status) and choose what interests you: +Go straight to the [docs](doc/) and choose what interests you: -- **Developer** -Developers are the heart of software and to keep Status beating we need all the help we can get! If you're looking to code in ClojureScript or Golang then Status is the project for you! We use React Native and there is even some Java/Objective-C too! -Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-react/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures. +- **Developer** Developers are the heart of software and to keep Status beating +we need all the help we can get! If you're looking to code in ClojureScript or +Golang then Status is the project for you! We use React Native and there is even +some Java/Objective-C too! Want to learn more about it? Start by reading our +[Developer Introduction](doc/starting-guide.md) which guides you +through the technology stack and start browsing [beginner +issues](https://github.com/status-im/status-mobile/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). +Then you can read how to [Build +Status](doc/starting-guide.md), which talks about managing +project dependencies, coding guidelines and testing procedures. +Check out our [coding guidelines](doc/new-guidelines.md). -- **Community Management** -Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Community Principles](https://status.im/contribute/our_principles.html) +- **Community Management** +Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and the long-lasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.app/manifesto) -- **Specification / Documentation** -John Dewey once said "Education is not preparation for life; education is life *itself* ". Developers & Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, head over to our [docs](https://status.im/docs) and see how you can improve what we have. +- **Specification / Documentation** +John Dewey once said, "Education is not preparation for life; education is life *itself* ". Developers and Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, check out our [docs](doc/) and see how you can improve what we have. -- **Blog Writing** -Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page. [Jump into our chat](https://join.status.im/chat/public/status) and discuss with the team how you can contribute! +- **Blog Writing** +Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page. -- **Testers** -It's bug hunting season! Status is currently in Alpha and there is sure to be a bunch of learning, [build status from scratch](https://status.im/build_status/) or if an android user check out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-react/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy! +- **Testers** +It's bug-hunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](doc/starting-guide.md) or if an android user checks out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-mobile/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy! -- **Security** +- **Security** Status is a visual interface to make permanent changes on the Blockchain, it handles crypto-tokens that have real value and allows 3rd party code execution. Security is paramount to its success. You are given permission to break Status as hard as you can, as long as you share your findings with the community! -- **Evangelism** -Help us spread the word! Tell a friend *right now*, in fact tell **everyone** - yell from a mountain if you have to, every person counts! If you've got a great story to tell or have some interesting way you've spread the word about Status let us know about it in our [chat](https://join.status.im/chat/public/status) - -## Status API -View our [API Docs](https://status.im/developer_tools/status_web_api.html) and learn how to integrate your DApp into Status. You can read more about how to add your DApp to Status [here](https://status.im/developer_tools/add_your_dapp.html). - +- **Evangelism** +Help us spread the word! Tell a friend *right now*, in fact, tell **everyone** - yell from a mountain if you have to, every person counts! If you've got a great story to tell or have some interesting way you've spread the word about Status let us know about it in our [chat](https://join.status.im/chat/public/status) + ## Give me Binaries! -You can get our Beta builds for both Android and iOS on our [website](https://status.im), through our [nightly builds](https://status.im/nightly/) or by [building it yourself](https://status.im/build_status/). +You can get our Beta builds for both Android and iOS on our [website](https://status.app), through our [nightly builds](https://status.im/nightly/), or by [building it yourself](doc/starting-guide.md). ## Core Contributors @@ -57,14 +71,8 @@ Without the dedication of these outstanding individuals, Status would not exist. ## Contact us -Feel free to email us at [support@status.im](mailto:support@status.im) or better yet, [join our chat](https://join.status.im/chat/public/status). +Feel free to email us at [support@status.im](mailto:support@status.im). ## License -Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/status-react/blob/develop/LICENSE.md) - -## Testing Supported by - -[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SFBWQ3k5R2tnT2t6UGsxU1h1U0g3VFlCNnoxVTRHYWNoTDhsb1laaTJZWT0tLUZMUm5sSVFBSU9qSWM1RUJvK1I3Z3c9PQ==--ad15ae7992b432b33743749d40318952415bd98f)](https://www.browserstack.com/automate/public-build/SFBWQ3k5R2tnT2t6UGsxU1h1U0g3VFlCNnoxVTRHYWNoTDhsb1laaTJZWT0tLUZMUm5sSVFBSU9qSWM1RUJvK1I3Z3c9PQ==--ad15ae7992b432b33743749d40318952415bd98f) - -[![Coverage Status](https://coveralls.io/repos/github/status-im/status-react/badge.svg?)](https://coveralls.io/github/status-im/status-react) +Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/status-mobile/blob/develop/LICENSE.md) diff --git a/RELEASES.md b/RELEASES.md new file mode 100644 index 00000000000..528e9860bbc --- /dev/null +++ b/RELEASES.md @@ -0,0 +1,1336 @@ +## 1.20 Release notes + +### Features + +* Add session management for wallet connect by @cammellos in https://github.com/status-im/status-mobile/pull/13799 +* [#13181] Cannot delete images or audio messages by @flexsurfer in https://github.com/status-im/status-mobile/pull/13210 +* [#13230] Show default syncing interval by @rasom in https://github.com/status-im/status-mobile/pull/13234 +* Add support for mutual contact requests by @cammellos in https://github.com/status-im/status-mobile/pull/13054 +* Implement Information box and ens banner view by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13753 +* Profile picture sync by @siphiuel in https://github.com/status-im/status-mobile/commit/fbfab9fd3bdbcfa6cdd9a24a6bce526da8252fd3 + +### Improvements + +* Improve notifications life-cycle by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13248 +* Simpledapp on Goerli by @churik in https://github.com/status-im/status-mobile/pull/13732 +* Include share action on longpress image menu by @jo-mut in https://github.com/status-im/status-mobile/pull/13359 +* fast image loading indicator by @flexsurfer in https://github.com/status-im/status-mobile/pull/13431 +* [#13355] Long time (5-15 sec) for loading chat messages by @flexsurfer in https://github.com/status-im/status-mobile/pull/13425 +* [Fixes: #13416] resize image in status-go as well, alert user if fails by @cammellos in https://github.com/status-im/status-mobile/pull/13422 +* [#12566] Remove legacy dependency on mailserver password by @erikseppanen in https://github.com/status-im/status-mobile/pull/13511 +* Wallet sync for generated accounts by @siphiuel in https://github.com/status-im/status-mobile/pull/13487 +* feat: lottie splash screen by @yqrashawn in https://github.com/status-im/status-mobile/pull/13714 +* [#13647] Update all settings on pairing with a new wallet account by @rasom in https://github.com/status-im/status-mobile/pull/13742 +* Improve ethereum.send by @qfrank in https://github.com/status-im/status-mobile/pull/13724 + +### Redesign + +* quo, Switcher Navigation by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13167 +* Switcher and Bottom Tabs Animations and UI Performance Improvements by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13470 +* feat: add token tag component (#13599) by @J-Son89 in https://github.com/status-im/status-mobile/pull/13644 +* [13565] icon-avatar component by @ibrkhalil in https://github.com/status-im/status-mobile/pull/13692 +* [13562] Wallet user avatar component by @ibrkhalil in https://github.com/status-im/status-mobile/pull/13681 +* Reply component in chat input & quoted messages redesign by @briansztamfater in https://github.com/status-im/status-mobile/pull/13706 +* Wallet redesign by @flexsurfer in https://github.com/status-im/status-mobile/pull/13172 +* [Potential: #13596] Add status-tags component by @cammellos in https://github.com/status-im/status-mobile/pull/13597 +* Chat views redesign by @briansztamfater in https://github.com/status-im/status-mobile/pull/13184 +* Implementation of React Native Blur view for android by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13663 +* feat: add token overview component (status-im#13555) by @J-Son89 in https://github.com/status-im/status-mobile/pull/13767 + +### Bug Fixes + +* fix screen orientation on android by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13218 +* Don't unmute contact while adding by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13237 +* fix chat image long press issue by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13371 +* [#13149] Timeline images stretch off screen by @siddarthkay in https://github.com/status-im/status-mobile/pull/13211 +* [#13233] Proper message after clearing history in pubchat by @rasom in https://github.com/status-im/status-mobile/pull/13241 +* [#13235] Fix opening of the last shown chat with local notifications by @rasom in https://github.com/status-im/status-mobile/pull/13252 +* [#13201] Fix handling of favourits syncing by @rasom in https://github.com/status-im/status-mobile/pull/13253 +* [#13257] Fix sync devices sorting by @rasom in https://github.com/status-im/status-mobile/pull/13282 +* [#13283] Fix syncing of adding contact after removal by @rasom in https://github.com/status-im/status-mobile/pull/13292 +* [#13263] Fix for ENS warning showing on custom domains by @daferna in https://github.com/status-im/status-mobile/pull/13312 +* fix can't share deep link from profile on ios by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13420 +* Fix sending logs from iOS by @bitgamma in https://github.com/status-im/status-mobile/pull/13619 +* fix #13642: Cannot sign in on claim.lens.xyz by @qfrank in https://github.com/status-im/status-mobile/pull/13668 +* [#13493] Can not switch to xDai chain by @flexsurfer in https://github.com/status-im/status-mobile/pull/13709 +* fix bookmarks not syncing by @Parveshdhull in https://github.com/status-im/status-mobile/pull/13727 +* fix: set max option not work when send from qrcode by @yqrashawn in https://github.com/status-im/status-mobile/pull/13733 +* [#13835] Fix Generate keys button by @rasom in https://github.com/status-im/status-mobile/pull/13841 +* Fix disappearing of the last notification when paired by @rasom in https://github.com/status-im/status-mobile/pull/13796 +* [#13766] custom networkid fix by @ flexsurfer in https://github.com/status-im/status-mobile/pull/13765 + +## New Contributors +* @siddarthkay made their first contribution in https://github.com/status-im/status-mobile/pull/13185 +* @daferna made their first contribution in https://github.com/status-im/status-mobile/pull/13312 +* @smohamedjavid made their first contribution in https://github.com/status-im/status-mobile/pull/13364 +* @ibrkhalil made their first contribution in https://github.com/status-im/status-mobile/pull/13450 +* @PEZ made their first contribution in https://github.com/status-im/status-mobile/pull/13494 +* @erikseppanen made their first contribution in https://github.com/status-im/status-mobile/pull/13511 +* @Rende11 made their first contribution in https://github.com/status-im/status-mobile/pull/13609 +* @yqrashawn made their first contribution in https://github.com/status-im/status-mobile/pull/13739 +* @ilmotta made their first contribution in https://github.com/status-im/status-mobile/pull/13747 +* @phrohdoh made their first contribution in https://github.com/status-im/status-mobile/pull/13772 +* @J-Son89 made their first contribution in https://github.com/status-im/status-mobile/pull/13767 + +**Full Changelog**: https://github.com/status-im/status-mobile/compare/1.19.0...1.20.0 + +## 1.19 Release notes + +### Features + +* 💬 Re-open app on the last open chat ([details](https://github.com/status-im/status-mobile/issues/12782)) +* 🪙 Support \$UBI token ([details](https://github.com/status-im/status-mobile/issues/12975)) +* 🔔 Implementation of remote android notifications ([details](https://github.com/status-im/status-mobile/issues/12866)) +* 🔁 Sync clear history on paired devices ([details](https://github.com/status-im/status-mobile/issues/13004)) +* 📑 Synchronize browser bookmarks/favorites across devices ([details](https://github.com/status-im/status-mobile/issues/12961)) +* 🔕 Add mute option to android ([details](https://github.com/status-im/status-mobile/issues/12890)) +* 👛 Wallet Connect 2.0 integration ([details](https://github.com/status-im/status-mobile/issues/12546)) +* 💰 Implement Wallet Connect 1.0 ([details](https://github.com/status-im/status-mobile/issues/12870)) +* ⚙️ Sync settings ([details](https://github.com/status-im/status-mobile/pull/13053)) + +### Improvements + +* Improve order of mailserver requests ([details](https://github.com/status-im/status-mobile/issues/12783)) +* Load images from an https server ([details](https://github.com/status-im/status-mobile/issues/12855)) +* Load audio messages from https server ([details](https://github.com/status-im/status-mobile/issues/13116)) +* Show message timestamps on tap, remove from bubbles 🕙 ([details](https://github.com/status-im/status-mobile/pull/12915)) +* support PUK and seed recovery during onboarding ([details](https://github.com/status-im/status-mobile/pull/12955)) +* update react-native-webview ([details](https://github.com/status-im/status-mobile/pull/12987)) +* Add group members to mentionable list ([details](https://github.com/status-im/status-mobile/pull/12994)) +* always use english for fallback text ([details](https://github.com/status-im/status-mobile/pull/13019)) +* Disable chat input for chats with a blocked user ([details](https://github.com/status-im/status-mobile/pull/13162)) +* Handle timeouts on mailserver requests ([details](https://github.com/status-im/status-mobile/issues/13022)) +* Human Readable data display when signing using eth_signTypedData_v3 ([details](https://github.com/status-im/status-mobile/issues/12535)) + +### Bug Fixes + +* Bug/fix opensea api ([details](https://github.com/status-im/status-mobile/pull/13021)) +* Show "Fetch more messages" only in public chats and communities ([details](https://github.com/status-im/status-mobile/pull/12927)) +* Chats are not synced if delete and re-add them on the first device while the second device is offline ([details](https://github.com/status-im/status-mobile/issues/12913)) +* fix distortion of app theme due to change in system theme ([details](https://github.com/status-im/status-mobile/pull/12934)) +* Unable to perform swap on 1inch.exchange if initial swap was cancelled by closing bottom sheet ([details](https://github.com/status-im/status-mobile/issues/12920)) +* Error when trying to edit 'per-gas price limit' on 1inch.exchange ([details](https://github.com/status-im/status-mobile/issues/12991)) +* Allow adding emoji in status input even if it exceeds limit ([details](https://github.com/status-im/status-mobile/pull/12949)) +* Allow adding emoji to group intro message if it exceeds limit ([details](https://github.com/status-im/status-mobile/pull/13024)) +* Use higher base fee value for default tx fee calculation ([details](https://github.com/status-im/status-mobile/pull/13020)) +* Profile QR code overlaps share menu during sharing (IOS) ([details](https://github.com/status-im/status-mobile/pull/13050)) +* No value in 'Gas amount limit' field in NFT dapps ([details](https://github.com/status-im/status-mobile/pull/13051)) +* Stop showing fetch more button for cleared history ([details](https://github.com/status-im/status-mobile/pull/13084)) +* fix ens resolve issue while following deep link ([details](https://github.com/status-im/status-mobile/pull/13080)) +* Fix deadlock on syncing all data ([details](https://github.com/status-im/status-mobile/pull/13128)) +* Fix broken username and timestamp layout for long usernames ([details](https://github.com/status-im/status-mobile/pull/13174)) + +## 1.18.0 Release notes :package: + +### Features +* 🚦Online status indicator +* 👛 Add possibility to select wallet for ENS names +* 🐞 Bug reporting and logs sharing improvements +* 🍳 Simplify Keycard onboarding by using defaults for pairing password +* 💾 Backup contacts via Waku +* 🪙 Added ENS token +* 🌠 Using react-native-fast-image for stickers +#### Message reliability improvements +* 𝌗 Show loading until all messages are processed +* 💪🏼 More robust message confirmations handling +* 📶 Allow sending messages when offline +#### Improvements on device pairing +* 🔔💻 Notification in activity centre now sync across devices +* ✅💻 Sync read messages across devices +#### Network settings improvements +* ✨ Add Binance Smart chain +* ♏︎ Added custom network symbol +* 💰 Network fee on xDai chain +* 📇 Support tx history (in a way) when on BSC chains +* 🙅🏻 Remove POA network from the list + +### Bug Fixes +* Fix activity center community invite preview +* Missing notifications for some contacts +* Fixes scrolling issues on the 'Max priority fee' bottom sheet +* Handle Keycard timeout on iOS 15 +* Allow user to be reinvited to the same group after leaving +* Fix for "TypeError: Network request failed" when switching to Goerli network +* Fix for Spin of death on adding custom NFT token contract +* Changing screen orientation results in breaking images / layout + + +## 1.17 + +### For iOS and Android + +### Features + +- 🖼️ Add ability to Share image from Status ([details](https://github.com/status-im/status-mobile/pull/12528)) +- 🕵️ Private Profile Photos ([details](https://github.com/status-im/status-mobile/pull/11768)) +- 🥥 Custom Emoji Thumbnails for Community Channels ([details](https://github.com/status-im/status-mobile/pull/12594)) +- 🔄 Sync deleted chats ([details](https://github.com/status-im/status-mobile/pull/12662)) +- 🔃 Sync removed/deleted/blocked contacts ([details](https://github.com/status-im/status-mobile/pull/12541)) +- 💸 Allow overriding nonce when sending transaction ([details](https://github.com/status-im/status-mobile/pull/12679)) +- 🗑️ Delete messages ([details](https://github.com/status-im/status-mobile/pull/12390)) +- 🎨 NFT Support via OpenSea ([details](https://github.com/status-im/status-mobile/pull/12485)) +- 🤳🏻 Enable collectibles and NFT as profile picture ([details](https://github.com/status-im/status-mobile/pull/12615)) + +### Improvements + +- Move pull to refresh to the account overview screen ([details](https://github.com/status-im/status-mobile/pull/12479)) +- Add $RARE token to our default list ([details](https://github.com/status-im/status-mobile/pull/12521)) +- Small UI Design Improvements ([details](https://github.com/status-im/status-mobile/pull/12544)) +- Chats list performance ([details](https://github.com/status-im/status-mobile/pull/12554)) +- Add push notification on group chat invite ([details](https://github.com/status-im/status-mobile/pull/12440)) +- Contacts performance ([details](https://github.com/status-im/status-mobile/pull/12643)) +- Add profile image in push notifications ([details](https://github.com/status-im/status-mobile/pull/12427)) +- Enable UI for signing legacy txs on networks without eip1559 ([details](https://github.com/status-im/status-mobile/pull/12692)) +- Doubled the character limit on timeline posts ([details](https://github.com/status-im/status-mobile/commit/a9333ad52ca71f512d5306f802927d0c20d63944)) + +### Bugfixes + +- Don't show notifications from self ([details](https://github.com/status-im/status-mobile/pull/12505)) +- Request permissions before saving images ([details](https://github.com/status-im/status-mobile/pull/12516)) +- Re-enable amount/fee validation on tx signing ([details](https://github.com/status-im/status-mobile/pull/12537)) +- Fix browser history sorting ([details](https://github.com/status-im/status-mobile/pull/12497)) +- Fix show/hide password on Android ([details](https://github.com/status-im/status-mobile/pull/12536)) +- Fix connecting autofarm.network dapps with status wallet freezes ([details](https://github.com/status-im/status-mobile/pull/12529)) +- RPC URL is lower-cased when entered in URL field when adding ([details](https://github.com/status-im/status-mobile/pull/12574)) +- Allow retrieving of profile updates after removing contact ([details](https://github.com/status-im/status-mobile/pull/12581)) +- Fetch history on receiving pubchat installation ([details](https://github.com/status-im/status-mobile/pull/12644)) +- Can't send funds to multisig - Out of gas ([details](https://github.com/status-im/status-mobile/pull/12648)) +- Fix handling errors on eth_gasPrice ([details](https://github.com/status-im/status-mobile/pull/12710)) + +## 1.16 + +### For iOS and Android + +### Features + +- EIP-1159 support ([#12369](https://github.com/status-im/status-mobile/pull/12369)) +- Hide/show option for accounts in the wallet ([#12438](https://github.com/status-im/status-mobile/pull/12438)) +- Delete accounts in wallet ([#12444](https://github.com/status-im/status-mobile/pull/12444)) +- Enable keeping database when migrating account to keycard ([#12306](https://github.com/status-im/status-mobile/pull/12306)) +- Replies from group chat in activity centre ([#12266](https://github.com/status-im/status-mobile/pull/12266)) + +### Improvements + +- Remove clear history from non-public chats ([#12384](https://github.com/status-im/status-mobile/pull/12384)) +- Clearing push notifications on read (Android) ([#12464](https://github.com/status-im/status-mobile/pull/12464)) +- Enable migration to keycard from signed-in state ([#11778](https://github.com/status-im/status-mobile/issues/11778)) + +### Bug Fixes + +#### Chat + +- Fix Error when opening 1-1 chat in Activity center for blocked user ([#12399](https://github.com/status-im/status-mobile/pull/12399)) +- Long press is long and it makes the message disappear entirely ([#12445](https://github.com/status-im/status-mobile/pull/12445)) +- Sort pinned messages by time of pinning ([#12402](https://github.com/status-im/status-mobile/pull/12402)) +- Screens with overlapping long usernames ([#12471](https://github.com/status-im/status-mobile/pull/12471)) + +#### Browser (Dapp) + +- Fix some token swap errors in Uniswap ([#12417](https://github.com/status-im/status-mobile/pull/12417)) +- Update react-native-webview for better SSL handling ([#12409](https://github.com/status-im/status-mobile/pull/12409)) + +#### Keycard + +- App freezes until reopening when signing tx with frozen Keycard ([#12473](https://github.com/status-im/status-mobile/pull/12473)) + +#### Wallet + +- Allow to add assets with same name ([#12466](https://github.com/status-im/status-mobile/pull/12466)) +- Update DATAcoin name ([#12454](https://github.com/status-im/status-mobile/pull/12454)) + +## 1.15 + +### For iOS and Android +### Features +- New improved native navigation, its very fast :dash: [[details](https://github.com/status-im/status-mobile/pull/12141)] +- Pinned messages in chats :pushpin: [[details](https://github.com/status-im/status-mobile/issues/11699)] +- Add support for ETH2x-FLI ERC20 token ⚫ [[details](https://github.com/status-im/status-mobile/issues/11885)] +- Add support for HEZ ERC20 token ⚫ [[details](https://github.com/status-im/status-mobile/issues/12233)] +- Show number of unread mentions in public and communities chats :bell: [[details](https://github.com/status-im/status-mobile/issues/12061)] +- QR code scanner for browser :ticket: [[details](https://github.com/status-im/status-mobile/issues/12195)] +- Edit messages after sending :pencil2: [[details](https://github.com/status-im/status-mobile/issues/12067)] +- Allow password reset :abcd: [[details](https://github.com/status-im/status-mobile/pull/12245)] + +### Improvements +- Native modals and tabs :house_with_garden: +- Improved time to show login screen :timer_clock: +- New, human friendly, terms of use :pencil: [[details](https://github.com/status-im/status-mobile/issues/12206)] + +### Bug Fixes +- No contact request in Activity Center after 1-1 chat deleted of non-contact user :no_good: [[details](https://github.com/status-im/status-mobile/issues/12218)] + +## 1.14 + +### For iOS and Android +### Features + +- Highlight posts that mention you ([details](https://github.com/status-im/status-mobile/pull/12146)) +- Remove PUK and Pairing Code screen from Keycard onboarding + [details](https://github.com/status-im/status-mobile/pull/12155)) +- Added unread messages count for messages with mentions in public chats ([details](https://github.com/status-im/status-mobile/pull/12152)) +- Sync history setting allowing to sync chat history up to 1 month ([details](https://github.com/status-im/status-mobile/pull/12166)) + + +### Improvements + +- "My profile" button for simplification of finding own public key ([details](https://github.com/status-im/status-mobile/pull/12044)) +- Factory reset option is available on account creation and recovery flows ([details](https://github.com/status-im/status-mobile/pull/12055)) +- Allow the creation of recovery/backup Keycard from the login interface ([details](https://github.com/status-im/status-mobile/pull/12115)) +- Reset blocked and/or frozen Keycards ([details](https://github.com/status-im/status-mobile/pull/12127)) +- Show cached balance ([details](https://github.com/status-im/status-mobile/pull/12134)) + + +### Bugfixes + +- Pending transactions are stored in the database and shown on history screen after re-login ([details](https://github.com/status-im/status-mobile/pull/12032)) +- Multiple fixes for keycard +- Fixes for resolving ENS name from chat key ([details](https://github.com/status-im/status-mobile/pull/12100)) + + +## 1.13 + +### For iOS and Android +### Features + +- New activity manager https://github.com/status-im/status-mobile/issues/11958 +New chats and group chat invitation will appear in a new section, the activity center, where a user will be able to accept or decline the request. +https://www.figma.com/file/r59kCQxl6tlC0dHkcAJOpP/Action-center-MVP---Mobile?node-id=2%3A8012 (not fully implemented) + +- Receive messages from contacts only option +Under privacy in settings a user will be able to select whether they want to receive messages and group chat invitations from contacts only. + +- Added delivered confirmation for private groups +Messages sent to private groups will now be marked as confirmed if at least one of the members received it. + +- New keycard functionalities: reset a keycard, changing PUK of a card, changing pairing code, create a new keycard backup card. + + +### Improvements + +- Improved UI for starting a new private chat + + +### Bugfixes + +- Fixed issue with crypto on ramp and requiring camera access +- Removed Wyre from list of services in buy crypto feature +- Added support for SOCKS token + + + +## 1.12 +### iOS +#### Excerpt +V1.12 Release - Keycard on iOS, Crypto Onramps, and More + +Keycard can now be used on iOS devices for hardware enforced security to your keys and accounts! Status v1.12 also introduces simpler access to obtaining crypto via onramps providers as well as some key updates to the messaging experience + +##### Added +Keycard iOS integration +Link previews for our.status.im and medium.om +List of Crypto onramps +Add “delivered” message confirmations to 1:1 messages +Keycard banner on login screen + +#### Fixed +UI issue showing up a chat on a paired device when it should not +UI issue was showing messages as pending if no one is part of the group chat* +Push notification is generated on paired account when you send message to 1-1 +UI issue for wrong notification when using two paired devices with same accounts +Improve keycard login time + +### Android +#### Excerpt +V1.12 Release - Crypto Onramps and Improved Messaging + +Status v1.12 introduces simpler access to obtaining crypto via onramp providers as well as some key updates to the messaging experience including delivered message confirmations in 1:1 private chats + +##### Added +Link previews for our.status.im and medium.om +List of Crypto onramps +Add “delivered” message confirmations to 1:1 messages +Keycard banner on login screen +Local notifications for Mentions + +#### Fixed +UI issue showing up a chat on a paired device when it should not +UI issue was showing messages as pending if no one is part of the group chat* +Push notification is generated on paired account when you send message to 1-1 +UI issue for wrong notification when using two paired devices with same accounts +Improve keycard login time + +## 1.11 +### iOS +#### Excerpt +V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats. + +Update in the App Store or Google Play if you do not have auto updates enabled. + +For the full changelog, see Github https://github.com/status-im/status-mobile/milestone/49?closed=1 + +#### Added +- Add Giphy url support in chat +- The Graph (GRT) erc-20 token added to the default list + +#### Changed +- Improved compatibility with DApps +- Sync with Status Nodes improvements + +#### Fixed +- Fixes to Android notifications +- UI fixes +- Sluggish performance on private group chats bug + +### Android +#### Excerpt +V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats. + +Update in the App Store or Google Play if you do not have auto updates enabled. + +For the full changelog, see Github https://github.com/status-im/status-mobile/milestone/49?closed=1 + +#### Added +- Migrate existing account to Keycard +- Add Giphy url support in chat +- The Graph (GRT) erc-20 token added to the default list + +#### Changed +- Improved compatibility with DApps +- Sync with Status Nodes improvements + +#### Fixed +- Fixes to Android notifications +- UI fixes +- Sluggish performance on private group chats bug + +## 1.10 +### iOS +#### Excerpt +Status version 1.10 is here and it is a perfect way to kick off 2021! Another feature rich update that makes the overall messaging, browsing, and transacting experience a whole lot better. Save your most frequently used DApps as favorites for one tap access to DeFi, NFTs, and more. Set a profile image to express yourself in chat. Speed up and cancel pending transactions and pull down to check for new transactions. + +#### Added +- Pull to refresh on individual account view +- Save dapps as favorite +- Switch between dapps in multiple tabs +- Banner to find dapps to buy crypto +- Sent message confirmation icon + +#### Changed +- Manage dapp permissions without leaving the browser +- Keycard pairing code updated to readible 5 symbol code +- Profile and settings back to most right position in tab bar + +#### Fixed +- Visibility of tab bar in dark mode +- Watching accounts for transaction in chat messages (update status) +- Multiple notifications for a single erc20 transfer +- Change group chat name when '/' character is included +- Show transaction in chat for small amounts +- Correction to transaction status in chat +- Rotate mailservers on error return +- Remove unused transport security entries +- Send chat messages in order so that text is always below image +- Performance of list rendering +- Alignment and image flickering issues in status updates +- Disallow multiple pop ups to be shown at the same time +- Add multiple custom history nodes without relogin + + +### Android +#### Excerpt +Status version 1.10 is here and it is a perfect way to kick off 2021! Another feature rich update that makes the overall messaging, browsing, and transacting experience a whole lot better. Bookmark your most frequently used DApps for one tap access to DeFi, NFTs, and more. Set a profile image to express yourself in chat. Speed up and cancel pending transactions and pull down to check for new transactions. + +#### Added +- Pull to refresh on individual account view +- Save dapps as favorite +- Switch between dapps in multiple tabs +- Banner to find dapps to buy crypto +- Sent message confirmations + +#### Changed +- Install with deeplink to public chat (Join to fetch messages) +- Manage dapp permissions without leaving the browser +- Keycard pairing code updated to readible 5 symbol code +- Profile and settings back to most right position in tab bar + +#### Fixed +- Visibility of tab bar in dark mode +- Watching accounts for transaction in chat messages (update status) +- Multiple notifications for a single erc20 transfer +- Change group chat name when '/' character is included +- Show transaction in chat for small amounts +- Correction to transaction status in chat +- Rotate mailservers on error return +- Remove unused transport security entries +- Send chat messages in order so that text is always below image +- Performance of list rendering +- Alignment and image flickering issues in status updates +- Disallow multiple pop ups to be shown at the same time +- Add multiple custom history nodes without relogin + + +## 1.9 +### iOS +#### Excerpt +With release 1.9, Status gives you the tools to better connect and engage with your friends and communities. You'll find a whole new tab for Status updates. Share what's on your mind and follow what your contacts are up to. + +Status updates, and any chat, are now more colorful with opt in link previews. + +#### Full + +#### Added +* Profile status updates +* Add unfurling of URLs in chats (YouTube) +* Onboarding into public chats + +#### Changed +* Add backwards compatibility for ENS Usernames +* Account cards design to accomodate high value accounts +* Rename Status account to Ethereum account for first account on onboarding +* Remove manual fetch 24h in bottom sheet +* Pinch to zoom on images + +#### Fixed +* Personal sign method +* Slow asset list +* Loading of older transactions (< April) +* Loading of message history after rejoining a public chat +* Unread message counter update when other user replies to own message +* App crash on navigation from and to generate keys in onboarding + + +### Android +#### Excerpt +With release 1.9, Status gives you the tools to better connect and engage with your friends and communities. You'll find a whole new tab for Status updates. Share what's on your mind and follow what your contacts are up to. + +Status updates, and any chat, are now more colorful with opt in link previews. + +#### Full + +#### Added +* Profile status updates +* Add unfurling of URLs in chats (YouTube) +* In-app local notifications for transactions(Beta) +* Onboarding into public chats + + +#### Changed +* Add backwards compatibility for ENS Usernames +* Account cards design to accomodate high value accounts +* Rename Status account to Ethereum account for first account on onboarding +* Remove manual fetch 24h in bottom sheet +* Pinch to zoom on images + +#### Fixed +* Personal sign method +* Slow asset list +* Loading of older transactions (< April) +* Loading of message history after rejoining a public chat +* Unread message counter update when other user replies to own message +* App crash on navigation from and to generate keys in onboarding + + + +## 1.8 +see https://notes.status.im/release-1.8-notes# +### Android + iOS +#### Excerpt + +#### Full +##### V1.8 Release - More people, more private & bug fixes + +This release includes updates that further improve private communication and your control over it. Group chats can now include up to 20 members (previously 10). With this increase, group chat preserves it's confidentiality, e2e encryption, and perfect forward secrecy that come with 1:1 private chats; Now usable with larger groups, without negatively impacting the network. Truly private group chats. + +Additionally, you can now opt out of 'History nodes' under Sync settings. With this option you control if you are ok sharing your IP address with a server in order to collect messages send while you were offline. In case you didn't know, you can also [run your own history node](https://status.im/technical/run_status_node.html) to connect to. + +Finally, when you receive a new ERC-20 token you can now add it to your wallet by tapping 'Scan tokens'. + + + +#### Added +* Increased private group chat size to 20 +* Allow users not to connect to history nodes +* Added scan button to fetch ERC-20 tokens + +#### Fixed +* Fix browser issues with logging in on github.com +* Fix bug with mentions not resolved in messages with markdown +* Fix blank view when open yearn.finance +* Fix entering “0x” in recipient field + +Update in the [App Store](https://apps.apple.com/us/app/status-private-communication/id1178893006) or [Google Play](https://play.google.com/store/apps/details?id=im.status.ethereum) if you do not have auto updates enabled. + +The APK available is [here](https://status-im-files.ams3.cdn.digitaloceanspaces.com/StatusIm-Mobile-v1.8.0.apk). + +For the full changelog, see our [Github](https://github.com/status-im/status-mobile/commits/release/1.8.x). +> [Verify APK link before publishing blog post] +> + +## 1.7.2 + +This release fixes an issue with fetching ERC20 balance. It was due to a contract that has been migrated to a different address which cause the whole request to fail. + + +## 1.7.1 +Full release commits: https://github.com/status-im/status-mobile/commits/release/1.7.1 +### Android + iOS +#### Excerpt +Several users have reported an issue in upgrading from release 1.6.1 to release 1.7. This update fixes the issue. + +#### Full +Several users have reported an issue in upgrading from release 1.6.1 to release 1.7. This update fixes the issue. + +The issue occurs when the application is killed during a migration that is part of the update. Killing the app causes the migration to fail and leaves a persistent database error. This error prevents users from unlocking their profile; Showing an error on password entry. The fix provided above resolves this issue by restarting the migration. It also prevents the issue from occuring if you haven’t updated yet. + +So far we’ve only received reports on this issue occurring on Android. We’re monitoring closely to see if further action is required and will take action to prevent this issue from occuring in future updates. Many thanks to our ambassador tbenr and others who reported this issue. + +#### Fixed +Retry failed migration + + +## 1.7 +Full release commits: https://github.com/status-im/status-mobile/commits/release/1.7.x + +### Android +#### Excerpt (446 characters including spaces) +Introducing the ability to mention and be mentioned (Beta). A host of other updates make it easier to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. You can now give 'Trusting Honeydew Panda' a nickname to recognize them. When sending transactions you can save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds. + +#### Full +Introducing the ability to mention and be mentioned. Note that this feature is in Beta, your feedback is much appreciated. Aside from Mentions, this release includes a host of other updates that are all about making it easier for you to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. While your best friend might be the 'Trusting Honeydew Panda' you can now give them a nickname to recognize them. Sending transactions got easier with the new feature to save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds. + + +#### Added +* Mentions (Beta) +* Local nicknames +* Wallet address selection (favorites, contacts, recent) +* Private group chat invite links +* Warning when attempting to send a transaction to a contract +* New tokens: UNI, COMP, BAL, AKRO, OXT, aUSDC +* Collapse long messages for more readible threads + +#### Changed +* Removed the ability to enable using Whisper instead of Waku + +#### Fixed +* Upgrade phishing detection library +* Decimal rounding when using 'Set max' +* ENS resolving for IPNS names +* SUPR support for old and new token contract + + + + +### iOS +#### Excerpt (496 characters incl spaces) +Introducing privacy preserving notifications on iOS. Paired with the ability mention and be mentioned (Beta). A host of other updates make it easier to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. You can now give 'Trusting Honeydew Panda' a nickname to recognize them. When sending transactions you can save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds. + +#### Full +Introducing privacy preserving, remote notifications on iOS. Paired with the ability mention and be mentioned. Note that this feature is in Beta, your feedback is much appreciated. Aside from Mentions, this release includes a host of other updates that are all about making it easier for you to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. While your best friend might be the 'Trusting Honeydew Panda' you can now give them a nickname to recognize them. Sending transactions got easier with the new feature to save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds. + +#### Added +* (Remote) Notifications on iOS +* Mentions (Beta) +* Local nicknames +* Wallet address selection (favorites, contacts, recent) +* Private group chat invite links +* Warning when attempting to send a transaction to a contract +* New tokens: UNI, COMP, BAL, AKRO, OXT, aUSDC +* Collapse long messages for more readible threads +#### Changed +* Removed the ability to enable using Whisper instead of Waku + +#### Fixed +* Upgrade phishing detection library +* Decimal rounding when using 'Set max' +* ENS resolving for IPNS names +* SUPR support for old and new token contract + + +## 1.6.1 +### Android + iOS +#### Excerpt +Introducing a spam mitigation +#### Full +Introducing a spam mitigation +##### Fixed +- Restrict message size on input +- Drop messages based on character length + + +## 1.6 +### Android +#### Excerpt +#### Full +This release includes a small, but important change to existing functionality: Onboard using a 'Referral URL'. You can confirm that you discovered the app through a partner of Status (Opt-in only). It also includes a fix to a persistant bug that resulted in messages not being marked as seen. + +##### Changed +- Attribute a referrer when installing and onboarding to the app using a Referral URL + +##### Fixed +- Mark 1:1 messages as seen (Badge kept reappearing when tapping 'Add as contact') + +### iOS +#### Excerpt +#### Full +This release includes a fix to a persistant bug that resulted in messages not being marked as seen as well as an issue that caused the app to crash. +##### Fixed +- Mark 1:1 messages as seen (Badge kept reappearing when tapping 'Add as contact') +- Crash on iOS when device passcode is switched off and 'Save password' is enabled inside the app + + +## 1.5 +### Excerpt (493 characters excl url) +Now including those features that make you feel connected while being miles apart. If there was a time you wondered if you could chat with friends and family, without giving up your privacy or security, wonder no more. Send images, audio messages, and show your love with emoji reactions ❤️; Not a word is sent to the cloud. #appdown is not a thing. E2E encryption is. If you have Internet you can send and receive messages. Securely. Privately. Always. +For the full changelog, see our Github + +### Full +Now including those features that make you feel connected while being miles apart. If there was a time you wondered if you could chat with friends and family, without giving up your privacy or security, wonder no more. Send images, audio messages, and show your love with emoji reactions ❤️; Not a word is sent to the cloud. #appdown is not a thing. E2E encryption is. If you have Internet you can send and receive messages. Securely. Privately. Always. + +Making new friends on open communities is now easier as well. We took the liberty of surfacing a few active public chats by category. + +For the full changelog, see our Github + + +#### Added +* Send images in 1:1 and group chats +* React with emojis to any message +* Send voice messages in 1:1 and group chats +* Discover public chats by category +* Ability to delete an account + +#### Changed +* Major interface improvements throughout, introducing our Quo component framework +* Auto-forwarding of the onboarding carousel +* Clarify and move 'Access existing keys' to import accounts +* Showing password entry and confirmation on the same screen +* Add contacts or invite friends from Contacts +* Searchbar includes search for ENS names + + +#### Fixed + + + +## 1.4.1 - Round of improvements +### Excerpt +This intermediate release, 1.4.1, includes bug fixes as well as UX and accessibility improvements. Most visibly, a gorgeous set of new icons, accessible input fields and toggling password entry visibility. Next to that the release includes updates to Notifications on Android, like being able to open Status, as well as close the notification service, directly from the notification banner. + +For the full changelog, see our [Github](https://github.com/status-im/status-mobile/commits/release/1.4.x) + + +### Full +While focused on building new features there are a few improvements we did not want to hold off on sharing. This intermediate release, 1.4.1, includes bug fixes as well as UX and accessibility improvements. Most visibly, a gorgeous set of new icons, accessible input fields and toggling password entry visibility. Next to that the release includes updates to Notifications on Android, like being able to open Status, as well as close the notification service, directly from the notification banner. + +For the full changelog, see our [Github](https://github.com/status-im/status-mobile/commits/release/1.4.x). + + + +#### Added +- Language support for Keycard use with Status (see our supported languages in [FAQ](https://status.im/faq/)) + +#### Changed +- Open the app and close the notification service from the notification banner +- More informative error messages for transaction overview contract and network fees +- Added a check for encoded characters in urls to increase browser security +- More accessible text input +- Replace icons with a more unified, carefully crafted set +- Update connectivity snackbar to explain messages can still be send and received when offline; only history does not sync + +#### Fixed +- ENS name is no longer infinitely pending when transaction has failed +- Added explainer that restart of the app is required to Disable logs +- Changed notification icon styling to follow convention of other apps +- Fixed critical issue that caused occasional app crashes +- Now giving feedback when blocking users is in progress +- Apply dark mode/light mode changes to System panel +- Update balance of custom tokens to be visible upon adding the token +- Show chat view after chat search gives no results (chat list showed up empty) +- Bring back numpad to sign with Keycard after dismissing an error (e.g. having tapped an unpaired card) +- Keyboard changes (include decimals for amount input and auto-capitalization) + + + + + +## 1.4 - Keycard, notifications DRAFT +In version 1.4, Status introduces a much anticipated integration with Keycard - the secure, contactless hardware wallet, also designed and developed by The Status Network. This integration enables Keycard holders to store their private keys offline on the Keycard device, add hardware-enforced authorizations to all of their transactions, and introduce two-factor authentication to log into their Status account. + +Another highly anticipated feature is the introduction of notifications. These notifications are [ANDRE to add detail].... + +The final addition to v1.4 is the introduction of browser support for EIP 1139 – A JavaScript Ethereum Provider API for consistency across clients and applications. + +Beyond that, version 1.4 includes some updates to the FAQ, extended translation support, and some fixes to ENS username displays, dark mode contrast, QR code scanner and more. + +For the full changelog, see our [Github](https://github.com/status-im/status-mobile/commits/release/1.4.x). + +#### Added +- Keycard integration on Android +- Browser support for eip-1193 (?) +- Notifications (Android) +- Content type for images in preparation of 'Images in chat' release + +#### Changed +- Extended and consolidated FAQ +- Extended translation support +- Animation in header (Profile + Wallet) + + +#### Fixed +- ENS in chat only when transaction is confirmed +- Dark mode contrast (increased) +- Updated and expanded token icons +- Resolved error on scrolling account view +- Parse markdown in subheader chat list +- Banner to back up seed phrase tappable +- [Chat performance improvements](https://github.com/status-im/status-mobile/pull/10711) +- QR code scanning issue when scanning from join.status.im + + +## 1.3 - Dark Mode, Group Chat + +In version 1.3, Status catches up to the most important design trend in recent history with the introduction of a dark mode. + +Hyperbolic? Perhaps, but we've heard your requests and we made it happen. Your app's appearance will now default to match your system settings, but if you'd like, you can head to `Profile` > `Appearance` to override it. Dark mode sure is easy on the eyes. + +Beyond that, we're bringing back private groups, another highly requested feature. Private groups allow you to add up to 9 friends to an invite-only chat. At the protocol level, group chats in Status function similarly to 1:1 chats. They're encrypted end-to-end and utilise perfect forward secrecy to protect your privacy. + +In the future, we'd like to expand these to host more than 10 members. We'll embark on further testing to determine the upper limit that our current protocol can support. + +Lastly, we've changed our webview implementation over to the react-native-community package, to remain in sync with the React Native community and benefit from upstream improvements. + +As always, we've also included a few nice fixes in this release. For the full changelog, [see our Github](https://github.com/status-im/status-mobile/commits/release/1.3.x). + + +#### Added +- Dark mode +- Group chat + +#### Changed +- Browser implementation now using react-native-community webview package + +#### Fixed +- Updates to back navigation +- Persistant wallet value +- Update to all text input, increasing pressable areas +- Improved seed phrase text input on small screens +- Easier to find user's public key for sharing (https://github.com/status-im/status-mobile/pull/10207#event-3163431514) +- Shortened universal links (https://github.com/status-im/status-mobile/issues/10083) + +## 1.2 + +### Short Version + +The change log is small, but significant! We've enabled mailservers that use our forked version of Whisper, known as Waku. Waku servers reduces bandwidth consumption by the app and enable Status to serve more concurrent users. + +A few bug fixes and optimizations are included, too. + +### Blog Post + +This release is one of the most important in Status' history. The change log is small, but significant. Today we're rolling out new mailservers that use our fork of the Whisper messaging protocol, known as Waku. + +Waku mailservers prevent Status from using excessive mobile bandwidth. With Waku, Status can support 10 times as many users as with Whisper servers alone. + +Regular Whisper mailservers use topic-based filters to surface only the chats that you want to see, but your device still receives all messages sent over the network. Filtration happens after the fact. + +To save on resources, Waku mailservers simply tell other nodes in the network which topics your device would like to receive content for, filtering before the messages reach your device. + +Heavy message traffic can be incredibly resource intensive, depending on how many topics you follow. For a heavy user, the difference can amount to several hundred kilobytes of data per minute. + +There is a potential privacy tradeoff in making your followed topics apparent to other nodes—it is easier to know if a given IP address belongs to a certain chat. + +In v1.2, we offer the legacy Whisper servers as an option under `Advanced` settings. You can disable Waku by toggling `Waku enabled`. Waku mailservers talk to existing mailservers without any disruption. + +With further improvements to Waku in the pipeline, Status becomes accessible to even more users and can deliver peer-to-peer messaging without draining unnecessary data. + + + +### Changelog + +#### Changed +- Waku mailservers +- Updating wallet fiat prices even more frequently (awaiting clarification) + +#### Fixed +- App crashing when webview is closed +- Messages not showing when received while on a different tab +- Token balances displayed as 0 after relogin + +## 1.1 + +Biggest changes: +- Status now support importing private key and seed phrase inside multiaccount! +(https://github.com/status-im/status-mobile/pull/10100) +- all chat dialogs moved to bottom sheet +- added "Mark all as read" option +- unread badge is changed for public chat + +More detailed: + +ENS name improvements: + +- https://github.com/status-im/status-mobile/pull/9952 - fixes ENS to new registry +- https://github.com/status-im/status-mobile/pull/9997 - Check for empty public key (for ENS names) +- https://github.com/status-im/status-mobile/pull/10007 - improve ENS display in Public chats +- https://github.com/status-im/status-mobile/pull/10022 - fix crash on long ENS names + + +General improvements: + +- https://github.com/status-im/status-mobile/pull/10027 - deep link handling (rename get.status.im to join.status.im) +- https://github.com/status-im/status-mobile/pull/9940 - changed navigation on logout +- https://github.com/status-im/status-mobile/pull/9917 - added search to currencies and assets +- https://github.com/status-im/status-mobile/pull/9941 - improvement on snackbar by considering login time (less "Offline", "Connected" after login) +- https://github.com/status-im/status-mobile/pull/9898 - added qr code reader for scanning QR when add watch-only address +- https://github.com/status-im/status-mobile/pull/9882 - Respond to FaceID failure callback +- https://github.com/status-im/status-mobile/pull/9915 - Make bottom sheet height dynamical +- https://github.com/status-im/status-mobile/pull/9931 - 2 lines for user name on intro screen + +Chat improvements: +- https://github.com/status-im/status-mobile/pull/10056 - added "Mark all as read" feature +- https://github.com/status-im/status-mobile/pull/9993, https://github.com/status-im/status-mobile/pull/9999 - better handling of ENS names / chat keys when starting new chat +- https://github.com/status-im/status-mobile/pull/10117 - reworked unread message indicator in public chats +- https://github.com/status-im/status-mobile/pull/9868 - all chat dialogs are moved to bottom sheets + +Performance improvements: +- https://github.com/status-im/status-mobile/pull/9995 - Offload chat messages +- https://github.com/status-im/status-mobile/pull/10120 - Android app UI is slow after background + +Issues fixed: +- https://github.com/status-im/status-mobile/issues/10002 +- https://github.com/status-im/status-mobile/issues/8797 +- https://github.com/status-im/status-mobile/issues/6839 +- https://github.com/status-im/status-mobile/issues/9754 +- https://github.com/status-im/status-mobile/issues/10044 +- https://github.com/status-im/status-mobile/issues/10041 +- https://github.com/status-im/status-mobile/issues/9886 + +## 1.0 + +### Blog Post + +Status version 1 is live! + +After nearly a year of quiet and focused development, we've restructured the core application, built out the promises of the white paper and prepared the app for a future in which the Status Network seeks to deliver on the promises of Ethereum at large. + +While the core mobile application is no longer the sole focus of the Status Network, it is integral to our dream of a decentralized web. With Status, we're building not just a tool for private and secure communication, but a gateway into an emerging ecosystem of distributed applications that embodies what is possible with decentralized technologies today. We believe apps like Status represent the future of the web—enabling an internet that can uphold human rights, and providing a path towards more open and equitable systems. + +Today, the underpinninngs of the core application are still tethered to the Ethereum stack. Whisper is still the communication layer of Status, and Status is still the only production use case of Whisper. + +The scalability of Whisper is not significantly improved from what it was roughly three years ago, when we first embarked on this project. We face immense challenge in building on this stack every day. + +But we also feel ready to share our progress with the world. Status version 1 launches with the Ethereum wallet, web3-enabled browser and peer-to-peer messenger that our community knows well. It includes new SNT utility features, like a sticker marketplace and a decentralized DApp directory (https://dap.ps). Other white paper features, such as the fiat-to-crypto Teller Network and incentivized messaging with Tribute to Talk, are well underway. + +Most pressingly, we're working to remedy the limitations of Whisper. In a forthcoming release, we'll introduce Waku mailservers, which will reduce the amount of bandwidth Status consumes—an important point for accessibility—and extend the capabilities of our nodes so that Status can support more concurrent users. + + +[Link to user guide] +[Link to roadmap] +[Shoutout contributors & team] +Huge shout out to our contributors: +Enrico +Yalu (user GH name) +Acolytec3 + +----- + +**Support comms** +- How to submit stickers for sticker marketplace ([google form](https://docs.google.com/forms/d/19itZB_V5bVW4cyV8a2ifDWHuQSr9V_dkVMCl6ARxOag/edit)) +- How to share your feedback with us (#status, primarily) +- Learn more about Status - Glossary, [FAQs up-to-date](https://status.im/docs/FAQs.html), [user guide by Jonny](https://docs.google.com/presentation/d/11o53KGcuzKouDU5VBeTB01mLCm41hKKuraz-AaudsEg/edit#slide=id.p) +- How to release your ENS name ([here](https://hackmd.io/QrfTRP6sQ9aQzjFyb_IfRQ?both)) +- How to set up your existing ENS name ([here](https://hackmd.io/QrfTRP6sQ9aQzjFyb_IfRQ?both)) + +----- + +**v1.0 Change Log** +**Added** +• Support for multiple Ethereum wallets within one Status account +• Generate unlimited additional BIP 44 wallets in Status +• Add watch-only addresses as well +• Brand new onboarding and key encryption flow +• Choose your random name and public chat key during onboarding +• You also can recover a seed phrase from any mnemonic compatible wallet +• Improvements to wallet transaction flow UI +• Sticker market and two initial sticker packs +• Choice of wallet to use when interacting with Dapps +• [Proper markdown support](https://github.com/status-im/status-mobile/pull/9409#issue-338045622) +• ENS username setting option for use in chat +• Improved chat intro screen and public chat list +• Updated chat command flow, with additional privacy layer to be compatible with multiaccount + +**Removed** +• Custom display names +• Custom profile photos, temporarily—photos will become a feature of ENS +• Push notifications—these will be improved and reintroduced for Android +• Group chat, temporarily—fixes to be prioritized for v1.1 +• Google Firebase database and Realm.js DB—performance gains, and more in line with our principles (fewer third party services) + +**Changed** +• Algorithm for deriving public chat key changed, performance. (andrey review: pubkey or 3 word name?, not sure if Algorithm for deriving pubkey can be changed) +• Storage of app state moved to Status-go—performance improvements in chat load times +• Browser privacy mode enabled by default, option removed (EIP1102) +• Updates to EIP1102 for compatibility (https://github.com/status-im/status-mobile/pull/9629) +• Protocol breaking changes: removed transit encoding in favor of protobuf, for better performance and interoperability with other languages +• Roughly 45% improvement in how quickly chats load +• Profile screen cleaned up + + +---- + +> Names and picture have changed as we use a different algorithm to generate it (linear > > feedback shift register instead of Mersienne Twister). +> There are breaking changing between protocol, as agreed before, so no compatibility at all. Previous version won't be able to receive/send messages to v1. + +> We confirmed the performance improvement with the test-team, roughly 45% improvement in how quickly chats load (maybe greater). +>indeed, true, good move to make together. +> but I would suggest to also add in the release changelog that the algorithm for deriving a > pubkey -> 3 word name changed, just because a standard was changed +> this is also good to say because there is performance gains. + + +## 0.13.2 +- V1 notification +- Bug fixes: + - Neverending loading indicator (#8550) + - Last message jumps after chat is opened (#8556) +- Sticker Market with two packs launched on mainnet +- Account explorer in preparation for multi-account +- Onboarding face lift (preparing for multiaccount/keycard) + +## 0.13.0 + +This release comes with a long change log and one popularly requested new feature: custom, user-added ERC20 token support. + +If you'd like to see a token that the Status wallet does not display by default, you can now add it yourself. From the wallet screen, open `Manage Assets` from the `...` menu and select `Add custom token`. Fill in the token's contract address, and the relevant information, and you will then be able to view this asset in your wallet. + +We've also added and altered our privacy settings: + +1) New `Preview privacy mode`: toggling this option in your profile will ensure that Status displays a blank screen when switching apps on your phone, to protect you from accidentally exposing your information while doing other things. Thanks to contributor [bitsikka](https://github.com/bitsikka) for this feature! +2) `Browser privacy mode` has been relocated from the profile to the browser, and reconfigured into a two option setting. Selecting `Require my permission` for this setting ensures that privacy mode is on, but still means that some DApps may be incompatible with Status. + +![](https://notes.status.im/uploads/upload_c9ea844cdcdc1ce5a786373ac08521bc.png) + +There are a few more important changes: + +- `Fetch more messages` was introduced in 0.12.0 to fill gaps in your message history; it now backfills gaps of up to 30 days in public chats, increased from 24 hours. +- We've removed the swipe functionality from the chat screen. To remove a chat, you can now tap on it and hold, pulling up a bottom menu. Another shout out to [bitsikka](https://github.com/bitsikka) for this change! +- We've reintroduced bug reporting on both iOS and Android: shake your phone to pull up an email report, or enable `Development mode` from your profile screen to `Report a bug` from there. + +Lastly, we've had some great contributions from the community for this release. They've added new features, refactored and even merged some changes to our developer tools. + +Special thanks to [tbenr](https://github.com/tbenr), [bitsikka](https://github.com/bitsikka), [m0ar](https://github.com/m0ar) and [alexanmtz](https://github.com/alexanmtz) for your recent [commits](https://notes.status.im/CgruSsRzQVGhsagaLxXGqQ?view#0130-mobile-release)! + +To get involved, you can find our current bounty issues on Gitcoin [LINK]. + + + +**Added** +- Custom, user-added ERC20 support +- New bug reporting options: shake device to send a report, with logs attached +- Bloom Protocol token - thanks to contributor [m0ar](https://github.com/m0ar)! +- Preview privacy mode to display blank Status screen when switching apps - thanks to contributor [bitsikka](https://github.com/bitsikka)! +- URLs for transactions open in Status (partial [EIP681](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-681.md) support) + +**Changed** +- Moved `Browser privacy Mode` toggle to the browser screen as new preference setting +- `Fetch more messages` button now retrieves up to 30 days of history in public chats +- Long press a chat for more options; no more swiping +- Fewer messages rendered before a chat is scrolled for better performance ([8191](https://github.com/status-im/status-mobile/pull/8191)) +- Using checksummed addresses in wallet (EIP55) ([8121](https://github.com/status-im/status-mobile/issues/8121) and [4959](https://github.com/status-im/status-mobile/issues/4959)) +- Scanning QR code from a DApp does not cause redirect + +**Fixed** +- Browser crash when incorrect domain entered ([8239](https://github.com/status-im/status-mobile/issues/8239)) +- ENS registration bug ([8249](https://github.com/status-im/status-mobile/issues/8249)) +- Wallet balance updates correctly after Tx received ([8107](https://github.com/status-im/status-mobile/issues/8107)) +- Support for EIP1577/`contenthash` field for ENS +- Numeric validation for `send`/`receive` chat commands ([1442](https://github.com/status-im/status-mobile/issues/1442)) +- Allow to select chat item below plus button ([7859](https://github.com/status-im/status-mobile/issues/7859)) + + +## 0.12.0 + +In this release, we're announcing the launch of Discover! + +Discover is our new portal for exploring the decentralized web. It has long been our vision for Status to act as a gateway to the new web, just like Chrome or Safari do for web2. + +Until this point, however, we've prioritized a curated list of DApps over an open-ended experience. + +With the launch of Discover, our browser becomes just that—a browser, with special capabilities for web3. + +Discover is its own web app and the new go-to for finding DApps. For now, we've ported over our existing list, with a few upgrades to the UI. + +But in the near future, we're decentralizing Discover, enabling anyone to add a DApp and giving the community control over curation through an SNT voting mechanism. More on that [here](https://our.status.im/discover-preparing-for-launch/). + +Discover can be accessed from any browser at https://dap.ps, so you can participate on desktop as well. + +This release also comes with a noteworthy chat improvement. Previously, a gap in connection to the mail servers—which happens if Status is closed for more than 24 hours or otherwise loses connection—meant that some messages might be lost. + +We now detect gaps where messages are missing and offer you the option to fetch the missing history. By tapping `Fetch messages` when it appears within a chat, you can backfill missing history. This is a big step forward for reliability in our peer-to-peer service. + +**Added** +- `Fetch messages` option to get missing message history +- Discover is live on https://dap.ps + +**Changed** +- `DApps` screen is now fully browser-centric with address bar, history and a link to Discover + + +**Fixed** +- Contact syncing between 0.11.0 and newer builds +- 503 error when accessing DApps +- More reliable history for token transactions + +## 0.11.0 + +Download 0.11.0 and you'll notice one thing right away: we have a new navigation! + +The home screen has been split into two tabs: Chats & DApps. From the chat view, you'll find the option to start or join a new chat has moved from the top right corner to bottom center. + +The DApp list also looks slightly different. We've done away with info screens for each DApp. Once you navigate to a URL, you'll find that your browser history appears under a `Recent` section at the top. + +This is phase one of bigger improvements to come, so we'd love to hear your feedback. + +We've also made preparations for the impending [Chaos Unicorn Day](https://chaos-unicorn-day.org/) in this release. + +Reminder: On April 1st, we'll experiment with eliminating all centralized, third party services from Status, including our own node clusters. To safeguard from the chaos, we've prepared [a guide for you](https://our.status.im/bulletproofing-against-chaos-unicorns-with-status-on-arm/). + + + +**Added** +- New DApps added +- New extensions features integrated within Status +- Chaos mode and preparation for Chaos Unicorn Day + +**Changed** +- New bottom navigation: chats & DApps are separated +- Improved UI performance (https://www.pivotaltracker.com/story/show/164245989) + +**Fixed** +- Universal link to public chat bug (https://github.com/status-im/status-mobile/issues/7549) +- Beta warning popup (https://github.com/status-im/status-mobile/issues/7771) +- DApp offline error (https://github.com/status-im/status-mobile/issues/7188#issuecomment-474308724) +- Bug with QR code scanner for custom bootnodes (https://github.com/status-im/status-mobile/pull/7782) +- Error message when entering an incorrect custom mailserver (https://github.com/status-im/status-mobile/issues/7752) + + +## 0.10.1 - Hot Fix + +**Added** +- Option for automatic mail server selection to optimize connection + +**Fixed** +- Copy errors corrected +- "Fetching messages" indicator appears on home screen + +## 0.10.0 + +A handful of exciting new features and fixes coming to you fresh in 0.10.0. + +First, a word about our new version numbers. Until now, our build versions have followed a convention of minor increments: 0.9.31, 0.9.32, 0.9.33. To better reflect the scope of our releases, we've [decided to level up](https://discuss.status.im/t/new-status-versioning-scheme/1066) to 0.10.0 and increment by 0.1.0 for typical releases, and 0.0.N for bug fixes. Our routine is business as usual otherwise. + +Onto the highlights from 0.10.0. + +The option to block a user will come in handy for those who participate in popular public chats. If someone is spamming a chat or otherwise bugging you, simply tap on their icon and hit `Block contact` from their profile. You'll no longer see any of their messages. + +From _your_ profile screen, you can undo this action via a new contact list feature. Open `Contacts` to find a list of users who are able to see your info—namely, photo and display name—and from there, `Blocked users` to see and unblock users as you wish. + +To better find users you _do_ want to hear from, we've added a search bar to the home screen. This allows you to filter through chats and browser history items. Text search within a chat is still to come. + +Back on your profile screen, you'll find another helpful new option to control message syncing. If on a mobile network, you can require Status to ask before syncing conversations, in order to protect against heavy data usage. You can also enable mobile network syncing by default, or turn these options off completely. + +You'll also find a new DApp permissions section here. DApps that adhere to browser privacy mode [ask permission](https://our.status.im/0-9-33/) to access your Ethereum account. You can now revoke access for a given DApp using these settings. + +And that concludes the most significant changes of this release! For more, check out the change log below. + +**Added** +- Ability to block specific users from profile view +- Contacts and blocked users list +- Search bar for chats and browser history +- Option to turn off syncing for chat on cell connection +- DApp web3 permissions management +- New DApps and WBTC token + +**Changed** +- Push notifications include sender name +- Contact updates pushed periodically to better maintain user data +- Public chats show first letter instead of # +- Minor tweaks to chat UI + +**Fixed** +- Status now works on restricted [ports](https://github.com/status-im/status-mobile/pull/7382) +- Overlap on small screens during log-in +- False mailserver connection error [removed](https://github.com/status-im/status-mobile/issues/7531) +- Premature sending of contact requests on Profile > Send message +- DApps on same host (i.e. IPFS) no longer share user-granted permissions + +Ready to update to 0.10.0? + +iOS +Within TestFlight, make sure you see version 0.10.0 and tap ‘INSTALL.’ +If you don’t currently have Status installed, access via TestFlight here: https://testflight.apple.com/join/J8EuJmey. + +Android +If you are not automatically asked to update, go to Status.im in the PlayStore and click ‘Update.’ +For more information, please join us in Status. +We're more than happy to answer your questions and help you out. + +--- +Social copy: +Release 0.10.0 is here! A whole bunch of exciting features, blocking contacts, searching, & more. Check out the blog for more details and update Status. our.status.im/0-10-0/ + + + +## 0.9.33 + +We're back in action! After a pause for the holidays and a transition back that saw us release 4 small updates to v.0.9.32, we've got a brand new mobile version for you. + +This release is a big one. + +First, we've made significant improvements to log-in, yielding a 10x increase in log-in speed. Android users will also be pleased to find a "Save password until logout" toggle to match iOS. This will save you significant time on launch of the app. + +Push notifications are improved by a number of fixes, including opening to the appropriate chat and no longer exposing your language settings to recipients using a different language than your own. + +Because of these fixes, anyone using an older version of the app **_will not receive notifications_** from users on v.0.9.33. Furthermore, iOS users will not receive push notifications while the app is closed, nor if they are on certain iOS versions (11.X). This is a known and temporary issue. + +Browser privacy mode is now enabled by default. This means that DApps will be required to ask permission before connecting to your wallet, and it may cause some DApps to break. If you find a DApp isn't working, you can go to your profile screen and toggle privacy mode off. In many cases, this should fix the issue. + +We're hopeful that more and more DApp developers will be up to speed with this new convention soon. + +Device pairing is no longer hidden under development mode. Visit the device section on your profile screen to "Pair this device" and sync messages and contacts from your phone to desktop. You can also name your devices to track which you've paired. + +For the full list of changes, see below. + +**Added** +- Device pairing and naming +- "Save password until logout" for Android +- New DApps including Aragon and Dragonereum +- BUFF token for ETHDenver +- Titles and favicons in browser +- Support for EIP1577, multihash interface for ENS names + +**Changed** +- Privacy mode enabled by default +- Log-in time improved 10x +- Private group chats limited to 10 members +- Connectivity loading indicator no longer appears as "Fetching messages" +- Chat bubble width increased +- Ethereum provider consistent with EIP1193 +- Upgraded styling for group chats + +**Fixed** +- Metadata leakage of language settings in push notifications +- Push notifications failing to open chat +- Loading indicator in browser +- Results displaying properly in Etheroll +- Issues with extensions installation +- Wrong password handling + +------- + +_Notes to call out_ +- Privacy mode by default instructions +- Breaking change: no PNs for old versions after next mobile release - https://github.com/status-im/status-mobile/pull/6893 +- Setting up device pairing + + +## 0.9.32 +Introducing beta support for Private group chats! +In this release you’ll find the ability to start private group chats with your friends. These group chats are e2e encrypted and utilize Signal's [double ratchet algorithm](https://en.wikipedia.org/wiki/Double_Ratchet_Algorithm) for guaranteed privacy. To start chatting go to the Home tab, tap "+", then Start group chat. + +There is also beta support for device pairing between all devices. To begin syncing messages and contacts across devices, go to Profile, tap advanced and turn on development mode, now go to devices and tap pair this device. + + + +Added +- Private group chats with increases security using Signal's double ratchet algorithm (In beta. Still being tested. Feedback welcome!) +- Device pairing and syncing with perfect forward secrecy (in dev mode) +- Added DApp Decentraland + + +Changed +- Support multi-extensions store +- Restyled wallet onboarding flow, main wallet screen, and sent-transaction screen +- Faster sign-in + +Fixed +- Transaction history fixes +- Updating enabled tokens before navigating to wallet + +[All changes](https://github.com/status-im/status-mobile/compare/release/0.9.31...release/0.9.32) + +## 0.9.31 + +Version 0.9.31 brings Status up to speed with the latest privacy standard for Ethereum browsers, introduced by EIP1102. + +You'll find a new privacy setting on your profile screen called "Browser privacy mode." + +If you toggle this setting ON, DApps will be required to ask your permission before accessing your Status wallet. DApps that do not currently follow this standard may not work! + +If you run into trouble, you can always toggle this setting OFF. With Browser privacy mode OFF, DApps can access your Status wallet without your permission. + +We're encouraging DApp builders to adopt this new standard and make web3 safer for users as soon as possible. Check the Status blog for details on how to comply. + + + +Added +- Browser privacy mode to toggle new web3 security setting on or off +- New DApps: Crypto Takeovers, Cryptographics, blockimmo and SNT Voting DApp +- ST to assets list + +Changed +- Changing mailserver no longer requires a logout +- Send button is inactive when there isn't an active internet or mailserver connection + +Fixed +- ENS addresses with unregistered chat IDs no longer resolve in chat +- CryptoKitties log-in issue +- Restored missing transaction error messages +- Granting profile access applies per DApp rather than per host + +[All changes](https://github.com/status-im/status-mobile/compare/release/0.9.30...release/0.9.31) + +## 0.9.30 + +Added + +- ENS registration link on profile screen +- Kudos tokens for the Status #CryptoLife Hackathon +- Reply and quote a message in chat. Long tap a message and tap Reply. +- Chat now resolves all .eth address +- New Farsi and Latin American Spanish translations +- Every Dapp gets its own built in chat room. Tap the chat icon from the Dapp browser to start chatting +- Added Kickback Dapp +- New custom RPC networks for POA Network and xDAI Chain + + +Changed +- Anonymous names now shown in chats and profile +- Disabled "sign transaction" button when offline +- Renamed default international public chats to ensure universal links would work. For example “status 中文” was changed to “status-chinese”. +- Removed Instabug for bug reports. In-app help is now available in #status + +Fixed +- Fixed an issue where messages are not saved to the database in some circumstances +- Fixed an error when fetching history on certain accounts +- Fixed logging in after logout when opening app from a notification +- Fixed profile QR code +- iPhone XS Max improvements + +Known Issues + +- POA and xDAI networks are only available for new accounts, not upgrades +- For more POA and xDAI network considerations see this issue post. + +## 0.9.29 + +This releases improves message validation to prevent potential crashes or malformed messages. We recommend all users upgrade. + +The fix makes these improvements: +- add validate method to StatusMessage protocol +- spec all message types for use in validate method +- use valid method after transit/decode step to reject invalid messages + + +## Older Versions + +- [Google docs](https://docs.google.com/document/d/1Z0mFlJJkNbRgv6qm80ob5g4PEvsI8cTmbwZpcRPWPho/edit#) + diff --git a/REVIEW.md b/REVIEW.md deleted file mode 100644 index 80060adce17..00000000000 --- a/REVIEW.md +++ /dev/null @@ -1,42 +0,0 @@ -This document MUST be updated everytime a PR has been identified has the source of a bug in develop. The post mortem analysis MUST include: the CAUSE of the bug, the RESOLUTION PROCESS and PREVENTION MEASURES. - - -# "sql: no rows in result set" error on iOS login - -## Cause - -There were errors in the iOS native code: -- "loginWithKeycard" method was not implemented -- "createAndLoginWithKeycard" method was actually used instead of "createAndLogin** which is used for regular account creation without keycard and doesn't have the same final argument - -QA process was focused on account creation and login with keycard, and this bug would only appear specifically on iOS when creating an account without keycard and only during the next login. It was therefore a more complex path to reach than what could have been expected from this PR, and it was caused in develop by a developer working on iOS simulator because that is a common path during development. - -## Resolution process - -- the commit was reverted locally by the developer which fixed the issue localy and confirmed the faulty commit -- the bug was only reproducible on iOS which strongly hinted at a potential issue with native code -- the missing method was not the origin of the problem but was found at this point and further analysis lead to the shadowing error - -## Prevention measures - -- PRs that change native code should be checked for platform parity: - - same methods are created/modified for each platform - - test cases in the PR should take these methods in consideration - -# Missing labels for en translation - -https://github.com/status-im/status-react/issues/9003 - -## Cause - -Unused labels in the application have been listed by QA and an issue created for their removal. The PR was made by an external contributor and it had to be rebased many time because it touched many files and other PRs got merged before this one could be tested. After a last rebase the PR was merged with 100% e2e test but no manual testing. - -The reason some translations got deleted despite the fact that they were used is because the `message status` related labels were not explicitly mentioned in the code unlike every other labels. They were built from the actual `message status` and the prefix `status-`. - -## Resolution process - -The mistake was quickly noticed in develop and an issue created. The fix was to recover the 3 labels that were accidentally deleted. - -## Prevention measures - -The code has been changed so that the labels are no longer generated and appear in the code like other labels. diff --git a/STARTING_GUIDE.md b/STARTING_GUIDE.md deleted file mode 100644 index acfd9415603..00000000000 --- a/STARTING_GUIDE.md +++ /dev/null @@ -1,50 +0,0 @@ -# Description - -This document provides information on how to start developing Status App. - -# Getting Started - -To start developing start a shell for platform you are interested in. -``` -make shell TARGET=android -``` -This step will take a while the first time as it will download all dependencies. - -To build the app, your can simply run on of the following: -``` -make release-android -make release-ios -``` -For more `make` targets run `make help`. - -# Manual Steps - -There are a few manual steps you might want to do in order to start contributing. - -## Genymotion Virtualization - -Optionally set up Genymotion if you don't want to use Android Virtual Device: - -https://www.genymotion.com - -## Android Development Environment - -You can also setup Android Development Environment + Simulator: - -https://facebook.github.io/react-native/docs/getting-started.html - -## Configure GitHub Account - -The optimal way of pushing to GitHubis using SSH instead of user/pass auth. - -It's recommented that you [add your public SSH key to your GitHub account](https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account). - -## Configure GPG Keys for signing commits - -In order to increase security we require all commits in `status-react` repo to be signed with a GPG key. - -Steps: -1. [Generate a new GPG key](https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key) -2. [Setup Git to use your GPG key](https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key) -3. [Setup Git to sign commits](https://help.github.com/en/github/authenticating-to-github/signing-commits) -4. [Setup GitHub to validate commits](https://help.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account) diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md deleted file mode 100644 index 2588dbe65a1..00000000000 --- a/TROUBLESHOOTING.md +++ /dev/null @@ -1,101 +0,0 @@ -# [DEPRECATED] Undefined is not an object evaluating `register_handler_fx` - -## Deprecation note - -This type of error should not occur anymore now that we require the namespace in the `fx.cljs` file. - -It can however happen with other macros requiring a cljs namespace. - -The general fix for that type of issue is to have two files for the namespace where your macros are defined, let's say for `my-project.my-macro` namespace you would have: -- my_macro.cljs in which you need `(:require-macros my-project.my-macro)` and `(:require my-project.the-namespace-used-in-the-macro)` -- my_macro.clj in which you define the macro - -That way you don't need to use any magical call like `find-ns` or inline `require` with some kind of call only once switch (which was the root cause of another bug in ``defstyle`` macro because the compilation phase at which the evaluation of the switch is done was not properly considered). - -You also want to make sure users are using the macro by using a aliased namespace defined in require statement rather than require-macro and refer to the macro directly. Otherwise it won't require the cljs file and the require statement of the namespace in the macroexpension might not be there. - -## Stacktrace - -``` -13:25:22, Requiring: hi-base32 -13:25:23, Possible Unhandled Promise Rejection (id: 0): -TypeError: undefined is not an object (evaluating 'status_im.utils.handlers.register_handler_fx') -eval code -eval@[native code] -asyncImportScripts$@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:200728:21 -tryCatch@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26567:23 -invoke@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26742:32 -tryCatch@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26567:23 -invoke@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26643:30 -http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26653:21 -tryCallOne@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:3725:16 -http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:3826:27 -_callTimer@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:28405:17 -_callImmediatesPass@http://localhost:8081/index.bundle?pla<…> -``` - -## Cause - -- stacktrace mentions `register_handler_fx`, -- common cause is when requires have been cleaned up and a require of `status-im.utils.handlers` namespace was removed because it looked like it was unused but was actually used through a fx/defn macro - -## Solution - -go through known faulty commit looking for deleted requires - - -# Git "unable to access" errors during `yarn install` - -## Description -Developer updates `package.json` file with a new dependency using a GitHub URL. So it looks like this: -``` - "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#feature/exportKeyWithPath", -``` -Afterwards, when running e.g. `make react-native-android`, they might see the following confusing error: -``` -# macOS -fatal: unable to access 'https://github.com/siphiuel/react-native-status-keycard.git/': SSL certificate problem: unable to get local issuer certificate -# Linux -fatal: unable to access 'https://github.com/status-im/react-native-status-keycard.git/': Could not resolve host: github.com -info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command. -``` - -## Cause -`yarn.lock` is not updated to be in sync with `package.json`. - -## Solution -Update yarn.lock file. In order to do this, perform the following steps on a clean `status-react` repo: -``` -cd status-react -ln -sf mobile/js_files/package.json . -ln -sf mobile/js_files/yarn.lock . -yarn install -``` -and don't forget to commit updated `yarn.lock` together with `package.json`. - - -# adb server/client version mismatch errors - -## Description -Running some adb commands, e.g. `adb devices` or `make android-ports` (in turn invokes `adb reverse`/`adb forward` commands) may display the following message: -``` -adb server version (40) doesn't match this client (41); killing... -``` -or the reverse -``` -adb server version (41) doesn't match this client (40); killing... -``` - -This might cause all kinds of difficult-to-debug errors, e.g.: - - not being able to find the device through `adb devices` - - `make run-android` throwing `com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: device 'device-id' not found.` - - `make run-android` throwing `- Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081 Unable to install /status-react/android/app/build/outputs/apk/debug/app-debug.apk com.android.ddmlib.InstallException: EOF` - - dropped CLJS repl connections (that have been enabled previously with the help of `make android-ports`) - -## Cause -System's local adb and Nix's adb differ. As adb include of server/client processes, this can cause subtle version errors that cause adb to kill mismatching server processes. - -## Solution -Always use respective `make` commands, e.g. `make android-ports`, `make android-devices`, etc. - -Alternatively, run adb commands only from `make shell TARGET=android` shell. Don't forget the `TARGET=android` env var setting - otherwise `adb` will still be selected from the system's default location. You can double-check this by running `which adb`. diff --git a/VERSION b/VERSION index a803cc227fe..78d1d9cf49e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.14.0 +2.34.1 diff --git a/android/app/BUCK b/android/app/BUCK deleted file mode 100644 index 7566a15f251..00000000000 --- a/android/app/BUCK +++ /dev/null @@ -1,53 +0,0 @@ -import re - -# To learn about Buck see [Docs](https://buckbuild.com/). -# To run your application with Buck: -# - install Buck -# - `npm start` - to start the packager -# - `cd android` -# - `cp ~/.android/debug.keystore keystores/debug.keystore` -# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck -# - `buck install -r android/app` - compile, install and run application -# - -lib_deps = [] -create_aar_targets(glob(["libs/*.aar"])) -create_jar_targets(glob(["libs/*.jar"])) - -android_library( - name = 'all-libs', - exported_deps = lib_deps -) - -android_library( - name = 'app-code', - srcs = glob([ - 'src/main/java/**/*.java', - ]), - deps = [ - ':all-libs', - ':build_config', - ':res', - ], -) - -android_build_config( - name = 'build_config', - package = 'im.status.ethereum', -) - -android_resource( - name = 'res', - res = 'src/main/res', - package = 'im.status.ethereum', -) - -android_binary( - name = 'app', - package_type = 'debug', - manifest = 'src/main/AndroidManifest.xml', - keystore = '//android/keystores:debug', - deps = [ - ':app-code', - ], -) diff --git a/android/app/build.gradle b/android/app/build.gradle index e942a4deba1..850f20752fc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,110 +1,75 @@ apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" import com.android.build.OutputFile import com.sun.org.apache.xalan.internal.xsltc.compiler.Copy -/** - * The react.gradle file registers a task for each build variant: - * - bundlePrJsAndAssets - * - bundleDebugJsAndAssets - * - bundleReleaseJsAndAssets - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "../../node_modules/react-native/react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation - * entryFile: "index.android.js", - * - * // whether to bundle JS and assets in debug mode - * bundleInDebug: false, - * - * // whether to bundle JS and assets in release mode - * bundleInRelease: true, - * - * // whether to bundle JS and assets in another build variant (if configured). - * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property can be in the following formats - * // 'bundleIn${productFlavor}${buildType}' - * // 'bundleIn${buildType}' - * // bundleInFreeDebug: true, - * // bundleInPaidRelease: true, - * // bundleInBeta: true, - * - * // whether to disable dev mode in custom build variants (by default only disabled in release) - * // for example: to disable dev mode in the staging build type (if configured) - * devDisabledInStaging: true, - * // The configuration property can be in the following formats - * // 'devDisabledIn${productFlavor}${buildType}' - * // 'devDisabledIn${buildType}' - * - * // the root of your project, i.e. where "package.json" lives - * root: "../../", - * - * // where to put the JS bundle asset in debug mode - * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", - * - * // where to put the JS bundle asset in release mode - * jsBundleDirRelease: "$buildDir/intermediates/assets/release", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in debug mode - * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in release mode - * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", - * - * // by default the gradle tasks are skipped if none of the JS files or assets change; this means - * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to - * // date; if you have any other folders that you want to ignore for performance reasons (gradle - * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ - * // for example, you might want to remove it from here. - * inputExcludes: ["android/**", "ios/**"], - * - * // override which node gets called and with what additional arguments - * nodeExecutableAndArgs: ["node"], - * - * // supply additional arguments to the packager - * extraPackagerArgs: [] - * ] +/* + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. */ -project.ext.react = [ - nodeExecutableAndArgs: ["node", "--max-old-space-size=16384"], - entryFile: "index.android.js", - enableHermes: true, // clean and rebuild if changing. NOTE: Hermes engine is required for Android 64-bit builds running on 64 devices, to guard against a hang in the UI thread after invoking status-go - bundleInPr: true, - inputExcludes: ["android/**", "ios/**", "react-native/**", "src/**", "test/**"] -] +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + // root = file("../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + // reactNativeDir = file("../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen + // codegenDir = file("../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") -// NOTE: Uncomment if building RN from a fork -// configurations.all { -// exclude group: 'com.facebook.react', module: 'react-native' -// } + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] -apply from: "../../node_modules/react-native/react.gradle" + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + nodeExecutableAndArgs = ["node", "--max-old-space-size=16384" ] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] +} /** - * Run Proguard to shrink the Java bytecode in release builds. + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. */ -def enableProguardInReleaseBuilds = false +def enableProguardInReleaseBuilds = true /** - * The preferred build flavor of JavaScriptCore. + * The preferred build flavor of JavaScriptCore (JSC) * * For example, to use the international variant, you can use: * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that + * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ def jscFlavor = 'org.webkit:android-jsc:+' @@ -116,7 +81,14 @@ def jscFlavor = 'org.webkit:android-jsc:+' * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode * and the benefits of using Hermes will therefore be sharply reduced. */ -def enableHermes = project.ext.react.get("enableHermes", false); +def enableHermes = hermesEnabled.toBoolean(); + +def getCommitHash = { -> + if (project.hasProperty("commitHash")) { + return project.commitHash + } + return "unknown" +} def getVersionCode = { -> new ByteArrayOutputStream().withStream { stdOut -> @@ -135,10 +107,14 @@ def getVersionCode = { -> def getVersionName = { -> new ByteArrayOutputStream().withStream { stdOut -> + // TODO: probably not used, cleanup if (project.hasProperty("releaseVersion")) { return project.releaseVersion } - version = new File('../VERSION').text + /* Necessary because Android Studio uses wrong PWD. + * Is actually absolute directory path of this file. */ + def configDir = project.projectDir.toString() + version = new File(configDir + '/../../VERSION').text return version.replaceAll("\\s","") } } @@ -159,13 +135,33 @@ def getEnvOrConfig = { varName -> } android { - compileSdkVersion rootProject.ext.compileSdkVersion + ndkVersion rootProject.ext.ndkVersion + + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + // Disable default lint checks to remove redundant lintVitalReportRelease task + lintOptions { + checkReleaseBuilds false + } + + // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake + externalNativeBuild { + cmake { + // This version must match cmakeVersions inside nix/pkgs/android-sdk/compose.nix + version "3.22.1" + } + } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } + namespace "im.status.ethereum" defaultConfig { applicationId "im.status.ethereum" minSdkVersion rootProject.ext.minSdkVersion @@ -174,6 +170,7 @@ android { versionCode getVersionCode() versionName getVersionName() missingDimensionStrategy 'react-native-camera', 'general' + manifestPlaceholders = [commitHash: getCommitHash()] /* this needs to be empty if we want APKs split by ABIs */ if (!getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean()) { ndk { @@ -181,6 +178,7 @@ android { } } } + /** * Arbitrary project metadata * https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html @@ -199,6 +197,12 @@ android { exclude '/lib/mips64/**' exclude '/lib/armeabi/**' + pickFirst '**/armeabi-v7a/libc++_shared.so' + pickFirst '**/x86/libc++_shared.so' + pickFirst '**/arm64-v8a/libc++_shared.so' + pickFirst '**/x86_64/libc++_shared.so' + pickFirst '**/x86/libjsc.so' + pickFirst '**/armeabi-v7a/libjsc.so' /** Fix for: Execution failed for task ':app:transformNativeLibsWithStripDebugSymbolForDebug'. * with recent version of ndk (17.0.4754217) @@ -206,9 +210,13 @@ android { doNotStrip '*/mips/*.so' doNotStrip '*/mips64/*.so' } - dexOptions { - jumboMode true - javaMaxHeapSize "8g" + splits { + abi { + reset() + enable getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean() + include getEnvOrConfig('ANDROID_ABI_INCLUDE').split(";") + universalApk getEnvOrConfig('ORG_GRADLE_PROJECT_universalApk').toBoolean() + } } signingConfigs { debug { @@ -217,47 +225,32 @@ android { keyAlias 'androiddebugkey' keyPassword 'android' } - release { - /* environment variables take precedence over gradle.properties file */ - storeFile file(getEnvOrConfig('KEYSTORE_PATH').replaceAll("~", System.properties['user.home'])) - storePassword getEnvOrConfig('KEYSTORE_PASSWORD') - keyAlias getEnvOrConfig('KEYSTORE_ALIAS') - keyPassword getEnvOrConfig('KEYSTORE_KEY_PASSWORD') - } - } - splits { - abi { - reset() - enable getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean() - include getEnvOrConfig('ANDROID_ABI_INCLUDE').split(";") - universalApk true - } } buildTypes { debug { applicationIdSuffix ".debug" debuggable true versionNameSuffix "-SNAPSHOT" - signingConfig signingConfigs.debug resValue "string", "build_config_package", "im.status.ethereum" + signingConfig signingConfigs.debug } release { - // Caution! In production, you need to generate your own keystore file. - // see https://facebook.github.io/react-native/docs/signed-apk-android. minifyEnabled enableProguardInReleaseBuilds + shrinkResources enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - signingConfig signingConfigs.release + signingConfig null } pr { initWith release applicationIdSuffix ".pr" versionNameSuffix ".pr" - debuggable false + debuggable false matchingFallbacks = ["release"] // necessary to make react-native-config's code generation work resValue "string", "build_config_package", "im.status.ethereum" } } + // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> @@ -273,6 +266,7 @@ android { } } + aaptOptions { // disable PNG optimization as for some reason it cannot be trusted to provide deterministic output (see https://f-droid.org/en/docs/Reproducible_Builds/) cruncherEnabled = false @@ -284,50 +278,69 @@ android { } dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.facebook.react:react-native:+" // From node_modules + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + implementation("androidx.core:core-splashscreen:1.0.0") if (enableHermes) { - def hermesPath = "../../node_modules/hermes-engine/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") - prImplementation files(hermesPath + "hermes-release.aar") + implementation("com.facebook.react:hermes-android") } else { - implementation jscFlavor + // https://github.com/status-im/status-mobile/issues/18493 + // we don't use hermes for debug builds because it crashes too often + implementation(jscFlavor) } - implementation 'androidx.multidex:multidex:2.0.1' // only needed if minSdkVersion is less than 21 (https://developer.android.com/studio/build/multidex) - implementation project(':react-native-dialogs') - // Force using exact RN version instead of relying on gradle dependency resolution - // https://docs.gradle.org/current/userguide/introduction_dependency_management.html#sec:dependency_resolution - // NOTE: Uncomment if building RN from a fork - //compile ("com.facebook.react:react-native:0.55.4") { force = true } // From node_modules + // react-native-screens + implementation("androidx.appcompat:appcompat:1.1.0-rc01") + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02") + implementation("androidx.multidex:multidex:2.0.1") // required by status-mobile/android/app/src/main/java/im/status/ethereum/MainApplication.java + implementation project(':react-native-blur') implementation project(':react-native-status') - implementation project(':react-native-webview-bridge') implementation project(':react-native-status-keycard') - implementation 'com.github.status-im:function:0.0.1' - implementation 'com.facebook.fresco:fresco:2.0.0' - implementation 'com.facebook.fresco:animated-gif:2.0.0' + implementation("com.github.status-im:function:0.0.1") + implementation("com.facebook.fresco:fresco:2.5.0") + implementation("com.facebook.fresco:animated-gif:2.5.0") + implementation("com.squareup.okhttp3:okhttp-tls:4.11.0") + implementation("com.google.prefab:cli:2.0.0") + implementation("com.android.tools.build:aapt2:8.1.1-10154469") } -// Run this once to be able to run the application with BUCK -// puts all compile dependencies into folder libs for BUCK to use -task hemroidBuild(type: Exec) { +def getLocalNDKDir = { -> def rootDir = project.rootDir def localProperties = new File(rootDir, "local.properties") + if (!localProperties.exists()) { + return null + } + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + return properties.getProperty('ndk.dir') +} - def ndkDir = System.env.ANDROID_NDK - if (localProperties.exists()) { - Properties properties = new Properties() - localProperties.withInputStream { instr -> - properties.load(instr) - } - ndkDir = properties.getProperty('ndk.dir') +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task hemroidBuild(type: Exec) { + def localNdkDir = getLocalNDKDir() + def ndkDir = System.env.ANDROID_NDK_ROOT + if (localNdkDir != null) { + ndkDir = localNdkDir } - executable "$ndkDir/ndk-build" + + def execPath = "$ndkDir/ndk-build" + def exec = new File(execPath) + if (!exec.exists()) { + throw new GradleException("No ndk-build binary found!") + } + executable execPath } preBuild.dependsOn hemroidBuild apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) + +def googleServicesConfigFile = "./googleServices.gradle"; +if (project.file(googleServicesConfigFile).exists()) { + apply from: file(googleServicesConfigFile) +} diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 00000000000..220a6195f92 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,119 @@ +{ + "project_info": { + "project_number": "854811651919", + "firebase_url": "https://status-react-app.firebaseio.com", + "project_id": "status-react-app", + "storage_bucket": "status-react-app.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:854811651919:android:11ee7444ded8a00a", + "android_client_info": { + "package_name": "im.status.ethereum" + } + }, + "oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "im.status.ethereum" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:854811651919:android:15dbe4af1e06ca3e005f3a", + "android_client_info": { + "package_name": "im.status.ethereum.debug" + } + }, + "oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "im.status.ethereum" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:854811651919:android:1d0d69fe8c1bb89b005f3a", + "android_client_info": { + "package_name": "im.status.ethereum.pr" + } + }, + "oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "854811651919-30s20e3l0me0ins0vc4185jbnj7ja49o.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "im.status.ethereum" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} diff --git a/android/app/googleServices.gradle b/android/app/googleServices.gradle new file mode 100644 index 00000000000..20dce0bd50d --- /dev/null +++ b/android/app/googleServices.gradle @@ -0,0 +1,25 @@ +/** + * Exclude google library so we can publish to external android stores + */ + +def googleFree = project.env.get("GOOGLE_FREE", "0") == '1' + +if (!googleFree) { + apply plugin: 'com.google.gms.google-services' +} + +dependencies { + if (googleFree) { + implementation(project(':react-native-firebase_app')) { + exclude group: 'com.google.firebase' + exclude group: 'com.google.gms' + } + + implementation(project(':react-native-firebase_messaging')) { + exclude group: 'com.google.firebase' + exclude group: 'com.google.gms' + } + } else { + implementation 'com.google.firebase:firebase-messaging:24.1.0' + } +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 19a307421d2..3904c4220ee 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -15,6 +15,9 @@ # React Native +-keep class com.facebook.hermes.unicode.** { *; } +-keep class com.facebook.jni.** { *; } + # Keep our interfaces so they can be used by other ProGuard rules. # See http://sourceforge.net/p/proguard/bugs/466/ -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip @@ -55,9 +58,33 @@ -keep interface okhttp3.** { *; } -dontwarn okhttp3.** +# to fix : java.security.KeyStoreException: BKS not found +-keep class org.bouncycastle.** { *; } + # okio -keep class sun.misc.Unsafe { *; } -dontwarn java.nio.file.* -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -dontwarn okio.** + +# fast-image + +-keep public class com.dylanvann.fastimage.* {*;} +-keep public class com.dylanvann.fastimage.** {*;} +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class com.bumptech.glide.annotation.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +# react-native-config +# https://github.com/lugg/react-native-config?tab=readme-ov-file#problems-with-proguard +-keep class im.status.ethereum.BuildConfig {*;} + +# react-native-navigation +# to fix : java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType +# at com.reactnativenavigation.views.element.animators.PropertyAnimatorCreator.getChildClass(Unknown Source:13) +-keep class com.reactnativenavigation.** {*;} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index bae533e8549..9b34ec89c86 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -2,7 +2,10 @@ + + + - + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index aecfa0f186b..da961875e71 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,10 +1,17 @@ + android:installLocation="auto"> + + + + + + + + @@ -17,29 +24,36 @@ + - - - - + + + android:usesCleartextTraffic="true" + android:extractNativeLibs="true" + android:requestLegacyExternalStorage="true"> + + @@ -57,19 +71,48 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + + + diff --git a/android/app/src/main/assets/fonts/InterStatus-Regular.otf b/android/app/src/main/assets/fonts/InterStatus-Regular.otf new file mode 100644 index 00000000000..92c5dcb6e68 Binary files /dev/null and b/android/app/src/main/assets/fonts/InterStatus-Regular.otf differ diff --git a/android/app/src/main/assets/fonts/UbuntuMono-Regular.ttf b/android/app/src/main/assets/fonts/UbuntuMono-Regular.ttf new file mode 100644 index 00000000000..fdd309d7166 Binary files /dev/null and b/android/app/src/main/assets/fonts/UbuntuMono-Regular.ttf differ diff --git a/android/app/src/main/java/im/status/ethereum/MainActivity.java b/android/app/src/main/java/im/status/ethereum/MainActivity.java deleted file mode 100644 index c341a902764..00000000000 --- a/android/app/src/main/java/im/status/ethereum/MainActivity.java +++ /dev/null @@ -1,247 +0,0 @@ -package im.status.ethereum; - -import android.content.Context; -import android.annotation.TargetApi; -import androidx.annotation.Nullable; -import android.app.AlertDialog; -import android.app.ActivityManager; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; -import android.content.DialogInterface.OnClickListener; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; -import android.os.Looper; -import android.preference.PreferenceManager; -import androidx.core.app.ActivityCompat; -import android.util.Log; -import android.view.WindowManager; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.provider.Settings; -import android.os.Bundle; -import com.facebook.react.ReactActivityDelegate; -import com.facebook.react.ReactRootView; -import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; - -import com.facebook.react.ReactFragmentActivity; -import com.facebook.react.ReactActivity; -import com.facebook.react.modules.core.PermissionListener; -import org.devio.rn.splashscreen.SplashScreen; - -import java.util.Properties; -import im.status.ethereum.module.StatusThreadPoolExecutor; - -public class MainActivity extends ReactFragmentActivity - implements ActivityCompat.OnRequestPermissionsResultCallback{ - - - @Nullable private PermissionListener mPermissionListener; - - private static void registerUncaughtExceptionHandler(final Context context) { - final Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(final Thread thread, final Throwable t) { - // High priority, so don't use StatusThreadPoolExecutor - new Thread() { - @Override - public void run() { - Looper.prepare(); - - new AlertDialog.Builder(context) - .setTitle("Error") - .setMessage(t.toString()) - .setNegativeButton("Exit", new DialogInterface.OnClickListener() { - public void onClick(final DialogInterface dialog, final int id) { - dialog.dismiss(); - defaultUncaughtExceptionHandler.uncaughtException(thread, t); - } - }).show(); - - Looper.loop(); - } - }.start(); - } - }); - } - - private ActivityManager getActivityManager() { - return (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); - } - - private ActivityManager.MemoryInfo getAvailableMemory(final ActivityManager activityManager) { - final ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); - activityManager.getMemoryInfo(memoryInfo); - return memoryInfo; - } - - protected void configureStatus() { - // Required because of crazy APN settings redirecting localhost (found in GB) - Properties properties = System.getProperties(); - properties.setProperty("http.nonProxyHosts", "localhost|127.0.0.1"); - properties.setProperty("https.nonProxyHosts", "localhost|127.0.0.1"); - } - - private Intent createNotificationSettingsIntent() { - final Intent intent = new Intent(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); - intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); - } else { - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(Uri.parse("package:" + getPackageName())); - } - return intent; - } - - @Override - public void onNewIntent(final Intent intent) { - super.onNewIntent(intent); - if (intent.getDataString() != null && intent.getData().getScheme().startsWith("app-settings")) { - startActivity(createNotificationSettingsIntent()); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - - // Make sure we get an Alert for every uncaught exceptions - registerUncaughtExceptionHandler(MainActivity.this); - - // Report memory details for this application - final ActivityManager activityManager = getActivityManager(); - Log.v("RNBootstrap", "Available system memory "+getAvailableMemory(activityManager).availMem + ", maximum usable application memory " + activityManager.getLargeMemoryClass()+"M"); - - setSecureFlag(); - SplashScreen.show(this, true); - super.onCreate(savedInstanceState); - - if (!shouldShowRootedNotification()) { - configureStatus(); - } else { - AlertDialog dialog = new AlertDialog.Builder(MainActivity.this) - .setMessage(getResources().getString(R.string.root_warning)) - .setPositiveButton(getResources().getString(R.string.root_okay), new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - rejectRootedNotification(); - dialog.dismiss(); - configureStatus(); - } - }) - .setNegativeButton(getResources().getString(R.string.root_cancel), new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - MainActivity.this.finishAffinity(); - } - }) - .setOnCancelListener(new OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - dialog.dismiss(); - MainActivity.this.finishAffinity(); - } - }) - .create(); - - dialog.show(); - } - - Runnable r = new Runnable() { - @Override - public void run() { - System.loadLibrary("status-logs"); - } - }; - - StatusThreadPoolExecutor.getInstance().execute(r); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - } - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "StatusIm"; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - Intent intent = new Intent("onConfigurationChanged"); - intent.putExtra("newConfig", newConfig); - this.sendBroadcast(intent); - } - - private static final String REJECTED_ROOTED_NOTIFICATION = "rejectedRootedNotification"; - private static final Integer FREQUENCY_OF_REMINDER_IN_PERCENT = 5; - - private boolean shouldShowRootedNotification() { - if (RootUtil.isDeviceRooted()) { - if (userRejectedRootedNotification()) { - return ((Math.random() * 100) < FREQUENCY_OF_REMINDER_IN_PERCENT); - } else return true; - } else { - return false; - } - } - - private boolean userRejectedRootedNotification() { - SharedPreferences preferences = getPreferences(0); - return preferences.getBoolean(REJECTED_ROOTED_NOTIFICATION, false); - } - - private void rejectRootedNotification() { - SharedPreferences preferences = getPreferences(0); - SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean(REJECTED_ROOTED_NOTIFICATION, true); - editor.commit(); - } - - private void setSecureFlag() { - final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); - final boolean setSecure = sharedPrefs.getBoolean("BLANK_PREVIEW", false); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && setSecure) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); - } else { - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); - } - } - - @TargetApi(Build.VERSION_CODES.M) - public void requestPermissions(String[] permissions, int requestCode, PermissionListener listener) { - mPermissionListener = listener; - requestPermissions(permissions, requestCode); - } - - @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - if (mPermissionListener != null && mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) { - mPermissionListener = null; - } - if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // Permission has been granted. Start camera preview Activity. - com.github.alinz.reactnativewebviewbridge.WebViewBridgeManager.grantAccess(requestCode); - } - } - - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegate(this, getMainComponentName()) { - @Override - protected ReactRootView createRootView() { - return new RNGestureHandlerEnabledRootView(MainActivity.this); - } - }; - } -} diff --git a/android/app/src/main/java/im/status/ethereum/MainActivity.kt b/android/app/src/main/java/im/status/ethereum/MainActivity.kt new file mode 100644 index 00000000000..c77da8d41c0 --- /dev/null +++ b/android/app/src/main/java/im/status/ethereum/MainActivity.kt @@ -0,0 +1,236 @@ +package im.status.ethereum + +import android.annotation.TargetApi +import android.app.ActivityManager +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.content.SharedPreferences +import android.content.pm.PackageManager +import android.content.res.Configuration +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.preference.PreferenceManager +import android.provider.Settings +import android.util.Log +import android.view.WindowManager +import androidx.annotation.Nullable +import androidx.core.app.ActivityCompat +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.WritableMap +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint +import com.facebook.react.defaults.DefaultReactActivityDelegate +import com.facebook.react.modules.core.DeviceEventManagerModule +import com.facebook.react.modules.core.PermissionListener +import com.reactnativenavigation.NavigationActivity +import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView +import im.status.ethereum.MainApplication +import im.status.ethereum.module.StatusThreadPoolExecutor +import java.util.Properties + +class MainActivity : NavigationActivity(), ActivityCompat.OnRequestPermissionsResultCallback { + + @Nullable + private var mPermissionListener: PermissionListener? = null + private var keepSplash = true + private val SPLASH_DELAY = 3200 + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + protected fun getMainComponentName(): String { + return "StatusIm" + } + + private fun registerUncaughtExceptionHandler(context: Context) { + val defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler() + // High priority, so don't use StatusThreadPoolExecutor + Thread.setDefaultUncaughtExceptionHandler { thread, t -> + Thread { + Looper.prepare() + AlertDialog.Builder(context) + .setTitle("Error") + .setMessage(t.toString()) + .setNegativeButton("Exit") { dialog, id -> + dialog.dismiss() + defaultUncaughtExceptionHandler.uncaughtException(thread, t) + }.show() + Looper.loop() + }.start() + } + } + + private fun getActivityManager(): ActivityManager { + return getSystemService(ACTIVITY_SERVICE) as ActivityManager + } + + private fun getAvailableMemory(activityManager: ActivityManager): ActivityManager.MemoryInfo { + val memoryInfo = ActivityManager.MemoryInfo() + activityManager.getMemoryInfo(memoryInfo) + return memoryInfo + } + + protected fun configureStatus() { + // Required because of crazy APN settings redirecting localhost (found in GB) + val properties = System.getProperties() + properties.setProperty("http.nonProxyHosts", "localhost|127.0.0.1") + properties.setProperty("https.nonProxyHosts", "localhost|127.0.0.1") + } + + private fun createNotificationSettingsIntent(): Intent { + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:$packageName") + } + return intent + } + + private fun tryToEmit(eventName: String, event: WritableMap) { + try { + (getApplication() as MainApplication).reactNativeHost + .getReactInstanceManager() + .getCurrentReactContext() + ?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + ?.emit("url", event) + } catch (e: Exception) { // we expect NPE on first start, which is OK because we have a fallback + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + if (intent.dataString != null && intent.data!!.scheme!!.startsWith("app-settings")) { + startActivity(createNotificationSettingsIntent()) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen(); + setTheme(R.style.DarkTheme) + // Make sure we get an Alert for every uncaught exceptions + registerUncaughtExceptionHandler(this) + + // Report memory details for this application + val activityManager = getActivityManager() + Log.v("RNBootstrap", "Available system memory " + getAvailableMemory(activityManager).availMem + ", maximum usable application memory " + activityManager.largeMemoryClass + "M") + + setSecureFlag() + + // NOTE: Try to not restore the state https://github.com/software-mansion/react-native-screens/issues/17 + super.onCreate(null) + + if (!shouldShowRootedNotification()) { + configureStatus() + } else { + val dialog = AlertDialog.Builder(this) + .setMessage(resources.getString(R.string.root_warning)) + .setPositiveButton(resources.getString(R.string.root_okay)) { dialog, which -> + rejectRootedNotification() + dialog.dismiss() + configureStatus() + } + .setNegativeButton(resources.getString(R.string.root_cancel)) { dialog, which -> + dialog.dismiss() + finishAffinity() + } + .setOnCancelListener { + it.dismiss() + finishAffinity() + } + .create() + + dialog.show() + } + + val r = Runnable { + System.loadLibrary("status-logs") + + // when app is started but the Activity has been destroyed, the deep linking url event is + // not emitted when coming back to foreground. This is a workaround. If the problem is + // resolved in react-native this code should be removed + if (intent.data != null) { + val event = Arguments.createMap() + event.putString("url", intent.dataString) + // on first start emit will (silently) fail, but the regular deep linking handler will work + tryToEmit("url", event) + } + } + + splashScreen.setKeepOnScreenCondition { keepSplash } + + val handler = Handler() + handler.postDelayed({ keepSplash = false }, SPLASH_DELAY.toLong()) + + StatusThreadPoolExecutor.getInstance().execute(r) + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val intent = Intent("onConfigurationChanged") + intent.putExtra("newConfig", newConfig) + sendBroadcast(intent) + } + + private val REJECTED_ROOTED_NOTIFICATION = "rejectedRootedNotification" + private val FREQUENCY_OF_REMINDER_IN_PERCENT = 5 + + private fun shouldShowRootedNotification(): Boolean { + if (RootUtil.isDeviceRooted() && BuildConfig.ENABLE_ROOT_ALERT == "1") { + return if (userRejectedRootedNotification()) { + (Math.random() * 100) < FREQUENCY_OF_REMINDER_IN_PERCENT + } else true + } else { + return false + } + } + + private fun userRejectedRootedNotification(): Boolean { + val preferences = getPreferences(0) + return preferences.getBoolean(REJECTED_ROOTED_NOTIFICATION, false) + } + + private fun rejectRootedNotification() { + val preferences = getPreferences(0) + val editor = preferences.edit() + editor.putBoolean(REJECTED_ROOTED_NOTIFICATION, true) + editor.commit() + } + + private fun setSecureFlag() { + val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this) + val setSecure = sharedPrefs.getBoolean("BLANK_PREVIEW", false) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && setSecure) { + window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + + @TargetApi(Build.VERSION_CODES.M) + override fun requestPermissions(permissions: Array, requestCode: Int, listener: PermissionListener) { + mPermissionListener = listener + super.requestPermissions(permissions, requestCode) + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if (mPermissionListener != null && mPermissionListener!!.onRequestPermissionsResult(requestCode, permissions, grantResults)) { + mPermissionListener = null + } + } +} diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.java b/android/app/src/main/java/im/status/ethereum/MainApplication.java deleted file mode 100644 index 83335152474..00000000000 --- a/android/app/src/main/java/im/status/ethereum/MainApplication.java +++ /dev/null @@ -1,56 +0,0 @@ -package im.status.ethereum; - -import androidx.multidex.MultiDexApplication; -import android.util.Log; -import com.facebook.react.PackageList; -import com.facebook.hermes.reactexecutor.HermesExecutorFactory; -import com.facebook.react.bridge.JavaScriptExecutorFactory; - -import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage; -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.soloader.SoLoader; -import com.github.alinz.reactnativewebviewbridge.WebViewBridgePackage; - -import java.util.List; - -import im.status.ethereum.keycard.RNStatusKeycardPackage; -import im.status.ethereum.module.StatusPackage; - -public class MainApplication extends MultiDexApplication implements ReactApplication { - - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - @Override - protected List getPackages() { - StatusPackage statusPackage = new StatusPackage(RootUtil.isDeviceRooted()); - List packages = new PackageList(this).getPackages(); - packages.add(statusPackage); - packages.add(new ReactNativeDialogsPackage()); - packages.add(new RNStatusKeycardPackage()); - packages.add(new WebViewBridgePackage(BuildConfig.DEBUG_WEBVIEW == "1")); - return packages; - } - - @Override - protected String getJSMainModuleName() { - return "index.android"; - } - }; - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - } -} diff --git a/android/app/src/main/java/im/status/ethereum/MainApplication.kt b/android/app/src/main/java/im/status/ethereum/MainApplication.kt new file mode 100644 index 00000000000..8963c19a510 --- /dev/null +++ b/android/app/src/main/java/im/status/ethereum/MainApplication.kt @@ -0,0 +1,59 @@ +package im.status.ethereum + +import android.webkit.WebView +import androidx.multidex.MultiDexApplication +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.JSIModulePackage +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint +import com.facebook.react.modules.network.OkHttpClientProvider +import com.reactnativenavigation.NavigationApplication +import com.reactnativenavigation.react.NavigationReactNativeHost +import cl.json.RNSharePackage +import com.reactnativecommunity.blurview.BlurViewPackage +import im.status.ethereum.keycard.RNStatusKeycardPackage +import im.status.ethereum.module.StatusPackage +import im.status.ethereum.pushnotifications.PushNotificationPackage +import im.status.ethereum.StatusOkHttpClientFactory + +class MainApplication : NavigationApplication() { + + private val mReactNativeHost = object : NavigationReactNativeHost(this) { + override fun getUseDeveloperSupport(): Boolean { + return BuildConfig.DEBUG + } + + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here + add(StatusPackage(RootUtil.isDeviceRooted())) + add(RNStatusKeycardPackage()) + add(PushNotificationPackage()) + add(BlurViewPackage()) + } + + override fun getJSMainModuleName(): String = "index" + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactNativeHost: ReactNativeHost + get() = mReactNativeHost + + override fun onCreate() { + super.onCreate() + + OkHttpClientProvider.setOkHttpClientFactory(StatusOkHttpClientFactory()) + + WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1") + + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load() + } + } +} diff --git a/android/app/src/main/java/im/status/ethereum/RootUtil.java b/android/app/src/main/java/im/status/ethereum/RootUtil.java deleted file mode 100644 index 5c74f566df8..00000000000 --- a/android/app/src/main/java/im/status/ethereum/RootUtil.java +++ /dev/null @@ -1,40 +0,0 @@ -package im.status.ethereum; - -import java.io.File; -import java.io.BufferedReader; -import java.io.InputStreamReader; - -/** @author Kevin Kowalewski */ -public class RootUtil { - - public static boolean isDeviceRooted() { - return checkRootMethod1() || checkRootMethod2() || checkRootMethod3(); - } - - private static boolean checkRootMethod1() { - String buildTags = android.os.Build.TAGS; - return buildTags != null && buildTags.contains("test-keys"); - } - - private static boolean checkRootMethod2() { - String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su", - "/system/bin/failsafe/su", "/data/local/su" }; - for (String path : paths) { - if (new File(path).exists()) return true; - } - return false; - } - - private static boolean checkRootMethod3() { - Process process = null; - try { - process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" }); - BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); - return in.readLine() != null; - } catch (Throwable t) { - return false; - } finally { - if (process != null) process.destroy(); - } - } -} diff --git a/android/app/src/main/java/im/status/ethereum/RootUtil.kt b/android/app/src/main/java/im/status/ethereum/RootUtil.kt new file mode 100644 index 00000000000..c6729842778 --- /dev/null +++ b/android/app/src/main/java/im/status/ethereum/RootUtil.kt @@ -0,0 +1,42 @@ +package im.status.ethereum + +import android.os.Build +import java.io.BufferedReader +import java.io.File +import java.io.InputStreamReader + +object RootUtil { + + fun isDeviceRooted(): Boolean = + checkRootMethod1() || checkRootMethod2() || checkRootMethod3() + + private fun checkRootMethod1(): Boolean = + Build.TAGS?.contains("test-keys") ?: false + + private fun checkRootMethod2(): Boolean { + val paths = arrayOf( + "/system/app/Superuser.apk", + "/sbin/su", + "/system/bin/su", + "/system/xbin/su", + "/data/local/xbin/su", + "/data/local/bin/su", + "/system/sd/xbin/su", + "/system/bin/failsafe/su", + "/data/local/su" + ) + return paths.any { File(it).exists() } + } + + private fun checkRootMethod3(): Boolean { + var process: Process? = null + return try { + process = Runtime.getRuntime().exec(arrayOf("/system/xbin/which", "su")) + BufferedReader(InputStreamReader(process.inputStream)).readLine() != null + } catch (t: Throwable) { + false + } finally { + process?.destroy() + } + } +} diff --git a/android/app/src/main/java/im/status/ethereum/StatusOKHttpClientFactory.kt b/android/app/src/main/java/im/status/ethereum/StatusOKHttpClientFactory.kt new file mode 100644 index 00000000000..a8458b8d38f --- /dev/null +++ b/android/app/src/main/java/im/status/ethereum/StatusOKHttpClientFactory.kt @@ -0,0 +1,88 @@ +package im.status.ethereum + +import android.util.Log +import com.facebook.react.modules.network.OkHttpClientFactory +import com.facebook.react.modules.network.OkHttpClientProvider +import okhttp3.OkHttpClient +import okhttp3.tls.HandshakeCertificates +import java.io.ByteArrayInputStream +import java.lang.RuntimeException +import java.lang.reflect.Field +import java.lang.reflect.Method +import java.security.cert.CertificateFactory +import java.security.cert.X509Certificate +import im.status.ethereum.module.StatusPackage + +class StatusOkHttpClientFactory : OkHttpClientFactory { + + companion object { + private const val TAG = "StatusOkHttpClientFactory" + private const val SLEEP_DURATION = 500L // milliseconds + } + + override fun createNewNetworkModuleClient(): OkHttpClient? { + val certPem = getCertificatePem().takeIf { it.isNotEmpty() } + ?: return logAndReturnNull("Certificate is empty, cannot create OkHttpClient without a valid certificate") + + val cert = try { + induceSleep() + // Convert PEM certificate string to X509Certificate object + CertificateFactory.getInstance("X.509") + .generateCertificate(ByteArrayInputStream(certPem.toByteArray())) as? X509Certificate + ?: return logAndReturnNull("Certificate could not be parsed as non-null") + } catch (e: Exception) { + return logAndReturnNull("Could not parse certificate", e) + } + + val clientCertificates = try { + induceSleep() + // Create HandshakeCertificates object with our certificate + HandshakeCertificates.Builder() + .addPlatformTrustedCertificates() + .addTrustedCertificate(cert) + .build() + } catch (e: Exception) { + return logAndReturnNull("Could not build HandshakeCertificates", e) + } + + return try { + OkHttpClientProvider.createClientBuilder() + .sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager) + .build() + } catch (e: Exception) { + logAndReturnNull("Could not create OkHttpClient", e) + } + } + + private fun getCertificatePem(): String { + return try { + // Create OkHttpClient with custom SSL socket factory and trust manager + StatusPackage.getImageTLSCert().takeIf { !it.isNullOrBlank() } + ?: logAndReturnEmpty("Certificate PEM string is null or empty") + } catch (e: Exception) { + logAndReturnEmpty("Could not getImageTLSCert", e) + } + } + + private fun induceSleep() { + try { + // induce half second sleep because sometimes a cert is not immediately available + // TODO : remove sleep if App no longer crashes on Android 10 devices with + // java.lang.RuntimeException: Could not invoke WebSocketModule.connect + Thread.sleep(SLEEP_DURATION) + } catch (e: InterruptedException) { + Log.e(TAG, "Sleep interrupted", e) + } + } + + private fun logAndReturnNull(message: String, e: Exception? = null): Nothing? { + Log.e(TAG, message, e) + return null + } + + private fun logAndReturnEmpty(message: String, e: Exception? = null): String { + Log.e(TAG, message, e) + return "" + } +} + diff --git a/android/app/src/main/res/drawable-hdpi/add.png b/android/app/src/main/res/drawable-hdpi/add.png deleted file mode 100644 index 21b37f431d9..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/add.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/add_contact.png b/android/app/src/main/res/drawable-hdpi/add_contact.png deleted file mode 100644 index b6dde36dd05..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/add_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/address.png b/android/app/src/main/res/drawable-hdpi/address.png deleted file mode 100644 index c3bdccdc79f..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/address.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/arrow_left.png b/android/app/src/main/res/drawable-hdpi/arrow_left.png deleted file mode 100644 index f44762016de..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/arrow_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/arrow_right.png b/android/app/src/main/res/drawable-hdpi/arrow_right.png deleted file mode 100644 index 673ef5572e8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/arrow_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/arrow_up.png b/android/app/src/main/res/drawable-hdpi/arrow_up.png deleted file mode 100644 index 41f9f45652b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/arrow_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/back.png b/android/app/src/main/res/drawable-hdpi/back.png deleted file mode 100644 index 874105736a7..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/backspace.png b/android/app/src/main/res/drawable-hdpi/backspace.png deleted file mode 100644 index f412af1d034..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/backspace.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/bell.png b/android/app/src/main/res/drawable-hdpi/bell.png deleted file mode 100644 index 76ee86e8680..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/bell.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/browser.png b/android/app/src/main/res/drawable-hdpi/browser.png deleted file mode 100644 index 2c4183a626d..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/browser.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/camera.png b/android/app/src/main/res/drawable-hdpi/camera.png deleted file mode 100644 index eae2bedfbf4..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/cancel.png b/android/app/src/main/res/drawable-hdpi/cancel.png deleted file mode 100644 index 89a4086f8ca..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/cancel.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/change.png b/android/app/src/main/res/drawable-hdpi/change.png deleted file mode 100644 index 143002657ff..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/change.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/check.png b/android/app/src/main/res/drawable-hdpi/check.png deleted file mode 100644 index acfb992f608..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/close.png b/android/app/src/main/res/drawable-hdpi/close.png deleted file mode 100644 index 65e1b4f7350..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/close.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/commands.png b/android/app/src/main/res/drawable-hdpi/commands.png deleted file mode 100644 index 06d320983f1..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/commands.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/copy.png b/android/app/src/main/res/drawable-hdpi/copy.png deleted file mode 100644 index 9c19da8d237..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/copy.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/corner_left_bottom.png b/android/app/src/main/res/drawable-hdpi/corner_left_bottom.png deleted file mode 100644 index 1c9c9b446d2..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/corner_left_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/corner_left_top.png b/android/app/src/main/res/drawable-hdpi/corner_left_top.png deleted file mode 100644 index 1a0a4e57f82..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/corner_left_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/corner_right_bottom.png b/android/app/src/main/res/drawable-hdpi/corner_right_bottom.png deleted file mode 100644 index e6071d1ae10..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/corner_right_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/corner_right_top.png b/android/app/src/main/res/drawable-hdpi/corner_right_top.png deleted file mode 100644 index 6eaca3cd9a0..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/corner_right_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/dapp.png b/android/app/src/main/res/drawable-hdpi/dapp.png deleted file mode 100644 index 8cd519e6b04..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/dapp.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/delete.png b/android/app/src/main/res/drawable-hdpi/delete.png deleted file mode 100644 index 5c5ed9404e3..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/delete.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/desktop.png b/android/app/src/main/res/drawable-hdpi/desktop.png deleted file mode 100644 index 2b03362c968..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/desktop.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/download.png b/android/app/src/main/res/drawable-hdpi/download.png deleted file mode 100644 index 0da5eaa1cd4..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/download.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/dropdown.png b/android/app/src/main/res/drawable-hdpi/dropdown.png deleted file mode 100644 index 228e20283e3..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/dropdown.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/dropdown_up.png b/android/app/src/main/res/drawable-hdpi/dropdown_up.png deleted file mode 100644 index 23efec887e8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/dropdown_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/edit.png b/android/app/src/main/res/drawable-hdpi/edit.png deleted file mode 100644 index f2e54d497cd..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/filter.png b/android/app/src/main/res/drawable-hdpi/filter.png deleted file mode 100644 index 3c7985a3d90..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/filter.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/fingerprint.png b/android/app/src/main/res/drawable-hdpi/fingerprint.png deleted file mode 100644 index 17137fe9699..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/fingerprint.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/flash.png b/android/app/src/main/res/drawable-hdpi/flash.png deleted file mode 100644 index d2486fa6c06..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/flash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/flash_active.png b/android/app/src/main/res/drawable-hdpi/flash_active.png deleted file mode 100644 index 15bbb77c8e6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/flash_active.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/group_chat.png b/android/app/src/main/res/drawable-hdpi/group_chat.png deleted file mode 100644 index 27cf5107b3e..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/group_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/help.png b/android/app/src/main/res/drawable-hdpi/help.png deleted file mode 100644 index f0e3656711f..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/help.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/history.png b/android/app/src/main/res/drawable-hdpi/history.png deleted file mode 100644 index c8e753b116b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/home.png b/android/app/src/main/res/drawable-hdpi/home.png deleted file mode 100644 index 19ddc6d532d..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/home.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/home_1.png b/android/app/src/main/res/drawable-hdpi/home_1.png deleted file mode 100644 index afb65ba21ef..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/home_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_background.png b/android/app/src/main/res/drawable-hdpi/ic_background.png index 0265779ac7f..583635a1c9d 100644 Binary files a/android/app/src/main/res/drawable-hdpi/ic_background.png and b/android/app/src/main/res/drawable-hdpi/ic_background.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_foreground.png index ef8ffe231a9..ca5e7ce1d20 100644 Binary files a/android/app/src/main/res/drawable-hdpi/ic_foreground.png and b/android/app/src/main/res/drawable-hdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_stat_status_notification.png b/android/app/src/main/res/drawable-hdpi/ic_stat_status_notification.png deleted file mode 100755 index a040aa06c8b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/ic_stat_status_notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_action_back.png b/android/app/src/main/res/drawable-hdpi/icon_action_back.png deleted file mode 100644 index 89db7e29865..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_action_back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_action_forward.png b/android/app/src/main/res/drawable-hdpi/icon_action_forward.png deleted file mode 100644 index b8abf47c489..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_action_forward.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_collapse.png b/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_collapse.png deleted file mode 100644 index 8bc5016f2ce..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_collapse.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_expand.png b/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_expand.png deleted file mode 100644 index d5b72bb7689..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_action_fullscreen_expand.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_arrow_top.png b/android/app/src/main/res/drawable-hdpi/icon_arrow_top.png deleted file mode 100644 index 193fe2261df..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_arrow_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_avatar.png b/android/app/src/main/res/drawable-hdpi/icon_avatar.png deleted file mode 100644 index d28594fcf10..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_avatar.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_check_on.png b/android/app/src/main/res/drawable-hdpi/icon_check_on.png deleted file mode 100644 index d8318e7fcb1..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_check_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_close_light_gray.png b/android/app/src/main/res/drawable-hdpi/icon_close_light_gray.png deleted file mode 100644 index 4b6d97ccefc..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_close_light_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_forward_gray.png b/android/app/src/main/res/drawable-hdpi/icon_forward_gray.png deleted file mode 100644 index 9b96935894e..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_forward_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_lock_gray.png b/android/app/src/main/res/drawable-hdpi/icon_lock_gray.png deleted file mode 100644 index 5e7c9580466..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_lock_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_lock_white.png b/android/app/src/main/res/drawable-hdpi/icon_lock_white.png deleted file mode 100644 index 700c8fdf815..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_lock_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_menu_group.png b/android/app/src/main/res/drawable-hdpi/icon_menu_group.png deleted file mode 100644 index 40e9b7dc416..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_menu_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_money_white.png b/android/app/src/main/res/drawable-hdpi/icon_money_white.png deleted file mode 100755 index 6510ff9c047..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_money_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_muted.png b/android/app/src/main/res/drawable-hdpi/icon_muted.png deleted file mode 100644 index 2c862042ba2..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_muted.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_notifications_on.png b/android/app/src/main/res/drawable-hdpi/icon_notifications_on.png deleted file mode 100644 index 207cb4c16f4..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_notifications_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/icon_phone_white.png b/android/app/src/main/res/drawable-hdpi/icon_phone_white.png deleted file mode 100755 index d60a9ac7a20..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/icon_phone_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/in_contacts.png b/android/app/src/main/res/drawable-hdpi/in_contacts.png deleted file mode 100644 index 704533ffcc8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/in_contacts.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/info.png b/android/app/src/main/res/drawable-hdpi/info.png deleted file mode 100644 index 6d1080e39b8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/info.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/keycard.png b/android/app/src/main/res/drawable-hdpi/keycard.png deleted file mode 100644 index 8dc1c79dff8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/keycard.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/keycard_logo.png b/android/app/src/main/res/drawable-hdpi/keycard_logo.png deleted file mode 100644 index 0546b5458bc..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/keycard_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/language.png b/android/app/src/main/res/drawable-hdpi/language.png deleted file mode 100644 index 289bf5270f3..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/language.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/launch_logo.png b/android/app/src/main/res/drawable-hdpi/launch_logo.png deleted file mode 100644 index b6252c8da30..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/launch_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/link.png b/android/app/src/main/res/drawable-hdpi/link.png deleted file mode 100644 index 557c9bd19f0..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/link.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/log_out.png b/android/app/src/main/res/drawable-hdpi/log_out.png deleted file mode 100644 index 370625beeb9..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/log_out.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/logo.png b/android/app/src/main/res/drawable-hdpi/logo.png deleted file mode 100644 index f703708c1db..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/mailserver.png b/android/app/src/main/res/drawable-hdpi/mailserver.png deleted file mode 100644 index 51389784c70..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/mailserver.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/make_admin.png b/android/app/src/main/res/drawable-hdpi/make_admin.png deleted file mode 100644 index b2d9b8ecdc7..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/make_admin.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/max.png b/android/app/src/main/res/drawable-hdpi/max.png deleted file mode 100644 index 096b9a0b35b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/max.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/message.png b/android/app/src/main/res/drawable-hdpi/message.png deleted file mode 100644 index 74e7ef02a1f..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/message.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/mobile.png b/android/app/src/main/res/drawable-hdpi/mobile.png deleted file mode 100644 index 0a8e141fab5..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/mobile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/more.png b/android/app/src/main/res/drawable-hdpi/more.png deleted file mode 100644 index d7acbc67583..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/more.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/network.png b/android/app/src/main/res/drawable-hdpi/network.png deleted file mode 100644 index 801c5fdc51b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/network.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/next.png b/android/app/src/main/res/drawable-hdpi/next.png deleted file mode 100644 index 9bb116be24f..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/next.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/notification.png b/android/app/src/main/res/drawable-hdpi/notification.png deleted file mode 100644 index a0a02e2152b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/one_on_one_chat.png b/android/app/src/main/res/drawable-hdpi/one_on_one_chat.png deleted file mode 100644 index b94487fe605..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/one_on_one_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/password.png b/android/app/src/main/res/drawable-hdpi/password.png deleted file mode 100644 index e22a7f6f4e6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/password.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/paste.png b/android/app/src/main/res/drawable-hdpi/paste.png deleted file mode 100644 index fd139764574..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/paste.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/photo.png b/android/app/src/main/res/drawable-hdpi/photo.png deleted file mode 100644 index 762a6eae62b..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/photo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/profile.png b/android/app/src/main/res/drawable-hdpi/profile.png deleted file mode 100644 index 9fd10682663..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/public_chat.png b/android/app/src/main/res/drawable-hdpi/public_chat.png deleted file mode 100644 index e1a76390710..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/public_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/qr.png b/android/app/src/main/res/drawable-hdpi/qr.png deleted file mode 100644 index 2e03d17323c..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/qr.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/receive.png b/android/app/src/main/res/drawable-hdpi/receive.png deleted file mode 100644 index 6b9a0c09fff..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/receive.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/refresh.png b/android/app/src/main/res/drawable-hdpi/refresh.png deleted file mode 100644 index 533559c3dc2..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/refresh.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/remove_contact.png b/android/app/src/main/res/drawable-hdpi/remove_contact.png deleted file mode 100644 index f801fd89f3c..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/remove_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/reply.png b/android/app/src/main/res/drawable-hdpi/reply.png deleted file mode 100644 index 144b8512eb6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/reply.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/rotate_camera.png b/android/app/src/main/res/drawable-hdpi/rotate_camera.png deleted file mode 100644 index 9e59fd92072..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/rotate_camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/search.png b/android/app/src/main/res/drawable-hdpi/search.png deleted file mode 100644 index 14ad5a0adfa..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/search.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/security.png b/android/app/src/main/res/drawable-hdpi/security.png deleted file mode 100644 index 6cc34a56343..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/security.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/send.png b/android/app/src/main/res/drawable-hdpi/send.png deleted file mode 100644 index 565006f41b7..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/send.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/settings.png b/android/app/src/main/res/drawable-hdpi/settings.png deleted file mode 100644 index 3d1d718f74d..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/settings_advanced.png b/android/app/src/main/res/drawable-hdpi/settings_advanced.png deleted file mode 100644 index f7ac1c697a7..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/settings_advanced.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/share.png b/android/app/src/main/res/drawable-hdpi/share.png deleted file mode 100644 index f70ab8f28b6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/share.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/splash_logo.png b/android/app/src/main/res/drawable-hdpi/splash_logo.png new file mode 100644 index 00000000000..ea5d96b73a6 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splash_logo.png differ diff --git a/android/app/src/main/res/drawable-hdpi/stickers.png b/android/app/src/main/res/drawable-hdpi/stickers.png deleted file mode 100644 index 63acc9b8bd9..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/stickers.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/text.png b/android/app/src/main/res/drawable-hdpi/text.png deleted file mode 100644 index cab051f1382..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/text.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_arrow_down.png b/android/app/src/main/res/drawable-hdpi/tiny_arrow_down.png deleted file mode 100644 index 51ee3d99f81..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_check.png b/android/app/src/main/res/drawable-hdpi/tiny_check.png deleted file mode 100644 index 0f33ab5cd01..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_clear.png b/android/app/src/main/res/drawable-hdpi/tiny_clear.png deleted file mode 100644 index b047208c4b9..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_clear.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_edit.png b/android/app/src/main/res/drawable-hdpi/tiny_edit.png deleted file mode 100644 index 60851f1aa88..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_external.png b/android/app/src/main/res/drawable-hdpi/tiny_external.png deleted file mode 100644 index 8a6956b60bd..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_external.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_group.png b/android/app/src/main/res/drawable-hdpi/tiny_group.png deleted file mode 100644 index 9b2a355e1f6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_lock.png b/android/app/src/main/res/drawable-hdpi/tiny_lock.png deleted file mode 100644 index 842deab5a33..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_lock.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_lock_broken.png b/android/app/src/main/res/drawable-hdpi/tiny_lock_broken.png deleted file mode 100644 index c1a89d012c6..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_lock_broken.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_new_contact.png b/android/app/src/main/res/drawable-hdpi/tiny_new_contact.png deleted file mode 100644 index fc273529cd0..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_new_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_pending.png b/android/app/src/main/res/drawable-hdpi/tiny_pending.png deleted file mode 100644 index 912c8ac4495..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_pending.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_public.png b/android/app/src/main/res/drawable-hdpi/tiny_public.png deleted file mode 100644 index b763156f1b8..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_public.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_settings.png b/android/app/src/main/res/drawable-hdpi/tiny_settings.png deleted file mode 100644 index 52d1b243628..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tiny_tribute_to_talk.png b/android/app/src/main/res/drawable-hdpi/tiny_tribute_to_talk.png deleted file mode 100644 index a4f970e105d..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tiny_tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/tribute_to_talk.png b/android/app/src/main/res/drawable-hdpi/tribute_to_talk.png deleted file mode 100644 index 8bb9575d92d..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/two_arrows.png b/android/app/src/main/res/drawable-hdpi/two_arrows.png deleted file mode 100644 index 7b561d17482..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/two_arrows.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/user_profile.png b/android/app/src/main/res/drawable-hdpi/user_profile.png deleted file mode 100644 index 2035b006631..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/user_profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/user_profile_1.png b/android/app/src/main/res/drawable-hdpi/user_profile_1.png deleted file mode 100644 index 2035b006631..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/user_profile_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/username.png b/android/app/src/main/res/drawable-hdpi/username.png deleted file mode 100644 index 819ea7d3e39..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/username.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/wallet.png b/android/app/src/main/res/drawable-hdpi/wallet.png deleted file mode 100644 index 99d2618ff45..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/wallet.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/warning.png b/android/app/src/main/res/drawable-hdpi/warning.png deleted file mode 100644 index 05f8a6db8a1..00000000000 Binary files a/android/app/src/main/res/drawable-hdpi/warning.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/account.png b/android/app/src/main/res/drawable-mdpi/account.png deleted file mode 100644 index ac33067ec10..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/account.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/add.png b/android/app/src/main/res/drawable-mdpi/add.png deleted file mode 100644 index 819d1bd5a43..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/add.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/add_contact.png b/android/app/src/main/res/drawable-mdpi/add_contact.png deleted file mode 100644 index fa26aecb01c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/add_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/address.png b/android/app/src/main/res/drawable-mdpi/address.png deleted file mode 100644 index 3405ff20569..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/address.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/arrow_down.png b/android/app/src/main/res/drawable-mdpi/arrow_down.png deleted file mode 100644 index a966063873e..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/arrow_left.png b/android/app/src/main/res/drawable-mdpi/arrow_left.png deleted file mode 100644 index 27adfc90f41..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/arrow_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/arrow_right.png b/android/app/src/main/res/drawable-mdpi/arrow_right.png deleted file mode 100644 index 77300cfe663..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/arrow_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/arrow_up.png b/android/app/src/main/res/drawable-mdpi/arrow_up.png deleted file mode 100644 index 62311e9a9ae..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/arrow_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/back.png b/android/app/src/main/res/drawable-mdpi/back.png deleted file mode 100644 index e494dee3c64..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/backspace.png b/android/app/src/main/res/drawable-mdpi/backspace.png deleted file mode 100644 index 3d3d3da440d..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/backspace.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/bell.png b/android/app/src/main/res/drawable-mdpi/bell.png deleted file mode 100644 index 986123f365c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/bell.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/browser.png b/android/app/src/main/res/drawable-mdpi/browser.png deleted file mode 100644 index 04702e3dcd0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/browser.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/camera.png b/android/app/src/main/res/drawable-mdpi/camera.png deleted file mode 100644 index bcc76f501c4..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/cancel.png b/android/app/src/main/res/drawable-mdpi/cancel.png deleted file mode 100644 index e2f5b5102aa..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/cancel.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/change.png b/android/app/src/main/res/drawable-mdpi/change.png deleted file mode 100644 index d0d731af64a..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/change.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/check.png b/android/app/src/main/res/drawable-mdpi/check.png deleted file mode 100644 index a1b61955164..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/close.png b/android/app/src/main/res/drawable-mdpi/close.png deleted file mode 100644 index 74eda06fa08..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/close.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/commands.png b/android/app/src/main/res/drawable-mdpi/commands.png deleted file mode 100644 index 8f3c94a4cd0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/commands.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/copy.png b/android/app/src/main/res/drawable-mdpi/copy.png deleted file mode 100644 index 3e0eb1bfcdc..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/copy.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/corner_left_bottom.png b/android/app/src/main/res/drawable-mdpi/corner_left_bottom.png deleted file mode 100644 index da09ea7a24c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/corner_left_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/corner_left_top.png b/android/app/src/main/res/drawable-mdpi/corner_left_top.png deleted file mode 100644 index 988d93651c4..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/corner_left_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/corner_right_bottom.png b/android/app/src/main/res/drawable-mdpi/corner_right_bottom.png deleted file mode 100644 index e74544e83ba..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/corner_right_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/corner_right_top.png b/android/app/src/main/res/drawable-mdpi/corner_right_top.png deleted file mode 100644 index 33726dfa018..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/corner_right_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/dapp.png b/android/app/src/main/res/drawable-mdpi/dapp.png deleted file mode 100644 index e6aacad3428..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/dapp.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/delete.png b/android/app/src/main/res/drawable-mdpi/delete.png deleted file mode 100644 index 1b0b6ad279f..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/delete.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/desktop.png b/android/app/src/main/res/drawable-mdpi/desktop.png deleted file mode 100644 index f24f9f714a1..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/desktop.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/download.png b/android/app/src/main/res/drawable-mdpi/download.png deleted file mode 100644 index 9bf52d1f1ce..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/download.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/dropdown.png b/android/app/src/main/res/drawable-mdpi/dropdown.png deleted file mode 100644 index cc4dad1b7c8..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/dropdown.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/dropdown_up.png b/android/app/src/main/res/drawable-mdpi/dropdown_up.png deleted file mode 100644 index 2b91d35c63f..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/dropdown_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/edit.png b/android/app/src/main/res/drawable-mdpi/edit.png deleted file mode 100644 index b8e36f102e8..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/faceid.png b/android/app/src/main/res/drawable-mdpi/faceid.png deleted file mode 100644 index 9f817b0addc..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/faceid.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/filter.png b/android/app/src/main/res/drawable-mdpi/filter.png deleted file mode 100644 index 0d1ec9f0047..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/filter.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/fingerprint.png b/android/app/src/main/res/drawable-mdpi/fingerprint.png deleted file mode 100644 index 7120503e075..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/fingerprint.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/flash.png b/android/app/src/main/res/drawable-mdpi/flash.png deleted file mode 100644 index b57610edc56..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/flash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/flash_active.png b/android/app/src/main/res/drawable-mdpi/flash_active.png deleted file mode 100644 index 57288d03934..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/flash_active.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/group_chat.png b/android/app/src/main/res/drawable-mdpi/group_chat.png deleted file mode 100644 index 493eb9cb9ae..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/group_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/help.png b/android/app/src/main/res/drawable-mdpi/help.png deleted file mode 100644 index e342dc7dc67..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/help.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/history.png b/android/app/src/main/res/drawable-mdpi/history.png deleted file mode 100644 index ef06678666b..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/home.png b/android/app/src/main/res/drawable-mdpi/home.png deleted file mode 100644 index a4442d64994..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/home.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/home_1.png b/android/app/src/main/res/drawable-mdpi/home_1.png deleted file mode 100644 index 7834e638d3d..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/home_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_background.png b/android/app/src/main/res/drawable-mdpi/ic_background.png index 5aee5ffb84a..a4e87e1d481 100644 Binary files a/android/app/src/main/res/drawable-mdpi/ic_background.png and b/android/app/src/main/res/drawable-mdpi/ic_background.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_foreground.png index 50fb38228da..94fe86346bb 100644 Binary files a/android/app/src/main/res/drawable-mdpi/ic_foreground.png and b/android/app/src/main/res/drawable-mdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_stat_status_notification.png b/android/app/src/main/res/drawable-mdpi/ic_stat_status_notification.png deleted file mode 100755 index 7810cd58a1c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/ic_stat_status_notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_action_back.png b/android/app/src/main/res/drawable-mdpi/icon_action_back.png deleted file mode 100644 index 8e31377a598..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_action_back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_action_forward.png b/android/app/src/main/res/drawable-mdpi/icon_action_forward.png deleted file mode 100644 index af802ac9eb0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_action_forward.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_collapse.png b/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_collapse.png deleted file mode 100644 index 09c4944904b..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_collapse.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_expand.png b/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_expand.png deleted file mode 100644 index a862a39fc51..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_action_fullscreen_expand.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_arrow_top.png b/android/app/src/main/res/drawable-mdpi/icon_arrow_top.png deleted file mode 100644 index dd47f4ff17a..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_arrow_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_avatar.png b/android/app/src/main/res/drawable-mdpi/icon_avatar.png deleted file mode 100644 index d76df40ebc0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_avatar.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_check_on.png b/android/app/src/main/res/drawable-mdpi/icon_check_on.png deleted file mode 100644 index a44f891d2fa..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_check_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_close_light_gray.png b/android/app/src/main/res/drawable-mdpi/icon_close_light_gray.png deleted file mode 100644 index 4918a29a643..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_close_light_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_forward_gray.png b/android/app/src/main/res/drawable-mdpi/icon_forward_gray.png deleted file mode 100644 index 66dd050bda0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_forward_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_lock_gray.png b/android/app/src/main/res/drawable-mdpi/icon_lock_gray.png deleted file mode 100644 index dce5f8dff8c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_lock_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_lock_white.png b/android/app/src/main/res/drawable-mdpi/icon_lock_white.png deleted file mode 100644 index 7da52c18af8..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_lock_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_menu_group.png b/android/app/src/main/res/drawable-mdpi/icon_menu_group.png deleted file mode 100644 index f17ab21946f..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_menu_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_money_white.png b/android/app/src/main/res/drawable-mdpi/icon_money_white.png deleted file mode 100755 index 1584a09d0a2..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_money_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_muted.png b/android/app/src/main/res/drawable-mdpi/icon_muted.png deleted file mode 100644 index 21c7dc39622..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_muted.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_notifications_on.png b/android/app/src/main/res/drawable-mdpi/icon_notifications_on.png deleted file mode 100644 index 89a9ca8f15d..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_notifications_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/icon_phone_white.png b/android/app/src/main/res/drawable-mdpi/icon_phone_white.png deleted file mode 100755 index 224f48c50de..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/icon_phone_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/in_contacts.png b/android/app/src/main/res/drawable-mdpi/in_contacts.png deleted file mode 100644 index dbd31f8ccd6..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/in_contacts.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/info.png b/android/app/src/main/res/drawable-mdpi/info.png deleted file mode 100644 index 662f42fe854..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/info.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/keycard.png b/android/app/src/main/res/drawable-mdpi/keycard.png deleted file mode 100644 index aebd4b711f4..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/keycard.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/keycard_logo.png b/android/app/src/main/res/drawable-mdpi/keycard_logo.png deleted file mode 100644 index a1ff5a74346..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/keycard_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/keycard_logo_big.png b/android/app/src/main/res/drawable-mdpi/keycard_logo_big.png deleted file mode 100644 index bfcbe8a44e1..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/keycard_logo_big.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/language.png b/android/app/src/main/res/drawable-mdpi/language.png deleted file mode 100644 index abd243bb7fe..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/language.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/launch_logo.png b/android/app/src/main/res/drawable-mdpi/launch_logo.png deleted file mode 100644 index 20a06751170..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/launch_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/link.png b/android/app/src/main/res/drawable-mdpi/link.png deleted file mode 100644 index 7cf592030eb..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/link.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/log_out.png b/android/app/src/main/res/drawable-mdpi/log_out.png deleted file mode 100644 index 5fe3bcdde99..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/log_out.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/logo.png b/android/app/src/main/res/drawable-mdpi/logo.png index fd5147d4755..5d415cc689a 100644 Binary files a/android/app/src/main/res/drawable-mdpi/logo.png and b/android/app/src/main/res/drawable-mdpi/logo.png differ diff --git a/android/app/src/main/res/drawable-mdpi/mailserver.png b/android/app/src/main/res/drawable-mdpi/mailserver.png deleted file mode 100644 index 71e7165a8a3..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/mailserver.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/make_admin.png b/android/app/src/main/res/drawable-mdpi/make_admin.png deleted file mode 100644 index 667e71d7a75..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/make_admin.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/max.png b/android/app/src/main/res/drawable-mdpi/max.png deleted file mode 100644 index fb47081ec19..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/max.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/message.png b/android/app/src/main/res/drawable-mdpi/message.png deleted file mode 100644 index 4b5d4f3f2a6..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/message.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/mobile.png b/android/app/src/main/res/drawable-mdpi/mobile.png deleted file mode 100644 index 15a1979b098..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/mobile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/more.png b/android/app/src/main/res/drawable-mdpi/more.png deleted file mode 100644 index ec28601c347..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/more.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/network.png b/android/app/src/main/res/drawable-mdpi/network.png deleted file mode 100644 index c039ef62295..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/network.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/next.png b/android/app/src/main/res/drawable-mdpi/next.png deleted file mode 100644 index b28153218d3..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/next.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/notification.png b/android/app/src/main/res/drawable-mdpi/notification.png deleted file mode 100644 index 321bb00f71a..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/notification_icon.png b/android/app/src/main/res/drawable-mdpi/notification_icon.png new file mode 100644 index 00000000000..a0f3fa51ee4 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/notification_icon.png differ diff --git a/android/app/src/main/res/drawable-mdpi/one_on_one_chat.png b/android/app/src/main/res/drawable-mdpi/one_on_one_chat.png deleted file mode 100644 index 58aec8405fe..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/one_on_one_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/password.png b/android/app/src/main/res/drawable-mdpi/password.png deleted file mode 100644 index 62b02fd7d16..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/password.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/paste.png b/android/app/src/main/res/drawable-mdpi/paste.png deleted file mode 100644 index 65cadaf5e10..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/paste.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/photo.png b/android/app/src/main/res/drawable-mdpi/photo.png deleted file mode 100644 index 422bc021d6c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/photo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/price.png b/android/app/src/main/res/drawable-mdpi/price.png deleted file mode 100644 index 169bcbb295d..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/price.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/print.png b/android/app/src/main/res/drawable-mdpi/print.png deleted file mode 100644 index 9556c28bba5..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/print.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/profile.png b/android/app/src/main/res/drawable-mdpi/profile.png deleted file mode 100644 index 59ab574daf3..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/public_chat.png b/android/app/src/main/res/drawable-mdpi/public_chat.png deleted file mode 100644 index 1f090cb9c04..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/public_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/qr.png b/android/app/src/main/res/drawable-mdpi/qr.png deleted file mode 100644 index 55ebeccbdec..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/qr.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/receive.png b/android/app/src/main/res/drawable-mdpi/receive.png deleted file mode 100644 index ed391c2933c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/receive.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/recent.png b/android/app/src/main/res/drawable-mdpi/recent.png deleted file mode 100644 index b52ed04e568..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/recent.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/refresh.png b/android/app/src/main/res/drawable-mdpi/refresh.png deleted file mode 100644 index 21bdcb83962..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/refresh.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/remove_contact.png b/android/app/src/main/res/drawable-mdpi/remove_contact.png deleted file mode 100644 index fd396c3e6a0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/remove_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/reply.png b/android/app/src/main/res/drawable-mdpi/reply.png deleted file mode 100644 index 11a182941be..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/reply.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/rotate_camera.png b/android/app/src/main/res/drawable-mdpi/rotate_camera.png deleted file mode 100644 index 174792f0512..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/rotate_camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/search.png b/android/app/src/main/res/drawable-mdpi/search.png deleted file mode 100644 index 656067c7ae0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/search.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/security.png b/android/app/src/main/res/drawable-mdpi/security.png deleted file mode 100644 index a5fc04bda56..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/security.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/send.png b/android/app/src/main/res/drawable-mdpi/send.png deleted file mode 100644 index b1c52a4632e..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/send.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/settings.png b/android/app/src/main/res/drawable-mdpi/settings.png deleted file mode 100644 index 2af6973f368..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/settings_advanced.png b/android/app/src/main/res/drawable-mdpi/settings_advanced.png deleted file mode 100644 index 97e5a54f4da..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/settings_advanced.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/share.png b/android/app/src/main/res/drawable-mdpi/share.png deleted file mode 100644 index 1e6e4c0bf14..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/share.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/splash_logo.png b/android/app/src/main/res/drawable-mdpi/splash_logo.png new file mode 100644 index 00000000000..f7383cec215 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splash_logo.png differ diff --git a/android/app/src/main/res/drawable-mdpi/sticker_history.png b/android/app/src/main/res/drawable-mdpi/sticker_history.png deleted file mode 100644 index 6b7e7619769..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/sticker_history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/stickers.png b/android/app/src/main/res/drawable-mdpi/stickers.png deleted file mode 100644 index f30a1f39cc1..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/stickers.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/stickers_big.png b/android/app/src/main/res/drawable-mdpi/stickers_big.png deleted file mode 100644 index a9551ba680f..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/stickers_big.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/text.png b/android/app/src/main/res/drawable-mdpi/text.png deleted file mode 100644 index c098d00b06e..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/text.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_arrow_down.png b/android/app/src/main/res/drawable-mdpi/tiny_arrow_down.png deleted file mode 100644 index f8c242d7daf..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_check.png b/android/app/src/main/res/drawable-mdpi/tiny_check.png deleted file mode 100644 index 4672100f68b..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_clear.png b/android/app/src/main/res/drawable-mdpi/tiny_clear.png deleted file mode 100644 index 4e52f554e26..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_clear.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_edit.png b/android/app/src/main/res/drawable-mdpi/tiny_edit.png deleted file mode 100644 index 9121279027b..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_external.png b/android/app/src/main/res/drawable-mdpi/tiny_external.png deleted file mode 100644 index a4fb8a5b7fa..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_external.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_group.png b/android/app/src/main/res/drawable-mdpi/tiny_group.png deleted file mode 100644 index 3257461a863..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_lock.png b/android/app/src/main/res/drawable-mdpi/tiny_lock.png deleted file mode 100644 index 50a7ee18221..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_lock.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_lock_broken.png b/android/app/src/main/res/drawable-mdpi/tiny_lock_broken.png deleted file mode 100644 index 35aebfabd97..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_lock_broken.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_new_contact.png b/android/app/src/main/res/drawable-mdpi/tiny_new_contact.png deleted file mode 100644 index f8cc99fd99c..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_new_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_pending.png b/android/app/src/main/res/drawable-mdpi/tiny_pending.png deleted file mode 100644 index ea05b8b90f0..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_pending.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_public.png b/android/app/src/main/res/drawable-mdpi/tiny_public.png deleted file mode 100644 index 132b5c99b51..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_public.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_settings.png b/android/app/src/main/res/drawable-mdpi/tiny_settings.png deleted file mode 100644 index b4080abd2e2..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_snt.png b/android/app/src/main/res/drawable-mdpi/tiny_snt.png deleted file mode 100644 index 72489de78a2..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_snt.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_tribute_to_talk.png b/android/app/src/main/res/drawable-mdpi/tiny_tribute_to_talk.png deleted file mode 100644 index 0059e0da394..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tiny_warning.png b/android/app/src/main/res/drawable-mdpi/tiny_warning.png deleted file mode 100644 index c7e8fa69d4b..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tiny_warning.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/token.png b/android/app/src/main/res/drawable-mdpi/token.png deleted file mode 100644 index e14adb9318f..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/token.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tooltip_triangle.png b/android/app/src/main/res/drawable-mdpi/tooltip_triangle.png deleted file mode 100644 index 622cc37c598..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tooltip_triangle.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/tribute_to_talk.png b/android/app/src/main/res/drawable-mdpi/tribute_to_talk.png deleted file mode 100644 index 616b9bb1561..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/two_arrows.png b/android/app/src/main/res/drawable-mdpi/two_arrows.png deleted file mode 100644 index 8673efa3de7..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/two_arrows.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/union_nfc.png b/android/app/src/main/res/drawable-mdpi/union_nfc.png deleted file mode 100644 index 9f8fd24420a..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/union_nfc.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/user_profile.png b/android/app/src/main/res/drawable-mdpi/user_profile.png deleted file mode 100644 index e138c45e72e..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/user_profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/user_profile_1.png b/android/app/src/main/res/drawable-mdpi/user_profile_1.png deleted file mode 100644 index e138c45e72e..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/user_profile_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/username.png b/android/app/src/main/res/drawable-mdpi/username.png deleted file mode 100644 index 0adacc6538a..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/username.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/wallet.png b/android/app/src/main/res/drawable-mdpi/wallet.png deleted file mode 100644 index 95c0410bb72..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/wallet.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/warning.png b/android/app/src/main/res/drawable-mdpi/warning.png deleted file mode 100644 index 62db2dab2b2..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/warning.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/watch.png b/android/app/src/main/res/drawable-mdpi/watch.png deleted file mode 100644 index 919d704fbdc..00000000000 Binary files a/android/app/src/main/res/drawable-mdpi/watch.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/account.png b/android/app/src/main/res/drawable-xhdpi/account.png deleted file mode 100644 index 094fd24490d..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/account.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/add.png b/android/app/src/main/res/drawable-xhdpi/add.png deleted file mode 100644 index b34859e553b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/add.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/add_contact.png b/android/app/src/main/res/drawable-xhdpi/add_contact.png deleted file mode 100644 index 116f7cd572a..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/add_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/address.png b/android/app/src/main/res/drawable-xhdpi/address.png deleted file mode 100644 index 3894e601624..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/address.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/arrow_down.png b/android/app/src/main/res/drawable-xhdpi/arrow_down.png deleted file mode 100644 index c197a93ba09..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/arrow_left.png b/android/app/src/main/res/drawable-xhdpi/arrow_left.png deleted file mode 100644 index 0e6d76c92de..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/arrow_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/arrow_right.png b/android/app/src/main/res/drawable-xhdpi/arrow_right.png deleted file mode 100644 index 78cd962e95a..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/arrow_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/arrow_up.png b/android/app/src/main/res/drawable-xhdpi/arrow_up.png deleted file mode 100644 index 30db61f6eeb..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/arrow_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/back.png b/android/app/src/main/res/drawable-xhdpi/back.png deleted file mode 100644 index b6756aa077f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/backspace.png b/android/app/src/main/res/drawable-xhdpi/backspace.png deleted file mode 100644 index 5752a69548e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/backspace.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/bell.png b/android/app/src/main/res/drawable-xhdpi/bell.png deleted file mode 100644 index 4f4602ebaf1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/bell.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/browser.png b/android/app/src/main/res/drawable-xhdpi/browser.png deleted file mode 100644 index a5900721177..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/browser.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/camera.png b/android/app/src/main/res/drawable-xhdpi/camera.png deleted file mode 100644 index c22675bbe61..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/cancel.png b/android/app/src/main/res/drawable-xhdpi/cancel.png deleted file mode 100644 index e2d3a8dac64..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/cancel.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/change.png b/android/app/src/main/res/drawable-xhdpi/change.png deleted file mode 100644 index 6ba249f4be1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/change.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/check.png b/android/app/src/main/res/drawable-xhdpi/check.png deleted file mode 100644 index db1ecadb8a2..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/close.png b/android/app/src/main/res/drawable-xhdpi/close.png deleted file mode 100644 index a3d9acebede..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/close.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/commands.png b/android/app/src/main/res/drawable-xhdpi/commands.png deleted file mode 100644 index ea6226849c0..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/commands.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/copy.png b/android/app/src/main/res/drawable-xhdpi/copy.png deleted file mode 100644 index 79ce1e37b9f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/copy.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/corner_left_bottom.png b/android/app/src/main/res/drawable-xhdpi/corner_left_bottom.png deleted file mode 100644 index b43f25a58da..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/corner_left_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/corner_left_top.png b/android/app/src/main/res/drawable-xhdpi/corner_left_top.png deleted file mode 100644 index f8180a9c1c7..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/corner_left_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/corner_right_bottom.png b/android/app/src/main/res/drawable-xhdpi/corner_right_bottom.png deleted file mode 100644 index ce0a7ab9c09..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/corner_right_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/corner_right_top.png b/android/app/src/main/res/drawable-xhdpi/corner_right_top.png deleted file mode 100644 index 2ae2e61860b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/corner_right_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/dapp.png b/android/app/src/main/res/drawable-xhdpi/dapp.png deleted file mode 100644 index f8f66b75ccc..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/dapp.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/delete.png b/android/app/src/main/res/drawable-xhdpi/delete.png deleted file mode 100644 index 33c287b8e77..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/delete.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/desktop.png b/android/app/src/main/res/drawable-xhdpi/desktop.png deleted file mode 100644 index 366c369a09e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/desktop.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/download.png b/android/app/src/main/res/drawable-xhdpi/download.png deleted file mode 100644 index df6d20c5b49..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/download.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/dropdown.png b/android/app/src/main/res/drawable-xhdpi/dropdown.png deleted file mode 100644 index 22f8d6478f4..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/dropdown.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/dropdown_up.png b/android/app/src/main/res/drawable-xhdpi/dropdown_up.png deleted file mode 100644 index 8bd34c66245..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/dropdown_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/edit.png b/android/app/src/main/res/drawable-xhdpi/edit.png deleted file mode 100644 index b49b93c5b2c..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/faceid.png b/android/app/src/main/res/drawable-xhdpi/faceid.png deleted file mode 100644 index cf0cae9d2a1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/faceid.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/filter.png b/android/app/src/main/res/drawable-xhdpi/filter.png deleted file mode 100644 index 8315c2ba15b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/filter.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/fingerprint.png b/android/app/src/main/res/drawable-xhdpi/fingerprint.png deleted file mode 100644 index af1c6a23c35..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/fingerprint.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/flash.png b/android/app/src/main/res/drawable-xhdpi/flash.png deleted file mode 100644 index 08b32417435..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/flash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/flash_active.png b/android/app/src/main/res/drawable-xhdpi/flash_active.png deleted file mode 100644 index bb50a1ba188..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/flash_active.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/group_chat.png b/android/app/src/main/res/drawable-xhdpi/group_chat.png deleted file mode 100644 index f2dc2f73bdf..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/group_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/help.png b/android/app/src/main/res/drawable-xhdpi/help.png deleted file mode 100644 index 890a49ae148..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/help.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/history.png b/android/app/src/main/res/drawable-xhdpi/history.png deleted file mode 100644 index 483bc430e77..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/home.png b/android/app/src/main/res/drawable-xhdpi/home.png deleted file mode 100644 index 627ff20f84e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/home.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/home_1.png b/android/app/src/main/res/drawable-xhdpi/home_1.png deleted file mode 100644 index 85963f2be98..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/home_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_background.png b/android/app/src/main/res/drawable-xhdpi/ic_background.png index 086c648f560..3d628c39623 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/ic_background.png and b/android/app/src/main/res/drawable-xhdpi/ic_background.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_foreground.png index 0c8d0ac4d04..a5a79d8d79a 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/ic_foreground.png and b/android/app/src/main/res/drawable-xhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_stat_status_notification.png b/android/app/src/main/res/drawable-xhdpi/ic_stat_status_notification.png deleted file mode 100755 index ab8aeaa8d9d..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/ic_stat_status_notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_action_back.png b/android/app/src/main/res/drawable-xhdpi/icon_action_back.png deleted file mode 100644 index 491112378ef..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_action_back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_action_forward.png b/android/app/src/main/res/drawable-xhdpi/icon_action_forward.png deleted file mode 100644 index 453add7dec6..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_action_forward.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_collapse.png b/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_collapse.png deleted file mode 100644 index 80948ff1915..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_collapse.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_expand.png b/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_expand.png deleted file mode 100644 index 35fcdd6ae63..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_action_fullscreen_expand.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_arrow_top.png b/android/app/src/main/res/drawable-xhdpi/icon_arrow_top.png deleted file mode 100644 index 9125df76b51..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_arrow_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_avatar.png b/android/app/src/main/res/drawable-xhdpi/icon_avatar.png deleted file mode 100644 index 63e1078f8ee..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_avatar.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_check_on.png b/android/app/src/main/res/drawable-xhdpi/icon_check_on.png deleted file mode 100644 index ef90004718a..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_check_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_close_light_gray.png b/android/app/src/main/res/drawable-xhdpi/icon_close_light_gray.png deleted file mode 100644 index 03a45042681..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_close_light_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_forward_gray.png b/android/app/src/main/res/drawable-xhdpi/icon_forward_gray.png deleted file mode 100644 index de0eccda60c..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_forward_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_lock_gray.png b/android/app/src/main/res/drawable-xhdpi/icon_lock_gray.png deleted file mode 100644 index 40369d54240..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_lock_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_lock_white.png b/android/app/src/main/res/drawable-xhdpi/icon_lock_white.png deleted file mode 100644 index 827cd722424..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_lock_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_menu_group.png b/android/app/src/main/res/drawable-xhdpi/icon_menu_group.png deleted file mode 100644 index 28c99ec40f5..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_menu_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_money_white.png b/android/app/src/main/res/drawable-xhdpi/icon_money_white.png deleted file mode 100755 index da077578fa6..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_money_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_muted.png b/android/app/src/main/res/drawable-xhdpi/icon_muted.png deleted file mode 100644 index 41956196703..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_muted.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_notifications_on.png b/android/app/src/main/res/drawable-xhdpi/icon_notifications_on.png deleted file mode 100644 index 9322a10becb..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_notifications_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/icon_phone_white.png b/android/app/src/main/res/drawable-xhdpi/icon_phone_white.png deleted file mode 100755 index f08867e855e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/icon_phone_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/in_contacts.png b/android/app/src/main/res/drawable-xhdpi/in_contacts.png deleted file mode 100644 index 6377195265c..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/in_contacts.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/info.png b/android/app/src/main/res/drawable-xhdpi/info.png deleted file mode 100644 index 8cdb154670d..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/info.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/keycard.png b/android/app/src/main/res/drawable-xhdpi/keycard.png deleted file mode 100644 index 68b28664845..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/keycard.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/keycard_logo.png b/android/app/src/main/res/drawable-xhdpi/keycard_logo.png deleted file mode 100644 index 8b0ed150cdc..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/keycard_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/keycard_logo_big.png b/android/app/src/main/res/drawable-xhdpi/keycard_logo_big.png deleted file mode 100644 index 53eb0d68541..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/keycard_logo_big.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/language.png b/android/app/src/main/res/drawable-xhdpi/language.png deleted file mode 100644 index a9d19130605..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/language.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/launch_logo.png b/android/app/src/main/res/drawable-xhdpi/launch_logo.png deleted file mode 100644 index c3cee132cc1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/launch_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/link.png b/android/app/src/main/res/drawable-xhdpi/link.png deleted file mode 100644 index bf27739e2cf..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/link.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/log_out.png b/android/app/src/main/res/drawable-xhdpi/log_out.png deleted file mode 100644 index acf787704fd..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/log_out.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/logo.png b/android/app/src/main/res/drawable-xhdpi/logo.png index 7b2e9a27372..f1d87020b90 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/logo.png and b/android/app/src/main/res/drawable-xhdpi/logo.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/mailserver.png b/android/app/src/main/res/drawable-xhdpi/mailserver.png deleted file mode 100644 index 7c8784d8748..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/mailserver.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/make_admin.png b/android/app/src/main/res/drawable-xhdpi/make_admin.png deleted file mode 100644 index 263e5cb8c4f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/make_admin.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/max.png b/android/app/src/main/res/drawable-xhdpi/max.png deleted file mode 100644 index 7608870c224..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/max.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/message.png b/android/app/src/main/res/drawable-xhdpi/message.png deleted file mode 100644 index 607bda323b5..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/message.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/mobile.png b/android/app/src/main/res/drawable-xhdpi/mobile.png deleted file mode 100644 index 69838441a73..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/mobile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/more.png b/android/app/src/main/res/drawable-xhdpi/more.png deleted file mode 100644 index 6e94684e355..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/more.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/network.png b/android/app/src/main/res/drawable-xhdpi/network.png deleted file mode 100644 index 63c9c065c24..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/network.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/next.png b/android/app/src/main/res/drawable-xhdpi/next.png deleted file mode 100644 index 5b3af7fcc70..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/next.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/notification.png b/android/app/src/main/res/drawable-xhdpi/notification.png deleted file mode 100644 index 0885375893d..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/notification_icon.png b/android/app/src/main/res/drawable-xhdpi/notification_icon.png new file mode 100644 index 00000000000..14530bdc2c5 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/notification_icon.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/one_on_one_chat.png b/android/app/src/main/res/drawable-xhdpi/one_on_one_chat.png deleted file mode 100644 index e3079d8fbd1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/one_on_one_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/password.png b/android/app/src/main/res/drawable-xhdpi/password.png deleted file mode 100644 index 17d35999c47..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/password.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/paste.png b/android/app/src/main/res/drawable-xhdpi/paste.png deleted file mode 100644 index ff894ccfbd2..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/paste.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/photo.png b/android/app/src/main/res/drawable-xhdpi/photo.png deleted file mode 100644 index d2f203a85ce..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/photo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/price.png b/android/app/src/main/res/drawable-xhdpi/price.png deleted file mode 100644 index a6f07ce2fe9..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/price.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/print.png b/android/app/src/main/res/drawable-xhdpi/print.png deleted file mode 100644 index 6103fe4ee09..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/print.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/profile.png b/android/app/src/main/res/drawable-xhdpi/profile.png deleted file mode 100644 index 06f02b96abd..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/public_chat.png b/android/app/src/main/res/drawable-xhdpi/public_chat.png deleted file mode 100644 index 0f1c959cf1f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/public_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/qr.png b/android/app/src/main/res/drawable-xhdpi/qr.png deleted file mode 100644 index 89418132064..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/qr.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/receive.png b/android/app/src/main/res/drawable-xhdpi/receive.png deleted file mode 100644 index 9c0a9b02fcf..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/receive.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/recent.png b/android/app/src/main/res/drawable-xhdpi/recent.png deleted file mode 100644 index 1a2a4e63ff9..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/recent.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/refresh.png b/android/app/src/main/res/drawable-xhdpi/refresh.png deleted file mode 100644 index bd4281eefdf..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/refresh.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/remove_contact.png b/android/app/src/main/res/drawable-xhdpi/remove_contact.png deleted file mode 100644 index 81f8a3928ea..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/remove_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/reply.png b/android/app/src/main/res/drawable-xhdpi/reply.png deleted file mode 100644 index e721e3f2007..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/reply.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/rotate_camera.png b/android/app/src/main/res/drawable-xhdpi/rotate_camera.png deleted file mode 100644 index 77fef6ed002..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/rotate_camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/search.png b/android/app/src/main/res/drawable-xhdpi/search.png deleted file mode 100644 index 7496b4613cf..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/search.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/security.png b/android/app/src/main/res/drawable-xhdpi/security.png deleted file mode 100644 index 1a6a337d44f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/security.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/send.png b/android/app/src/main/res/drawable-xhdpi/send.png deleted file mode 100644 index 0d577123a08..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/send.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/settings.png b/android/app/src/main/res/drawable-xhdpi/settings.png deleted file mode 100644 index 60636dcefb1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/settings_advanced.png b/android/app/src/main/res/drawable-xhdpi/settings_advanced.png deleted file mode 100644 index 491f9f2b00e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/settings_advanced.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/share.png b/android/app/src/main/res/drawable-xhdpi/share.png deleted file mode 100644 index 9854f8e085c..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/share.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/splash_logo.png b/android/app/src/main/res/drawable-xhdpi/splash_logo.png new file mode 100644 index 00000000000..44007cad485 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splash_logo.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/stickers.png b/android/app/src/main/res/drawable-xhdpi/stickers.png deleted file mode 100644 index 425504f1058..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/stickers.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/text.png b/android/app/src/main/res/drawable-xhdpi/text.png deleted file mode 100644 index 413cb3e92dc..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/text.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_clear.png b/android/app/src/main/res/drawable-xhdpi/tiny_clear.png deleted file mode 100644 index 5aba08494a1..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_clear.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_edit.png b/android/app/src/main/res/drawable-xhdpi/tiny_edit.png deleted file mode 100644 index 9b40b5b3380..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_group.png b/android/app/src/main/res/drawable-xhdpi/tiny_group.png deleted file mode 100644 index 063d393d256..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_new_contact.png b/android/app/src/main/res/drawable-xhdpi/tiny_new_contact.png deleted file mode 100644 index 4a9cdd81db0..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_new_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_pending.png b/android/app/src/main/res/drawable-xhdpi/tiny_pending.png deleted file mode 100644 index 7596d1ef953..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_pending.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_public.png b/android/app/src/main/res/drawable-xhdpi/tiny_public.png deleted file mode 100644 index 007a1e6cf8d..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_public.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_settings.png b/android/app/src/main/res/drawable-xhdpi/tiny_settings.png deleted file mode 100644 index 7e83abb5980..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tiny_tribute_to_talk.png b/android/app/src/main/res/drawable-xhdpi/tiny_tribute_to_talk.png deleted file mode 100644 index 0e6299323ba..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tiny_tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/token.png b/android/app/src/main/res/drawable-xhdpi/token.png deleted file mode 100644 index 81b9d452c5e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/token.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/tooltip_triangle.png b/android/app/src/main/res/drawable-xhdpi/tooltip_triangle.png deleted file mode 100644 index 82ac02e485b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/tooltip_triangle.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/two_arrows.png b/android/app/src/main/res/drawable-xhdpi/two_arrows.png deleted file mode 100644 index 8c4d464de4e..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/two_arrows.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/user_profile.png b/android/app/src/main/res/drawable-xhdpi/user_profile.png deleted file mode 100644 index a056e16b8ac..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/user_profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/user_profile_1.png b/android/app/src/main/res/drawable-xhdpi/user_profile_1.png deleted file mode 100644 index 15475e3840b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/user_profile_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/username.png b/android/app/src/main/res/drawable-xhdpi/username.png deleted file mode 100644 index e9be06b1105..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/username.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/wallet.png b/android/app/src/main/res/drawable-xhdpi/wallet.png deleted file mode 100644 index 99145c3118c..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/wallet.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/warning.png b/android/app/src/main/res/drawable-xhdpi/warning.png deleted file mode 100644 index 383a5726b9b..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/warning.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/watch.png b/android/app/src/main/res/drawable-xhdpi/watch.png deleted file mode 100644 index e376bdce53f..00000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/watch.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/account.png b/android/app/src/main/res/drawable-xxhdpi/account.png deleted file mode 100644 index 4bb3c37d22f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/account.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/add.png b/android/app/src/main/res/drawable-xxhdpi/add.png deleted file mode 100644 index 4dec6c507f7..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/add.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/add_contact.png b/android/app/src/main/res/drawable-xxhdpi/add_contact.png deleted file mode 100644 index 534cd129bbb..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/add_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/address.png b/android/app/src/main/res/drawable-xxhdpi/address.png deleted file mode 100644 index 09c1339da0b..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/address.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/arrow_down.png b/android/app/src/main/res/drawable-xxhdpi/arrow_down.png deleted file mode 100644 index 5482ee4a80b..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/arrow_left.png b/android/app/src/main/res/drawable-xxhdpi/arrow_left.png deleted file mode 100644 index 0c80d96f15c..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/arrow_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/arrow_right.png b/android/app/src/main/res/drawable-xxhdpi/arrow_right.png deleted file mode 100644 index 0e945beea83..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/arrow_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/arrow_up.png b/android/app/src/main/res/drawable-xxhdpi/arrow_up.png deleted file mode 100644 index 595d3ded2de..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/arrow_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/back.png b/android/app/src/main/res/drawable-xxhdpi/back.png deleted file mode 100644 index f520c6b1c34..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/backspace.png b/android/app/src/main/res/drawable-xxhdpi/backspace.png deleted file mode 100644 index 8105ac58c38..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/backspace.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/bell.png b/android/app/src/main/res/drawable-xxhdpi/bell.png deleted file mode 100644 index bc17c822ad4..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/bell.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/browser.png b/android/app/src/main/res/drawable-xxhdpi/browser.png deleted file mode 100644 index 3b2f50b5166..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/browser.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/camera.png b/android/app/src/main/res/drawable-xxhdpi/camera.png deleted file mode 100644 index d8278dd1b0d..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/cancel.png b/android/app/src/main/res/drawable-xxhdpi/cancel.png deleted file mode 100644 index 7f63e5d1675..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/cancel.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/change.png b/android/app/src/main/res/drawable-xxhdpi/change.png deleted file mode 100644 index 1ec6efe36a9..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/change.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/check.png b/android/app/src/main/res/drawable-xxhdpi/check.png deleted file mode 100644 index c67be674a92..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/close.png b/android/app/src/main/res/drawable-xxhdpi/close.png deleted file mode 100644 index a30ee21a916..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/close.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/commands.png b/android/app/src/main/res/drawable-xxhdpi/commands.png deleted file mode 100644 index e5ba4e2aa73..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/commands.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/copy.png b/android/app/src/main/res/drawable-xxhdpi/copy.png deleted file mode 100644 index 15e103203dc..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/copy.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/corner_left_bottom.png b/android/app/src/main/res/drawable-xxhdpi/corner_left_bottom.png deleted file mode 100644 index 0fff3412209..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/corner_left_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/corner_left_top.png b/android/app/src/main/res/drawable-xxhdpi/corner_left_top.png deleted file mode 100644 index e25037ece32..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/corner_left_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/corner_right_bottom.png b/android/app/src/main/res/drawable-xxhdpi/corner_right_bottom.png deleted file mode 100644 index e542ec0d64d..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/corner_right_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/corner_right_top.png b/android/app/src/main/res/drawable-xxhdpi/corner_right_top.png deleted file mode 100644 index a6a65aedc96..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/corner_right_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/dapp.png b/android/app/src/main/res/drawable-xxhdpi/dapp.png deleted file mode 100644 index 98a7bf9b0a7..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/dapp.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/delete.png b/android/app/src/main/res/drawable-xxhdpi/delete.png deleted file mode 100644 index 7071b70d2cb..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/delete.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/desktop.png b/android/app/src/main/res/drawable-xxhdpi/desktop.png deleted file mode 100644 index 449a14e1557..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/desktop.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/download.png b/android/app/src/main/res/drawable-xxhdpi/download.png deleted file mode 100644 index edae78bf2b4..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/download.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/dropdown.png b/android/app/src/main/res/drawable-xxhdpi/dropdown.png deleted file mode 100644 index 2d54894207f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/dropdown.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/dropdown_up.png b/android/app/src/main/res/drawable-xxhdpi/dropdown_up.png deleted file mode 100644 index bf94aa0bb32..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/dropdown_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/edit.png b/android/app/src/main/res/drawable-xxhdpi/edit.png deleted file mode 100644 index 76b0ae60209..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/faceid.png b/android/app/src/main/res/drawable-xxhdpi/faceid.png deleted file mode 100644 index 6c4dd55ac69..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/faceid.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/filter.png b/android/app/src/main/res/drawable-xxhdpi/filter.png deleted file mode 100644 index 01e18909a8a..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/filter.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/fingerprint.png b/android/app/src/main/res/drawable-xxhdpi/fingerprint.png deleted file mode 100644 index 16dea45157f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/fingerprint.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/flash.png b/android/app/src/main/res/drawable-xxhdpi/flash.png deleted file mode 100644 index 0b87673ac7e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/flash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/flash_active.png b/android/app/src/main/res/drawable-xxhdpi/flash_active.png deleted file mode 100644 index c648d295c8e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/flash_active.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/group_chat.png b/android/app/src/main/res/drawable-xxhdpi/group_chat.png deleted file mode 100644 index 81ab47d4d56..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/group_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/help.png b/android/app/src/main/res/drawable-xxhdpi/help.png deleted file mode 100644 index f6d8b0cc2e8..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/help.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/history.png b/android/app/src/main/res/drawable-xxhdpi/history.png deleted file mode 100644 index 220eb6b698e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/home.png b/android/app/src/main/res/drawable-xxhdpi/home.png deleted file mode 100644 index 75d9309aa7a..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/home.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/home_1.png b/android/app/src/main/res/drawable-xxhdpi/home_1.png deleted file mode 100644 index 6dd3c197f34..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/home_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_background.png b/android/app/src/main/res/drawable-xxhdpi/ic_background.png index 0f4f695623a..f664414df47 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_background.png and b/android/app/src/main/res/drawable-xxhdpi/ic_background.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_foreground.png index c5a3afd29da..9e49b93dce1 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_foreground.png and b/android/app/src/main/res/drawable-xxhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stat_status_notification.png b/android/app/src/main/res/drawable-xxhdpi/ic_stat_status_notification.png deleted file mode 100755 index 79708073580..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_stat_status_notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_avatar.png b/android/app/src/main/res/drawable-xxhdpi/icon_avatar.png deleted file mode 100644 index f3b8d0770d0..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_avatar.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_check_on.png b/android/app/src/main/res/drawable-xxhdpi/icon_check_on.png deleted file mode 100644 index 6388824eb66..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_check_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_close_light_gray.png b/android/app/src/main/res/drawable-xxhdpi/icon_close_light_gray.png deleted file mode 100644 index 8f9b0d0b809..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_close_light_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_forward_gray.png b/android/app/src/main/res/drawable-xxhdpi/icon_forward_gray.png deleted file mode 100644 index 629d017ffbe..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_forward_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_lock_gray.png b/android/app/src/main/res/drawable-xxhdpi/icon_lock_gray.png deleted file mode 100644 index f18aaa61e18..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_lock_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_lock_white.png b/android/app/src/main/res/drawable-xxhdpi/icon_lock_white.png deleted file mode 100644 index ccddc79dec7..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_lock_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_menu_group.png b/android/app/src/main/res/drawable-xxhdpi/icon_menu_group.png deleted file mode 100644 index a356f7ccdd3..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_menu_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_money_white.png b/android/app/src/main/res/drawable-xxhdpi/icon_money_white.png deleted file mode 100755 index 243469d9a98..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_money_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_muted.png b/android/app/src/main/res/drawable-xxhdpi/icon_muted.png deleted file mode 100644 index 674a9faa669..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_muted.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_notifications_on.png b/android/app/src/main/res/drawable-xxhdpi/icon_notifications_on.png deleted file mode 100644 index a0ee3c3fd5b..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_notifications_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_phone_white.png b/android/app/src/main/res/drawable-xxhdpi/icon_phone_white.png deleted file mode 100755 index b49ec0439d4..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/icon_phone_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/in_contacts.png b/android/app/src/main/res/drawable-xxhdpi/in_contacts.png deleted file mode 100644 index 312a1612f6e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/in_contacts.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/info.png b/android/app/src/main/res/drawable-xxhdpi/info.png deleted file mode 100644 index 8af67e41944..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/info.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/keycard.png b/android/app/src/main/res/drawable-xxhdpi/keycard.png deleted file mode 100644 index 7211516129b..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/keycard.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/keycard_logo.png b/android/app/src/main/res/drawable-xxhdpi/keycard_logo.png deleted file mode 100644 index 0a0a5cc6024..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/keycard_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/keycard_logo_big.png b/android/app/src/main/res/drawable-xxhdpi/keycard_logo_big.png deleted file mode 100644 index 332afc2f0cb..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/keycard_logo_big.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/language.png b/android/app/src/main/res/drawable-xxhdpi/language.png deleted file mode 100644 index fd2760e7c2d..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/language.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/launch_logo.png b/android/app/src/main/res/drawable-xxhdpi/launch_logo.png deleted file mode 100644 index 90a2866375e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/launch_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/link.png b/android/app/src/main/res/drawable-xxhdpi/link.png deleted file mode 100644 index d8328b4288d..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/link.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/log_out.png b/android/app/src/main/res/drawable-xxhdpi/log_out.png deleted file mode 100644 index 08f7dca2d6c..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/log_out.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/logo.png b/android/app/src/main/res/drawable-xxhdpi/logo.png index 2fba84b630f..aa6f1830016 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/logo.png and b/android/app/src/main/res/drawable-xxhdpi/logo.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/mailserver.png b/android/app/src/main/res/drawable-xxhdpi/mailserver.png deleted file mode 100644 index b05575e2ded..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/mailserver.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/make_admin.png b/android/app/src/main/res/drawable-xxhdpi/make_admin.png deleted file mode 100644 index 018004e1b45..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/make_admin.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/max.png b/android/app/src/main/res/drawable-xxhdpi/max.png deleted file mode 100644 index 970ad25d649..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/max.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/message.png b/android/app/src/main/res/drawable-xxhdpi/message.png deleted file mode 100644 index 7bac8866a17..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/message.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/mobile.png b/android/app/src/main/res/drawable-xxhdpi/mobile.png deleted file mode 100644 index 59afa76582e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/mobile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/more.png b/android/app/src/main/res/drawable-xxhdpi/more.png deleted file mode 100644 index 654cf396adf..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/more.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/network.png b/android/app/src/main/res/drawable-xxhdpi/network.png deleted file mode 100644 index 8c7b4e9af4c..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/network.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/next.png b/android/app/src/main/res/drawable-xxhdpi/next.png deleted file mode 100644 index ece1b1b6e49..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/next.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/notification.png b/android/app/src/main/res/drawable-xxhdpi/notification.png deleted file mode 100644 index 517f9af9219..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/notification_icon.png b/android/app/src/main/res/drawable-xxhdpi/notification_icon.png new file mode 100644 index 00000000000..41d6814e024 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/notification_icon.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/one_on_one_chat.png b/android/app/src/main/res/drawable-xxhdpi/one_on_one_chat.png deleted file mode 100644 index 6e049ad1dc5..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/one_on_one_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/password.png b/android/app/src/main/res/drawable-xxhdpi/password.png deleted file mode 100644 index 991d235f350..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/password.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/paste.png b/android/app/src/main/res/drawable-xxhdpi/paste.png deleted file mode 100644 index 848953fed57..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/paste.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/photo.png b/android/app/src/main/res/drawable-xxhdpi/photo.png deleted file mode 100644 index 063cfe63b35..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/photo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/price.png b/android/app/src/main/res/drawable-xxhdpi/price.png deleted file mode 100644 index a172120b51e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/price.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/print.png b/android/app/src/main/res/drawable-xxhdpi/print.png deleted file mode 100644 index 874c7babc3b..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/print.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/profile.png b/android/app/src/main/res/drawable-xxhdpi/profile.png deleted file mode 100644 index 30cb25caaa4..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/public_chat.png b/android/app/src/main/res/drawable-xxhdpi/public_chat.png deleted file mode 100644 index ac5992bb094..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/public_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/qr.png b/android/app/src/main/res/drawable-xxhdpi/qr.png deleted file mode 100644 index e6d2c60dfb0..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/qr.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/receive.png b/android/app/src/main/res/drawable-xxhdpi/receive.png deleted file mode 100644 index 5941d14322a..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/receive.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/recent.png b/android/app/src/main/res/drawable-xxhdpi/recent.png deleted file mode 100644 index 7cba13d226e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/recent.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/refresh.png b/android/app/src/main/res/drawable-xxhdpi/refresh.png deleted file mode 100644 index 357de8ea44f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/refresh.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/remove_contact.png b/android/app/src/main/res/drawable-xxhdpi/remove_contact.png deleted file mode 100644 index 3c443a80364..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/remove_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/reply.png b/android/app/src/main/res/drawable-xxhdpi/reply.png deleted file mode 100644 index 92160f01ab8..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/reply.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/rotate_camera.png b/android/app/src/main/res/drawable-xxhdpi/rotate_camera.png deleted file mode 100644 index c447bbedfd3..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/rotate_camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/search.png b/android/app/src/main/res/drawable-xxhdpi/search.png deleted file mode 100644 index 3d4cab02736..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/search.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/security.png b/android/app/src/main/res/drawable-xxhdpi/security.png deleted file mode 100644 index 7400a1d26d4..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/security.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/send.png b/android/app/src/main/res/drawable-xxhdpi/send.png deleted file mode 100644 index 50904ce0d35..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/send.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/settings.png b/android/app/src/main/res/drawable-xxhdpi/settings.png deleted file mode 100644 index 724a0510fa3..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/settings_advanced.png b/android/app/src/main/res/drawable-xxhdpi/settings_advanced.png deleted file mode 100644 index da52c596848..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/settings_advanced.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/share.png b/android/app/src/main/res/drawable-xxhdpi/share.png deleted file mode 100644 index e5372ebf594..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/share.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash_logo.png b/android/app/src/main/res/drawable-xxhdpi/splash_logo.png new file mode 100644 index 00000000000..b258ed1ace2 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splash_logo.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/stickers.png b/android/app/src/main/res/drawable-xxhdpi/stickers.png deleted file mode 100644 index 1c884ccee93..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/stickers.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/text.png b/android/app/src/main/res/drawable-xxhdpi/text.png deleted file mode 100644 index f6677cad0b1..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/text.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_clear.png b/android/app/src/main/res/drawable-xxhdpi/tiny_clear.png deleted file mode 100644 index 3f6d5abd62e..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_clear.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_edit.png b/android/app/src/main/res/drawable-xxhdpi/tiny_edit.png deleted file mode 100644 index d026b146213..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_group.png b/android/app/src/main/res/drawable-xxhdpi/tiny_group.png deleted file mode 100644 index 6d61e09dec2..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_new_contact.png b/android/app/src/main/res/drawable-xxhdpi/tiny_new_contact.png deleted file mode 100644 index 49acd9dc30a..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_new_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_pending.png b/android/app/src/main/res/drawable-xxhdpi/tiny_pending.png deleted file mode 100644 index e3a94d91a07..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_pending.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_public.png b/android/app/src/main/res/drawable-xxhdpi/tiny_public.png deleted file mode 100644 index 7d6b381ed8f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_public.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_settings.png b/android/app/src/main/res/drawable-xxhdpi/tiny_settings.png deleted file mode 100644 index f67c0074ee5..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tiny_tribute_to_talk.png b/android/app/src/main/res/drawable-xxhdpi/tiny_tribute_to_talk.png deleted file mode 100644 index fe27f8eb227..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tiny_tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/tooltip_triangle.png b/android/app/src/main/res/drawable-xxhdpi/tooltip_triangle.png deleted file mode 100644 index 02666d3c313..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/tooltip_triangle.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/two_arrows.png b/android/app/src/main/res/drawable-xxhdpi/two_arrows.png deleted file mode 100644 index a1cf08974ac..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/two_arrows.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/user_profile.png b/android/app/src/main/res/drawable-xxhdpi/user_profile.png deleted file mode 100644 index 36f5fea3da3..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/user_profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/user_profile_1.png b/android/app/src/main/res/drawable-xxhdpi/user_profile_1.png deleted file mode 100644 index c49caa5db88..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/user_profile_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/username.png b/android/app/src/main/res/drawable-xxhdpi/username.png deleted file mode 100644 index e8fb625c62f..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/username.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/wallet.png b/android/app/src/main/res/drawable-xxhdpi/wallet.png deleted file mode 100644 index ffccadcb347..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/wallet.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/warning.png b/android/app/src/main/res/drawable-xxhdpi/warning.png deleted file mode 100644 index ff826e99b39..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/warning.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/watch.png b/android/app/src/main/res/drawable-xxhdpi/watch.png deleted file mode 100644 index a4fe1baef81..00000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/watch.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/add.png b/android/app/src/main/res/drawable-xxxhdpi/add.png deleted file mode 100644 index 5b0bdbf7df3..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/add.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/add_contact.png b/android/app/src/main/res/drawable-xxxhdpi/add_contact.png deleted file mode 100644 index 95d2f682589..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/add_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/address.png b/android/app/src/main/res/drawable-xxxhdpi/address.png deleted file mode 100644 index dad551456d5..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/address.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/arrow_left.png b/android/app/src/main/res/drawable-xxxhdpi/arrow_left.png deleted file mode 100644 index a6bb9a8e7d4..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/arrow_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/arrow_right.png b/android/app/src/main/res/drawable-xxxhdpi/arrow_right.png deleted file mode 100644 index 727dfab807a..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/arrow_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/arrow_up.png b/android/app/src/main/res/drawable-xxxhdpi/arrow_up.png deleted file mode 100644 index 7f302a27acc..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/arrow_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/back.png b/android/app/src/main/res/drawable-xxxhdpi/back.png deleted file mode 100644 index 0e9c620fc05..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/back.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/backspace.png b/android/app/src/main/res/drawable-xxxhdpi/backspace.png deleted file mode 100644 index 93608447ebc..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/backspace.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/bell.png b/android/app/src/main/res/drawable-xxxhdpi/bell.png deleted file mode 100644 index d2e5fc41571..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/bell.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/browser.png b/android/app/src/main/res/drawable-xxxhdpi/browser.png deleted file mode 100644 index c32715a00e7..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/browser.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/camera.png b/android/app/src/main/res/drawable-xxxhdpi/camera.png deleted file mode 100644 index a325334d142..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/cancel.png b/android/app/src/main/res/drawable-xxxhdpi/cancel.png deleted file mode 100644 index 65c3972cc6d..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/cancel.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/change.png b/android/app/src/main/res/drawable-xxxhdpi/change.png deleted file mode 100644 index af87c8bdf42..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/change.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/check.png b/android/app/src/main/res/drawable-xxxhdpi/check.png deleted file mode 100644 index c64e9836257..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/close.png b/android/app/src/main/res/drawable-xxxhdpi/close.png deleted file mode 100644 index d40096944cf..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/close.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/commands.png b/android/app/src/main/res/drawable-xxxhdpi/commands.png deleted file mode 100644 index 0481e6d1e9f..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/commands.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/copy.png b/android/app/src/main/res/drawable-xxxhdpi/copy.png deleted file mode 100644 index 877285e0c5d..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/copy.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/corner_left_bottom.png b/android/app/src/main/res/drawable-xxxhdpi/corner_left_bottom.png deleted file mode 100644 index 79d8ff98d39..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/corner_left_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/corner_left_top.png b/android/app/src/main/res/drawable-xxxhdpi/corner_left_top.png deleted file mode 100644 index 8ccdd18d77b..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/corner_left_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/corner_right_bottom.png b/android/app/src/main/res/drawable-xxxhdpi/corner_right_bottom.png deleted file mode 100644 index 1fa347dffe8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/corner_right_bottom.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/corner_right_top.png b/android/app/src/main/res/drawable-xxxhdpi/corner_right_top.png deleted file mode 100644 index a26ebe0e614..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/corner_right_top.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/dapp.png b/android/app/src/main/res/drawable-xxxhdpi/dapp.png deleted file mode 100644 index b6463bf2fdd..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/dapp.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/delete.png b/android/app/src/main/res/drawable-xxxhdpi/delete.png deleted file mode 100644 index 9555edb7576..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/delete.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/desktop.png b/android/app/src/main/res/drawable-xxxhdpi/desktop.png deleted file mode 100644 index 7f39e545da9..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/desktop.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/download.png b/android/app/src/main/res/drawable-xxxhdpi/download.png deleted file mode 100644 index 43e953b5531..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/download.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/dropdown.png b/android/app/src/main/res/drawable-xxxhdpi/dropdown.png deleted file mode 100644 index 9a2d59c9543..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/dropdown.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/dropdown_up.png b/android/app/src/main/res/drawable-xxxhdpi/dropdown_up.png deleted file mode 100644 index 2a56a65804b..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/dropdown_up.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/edit.png b/android/app/src/main/res/drawable-xxxhdpi/edit.png deleted file mode 100644 index 96755788941..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/filter.png b/android/app/src/main/res/drawable-xxxhdpi/filter.png deleted file mode 100644 index 116c6938869..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/filter.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/fingerprint.png b/android/app/src/main/res/drawable-xxxhdpi/fingerprint.png deleted file mode 100644 index d27788ec135..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/fingerprint.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/flash.png b/android/app/src/main/res/drawable-xxxhdpi/flash.png deleted file mode 100644 index 00e626ee0e4..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/flash.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/flash_active.png b/android/app/src/main/res/drawable-xxxhdpi/flash_active.png deleted file mode 100644 index 5fb05efad8f..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/flash_active.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/group_chat.png b/android/app/src/main/res/drawable-xxxhdpi/group_chat.png deleted file mode 100644 index 6504fee03d8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/group_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/help.png b/android/app/src/main/res/drawable-xxxhdpi/help.png deleted file mode 100644 index deb10b12a80..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/help.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/history.png b/android/app/src/main/res/drawable-xxxhdpi/history.png deleted file mode 100644 index 9c3efea50c2..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/history.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/home.png b/android/app/src/main/res/drawable-xxxhdpi/home.png deleted file mode 100644 index 9486a57f913..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/home.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/home_1.png b/android/app/src/main/res/drawable-xxxhdpi/home_1.png deleted file mode 100644 index c2b792056bf..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/home_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_background.png b/android/app/src/main/res/drawable-xxxhdpi/ic_background.png index 3773b54175a..4aeb9a15ba1 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_background.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_background.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_foreground.png index 7f8ab76b4b9..ea5d96b73a6 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_foreground.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_stat_status_notification.png b/android/app/src/main/res/drawable-xxxhdpi/ic_stat_status_notification.png deleted file mode 100755 index c43ceadb5c9..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_stat_status_notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_avatar.png b/android/app/src/main/res/drawable-xxxhdpi/icon_avatar.png deleted file mode 100644 index a0ab8e66571..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_avatar.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_check_on.png b/android/app/src/main/res/drawable-xxxhdpi/icon_check_on.png deleted file mode 100644 index 780956a86bd..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_check_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_close_light_gray.png b/android/app/src/main/res/drawable-xxxhdpi/icon_close_light_gray.png deleted file mode 100644 index cc04ce0d256..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_close_light_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_forward_gray.png b/android/app/src/main/res/drawable-xxxhdpi/icon_forward_gray.png deleted file mode 100644 index 78bf7faa089..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_forward_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_lock_gray.png b/android/app/src/main/res/drawable-xxxhdpi/icon_lock_gray.png deleted file mode 100644 index 8b3739e6a8b..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_lock_gray.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_lock_white.png b/android/app/src/main/res/drawable-xxxhdpi/icon_lock_white.png deleted file mode 100644 index 41875c78c23..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_lock_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_menu_group.png b/android/app/src/main/res/drawable-xxxhdpi/icon_menu_group.png deleted file mode 100644 index 7c51fd4dd03..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_menu_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_money_white.png b/android/app/src/main/res/drawable-xxxhdpi/icon_money_white.png deleted file mode 100755 index 9fcfca74965..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_money_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_muted.png b/android/app/src/main/res/drawable-xxxhdpi/icon_muted.png deleted file mode 100644 index bb46070875c..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_muted.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_notifications_on.png b/android/app/src/main/res/drawable-xxxhdpi/icon_notifications_on.png deleted file mode 100644 index cc4a37280a9..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_notifications_on.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_phone_white.png b/android/app/src/main/res/drawable-xxxhdpi/icon_phone_white.png deleted file mode 100755 index eb66d11f8d8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/icon_phone_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/in_contacts.png b/android/app/src/main/res/drawable-xxxhdpi/in_contacts.png deleted file mode 100644 index 214e7fc45e9..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/in_contacts.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/info.png b/android/app/src/main/res/drawable-xxxhdpi/info.png deleted file mode 100644 index ea82dd087bb..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/info.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/keycard.png b/android/app/src/main/res/drawable-xxxhdpi/keycard.png deleted file mode 100644 index 3eb5cc01720..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/keycard.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/keycard_logo.png b/android/app/src/main/res/drawable-xxxhdpi/keycard_logo.png deleted file mode 100644 index 722f3568c18..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/keycard_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/language.png b/android/app/src/main/res/drawable-xxxhdpi/language.png deleted file mode 100644 index 991cb946849..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/language.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/launch_logo.png b/android/app/src/main/res/drawable-xxxhdpi/launch_logo.png deleted file mode 100644 index fd99c7f57e8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/launch_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/link.png b/android/app/src/main/res/drawable-xxxhdpi/link.png deleted file mode 100644 index 899f645c0c6..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/link.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/log_out.png b/android/app/src/main/res/drawable-xxxhdpi/log_out.png deleted file mode 100644 index 37a2b0c5a72..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/log_out.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/logo.png b/android/app/src/main/res/drawable-xxxhdpi/logo.png index 6a21c111d26..b756ca0b651 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/logo.png and b/android/app/src/main/res/drawable-xxxhdpi/logo.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/mailserver.png b/android/app/src/main/res/drawable-xxxhdpi/mailserver.png deleted file mode 100644 index cdb61ac3325..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/mailserver.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/make_admin.png b/android/app/src/main/res/drawable-xxxhdpi/make_admin.png deleted file mode 100644 index 1aa1922373d..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/make_admin.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/max.png b/android/app/src/main/res/drawable-xxxhdpi/max.png deleted file mode 100644 index 32694764576..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/max.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/message.png b/android/app/src/main/res/drawable-xxxhdpi/message.png deleted file mode 100644 index 26d4702bce0..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/message.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/mobile.png b/android/app/src/main/res/drawable-xxxhdpi/mobile.png deleted file mode 100644 index 0104bf6aa2a..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/mobile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/more.png b/android/app/src/main/res/drawable-xxxhdpi/more.png deleted file mode 100644 index 35796a236f6..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/more.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/network.png b/android/app/src/main/res/drawable-xxxhdpi/network.png deleted file mode 100644 index ef2fa6f4a67..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/network.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/next.png b/android/app/src/main/res/drawable-xxxhdpi/next.png deleted file mode 100644 index f5ec33e445e..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/next.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/notification.png b/android/app/src/main/res/drawable-xxxhdpi/notification.png deleted file mode 100644 index c042c87287e..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/notification.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png b/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png new file mode 100644 index 00000000000..f82b908d9c7 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/one_on_one_chat.png b/android/app/src/main/res/drawable-xxxhdpi/one_on_one_chat.png deleted file mode 100644 index 91655d9d066..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/one_on_one_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/password.png b/android/app/src/main/res/drawable-xxxhdpi/password.png deleted file mode 100644 index b9f99639a35..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/password.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/paste.png b/android/app/src/main/res/drawable-xxxhdpi/paste.png deleted file mode 100644 index 2b1631ca44c..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/paste.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/photo.png b/android/app/src/main/res/drawable-xxxhdpi/photo.png deleted file mode 100644 index bd65caf4739..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/photo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/profile.png b/android/app/src/main/res/drawable-xxxhdpi/profile.png deleted file mode 100644 index 77cee25a1f2..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/public_chat.png b/android/app/src/main/res/drawable-xxxhdpi/public_chat.png deleted file mode 100644 index 56d1f97f7df..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/public_chat.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/qr.png b/android/app/src/main/res/drawable-xxxhdpi/qr.png deleted file mode 100644 index 673c844f4e2..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/qr.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/receive.png b/android/app/src/main/res/drawable-xxxhdpi/receive.png deleted file mode 100644 index 0a5941d9208..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/receive.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/refresh.png b/android/app/src/main/res/drawable-xxxhdpi/refresh.png deleted file mode 100644 index 080d8a7ae22..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/refresh.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/remove_contact.png b/android/app/src/main/res/drawable-xxxhdpi/remove_contact.png deleted file mode 100644 index 341a3209990..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/remove_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/reply.png b/android/app/src/main/res/drawable-xxxhdpi/reply.png deleted file mode 100644 index ff4074e15b7..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/reply.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/rotate_camera.png b/android/app/src/main/res/drawable-xxxhdpi/rotate_camera.png deleted file mode 100644 index b0c2c629907..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/rotate_camera.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/search.png b/android/app/src/main/res/drawable-xxxhdpi/search.png deleted file mode 100644 index d6ab15f09f9..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/search.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/security.png b/android/app/src/main/res/drawable-xxxhdpi/security.png deleted file mode 100644 index 8774fc1c3f7..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/security.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/send.png b/android/app/src/main/res/drawable-xxxhdpi/send.png deleted file mode 100644 index 6a4d339dad3..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/send.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/settings.png b/android/app/src/main/res/drawable-xxxhdpi/settings.png deleted file mode 100644 index 45e61e43ea5..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/settings_advanced.png b/android/app/src/main/res/drawable-xxxhdpi/settings_advanced.png deleted file mode 100644 index 810518557ae..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/settings_advanced.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/share.png b/android/app/src/main/res/drawable-xxxhdpi/share.png deleted file mode 100644 index 9e05ff9b400..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/share.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash_logo.png b/android/app/src/main/res/drawable-xxxhdpi/splash_logo.png new file mode 100644 index 00000000000..5d39707224e Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splash_logo.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/stickers.png b/android/app/src/main/res/drawable-xxxhdpi/stickers.png deleted file mode 100644 index 159370de240..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/stickers.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/text.png b/android/app/src/main/res/drawable-xxxhdpi/text.png deleted file mode 100644 index 1ed1c0db0d8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/text.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_arrow_down.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_arrow_down.png deleted file mode 100644 index 0e52f7411b8..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_arrow_down.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_check.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_check.png deleted file mode 100644 index 979f416ed15..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_check.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_clear.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_clear.png deleted file mode 100644 index 8968b1ab0c1..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_clear.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_edit.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_edit.png deleted file mode 100644 index dbd63804db0..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_edit.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_external.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_external.png deleted file mode 100644 index f020f8ca9ac..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_external.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_group.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_group.png deleted file mode 100644 index f61f0b0e4ae..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_group.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_lock.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_lock.png deleted file mode 100644 index 997929a18c3..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_lock.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_lock_broken.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_lock_broken.png deleted file mode 100644 index eb78d7b1ef1..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_lock_broken.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_new_contact.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_new_contact.png deleted file mode 100644 index e47041232a4..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_new_contact.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_pending.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_pending.png deleted file mode 100644 index ad58e58234b..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_pending.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_public.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_public.png deleted file mode 100644 index c870e74646e..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_public.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_settings.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_settings.png deleted file mode 100644 index 072d7c6bf17..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_settings.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tiny_tribute_to_talk.png b/android/app/src/main/res/drawable-xxxhdpi/tiny_tribute_to_talk.png deleted file mode 100644 index 17b9c465c88..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tiny_tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/token.png b/android/app/src/main/res/drawable-xxxhdpi/token.png deleted file mode 100644 index d4068c24fba..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/token.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/tribute_to_talk.png b/android/app/src/main/res/drawable-xxxhdpi/tribute_to_talk.png deleted file mode 100644 index 53d12ae8724..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/tribute_to_talk.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/two_arrows.png b/android/app/src/main/res/drawable-xxxhdpi/two_arrows.png deleted file mode 100644 index 6ab7a0164a5..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/two_arrows.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/user_profile.png b/android/app/src/main/res/drawable-xxxhdpi/user_profile.png deleted file mode 100644 index b7e5924258d..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/user_profile.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/user_profile_1.png b/android/app/src/main/res/drawable-xxxhdpi/user_profile_1.png deleted file mode 100644 index b7e5924258d..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/user_profile_1.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/username.png b/android/app/src/main/res/drawable-xxxhdpi/username.png deleted file mode 100644 index f57270182b4..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/username.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/wallet.png b/android/app/src/main/res/drawable-xxxhdpi/wallet.png deleted file mode 100644 index 6f7f730bd80..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/wallet.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/warning.png b/android/app/src/main/res/drawable-xxxhdpi/warning.png deleted file mode 100644 index 1ceb9572a3c..00000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/warning.png and /dev/null differ diff --git a/android/app/src/main/res/ic_launcher-web.png b/android/app/src/main/res/ic_launcher-web.png index ea08459f160..52c3837fe46 100644 Binary files a/android/app/src/main/res/ic_launcher-web.png and b/android/app/src/main/res/ic_launcher-web.png differ diff --git a/android/app/src/main/res/layout/launch_screen.xml b/android/app/src/main/res/layout/launch_screen.xml index 6bbb51c5148..2f37c5fe4fe 100644 --- a/android/app/src/main/res/layout/launch_screen.xml +++ b/android/app/src/main/res/layout/launch_screen.xml @@ -1,16 +1,21 @@ + android:background="?attr/backgroundColor"> - - - \ No newline at end of file + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index d00e59e4138..f31858d7719 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index d00e59e4138..f31858d7719 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_background.png b/android/app/src/main/res/mipmap-hdpi/ic_background.png index 8397ebdbb92..cbf5ce6fee2 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_background.png and b/android/app/src/main/res/mipmap-hdpi/ic_background.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_foreground.png index 20e392fbd6e..d36823d2707 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 2117b499805..9d27512c3cd 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000000..09acba2aaf9 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 9ce7c259ce4..39f58863538 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png index cb7ae284fe1..4b1d945bae1 100644 Binary files a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png and b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png new file mode 100644 index 00000000000..a1191f67944 Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_background.png b/android/app/src/main/res/mipmap-mdpi/ic_background.png index c89e6752f46..b0221607704 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_background.png and b/android/app/src/main/res/mipmap-mdpi/ic_background.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_foreground.png index 7d9e9542efe..61fff9f2344 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 1ffe19a5d74..1e4d9017606 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000000..c9142881511 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 98414c5ad0d..e39eada7bc9 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_background.png b/android/app/src/main/res/mipmap-xhdpi/ic_background.png index 396c76004d4..791a2fe2795 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_background.png and b/android/app/src/main/res/mipmap-xhdpi/ic_background.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_foreground.png index 3f7e1182383..d2fcaed1a78 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 093b474db8a..c4b071d30d7 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000000..6ccb6c747ff Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index e3afdce2798..9faa82c14fe 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_background.png b/android/app/src/main/res/mipmap-xxhdpi/ic_background.png index 69bd84b60d5..f664414df47 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_background.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_background.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png index f705c3c0015..649230679ff 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 346f017c3f5..b5bf2cc1406 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000000..340b47dbbb3 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index e6309a3f88d..8e5765dcd61 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png index 9381023db5c..7af6e2cf4d5 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_background.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png index 83ae4d0e7bc..ca890da1d60 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 75b75ea8aed..9d195a9116e 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000000..ad43de25986 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 103dcd72a9a..8a883d4f277 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/raw/launching_animation.json b/android/app/src/main/res/raw/launching_animation.json new file mode 100644 index 00000000000..d45da7f722e --- /dev/null +++ b/android/app/src/main/res/raw/launching_animation.json @@ -0,0 +1 @@ +{"v":"5.7.8","fr":60,"ip":0,"op":91,"w":128,"h":128,"nm":"!!LOGO_lottie","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Merged Shape Layer 6","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[3.789]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[-192.857]},{"i":{"x":[0.833],"y":[0.762]},"o":{"x":[0.167],"y":[0.167]},"t":6.545,"s":[-193.857]},{"i":{"x":[0.833],"y":[0.691]},"o":{"x":[0.167],"y":[0.155]},"t":7.363,"s":[-191.765]},{"i":{"x":[0.833],"y":[0.797]},"o":{"x":[0.167],"y":[0.122]},"t":10.637,"s":[-178.897]},{"i":{"x":[0.833],"y":[0.855]},"o":{"x":[0.167],"y":[0.153]},"t":14.727,"s":[-138.079]},{"i":{"x":[0.833],"y":[0.814]},"o":{"x":[0.167],"y":[0.224]},"t":22.908,"s":[-29.589]},{"i":{"x":[0.833],"y":[0.801]},"o":{"x":[0.167],"y":[0.162]},"t":27.818,"s":[12.5]},{"i":{"x":[0.833],"y":[0.873]},"o":{"x":[0.167],"y":[0.107]},"t":45,"s":[181.996]},{"i":{"x":[0.833],"y":[0.923]},"o":{"x":[0.167],"y":[0.227]},"t":49.908,"s":[272.04]},{"i":{"x":[0.833],"y":[0.94]},"o":{"x":[0.167],"y":[0.514]},"t":55.637,"s":[330.762]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-2.596]},"t":65.455,"s":[345.875]},{"t":81.818359375,"s":[345.292]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.791,"y":0.712},"o":{"x":0.652,"y":0.344},"t":8.182,"s":[-57.414,88.804,0],"to":[-266.586,66.696,0],"ti":[-471.296,0.211,0]},{"i":{"x":0.672,"y":0.664},"o":{"x":0.291,"y":0.351},"t":26.613,"s":[44.704,-314.789,0],"to":[74.296,1.789,0],"ti":[-24.095,-183.222,0]},{"i":{"x":0.414,"y":0.331},"o":{"x":0.136,"y":0.106},"t":34.889,"s":[318.5,-68,0],"to":[29.675,225.652,0],"ti":[174.57,-11.464,0]},{"i":{"x":0.288,"y":1},"o":{"x":0.288,"y":1},"t":44.047,"s":[-7.935,330.275,0],"to":[-375.415,-24.719,0],"ti":[-390,21,0]},{"t":81.818359375,"s":[53.652,-82.594,0]}],"ix":2,"l":2},"a":{"a":0,"k":[560,410.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.623,0.623,0.833],"y":[0.806,0.806,1.942]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8.182,"s":[100,100,100]},{"i":{"x":[0.615,0.615,0.833],"y":[-9.004,-9.004,-0.939]},"o":{"x":[0.32,0.32,0.167],"y":[-6.872,-6.872,-1.07]},"t":23.283,"s":[63.265,63.265,100]},{"i":{"x":[0.532,0.532,0.667],"y":[1,1,1]},"o":{"x":[0.407,0.407,0.167],"y":[0.429,0.429,3.289]},"t":40.443,"s":[63.265,63.265,100]},{"t":69.544921875,"s":[105,105,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8.182,"s":[{"i":[[29.256,-1.636],[12.654,-5.359],[8.617,-28.501],[-28.968,-8.636],[-24.783,-3.988],[-20.286,7.565],[3.491,32.586],[22.957,14.401]],"o":[[-19.802,1.107],[-62.447,26.447],[28.952,1.188],[19.806,5.905],[23.203,3.734],[32.599,-12.156],[-2.92,-27.253],[-17.795,-11.163]],"v":[[552.771,323.203],[505.624,334.015],[404.252,446.909],[473.294,460.187],[557.264,486.313],[622.075,480.875],[668.525,402.251],[624.928,339.765]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.637,"s":[{"i":[[35.646,-6.61],[29.714,-25.56],[-5.458,-8.042],[-24.339,-5.662],[-31.956,-1.833],[-22.776,10.595],[3.231,33.642],[29.445,12.037]],"o":[[-29.737,6.28],[-33.566,28.873],[5.468,8.056],[24.339,5.662],[31.956,1.833],[30.472,-13.464],[-4.304,-33.253],[-24.528,-9.336]],"v":[[515.251,324.945],[432.694,362.132],[374.686,460.302],[435.7,469.78],[534.564,489.883],[624.004,480.477],[668.476,402.398],[607.104,332.181]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.727,"s":[{"i":[[46.296,-14.902],[24.146,-47.639],[-14.286,-9.646],[-32.343,13.44],[-30.439,13.873],[-26.928,15.644],[2.798,35.403],[40.258,8.096]],"o":[[-46.296,14.902],[-32.901,64.912],[7.844,5.296],[32.343,-13.44],[41.324,-15.99],[26.928,-15.644],[-6.611,-43.252],[-35.748,-6.292]],"v":[[452.248,330.653],[340.333,427.05],[331.295,569.328],[388.653,559.038],[494.121,516.795],[621.12,482.157],[663.333,400.633],[576.423,320.768]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[46.329,-30.799],[9.206,-101.382],[-26.527,-8.11],[-23.981,21.663],[-27.026,18.669],[-27.972,10.72],[0.825,47.829],[49.937,10.873]],"o":[[-46.329,30.799],[-6.708,73.874],[23.569,6.669],[25.302,-22.856],[25.053,-17.306],[29.125,-11.006],[-2.651,-57.164],[-45.744,-9.256]],"v":[[379.868,359.18],[255.626,543.131],[308.895,689.081],[385.909,642.222],[491.706,538.051],[592.014,497.121],[656.681,411.345],[564.93,316.12]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.455,"s":[{"i":[[64.565,-52.319],[10.188,-103.027],[-34.457,-9.254],[-24.784,40.268],[-45.418,34.675],[-26.649,9.512],[2.702,63.401],[53.773,2.903]],"o":[[-51.36,40.959],[-9.005,86.228],[32.953,8.587],[25.24,-40.488],[36.098,-27.559],[28.678,-10.033],[-3.84,-69.666],[-53.609,-2.058]],"v":[[318.842,389.727],[195.107,601.075],[271.374,775.287],[373.46,679.376],[465.38,554.672],[571.854,508.306],[654.682,407.541],[535.788,310.26]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.092,"s":[{"i":[[79.222,-63.486],[15.85,-103.554],[-39.269,-11.688],[-27.26,51.436],[-59.282,43.184],[-26.212,7.402],[0.865,73.868],[56.15,0.205]],"o":[[-56.671,45.204],[-14.727,93.965],[38.768,11.464],[27.152,-50.985],[44.777,-32.618],[28.849,-7.981],[-1.239,-78.137],[-58.715,0.133]],"v":[[278.98,398.976],[145.383,622.417],[219.236,827.081],[321.65,722.651],[438.056,558.321],[546.812,508.94],[653.065,410.221],[527.368,313.788]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.908,"s":[{"i":[[88.24,-66.875],[21.23,-103.3],[-41.334,-13.936],[-29.916,56.289],[-67.396,45.724],[-26.133,5.706],[-2.025,79.062],[57.349,0.274]],"o":[[-60.475,45.833],[-20.006,97.346],[41.334,13.936],[29.504,-55.514],[49.972,-33.903],[29.088,-6.239],[2.109,-82.33],[-61.277,-0.292]],"v":[[261.383,400.535],[115.172,622.607],[185.068,841.779],[296.59,729.919],[419.424,554.344],[533.802,511.454],[652.175,414.378],[525.102,315.747]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[79.206,-55.07],[34.985,-104.299],[-42.561,-16.337],[-35.547,56.801],[-74.269,39.628],[-26.803,6.098],[-2.508,70.574],[53.383,2.857]],"o":[[-71.711,40.918],[-33.75,99.227],[42.561,16.337],[44.194,-81.881],[51.209,-28.805],[29.168,-6.524],[2.444,-72.114],[-61.034,-4.458]],"v":[[259.091,379.56],[62.788,598.549],[117.611,837.642],[244.281,713.451],[395.457,545.595],[544.293,507.648],[652.581,414.871],[538.559,317.657]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[88.573,-35.243],[54.717,-109.178],[-44.347,-19.446],[-41.907,58.686],[-84.031,29.734],[-27.837,6.159],[-4.542,61.804],[47.75,7.066]],"o":[[-87.545,32.48],[-52.212,102.123],[44.346,19.446],[63.83,-104.145],[53.421,-18.892],[29.386,-6.448],[3.563,-57.999],[-60.415,-11.137]],"v":[[284.722,355.414],[25.649,572.493],[47.058,813.868],[189.834,694.714],[402.92,527.491],[557.36,502.833],[653.024,417.228],[562.218,320.949]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.182,"s":[{"i":[[52.752,-17.839],[78.034,-114.944],[-46.456,-23.119],[-49.422,60.915],[-95.568,18.043],[-29.058,6.232],[-6.946,51.442],[41.094,12.038]],"o":[[-106.257,22.509],[-74.028,105.546],[46.456,23.119],[63.258,-77.968],[55.352,-11.602],[29.644,-6.358],[4.885,-41.321],[-59.684,-19.031]],"v":[[343.855,339.288],[0.542,548.387],[-20.386,790.87],[141.422,677.669],[416.79,520.423],[572.801,497.145],[653.549,420.013],[584.566,330.441]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[43.07,-7.849],[90.005,-108.293],[-47.472,-25.94],[-58.072,58.848],[-101.759,15.243],[-29.485,7.665],[-4.439,36.618],[37.52,13.193]],"o":[[-116.65,21.257],[-88.725,106.752],[47.472,25.94],[55.225,-55.962],[56.154,-8.412],[29.485,-7.665],[3.788,-31.249],[-60.064,-21.119]],"v":[[386.723,335.167],[7.232,529.027],[-44.498,775.809],[130.381,668.23],[427.379,517.498],[586.257,492.426],[654.202,416.845],[592.878,332.108]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[44.276,-9.501],[92.678,-97.204],[-43.839,-29.268],[-63.11,53.812],[-96.226,16.884],[-30.135,8.192],[-3.931,36.439],[39.485,12.843]],"o":[[-113.609,22.765],[-90.624,94.765],[43.702,29.176],[59.471,-50.709],[57.153,-11.132],[30.135,-8.192],[3.354,-31.081],[-60.976,-20.193]],"v":[[379.087,333.684],[21.384,525.463],[-45.868,757.813],[132.646,666.302],[426.199,511.645],[586.778,490.796],[654.789,415.852],[590.825,332.473]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34.363,"s":[{"i":[[51.95,-20.013],[47.111,-81.464],[-37.667,-22.586],[-60.422,59.227],[-61.018,27.321],[-34.269,11.551],[-0.7,35.297],[51.989,10.621]],"o":[[-94.257,32.363],[-41.697,72.103],[36.628,21.963],[53.557,-52.765],[63.512,-28.438],[34.269,-11.551],[0.595,-30.014],[-66.778,-14.296]],"v":[[345.105,371.328],[91.668,574.153],[71.198,750.239],[211.554,652.871],[394.335,520.673],[590.09,480.427],[658.524,409.528],[577.761,334.795]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[60.597,-17.144],[55.738,-88.07],[-35.721,-21.835],[-52.845,48.263],[-52.868,16.415],[-40.067,1.439],[-7.978,34.246],[60.029,22.238]],"o":[[-79.624,19.63],[-59.491,90.469],[31.596,14.564],[59.618,-57.163],[53.386,-16.576],[43.14,-1.659],[7.69,-33.012],[-63.674,-23.588]],"v":[[375.49,339.43],[98.306,541.725],[47.861,762.978],[201.734,605.95],[401.05,491.915],[577.877,488.873],[660.255,431.731],[585.708,338.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45.818,"s":[{"i":[[59.539,-20.244],[47.714,-88.677],[-35.756,-18.463],[-47.228,49.234],[-57.954,15.189],[-40.35,2.243],[-7.563,34.736],[60.472,20.586]],"o":[[-104.048,33.408],[-52.426,93.275],[31.389,12.094],[52.583,-56.964],[52.241,-19.065],[43.423,-2.311],[7.257,-33.199],[-68.206,-22.475]],"v":[[373.478,351.274],[112.92,565.233],[83.609,785.614],[222.477,620.276],[408.233,501.25],[578.764,490.053],[661.094,430.613],[583.469,337.255]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46.637,"s":[{"i":[[57.712,-25.504],[36.433,-90.98],[-36.447,-13.777],[-39.793,51.902],[-62.468,19.926],[-40.634,3.047],[-7.148,35.225],[60.914,18.933]],"o":[[-94.357,38.947],[-41.933,97.946],[31.607,8.473],[43.446,-58.655],[52.271,-21.234],[43.705,-2.964],[6.824,-33.386],[-72.737,-21.362]],"v":[[369.092,363.635],[139.739,595.719],[129.151,823.514],[250.732,640.492],[419.312,512],[579.65,491.233],[661.932,429.495],[581.231,336.135]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47.455,"s":[{"i":[[55.886,-30.764],[25.152,-93.284],[-37.137,-9.091],[-32.357,54.571],[-54.109,23.906],[-40.917,3.851],[-6.733,35.714],[61.356,17.281]],"o":[[-84.667,44.486],[-31.441,102.617],[31.825,4.853],[34.308,-60.345],[49.456,-26.726],[43.987,-3.616],[6.391,-33.574],[-77.269,-20.249]],"v":[[364.707,375.996],[166.557,626.204],[179.604,848.983],[278.987,660.708],[431.33,522.675],[580.537,492.412],[662.77,428.377],[578.992,335.014]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48.273,"s":[{"i":[[54.06,-36.024],[13.871,-95.586],[-37.828,-4.406],[-24.921,57.239],[-45.75,27.885],[-41.201,4.654],[-6.318,36.204],[61.799,15.629]],"o":[[-74.977,50.025],[-20.948,107.289],[32.043,1.232],[25.17,-62.036],[46.641,-32.218],[44.269,-4.268],[5.958,-33.761],[-81.8,-19.136]],"v":[[360.321,388.358],[193.375,656.689],[235.527,864.013],[307.241,680.924],[439.013,526.779],[581.423,493.592],[663.609,427.259],[576.753,333.894]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49.092,"s":[{"i":[[54.229,-36.905],[5.57,-101.387],[-36.641,-0.768],[-18.517,56.284],[-43.774,26.557],[-41.347,4.599],[-6.649,36.331],[63.855,15.952]],"o":[[-72.741,49.715],[-9.702,103.79],[30.91,-1.363],[17.66,-59.396],[43.888,-30.122],[44.357,-3.993],[6.15,-33.603],[-80.543,-18.707]],"v":[[362.232,386.897],[219.032,657.044],[282.368,849.948],[335.912,674.032],[446.191,523.631],[581.228,494.34],[664.433,427.968],[577.151,334.124]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49.908,"s":[{"i":[[55.851,-35.639],[1.081,-106.649],[-35.286,1.356],[-14.408,54.346],[-42.927,23.411],[-41.691,2.902],[-8.386,36.225],[65.306,18.743]],"o":[[-72.524,46.428],[-2.751,99.475],[29.734,-2.677],[12.638,-55.763],[42.437,-26.174],[44.627,-1.954],[7.69,-33.217],[-78.547,-21.547]],"v":[[366.116,380.681],[232.937,642.825],[309.173,823.03],[351.888,657.114],[446.876,515.689],[575.915,495.971],[662.811,432.816],[578.799,335.002]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50.727,"s":[{"i":[[60.314,-29.713],[5.377,-111.641],[-33.983,0.571],[-14.751,51.127],[-43.936,16.689],[-42.203,-2.234],[-13.085,35.369],[65.102,26.881]],"o":[[-76.009,37.087],[-3.991,94.765],[28.729,-1.537],[12.189,-50.993],[43.07,-18.685],[44.984,3.765],[11.954,-32.141],[-74.643,-30.821]],"v":[[376.485,357.42],[231.958,600.145],[306.12,773.627],[351.602,621.51],[442.789,497.128],[567.236,497.647],[662.876,444.974],[590.334,336.436]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51.545,"s":[{"i":[[58.454,-25.382],[12.681,-98.321],[-31.559,-2.887],[-18.537,44.967],[-43.332,12.958],[-41.167,-3.588],[-14.185,34.151],[58.033,30.328]],"o":[[-69.015,30.489],[-12.424,86.472],[26.845,1.924],[15.157,-43.44],[43.664,-17.851],[43.766,5.393],[12.87,-30.749],[-63.143,-32.099]],"v":[[384.844,342.58],[232.615,547.383],[290,720.149],[345.565,591.838],[431.399,489.858],[566.257,498.124],[662.432,448.126],[599.974,337.45]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52.363,"s":[{"i":[[60.624,-26.033],[15.363,-79.978],[-27.604,-4.648],[-19.302,37.316],[-42.727,9.226],[-40.356,-0.588],[-11.64,34.294],[53.659,27.394]],"o":[[-83.841,33.567],[-16.149,74.105],[23.706,3.945],[15.658,-34.2],[41.582,-11.502],[42.942,2.391],[10.487,-30.583],[-54.449,-26.153]],"v":[[384.655,338.807],[231.988,523.839],[277.919,673.482],[335.725,573.116],[426.23,485.259],[573.209,496.029],[662.821,442.929],[599.313,337.255]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53.182,"s":[{"i":[[60.048,-18.04],[30.218,-72.336],[-23.744,-10.961],[-26.815,27.74],[-59.275,9.159],[-41.895,-4.369],[-10.342,34.691],[48.819,25.855]],"o":[[-55.027,17.293],[-26.75,64.032],[20.738,9.824],[22.695,-23.478],[54.694,-8.451],[42.8,0.661],[9.135,-30.641],[-45.428,-20.735]],"v":[[400.303,331.387],[248.699,467.457],[260.73,611.694],[340.25,545.13],[442.156,481.453],[576.562,497.201],[665.233,438.89],[603.252,335.098]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[{"i":[[56.897,-17.397],[38.265,-58.304],[-18.542,-13.031],[-28.19,18.585],[-56.997,10.729],[-39.901,-2.575],[-9.289,34.498],[47.944,23.807]],"o":[[-52.871,17.484],[-34.393,52.086],[16.577,12.127],[23.802,-15.741],[50.309,-5.992],[41.897,-0.884],[8.223,-30.629],[-44.847,-19.267]],"v":[[413.774,330.395],[284.179,421.614],[274.821,546.65],[356.095,516.769],[450.839,480.228],[580.534,495.137],[667.25,435.326],[606.323,335.728]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54.818,"s":[{"i":[[54.245,-16.24],[32.598,-43.781],[-13.881,-13.328],[-27.245,10.844],[-52.193,8.882],[-38.212,-1.181],[-8.763,34.48],[51.03,23.553]],"o":[[-51.284,17.177],[-34.856,42.266],[12.833,12.969],[22.946,-9.211],[46.029,-3.066],[41.384,-1.933],[7.793,-30.777],[-48.137,-21.126]],"v":[[428.16,331.264],[318.256,403.889],[293.813,516.44],[369.963,507.474],[462.486,480.365],[584.382,494.182],[667.934,433.567],[608.325,336.102]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58.092,"s":[{"i":[[43.639,-11.614],[19.055,-21.071],[-3.889,-4.135],[-14.525,-1.576],[-29.412,-8.791],[-31.456,4.392],[-6.661,34.408],[44.084,17.289]],"o":[[-44.939,15.949],[-19.81,21.906],[6.308,6.708],[11.937,1.295],[28.909,8.641],[39.333,-6.127],[6.072,-31.368],[-42.526,-15.47]],"v":[[485.056,328.469],[396.287,387.701],[369.078,452.515],[403.714,458.848],[495.883,475.935],[599.772,490.363],[670.673,426.531],[607.6,332.794]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60.545,"s":[{"i":[[28.22,0.324],[12.906,-4.721],[9.327,-29.791],[-28.742,-9.153],[-24.553,-5.22],[-20.638,6.542],[2.522,32.675],[22.21,15.529]],"o":[[-19.831,-0.228],[-63.69,23.297],[28.857,2.631],[19.693,6.271],[22.988,4.887],[33.165,-10.514],[-1.99,-25.781],[-17.216,-12.037]],"v":[[557.533,321.811],[498.304,333.119],[393.386,442.624],[471.037,459.143],[553.818,485.938],[618.82,483.742],[668.474,407.752],[628.809,344.92]],"c":true}]},{"t":65.455078125,"s":[{"i":[[29.256,-1.636],[12.654,-5.359],[8.617,-28.501],[-28.968,-8.636],[-24.783,-3.988],[-20.286,7.565],[3.491,32.586],[22.957,14.401]],"o":[[-19.802,1.107],[-62.447,26.447],[28.952,1.188],[19.806,5.905],[23.203,3.734],[32.599,-12.156],[-2.92,-27.253],[-17.795,-11.163]],"v":[[552.771,323.203],[505.624,334.015],[404.252,446.909],[473.294,460.187],[557.264,486.313],[622.075,480.875],[668.525,402.251],[624.928,339.765]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250979988248,0.721568986481,0.588234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":-11,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"new_drop1","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.689]},"o":{"x":[0.167],"y":[0.167]},"t":6.545,"s":[-14.347]},{"i":{"x":[0.833],"y":[0.789]},"o":{"x":[0.167],"y":[0.114]},"t":10.637,"s":[0.326]},{"i":{"x":[0.833],"y":[0.87]},"o":{"x":[0.167],"y":[0.151]},"t":14.727,"s":[40.484]},{"i":{"x":[0.833],"y":[0.806]},"o":{"x":[0.167],"y":[0.186]},"t":22.908,"s":[153.117]},{"i":{"x":[0.833],"y":[0.873]},"o":{"x":[0.167],"y":[0.102]},"t":45,"s":[366.201]},{"i":{"x":[0.833],"y":[0.924]},"o":{"x":[0.167],"y":[0.228]},"t":49.908,"s":[456.075]},{"i":{"x":[0.833],"y":[0.945]},"o":{"x":[0.167],"y":[0.561]},"t":55.637,"s":[514.342]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[-1.414]},"t":65.455,"s":[527.802]},{"t":83.455078125,"s":[526.848]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.791,"y":0.711},"o":{"x":0.652,"y":0.346},"t":8.182,"s":[53.414,-82.804,0],"to":[266.586,-66.696,0],"ti":[471.296,-0.211,0]},{"i":{"x":0.672,"y":0.664},"o":{"x":0.291,"y":0.35},"t":26.613,"s":[-44.704,314.789,0],"to":[-74.296,-1.789,0],"ti":[24.095,183.222,0]},{"i":{"x":0.414,"y":0.331},"o":{"x":0.136,"y":0.106},"t":34.889,"s":[-318.5,68,0],"to":[-29.675,-225.652,0],"ti":[-174.57,11.464,0]},{"i":{"x":0.288,"y":1},"o":{"x":0.29,"y":1},"t":44.047,"s":[7.935,-330.275,0],"to":[375.415,24.719,0],"ti":[390,-21,0]},{"t":81.818359375,"s":[-57.824,89.667,0]}],"ix":2,"l":2},"a":{"a":0,"k":[560,410.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.623,0.623,0.833],"y":[0.793,0.793,1.942]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8.182,"s":[105,105,100]},{"i":{"x":[0.615,0.615,0.833],"y":[-9.004,-9.004,-0.939]},"o":{"x":[0.32,0.32,0.167],"y":[-6.872,-6.872,-1.07]},"t":23.283,"s":[70.547,70.547,100]},{"i":{"x":[0.532,0.532,0.667],"y":[1,1,1]},"o":{"x":[0.407,0.407,0.167],"y":[0.591,0.591,3.196]},"t":40.443,"s":[70.547,70.547,100]},{"t":68.7265625,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8.182,"s":[{"i":[[29.256,-1.636],[12.654,-5.359],[8.617,-28.501],[-28.968,-8.636],[-24.783,-3.988],[-20.286,7.565],[3.491,32.586],[22.957,14.401]],"o":[[-19.802,1.107],[-62.447,26.447],[28.952,1.188],[19.806,5.905],[23.203,3.734],[32.599,-12.156],[-2.92,-27.253],[-17.795,-11.163]],"v":[[552.771,323.203],[505.624,334.015],[404.252,446.909],[473.294,460.187],[557.264,486.313],[622.075,480.875],[668.525,402.251],[624.928,339.765]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.637,"s":[{"i":[[35.646,-6.61],[29.714,-25.56],[-5.458,-8.042],[-24.339,-5.662],[-31.956,-1.833],[-22.776,10.595],[3.231,33.642],[29.445,12.037]],"o":[[-29.737,6.28],[-33.566,28.873],[5.468,8.056],[24.339,5.662],[31.956,1.833],[30.472,-13.464],[-4.304,-33.253],[-24.528,-9.336]],"v":[[515.251,324.945],[435.35,364.682],[379.454,457.143],[436.661,468.177],[538.465,491.522],[618.412,480.135],[662.46,401.018],[603.745,333.35]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.727,"s":[{"i":[[46.296,-14.902],[25.654,-41.975],[-12.411,-9.901],[-30.679,9.975],[-36.109,12.657],[-26.928,15.644],[2.798,35.403],[40.258,8.096]],"o":[[-46.296,14.902],[-34.955,57.193],[6.815,5.436],[30.679,-9.975],[41.324,-15.99],[26.928,-15.644],[-6.611,-43.252],[-35.748,-6.292]],"v":[[452.248,330.653],[349.544,418.17],[334.02,549.151],[385.979,543.95],[494.712,516.604],[609.938,480.878],[652.352,398.963],[565.911,321.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[46.299,-16.229],[25.223,-44.785],[-14.312,-8.764],[-29.132,13.264],[-35.087,17.189],[-26.668,15.692],[3.512,36.17],[41.001,7.348]],"o":[[-46.299,16.23],[-33.63,58.297],[8.585,5.04],[29.364,-13.44],[47.516,-22.057],[26.753,-15.736],[-7.266,-43.807],[-36.51,-5.645]],"v":[[446.17,335.328],[343.935,425.06],[336.74,568.517],[390.433,555.664],[494.669,518.468],[615.02,483.177],[658.058,401.022],[569.847,323.672]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[46.309,-21.086],[23.647,-55.061],[-29.449,-15.295],[-26.095,17.291],[-25.89,21.87],[-25.717,15.868],[6.123,38.977],[43.717,4.612]],"o":[[-46.309,21.086],[-28.781,62.334],[13.711,5.156],[27.142,-18.146],[56.674,-32.922],[26.112,-16.071],[-9.659,-45.837],[-39.296,-3.281]],"v":[[427.552,344.658],[320.257,451.253],[335.779,615.638],[396.852,587.851],[494.511,525.284],[614.116,480.305],[653.219,395.451],[554.114,323.076]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[50.874,-30.153],[20.495,-75.614],[-27.143,-14.724],[-23.602,18.606],[-16.627,16.893],[-31.675,11.482],[11.345,44.591],[55.689,-3.223]],"o":[[-47.858,28.366],[-19.084,70.409],[25.466,10.945],[27.119,-21.379],[29.344,-29.813],[29.775,-15.339],[-14.445,-49.896],[-41.559,5.601]],"v":[[392.332,367.062],[286.273,507.681],[328.632,672.3],[405.833,628.449],[494.195,538.917],[595.274,490.855],[646.745,388.536],[522.648,321.886]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[47.876,-39.067],[-1.493,-87.716],[-33.186,-6.385],[-20.836,38.763],[-32.797,26.281],[-22.697,14.619],[14.746,51.862],[55.358,-4.207]],"o":[[-47.876,39.067],[1.506,88.468],[31.64,5.908],[26.52,-39.942],[41.687,-43.224],[24.486,-15.507],[-16.763,-55.537],[-51.359,4.227]],"v":[[340.188,395.388],[225.533,612.286],[306.086,765.697],[392.682,674.77],[469.386,553.989],[593.181,490.089],[642.817,387.036],[511.322,321.364]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[51.265,-39.755],[0.551,-90.546],[-35.981,-6.35],[-20.3,47.041],[-41.532,29.872],[-23.105,12.196],[12.781,56.402],[58.621,-1.996]],"o":[[-51.265,39.755],[0.113,88.161],[35.176,6.272],[22.773,-47.833],[45.977,-38.344],[25.338,-13.139],[-13.994,-59.394],[-54.774,2.012]],"v":[[321.939,399.283],[196.493,623.914],[282.356,788.609],[369.309,686.696],[459.573,545.854],[579.65,494.411],[643.311,393.539],[509.611,324.553]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[54.655,-40.444],[21.671,-95.144],[-37.963,-13.705],[-28.782,51.483],[-50.267,33.464],[-23.513,9.772],[10.816,60.942],[61.884,0.215]],"o":[[-54.655,40.444],[-20.422,89.659],[37.963,13.705],[28.385,-50.774],[50.267,-33.464],[26.19,-10.771],[-11.226,-63.251],[-58.189,-0.202]],"v":[[296.919,402.702],[168.072,605.071],[227.024,801.31],[335.872,705.635],[436.307,547.324],[565.885,497.106],[643.57,398.416],[507.666,326.116]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[51.352,-33.861],[27.009,-88.13],[-39.938,-14.519],[-33.749,52.795],[-62.301,32.617],[-23.737,9.926],[8.332,53.733],[54.243,1.817]],"o":[[-69.052,39.888],[-31.555,92.567],[39.938,14.519],[30.003,-66.106],[51.275,-29.247],[25.745,-10.674],[-8.607,-54.288],[-57.202,-3.019]],"v":[[310.318,383.13],[130.903,588.955],[171.032,802.299],[289.305,702.667],[433.374,531.562],[573.674,492.141],[643.853,398.494],[525.74,328.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[48.049,-27.278],[32.346,-81.117],[-41.913,-15.333],[-38.716,54.106],[-74.334,31.77],[-23.962,10.079],[5.847,46.524],[46.602,3.419]],"o":[[-83.448,39.332],[-42.688,95.476],[41.913,15.333],[69.784,-113.901],[52.284,-25.031],[25.3,-10.578],[-5.987,-45.325],[-56.214,-5.836]],"v":[[325.781,370.853],[100.33,581.377],[121.894,802.211],[246.691,696.362],[431.548,522.436],[581.464,487.175],[644.135,398.573],[543.815,331.435]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[44.745,-20.695],[37.684,-74.103],[-43.889,-16.146],[-43.683,55.418],[-86.367,30.923],[-24.186,10.232],[3.362,39.315],[38.961,5.021]],"o":[[-119.264,43.039],[-53.821,98.384],[43.889,16.146],[53.717,-78.902],[53.292,-20.814],[24.855,-10.482],[-3.368,-36.362],[-55.227,-8.653]],"v":[[351.853,367.665],[83.444,578.458],[83.037,797.956],[218.71,689.28],[440.332,522.4],[589.253,482.21],[644.417,398.652],[561.889,334.094]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[41.442,-14.112],[43.022,-67.09],[-45.864,-16.96],[-48.65,56.729],[-98.4,30.077],[-24.41,10.386],[0.877,32.106],[31.32,6.623]],"o":[[-112.242,38.22],[-64.954,101.292],[45.864,16.96],[37.651,-43.904],[54.3,-16.598],[24.41,-10.386],[-0.749,-27.399],[-54.239,-11.47]],"v":[[377.924,364.478],[86.477,578.389],[64.098,796.551],[210.646,685.049],[449.115,522.363],[597.042,477.244],[644.699,398.73],[579.964,336.754]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[44.513,-23.712],[27.482,-56.256],[-37.784,-12.866],[-50.63,58.126],[-58.35,29.482],[-29.403,14.275],[3.378,32.034],[47.465,3.666]],"o":[[-83.032,40.247],[-28.361,58.056],[37.359,12.721],[44.616,-51.418],[56.174,-28.817],[29.403,-14.275],[-2.873,-27.245],[-61.731,-5.418]],"v":[[360.522,399.512],[167.659,595.984],[159.499,760.219],[281.433,660.858],[421.356,527.51],[592.399,468.7],[643.096,401.03],[557.766,341.618]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34.363,"s":[{"i":[[44.672,-24.21],[31.158,-53.285],[-36.18,-15.729],[-55.363,53.834],[-56.271,29.451],[-29.662,14.476],[3.508,32.03],[48.303,3.512]],"o":[[-81.516,40.352],[-31.158,53.285],[35.747,15.541],[49.074,-47.961],[56.271,-29.451],[29.662,-14.476],[-2.983,-27.237],[-62.12,-5.104]],"v":[[353.995,392.968],[165.032,568.445],[141.322,727.462],[269.779,639.11],[419.915,527.777],[566.624,471.102],[623.232,402.797],[535.507,347.324]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[45.26,-24.45],[27.597,-58.817],[-37.262,-10.276],[-47.761,60.94],[-55.381,28.571],[-42.375,15.472],[3.29,32.053],[49.693,3.91]],"o":[[-79.368,39.383],[-29.194,62.221],[36.766,10.14],[42.806,-54.803],[55.381,-28.571],[31.516,-11.507],[-2.797,-27.247],[-62.693,-5.411]],"v":[[360.281,400.125],[170.977,597.431],[166.909,762.505],[282.798,653.18],[419.132,529.165],[591.161,470.697],[644.403,400.507],[556.486,342.254]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[52.639,-27.461],[57.444,-90.469],[-27.818,-6.701],[-52.811,60.226],[-44.19,17.504],[-43.428,1.434],[0.576,34.149],[70.929,9.404]],"o":[[-52.383,27.204],[-61.648,97.089],[26.814,6.459],[53.554,-61.074],[44.19,-17.504],[39.724,-1.312],[-0.488,-28.916],[-73.81,-9.786]],"v":[[337.627,393.675],[150.938,571.051],[113.78,790.198],[241.183,630.489],[415.018,508.533],[567.036,477.673],[651.931,411.796],[560.242,337.699]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43.363,"s":[{"i":[[52.975,-27.598],[71.449,-82.568],[-26.119,-10.549],[-61.267,51.896],[-43.682,17.002],[-38.66,13.544],[0.42,32.348],[67.954,9.137]],"o":[[-51.157,26.651],[-76.706,88.642],[25.139,10.153],[62.435,-52.885],[43.681,-17.002],[38.66,-13.544],[-0.356,-27.386],[-70.216,-9.441]],"v":[[336.43,389.985],[165.007,532.087],[94.633,745.987],[244.636,604.296],[414.831,507.596],[559.622,473.279],[630.986,414.799],[536.565,346.563]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[52.475,-26.235],[56.355,-88.221],[-30.185,-10.492],[-53.423,57.161],[-42.414,16.625],[-57.784,7.045],[0.205,34.313],[70.43,10.482]],"o":[[-50.402,25.322],[-58.909,92.218],[26.307,6.588],[53.501,-59.257],[42.414,-16.625],[46.26,-10.266],[-0.174,-29.039],[-72.558,-10.799]],"v":[[337.76,388.794],[151.526,564.444],[110.692,784.489],[240.195,625.592],[405.777,506.621],[582.34,476.23],[653.568,408.95],[561.786,333.748]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[51.577,-25.66],[52.706,-87.785],[-30.618,-13.006],[-53.379,56.684],[-40.59,21.111],[-40.211,4.323],[-2.249,33.805],[67.004,15.657]],"o":[[-49.263,24.751],[-53.471,89.059],[27.013,6.224],[52.454,-59.802],[65.198,-33.909],[42.937,-6.667],[1.902,-28.598],[-67.829,-17.238]],"v":[[334.232,376.664],[151.617,546.553],[111.829,770.102],[245.559,611.006],[396.481,500.734],[579.493,475.824],[655.106,416.229],[569.69,335.104]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[50.679,-25.085],[44.071,-89.098],[-46.758,-23.261],[-50.159,58.35],[-39.774,16.193],[-40.206,5.305],[-1.298,33.563],[65.247,13.992]],"o":[[-48.123,24.179],[-43.227,87.392],[27.813,4.434],[47.993,-62.401],[64.986,-26.457],[43.11,-5.688],[1.098,-28.382],[-66.847,-14.049]],"v":[[349.01,382.282],[168.344,569.255],[155.055,803.191],[267.079,623.072],[416.579,501.275],[580.869,477.737],[655.02,412.524],[562.755,331.998]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[54.013,-35.45],[31.181,-97.419],[-43.069,-14.713],[-37.982,58.176],[-41.046,21.571],[-38.634,6.618],[0.037,33.154],[68.455,8.382]],"o":[[-46.017,33.376],[-31.464,101.162],[28.623,2.354],[45.782,-83.993],[58.103,-28.516],[47.059,-7.74],[-0.03,-28.022],[-64.25,-11.676]],"v":[[366.929,388.677],[191.905,611.177],[209.588,831.886],[294.473,653.961],[432.216,517.603],[579.867,478.292],[654.7,408.047],[561.596,330.44]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[54.111,-39.519],[6.329,-91.851],[-34.642,-2.992],[-18.209,52.194],[-43.589,32.329],[-36.365,1.728],[-0.196,32.447],[58.26,10.274]],"o":[[-71.666,47.302],[-8.274,120.077],[29.825,-0.297],[15.222,-53.379],[44.337,-32.634],[36.365,-1.728],[0.219,-36.155],[-58.627,-9.934]],"v":[[382.759,383.444],[250.15,636.941],[316.407,845.175],[356.09,671.488],[449.132,517.315],[581.972,480.508],[654.091,410.744],[567.259,331.944]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[55.613,-33.605],[-2.319,-104.947],[-33.372,0.013],[-11.332,50.116],[-43.975,27.16],[-36.725,3.231],[-1.296,32.438],[55.896,12.299]],"o":[[-67.316,38.794],[4.746,115.08],[28.468,-2.037],[9.012,-50.107],[44.439,-27.35],[37.425,-2.764],[1.183,-33.435],[-55.206,-10.869]],"v":[[391.276,368.929],[259.131,617.547],[343.337,809.45],[372.16,648.668],[449.357,507.798],[583.942,482.065],[655.642,413.828],[572.354,331.966]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[{"i":[[58.617,-21.778],[22.296,-90.194],[-29.972,-7.107],[-17,40.204],[-44.746,16.822],[-37.445,6.235],[-3.495,32.42],[51.168,16.349]],"o":[[-58.617,21.777],[-19.12,77.346],[25.817,5.735],[16.073,-38.719],[44.641,-16.782],[39.547,-4.836],[3.113,-27.994],[-48.364,-12.74]],"v":[[408.309,339.9],[251.256,509.005],[293.679,696.402],[351.615,577.292],[435.223,487.628],[587.884,485.178],[658.745,419.996],[582.544,332.009]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[{"i":[[53.658,-20.108],[35.383,-73.197],[-35.581,-11.521],[-21.277,28.439],[-40.437,12.211],[-35.307,6.585],[-3.296,32.76],[49.209,15.135]],"o":[[-53.978,20.738],[-31.828,64.285],[21.645,9.878],[26.197,-35.015],[40.361,-12.183],[38.856,-6.256],[2.951,-28.734],[-46.713,-12.085]],"v":[[416.241,335.883],[263.276,463.833],[273.739,629.436],[344.978,550.671],[443.616,481.103],[590.437,484.338],[658.853,418.224],[583.644,332.145]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55.637,"s":[{"i":[[40.583,-15.705],[32.277,-43.48],[-9.048,-5.922],[-22.454,4.257],[-29.076,0.054],[-29.671,7.508],[-2.769,33.659],[44.042,11.934]],"o":[[-41.749,17.998],[-32.277,43.48],[14.817,9.699],[22.454,-4.257],[29.076,-0.054],[37.034,-9.997],[2.525,-30.685],[-42.359,-10.356]],"v":[[447.449,340.537],[353.348,411.355],[338.562,501.49],[403.265,496.366],[487.812,484.877],[597.168,482.124],[659.137,413.552],[586.547,332.506]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58.092,"s":[{"i":[[41.14,-14.181],[16.857,-21.57],[-4.024,-3.706],[-14.07,-0.51],[-28.878,-6.415],[-29.93,6.397],[-4.022,33.532],[43.567,13.567]],"o":[[-42.09,18.438],[-17.525,22.426],[6.527,6.011],[11.563,0.419],[28.384,6.305],[37.381,-8.61],[3.666,-30.569],[-41.944,-11.927]],"v":[[481.538,335.535],[400.029,396.959],[378.702,461.784],[412.431,465.475],[500.339,477.428],[600.398,484.818],[664.879,418.602],[595.533,332.495]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60.545,"s":[{"i":[[28.201,-1.085],[12.654,-5.359],[7.828,-30.219],[-29.163,-7.707],[-24.783,-3.988],[-20.286,7.565],[4.15,32.508],[22.957,14.401]],"o":[[-19.818,0.762],[-62.447,26.447],[28.952,1.188],[19.981,5.281],[23.203,3.734],[32.599,-12.156],[-3.274,-25.65],[-17.795,-11.163]],"v":[[552.771,323.203],[494.19,336.456],[394.869,451.062],[473.248,463.684],[557.264,486.313],[622.075,480.875],[667.874,402.501],[624.119,342.216]],"c":true}]},{"t":65.455078125,"s":[{"i":[[29.256,-1.636],[12.654,-5.359],[8.617,-28.501],[-28.968,-8.636],[-24.783,-3.988],[-20.286,7.565],[3.491,32.586],[22.957,14.401]],"o":[[-19.802,1.107],[-62.447,26.447],[28.952,1.188],[19.806,5.905],[23.203,3.734],[32.599,-12.156],[-2.92,-27.253],[-17.795,-11.163]],"v":[[552.771,323.203],[505.624,334.015],[404.252,446.909],[473.294,460.187],[557.264,486.313],[622.075,480.875],[668.525,402.251],[624.928,339.765]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250979988248,0.721568986481,0.588234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":-11,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 6","hd":true,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.11],"y":[1.253]},"o":{"x":[0.234],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.619],"y":[1.175]},"o":{"x":[0.466],"y":[0.235]},"t":16.363,"s":[-23.464]},{"i":{"x":[0.495],"y":[1]},"o":{"x":[0.367],"y":[0.239]},"t":63.818,"s":[14.851]},{"t":90,"s":[0]}],"ix":10},"p":{"a":0,"k":[63.999999999999986,63.999999999999986,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.517,0.517,0.833],"y":[1.074,1.074,1.173]},"o":{"x":[0.571,0.571,0.333],"y":[0,0,0]},"t":0,"s":[12.799999999999997,12.799999999999997,100]},{"i":{"x":[0.636,0.636,0.667],"y":[0.588,0.588,0.493]},"o":{"x":[0.428,0.428,0.167],"y":[0.065,0.065,-0.129]},"t":31.908,"s":[10.323455999999998,10.323455999999998,100]},{"i":{"x":[0.472,0.472,0.667],"y":[1.033,1.033,1]},"o":{"x":[0.23,0.23,0.333],"y":[1.161,1.161,0.734]},"t":55.637,"s":[12.192767999999997,12.192767999999997,100]},{"t":90,"s":[12.799999999999997,12.799999999999997,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":91,"st":-10,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[63.99884799999998,63.999999999999986,0],"ix":2,"l":2},"a":{"a":0,"k":[20.25,20.25,0],"ix":1,"l":2},"s":{"a":0,"k":[255.99999999999994,255.99999999999994,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.045,0],[0,-11.046],[-11.046,0],[0,11.045]],"o":[[-11.046,0],[0,11.046],[11.045,0],[0,-11.046]],"v":[[0,-20],[-20,0],[0,20],[20,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.262745098039,0.376470618154,0.87450986376,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.25,20.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"bm":0}],"markers":[]} diff --git a/android/app/src/main/res/values-night/colors.xml b/android/app/src/main/res/values-night/colors.xml new file mode 100644 index 00000000000..eb75d8dd2b6 --- /dev/null +++ b/android/app/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + #141414 + #ffffff + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 32cc9d7d8ce..a370d388ac1 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -1,6 +1,8 @@ + - #4360df - #FFFFFF - #5c6bc0 - #FFFFFF + #ffffff + #000000 + #09101C + #ffffff + #4360DF diff --git a/android/app/src/main/res/values/splash_theme.xml b/android/app/src/main/res/values/splash_theme.xml new file mode 100644 index 00000000000..c61662059cd --- /dev/null +++ b/android/app/src/main/res/values/splash_theme.xml @@ -0,0 +1,13 @@ + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 6e2ee577e45..504077f1b02 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,13 +1,31 @@ - + + - @color/primary - @color/primary - @color/background - #000000 + + diff --git a/android/app/src/main/res/values/theme.xml b/android/app/src/main/res/values/theme.xml new file mode 100644 index 00000000000..70d50d50307 --- /dev/null +++ b/android/app/src/main/res/values/theme.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/pr/AndroidManifest.xml b/android/app/src/pr/AndroidManifest.xml index daa2f037e67..3571ea04c32 100644 --- a/android/app/src/pr/AndroidManifest.xml +++ b/android/app/src/pr/AndroidManifest.xml @@ -3,5 +3,7 @@ + + diff --git a/android/app/src/release/AndroidManifest.xml b/android/app/src/release/AndroidManifest.xml index 641bd0329a4..3571ea04c32 100644 --- a/android/app/src/release/AndroidManifest.xml +++ b/android/app/src/release/AndroidManifest.xml @@ -3,5 +3,7 @@ + + - \ No newline at end of file + diff --git a/android/build.gradle b/android/build.gradle index a98acf021ea..e7dbc681df4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,26 +4,34 @@ * Project-wide gradle configuration properties for use by all modules */ ext { + // kotlin_version is needed for react-native-camera-kit library + kotlin_version = project.kotlinPluginVersion + RNNKotlinVersion = project.kotlinPluginVersion + RNGH_kotlinVersion = project.kotlinPluginVersion buildToolsVersion = project.buildToolsVersion minSdkVersion = Integer.valueOf(project.minSdkVersion) compileSdkVersion = Integer.valueOf(project.compileSdkVersion) targetSdkVersion = Integer.valueOf(project.targetSdkVersion) supportLibVersion = project.supportLibVersion gradlePluginVersion = project.gradlePluginVersion + kotlinVersion = project.kotlinPluginVersion + kotlinPluginVersion = project.kotlinPluginVersion + kotlinToolsVersion = project.kotlinPluginVersion + ndkVersion = "25.2.9519653" } buildscript { repositories { flatDir { dirs "libs", "${rootDir}/app/libs" } google() - jcenter() + mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:${project.ext.gradlePluginVersion}" - classpath 'de.undercouch:gradle-download-task:3.1.2' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${project.ext.kotlinPluginVersion}" + classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + classpath("com.google.gms:google-services:4.4.2") } } @@ -37,34 +45,44 @@ subprojects { defaultConfig { targetSdkVersion rootProject.ext.targetSdkVersion } + + // Speed up Tests Stage + tasks.withType(Test).configureEach { + // https://docs.gradle.org/current/userguide/performance.html#execute_tests_in_parallel + maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 + // https://docs.gradle.org/current/userguide/performance.html#fork_tests_into_multiple_processes + forkEvery = 100 + // https://docs.gradle.org/current/userguide/performance.html#disable_reports + reports.html.required = false + reports.junitXml.required = false + } + // Speed up Java Compile Stage + // https://docs.gradle.org/current/userguide/performance.html#run_the_compiler_as_a_separate_process + tasks.withType(JavaCompile).configureEach { + options.fork = true + } + } } } } +apply plugin: "com.facebook.react.rootproject" + allprojects { beforeEvaluate { - if (System.env.STATUS_GO_ANDROID_LIBDIR == null || System.env.STATUS_GO_ANDROID_LIBDIR == "") { - throw new GradleException('STATUS_GO_ANDROID_LIBDIR environment variable is not valid!') - } + if (System.env.STATUS_GO_ANDROID_LIBDIR == null || System.env.STATUS_GO_ANDROID_LIBDIR == "") { + throw new GradleException('STATUS_GO_ANDROID_LIBDIR environment variable is not valid!') + } } - repositories { mavenLocal() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url("$rootDir/../node_modules/react-native/android") - } - maven { - // Android JSC is installed from npm - url("$rootDir/../node_modules/jsc-android/dist") - } - - google() - jcenter() - - // for geth, function, and status-go + // Android JSC is installed from npm + maven { url("$rootDir/../node_modules/jsc-android/dist") } + // For geth, function, and status-go flatDir { dirs "libs", System.env.STATUS_GO_ANDROID_LIBDIR } - maven { url "https://www.jitpack.io" } + google() + mavenCentral() + maven { url 'https://mvnrepository.com/artifact/com.github.gundy/semver4j'} } } diff --git a/android/gradle.properties b/android/gradle.properties index 03a37582dd3..6d587f756f9 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -21,12 +21,14 @@ # $keytool -genkey -v -keystore ./status-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias status # Version requirements used throughout the Gradle scripts -minSdkVersion=23 -compileSdkVersion=29 -targetSdkVersion=29 -buildToolsVersion=29.0.2 +minSdkVersion=24 +compileSdkVersion=34 +targetSdkVersion=34 +buildToolsVersion=34.0.0 supportLibVersion=28.0.0 -gradlePluginVersion=3.4.1 +# This should match version from nix/pkgs/aapt2/default.nix +gradlePluginVersion=7.4.2 +kotlinPluginVersion=1.9.0 android.useAndroidX=true android.enableJetifier=true @@ -36,11 +38,25 @@ KEYSTORE_PASSWORD=password KEYSTORE_ALIAS=status KEYSTORE_KEY_PASSWORD=password -# By default we build a mostly universal APK -ANDROID_ABI_SPLIT=false -# Some platforms are excluded though -ANDROID_ABI_INCLUDE=armeabi-v7a;arm64-v8a;x86 +# Splitting by CPU Architecture produces smaller APKs. +ANDROID_ABI_SPLIT=true +# By default its better to only build apk for most recent devices. +ANDROID_ABI_INCLUDE=arm64-v8a -org.gradle.jvmargs=-Xmx8704M +org.gradle.jvmargs=-Xmx8704M -XX:+UseParallelGC versionCode=9999 +commitHash=unknown + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=false + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +# Disabled for debug builds to avoid 'maximum call stack exceeded' errors. +# https://github.com/status-im/status-mobile/issues/18493 +hermesEnabled=false diff --git a/android/gradlew b/android/gradlew index 7047e372b2f..7e5e936d819 100755 --- a/android/gradlew +++ b/android/gradlew @@ -17,8 +17,8 @@ if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then fi # Map mavenLocal() to the Nix maven repo we set up in nix/mobile/android/maven-and-npm-deps/default.nix -if [ -n "$STATUSREACT_NIX_MAVEN_REPO" ]; then - repoOpts="-Dmaven.repo.local=${STATUSREACT_NIX_MAVEN_REPO}" +if [ -n "${STATUS_NIX_MAVEN_REPO}" ]; then + repoOpts="-Dmaven.repo.local=${STATUS_NIX_MAVEN_REPO}" else repoOpts='' fi diff --git a/android/init.gradle b/android/init.gradle new file mode 100644 index 00000000000..57b06eeaf87 --- /dev/null +++ b/android/init.gradle @@ -0,0 +1,9 @@ +initscript { + repositories { + gradlePluginPortal() + } + dependencies { + classpath "org.gradle:github-dependency-graph-gradle-plugin:+" + } +} +apply plugin: org.gradle.dependencygraph.simple.SimpleDependencyGraphPlugin diff --git a/android/settings.gradle b/android/settings.gradle index 3dadae46ba1..e9a8127c624 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,20 +1,21 @@ pluginManagement { +includeBuild('../node_modules/@react-native/gradle-plugin') repositories { mavenLocal() // Let's prioritize local Maven repos so that Nix can provide them offline gradlePluginPortal() } } - +include ':react-native-share' +project(':react-native-share').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-share/android') rootProject.name = 'StatusIm' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':react-native-nfc-manager' project(':react-native-nfc-manager').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-nfc-manager/android') include ':app' -include ':react-native-dialogs' -project(':react-native-dialogs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-dialogs/android') include ':react-native-status' project(':react-native-status').projectDir = new File(rootProject.projectDir, '../modules/react-native-status/android') include ':react-native-status-keycard' project(':react-native-status-keycard').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-status-keycard/android') -include ':react-native-webview-bridge' -project(':react-native-webview-bridge').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview-bridge/android') +include ':react-native-blur' +project(':react-native-blur').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/blur/android') +includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/app.json b/app.json index c24d965dac4..7e5f39bafdf 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,4 @@ { "name": "StatusIm", "displayName": "StatusIm" -} \ No newline at end of file +} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000000..31de5f62fcd --- /dev/null +++ b/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], + plugins: ['react-native-reanimated/plugin', '@babel/plugin-transform-named-capturing-groups-regex'], +}; diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 00000000000..f161b329987 --- /dev/null +++ b/binding.gyp @@ -0,0 +1,38 @@ +{ + "variables": { + "module_name%": "status_nodejs_addon", + "module_path%": "./lib/binding/" + }, + "targets": [{ + "target_name": "<(module_name)", + "sources": [ + "./modules/react-native-status/nodejs/status.cpp" + ], + "xcode_settings": { + "MACOSX_DEPLOYMENT_TARGET": "10.7" + }, + "libraries": [ + "> compiler-options :modules vals))))) - -(defn- compile-cljs-with-build-config [build-config build-fn env build-id] - (let [{:keys [source-paths compiler]} build-config - output-files (get-output-files compiler) - started-at (System/currentTimeMillis)] - (println (str "Compiling " (pr-str build-id) " for " (pr-str env) "...")) - (flush) - (build-fn (apply api/inputs source-paths) compiler) - (println-colorized (str "Successfully compiled " (pr-str output-files) " in " (elapsed started-at) ".") green-color))) - -(defn- compile-cljs [env & [build-id watch?]] - (let [build-fn (if watch? api/watch api/build)] - (if build-id - (compile-cljs-with-build-config (get-cljsbuild-config env build-id) build-fn env build-id) - (doseq [[build-id build-config] (get-cljsbuild-config env)] - (compile-cljs-with-build-config (get-cljsbuild-config env build-id) build-fn env build-id))))) - -(defn- show-help [] - (doseq [[task {:keys [desc usage]}] cli-tasks-info] - (println (format (str yellow-color "%-12s" reset-color green-color "%s" reset-color) - (name task) desc)) - (when usage - (println) - (->> usage - (map #(str " " %)) - (str/join "\n") - println) - (println)))) - -;;; Task dispatching - -(defmulti task first) - -(defmethod task :default [args] - (println (format "Unknown or missing task. Choose one of: %s\n" - (->> cli-tasks-info - keys - (map name) - (interpose ", ") - (apply str)))) - (show-help) - (System/exit 1)) - -;;; Compiling task - -(defmethod task "compile" [[_ env build-id type]] - (case type - (nil "once") (compile-cljs env build-id) - "watch" (compile-cljs env build-id true) - (do (println "Unknown argument to compile task:" type) - (System/exit 1)))) - -;;; Testing task - -(defmethod task "test" [[_ build-id]] - (with-namespaces [[doo.core :as doo]] - (compile-cljs :test build-id) - (doo/run-script :node (->> build-id (get-cljsbuild-config :test) :compiler)))) - -;;; :watch task - -(defn hawk-handler-resources - [ctx e] - (let [path "src/status_im/utils/js_resources.cljs" - js-resourced (slurp path)] - (spit path (str js-resourced " ;;")) - (spit path js-resourced)) - ctx) - -(defn hawk-handler-translations - [ctx e] - (let [path "dev/status_im/i18n_resources.cljs" - i18n (slurp path)] - (spit path (str i18n " ;;")) - (spit path i18n)) - ctx) - -(defmethod task "watch" [[_ & args]] - (with-namespaces [[hawk.core :as hawk] - [re-frisk-sidecar.core :as rfs] - [figwheel-sidecar.repl-api :as ra] - [clj-rn.core :as clj-rn] - [clj-rn.main :as main]] - (let [options (main/parse-cli-options args main/watch-task-options)] - (clj-rn/watch (assoc options :start-cljs-repl false)) - (rfs/-main) - (hawk/watch! [{:paths ["resources"] :handler hawk-handler-resources} - {:paths ["translations"] :handler hawk-handler-translations}]) - (when (:start-cljs-repl options) (ra/cljs-repl))))) - -;;; Help - -(defmethod task "help" [_] - (show-help) - (System/exit 1)) - -;;; Build script entrypoint. - -(task *command-line-args*) diff --git a/ci/Jenkinsfile.android b/ci/Jenkinsfile.android index bc4b4e28597..9f8cd46a3fe 100644 --- a/ci/Jenkinsfile.android +++ b/ci/Jenkinsfile.android @@ -1,16 +1,28 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +/* Options section can't access functions in objects. */ +def isPRBuild = utils.isPRBuild() + pipeline { - agent { label 'linux' } + agent { label 'linux && x86_64 && nix-2.24' } options { timestamps() /* Prevent Jenkins jobs from running forever */ - timeout(time: 45, unit: 'MINUTES') + timeout(time: 30, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '20', - artifactNumToKeepStr: '10', + artifactNumToKeepStr: '1', )) + /* Allows combined build to copy */ + copyArtifactPermission('/status-mobile/*') + /* Abort old PR builds. */ + disableConcurrentBuilds( + abortPrevious: isPRBuild + ) } parameters { @@ -22,71 +34,33 @@ pipeline { } environment { - LANG = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - TARGET = 'android' + LANG = 'en_US.UTF-8' + LC_ALL = 'en_US.UTF-8' + LANGUAGE = 'en_US.UTF-8' + PLATFORM = "android${utils.isE2EBuild() ? "-e2e" : ""}" BUILD_ENV = 'prod' NIX_CONF_DIR = "${env.WORKSPACE}/nix" FASTLANE_DISABLE_COLORS = 1 - /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ - LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" - /* coverage report identification */ - COVERALLS_SERVICE_NAME = "jenkins" - COVERALLS_SERVICE_JOB_ID = "${JOB_NAME}#${BUILD_NUMBER}" + SENTRY_PRODUCTION = "${utils.isReleaseBuild() ? 'true' : 'false'}" } stages { stage('Prep') { steps { script { - /* Necessary to load methods */ - android = load 'ci/android.groovy' - cmn = load 'ci/common.groovy' - btype = cmn.utils.getBuildType() - print "Running ${btype} build!" - cmn.ci.abortPreviousRunningBuilds() - /* Cleanup and Prep */ - cmn.prep(btype) + utils.symlinkEnv() + println("Build Number: ${utils.genBuildNumber()}") } } } - stage('Implicit dependencies') { + stage('Bundle') { steps { - /* Build implicit dependencies if needed (we run `lein deps :tree` but it's not really required, for this purpose) - Implicit dependencies include building a patched node_modules, fetching maven dependencies, and anything else required. - We do this before the parallel steps so we have a known starting situation. */ - script { cmn.nix.shell('lein deps :tree', attr: 'shells.lein') } + script { apks = android.bundle() } } } - stage('Parallel Assemble') { - parallel { - stage('Checks') { stages { - stage('Lint') { - steps { - script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') } - } - } - stage('Tests') { - steps { - script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') } - } - } - } } - stage('Build') { stages { - stage('JSBundle') { - steps { - script { - cmn.nix.shell('make jsbundle-android', pure: false) - } - } - } - stage('Bundle') { - steps { - script { apks = android.bundle() } - } - } - } } + stage('Sign') { + steps { + script { apks = android.sign(apks) } } } stage('Parallel Upload') { @@ -97,36 +71,18 @@ pipeline { } } } stage('Upload') { - steps { - script { - def urls = apks.collect { cmn.uploadArtifact(it) } - /* return only the universal APK */ - if (urls.size() > 1) { - env.PKG_URL = urls.find { it.contains('universal') } - } else { /* if no universal is available pick first */ - env.PKG_URL = urls.first() - } - /* build type specific */ - switch (btype) { - case 'nightly': - env.DIAWI_URL = android.uploadToDiawi(); break; - case 'e2e': - env.SAUCE_URL = android.uploadToSauceLabs(); break; - } - } - } + steps { script { + def urls = apks.collect { s5cmd.upload(it) } + env.PKG_URL = urls.first() + jenkins.setBuildDesc(APK: env.PKG_URL) + } } } } } - stage('Cleanup') { - steps { - sh 'make clean' - } - } } post { - success { script { load('ci/github.groovy').notifyPR(true) } } - failure { script { load('ci/github.groovy').notifyPR(false) } } - always { sh 'make _fix-node-perms' } + success { script { github.notifyPR(true) } } + failure { script { github.notifyPR(false) } } + always { sh 'make purge' } } } diff --git a/ci/Jenkinsfile.combined b/ci/Jenkinsfile.combined index 0deb1e87e22..1d21a717806 100644 --- a/ci/Jenkinsfile.combined +++ b/ci/Jenkinsfile.combined @@ -1,3 +1,8 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +import groovy.json.JsonBuilder + pipeline { agent { label 'linux' } @@ -5,49 +10,57 @@ pipeline { timestamps() disableConcurrentBuilds() /* Prevent Jenkins jobs from running forever */ - timeout(time: 45, unit: 'MINUTES') + timeout(time: 40, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '30', - artifactNumToKeepStr: '10', + artifactNumToKeepStr: '1', )) } + /* WARNING: Defining parameters here with the ?: trick causes them to remember last value. */ + parameters { + choice( + name: 'BUILD_TYPE', + description: 'Makefile target to build. Optional Parameter.', + choices: genChoices(params.BUILD_TYPE, ['manual', 'nightly', 'release', 'pr', 'e2e']), + ) + booleanParam( + name: 'PUBLISH', + description: 'Trigger publishing of build results for nightly or release.', + defaultValue: getPublishDefault(params.PUBLISH), + ) + } + stages { stage('Prep') { steps { script { - println "Current JOB: ${env.JOB_NAME}" - /* load common lib */ - cmn = load('ci/common.groovy') - gh = load('ci/github.groovy') - /* just for a shorter access */ - btype = cmn.utils.getBuildType() + println("Current JOB: ${env.JOB_NAME}") } } } stage('Build') { parallel { stage('iOS') { steps { script { - ios = cmn.ci.Build('status-react/combined/mobile-ios') + ios = jenkins.Build('status-mobile/platforms/ios') } } } stage('Android') { steps { script { - apk = cmn.ci.Build('status-react/combined/mobile-android') + apk = jenkins.Build('status-mobile/platforms/android') } } } - stage('Android e2e') { steps { script { - apke2e = cmn.ci.Build('status-react/combined/mobile-android-e2e') + stage('Tests') { steps { script { + jenkins.Build('status-mobile/platforms/tests') } } } } } stage('Archive') { steps { script { sh('rm -f pkg/*') - cmn.ci.copyArts(ios) - //cmn.ci.copyArts(iose2e) - cmn.ci.copyArts(apk) - cmn.ci.copyArts(apke2e) + jenkins.copyArts(ios) + jenkins.copyArts(apk) + sha = "pkg/${utils.pkgFilename(ext: 'sha256')}" dir('pkg') { /* generate sha256 checksums for upload */ - sh "sha256sum * | tee ${cmn.utils.pkgFilename(btype, 'sha256')}" + sh "sha256sum * | tee ../${sha}" archiveArtifacts('*') } } } @@ -57,38 +70,67 @@ pipeline { /* object for easier URLs handling */ urls = [ /* mobile */ - Apk: cmn.pkgUrl(apk), Apke2e: cmn.pkgUrl(apke2e), - iOS: cmn.pkgUrl(ios), /*iOSe2e: cmn.pkgUrl(iose2e),*/ - Diawi: cmn.utils.getEnv(ios, 'DIAWI_URL'), + Apk: utils.pkgUrl(apk), + iOS: utils.pkgUrl(ios), + Diawi: utils.getEnv(ios, 'DIAWI_URL'), /* upload the sha256 checksums file too */ - SHA: cmn.uploadArtifact(cmn.utils.pkgFind('sha256')), + SHA: s5cmd.upload(sha), ] /* add URLs to the build description */ - cmn.ci.setBuildDesc(urls) - /* Create JSON file with newest build URLs */ - switch (btype) { - /* legacy naming, should have named it nightly.json */ - case 'nightly': cmn.updateBucketJSON(urls, 'latest.json'); break - } + jenkins.setBuildDesc(urls) } } } stage('Publish') { + when { expression { params.PUBLISH } } steps { script { - switch (btype) { - case 'nightly': build(job: 'misc/status.im', wait: false); break - case 'release': gh.publishReleaseMobile(); break + switch (utils.getBuildType()) { + case 'nightly': /* Create JSON file with newest build URLs */ + updateBucketJSON(urls, 'latest.json'); + break; + case 'release': + github.publishReleaseFiles(repo: 'status-mobile'); + break; } } } } - stage('Run e2e') { - when { expression { btype == 'nightly' } } - steps { script { - e2eApk = cmn.utils.getEnv(apke2e, 'SAUCE_URL') - build( - job: 'end-to-end-tests/status-app-nightly', wait: false, - parameters: [string(name: 'APK_NAME', value: e2eApk)] - ) - } } - } } } + +/* Helper that generates list of available choices for a parameter + * but re-orders them based on the currently set value. First is default. */ +def List genChoices(String previousChoice, List defaultChoices) { + if (previousChoice == null) { + return defaultChoices + } + choices = defaultChoices.minus(previousChoice) + choices.add(0, previousChoice) + return choices +} + +/* Helper that makes PUBLISH default to 'false' unless: + * - The build is for a release branch + * - A user explicitly specified a value + * Since release builds create and re-create GitHub drafts every time. */ +def Boolean getPublishDefault(Boolean previousValue) { + if (env.JOB_NAME.startsWith('status-mobile/release')) { return true } + if (previousValue != null) { return previousValue } + return false +} + +/* Helper for updating JSON with newest builds. */ +def updateBucketJSON(urls, fileName) { + /* latest.json has slightly different key names */ + def content = [ + DIAWI: urls.Diawi, + APK: urls.Apk, IOS: urls.iOS, + APP: urls.App, MAC: urls.Mac, + WIN: urls.Win, SHA: urls.SHA + ] + def filePath = "${pwd()}/pkg/${fileName}" + /* it might not exist */ + sh "mkdir -p ${pwd()}/pkg" + def contentJson = new JsonBuilder(content).toPrettyString() + println "${filePath}:\n${contentJson}" + writeFile(file: filePath, text: contentJson) + return s5cmd.upload(filePath) +} diff --git a/ci/Jenkinsfile.e2e-nightly b/ci/Jenkinsfile.e2e-nightly new file mode 100644 index 00000000000..0aa6d250afa --- /dev/null +++ b/ci/Jenkinsfile.e2e-nightly @@ -0,0 +1,52 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + agent { label 'linux' } + + triggers { + // Nightly at 0am + cron 'H 0 * * *' + } + + parameters { + string( + name: 'BRANCH', + description: 'Name of the branch to checkout and build.', + defaultValue: 'develop', + ) + } + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '30', + artifactNumToKeepStr: '1', + )) + } + + stages { + stage('Build') { + steps { + script { + apk_build = jenkins.Build('status-mobile/platforms/android-e2e') + apk_build_number = apk_build.getNumber().toString() + } + } + } + stage('Run e2e') { + steps { + build( + job: 'status-mobile/e2e/status-app-nightly', + parameters: [ + string(name: 'APK_BUILD_NUMBER', value: apk_build_number), + string(name: 'BRANCH', value: env.BRANCH), + ] + ) + } + } + } +} + diff --git a/ci/Jenkinsfile.fastlane.clean b/ci/Jenkinsfile.fastlane.clean deleted file mode 100644 index a8cf277f68d..00000000000 --- a/ci/Jenkinsfile.fastlane.clean +++ /dev/null @@ -1,54 +0,0 @@ -pipeline { - agent { label 'macos' } - - environment { - LANG = 'en_US.UTF-8' - LANGUAGE = 'en_US.UTF-8' - LC_ALL = 'en_US.UTF-8' - TARGET = 'ios' - FASTLANE_DISABLE_COLORS = 1 - /* See nix/README.md */ - NIX_IGNORE_SYMLINK_STORE = 1 - /* avoid writing to r/o /nix */ - GEM_HOME = '~/.rubygems' - } - - options { - timestamps() - /* Disable concurrent jobs */ - disableConcurrentBuilds() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 45, unit: 'MINUTES') - /* Don't keep more than 50 builds */ - buildDiscarder(logRotator(numToKeepStr: '50')) - } - - stages { - stage('Prep') { - steps { script { - nix = load('ci/nix.groovy') - nix.shell( - 'bundle install --gemfile=fastlane/Gemfile', - attr: 'shells.fastlane', - ) - } } - } - stage('Clean Users'){ - steps { script { - withCredentials([ - usernamePassword( - credentialsId: 'fastlane-match-apple-id', - usernameVariable: 'FASTLANE_APPLE_ID', - passwordVariable: 'FASTLANE_PASSWORD' - ), - ]) { - nix.shell( - 'bundle exec --gemfile=fastlane/Gemfile fastlane ios clean', - keepEnv: ['FASTLANE_APPLE_ID', 'FASTLANE_PASSWORD'], - attr: 'shells.fastlane', - ) - } - } } - } - } -} diff --git a/ci/Jenkinsfile.ios b/ci/Jenkinsfile.ios index 4eb99098fe6..21aafb6a341 100644 --- a/ci/Jenkinsfile.ios +++ b/ci/Jenkinsfile.ios @@ -1,5 +1,11 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +/* Options section can't access functions in objects. */ +def isPRBuild = utils.isPRBuild() + pipeline { - agent { label 'macos-xcode-11.3.1' } + agent { label 'macos && arm64 && nix-2.24 && xcode-16.2' } parameters { string( @@ -12,70 +18,54 @@ pipeline { options { timestamps() /* Prevent Jenkins jobs from running forever */ - timeout(time: 45, unit: 'MINUTES') + timeout(time: 25, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '20', - artifactNumToKeepStr: '10', + artifactNumToKeepStr: '1', )) + /* Allows combined build to copy */ + copyArtifactPermission('/status-mobile/*') + /* Abort old PR builds. */ + disableConcurrentBuilds( + abortPrevious: isPRBuild + ) } environment { - LANG = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - TARGET = 'ios' + LANG = 'en_US.UTF-8' + LC_ALL = 'en_US.UTF-8' + LANGUAGE = 'en_US.UTF-8' + PLATFORM = 'ios' NIX_CONF_DIR = "${env.WORKSPACE}/nix" - /* See nix/README.md */ - NIX_IGNORE_SYMLINK_STORE = 1 FASTLANE_DISABLE_COLORS = 1 BUNDLE_PATH = "${HOME}/.bundle" - /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ - LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" + SENTRY_PRODUCTION = "${utils.isReleaseBuild() ? 'true' : 'false'}" } stages { stage('Prep') { steps { script { - /* Necessary to load methods */ - ios = load 'ci/ios.groovy' - cmn = load 'ci/common.groovy' - btype = cmn.utils.getBuildType() - print "Running ${btype} build!" - cmn.ci.abortPreviousRunningBuilds() - /* Cleanup and Prep */ - cmn.prep(btype) + utils.symlinkEnv() + println("Build Number: ${utils.genBuildNumber()}") } } } - stage('Parallel Assemble') { - parallel { - stage('Checks') { stages { - stage('Lint') { - steps { - script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') } - } - } - stage('Tests') { - steps { - script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') } - } - } - } } - stage('Build') { stages { - stage('JSBundle') { - steps { - script { cmn.nix.shell('make jsbundle-ios') } - } - } - stage('Bundle') { - steps { - script { api = ios.bundle() } - } - } - } } + stage('JSBundle') { + steps { + script { ios.jsbundle() } + } + } + stage('Bundle') { + steps { + script { api = ios.bundle() } + } + post { + failure { + archiveArtifacts 'logs/*' + } } } stage('Parallel Upload') { @@ -86,30 +76,18 @@ pipeline { } } stage('Upload') { - steps { - script { - env.PKG_URL = cmn.uploadArtifact(api) - /* e2e builds get tested in SauceLabs */ - if (btype == 'e2e') { - env.SAUCE_URL = ios.uploadToSauceLabs() - } else { - env.DIAWI_URL = ios.uploadToDiawi() - } - } - } + steps { script { + env.DIAWI_URL = ios.uploadToDiawi() + env.PKG_URL = env.DIAWI_URL + jenkins.setBuildDesc(IPA: env.PKG_URL) + } } } } } - stage('Cleanup') { - steps { - sh 'make watchman-clean' - sh 'make clean' - } - } } post { - success { script { load('ci/github.groovy').notifyPR(true) } } - failure { script { load('ci/github.groovy').notifyPR(false) } } - always { sh 'make _fix-node-perms' } + success { script { github.notifyPR(true) } } + failure { script { github.notifyPR(false) } } + always { sh 'make purge' } } } diff --git a/ci/Jenkinsfile.linux b/ci/Jenkinsfile.linux deleted file mode 100644 index 4854a7853b3..00000000000 --- a/ci/Jenkinsfile.linux +++ /dev/null @@ -1,114 +0,0 @@ -pipeline { - agent { label 'linux' } - - parameters { - string( - name: 'BUILD_TYPE', - description: 'Specify build type. Values: pr / nightly / release', - defaultValue: 'pr', - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 40, unit: 'MINUTES') - /* Limit builds retained */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '20', - artifactNumToKeepStr: '10', - )) - } - - /** - * WARNING: Jenkins ignores PATH changes in Docker - * https://issues.jenkins-ci.org/browse/JENKINS-49076 - **/ - environment { - LANG = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - TARGET = 'linux' - NIX_CONF_DIR = "${env.WORKSPACE}/nix" - VERBOSE_LEVEL = '3' - /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ - LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" - YARN_CACHE_FOLDER = "/var/tmp/yarn-${EXECUTOR_NUMBER}" - GRADLE_USER_HOME = "/var/tmp/gradle-${EXECUTOR_NUMBER}" - } - - stages { - stage('Prep') { - steps { - script { - /* Necessary to load methods */ - desktop = load 'ci/desktop.groovy' - cmn = load 'ci/common.groovy' - btype = cmn.utils.getBuildType() - print "Running ${btype} build!" - cmn.ci.abortPreviousRunningBuilds() - /* Cleanup and Prep */ - cmn.prep(btype) - } - } - } - stage('Parallel Assemble') { - parallel { - stage('Checks') { stages { - stage('Lint') { - steps { - script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') } - } - } - stage('Tests') { - steps { - script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') } - } - } - } } - stage('Build') { stages { - stage('JSBundle') { - steps { - script { desktop.buildJSBundle() } - } - } - stage('Compile') { - steps { - script { desktop.compile() } - } - } - stage('Bundle') { - steps { - script { app = desktop.bundleLinux(btype) } - } - } - } } - } - } - stage('Parallel Upload') { - parallel { - stage('Archive') { - steps { - archiveArtifacts app - } - } - stage('Upload') { - steps { - script { env.PKG_URL = cmn.uploadArtifact(app) } - } - } - } - } - stage('Cleanup') { - steps { - sh 'make watchman-clean' - sh 'make clean' - } - } - } - post { - success { script { load('ci/github.groovy').notifyPR(true) } } - failure { script { load('ci/github.groovy').notifyPR(false) } } - } -} diff --git a/ci/Jenkinsfile.macos b/ci/Jenkinsfile.macos deleted file mode 100644 index c52921bafd9..00000000000 --- a/ci/Jenkinsfile.macos +++ /dev/null @@ -1,112 +0,0 @@ -pipeline { - agent { label 'macos-xcode-11.3.1' } - - parameters { - string( - name: 'BUILD_TYPE', - description: 'Specify build type. Values: pr / nightly / release', - defaultValue: 'pr', - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 30, unit: 'MINUTES') - /* Limit builds retained */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '20', - artifactNumToKeepStr: '10', - )) - } - - environment { - LANG = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - TARGET = 'macos' - NIX_CONF_DIR = "${env.WORKSPACE}/nix" - /* See nix/README.md */ - NIX_IGNORE_SYMLINK_STORE = 1 - VERBOSE_LEVEL = '3' - /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ - LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" - YARN_CACHE_FOLDER = "/var/tmp/yarn-${EXECUTOR_NUMBER}" - GRADLE_USER_HOME = "/var/tmp/gradle-${EXECUTOR_NUMBER}" - } - - stages { - stage('Prep') { - steps { - script { - /* Necessary to load methods */ - desktop = load 'ci/desktop.groovy' - cmn = load 'ci/common.groovy' - btype = cmn.utils.getBuildType() - print "Running ${btype} build!" - cmn.ci.abortPreviousRunningBuilds() - /* Cleanup and Prep */ - cmn.prep(btype) - } - } - } - stage('Parallel Assemble') { - parallel { - stage('Checks') { stages { - stage('Lint') { - steps { - script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') } - } - } - stage('Tests') { - steps { - script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') } - } - } - } } - stage('Build') { stages { - stage('JSBundle') { - steps { - script { desktop.buildJSBundle() } - } - } - stage('Compile') { - steps { - script { desktop.compile() } - } - } - stage('Bundle') { - steps { - script { dmg = desktop.bundleMacOS(btype) } - } - } - } } - } - } - stage('Parallel Upload') { - parallel { - stage('Archive') { - steps { - archiveArtifacts dmg - } - } - stage('Upload') { - steps { - script { env.PKG_URL = cmn.uploadArtifact(dmg) } - } - } - } - } - stage('Cleanup') { - steps { - sh 'make watchman-clean' - sh 'make clean' - } - } - } - post { - success { script { load('ci/github.groovy').notifyPR(true) } } - failure { script { load('ci/github.groovy').notifyPR(false) } } - } -} diff --git a/ci/Jenkinsfile.nix-cache b/ci/Jenkinsfile.nix-cache deleted file mode 100644 index c92af3c4b17..00000000000 --- a/ci/Jenkinsfile.nix-cache +++ /dev/null @@ -1,108 +0,0 @@ -pipeline { - agent { label params.AGENT_LABEL } - - environment { - /* See nix/README.md */ - NIX_IGNORE_SYMLINK_STORE = 1 - /* we source .bash_profile to be able to use nix-store */ - NIX_SSHOPTS = "-o StrictHostKeyChecking=no source .bash_profile;" - /* where our /nix/store is hosted */ - NIX_CACHE_USER = 'nix-cache' - NIX_CACHE_HOST = 'master-01.do-ams3.ci.misc.statusim.net' - NIX_CONF_DIR = "${env.WORKSPACE}/nix" - } - - options { - timestamps() - disableConcurrentBuilds() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 300, unit: 'MINUTES') - /* Limit builds retained */ - buildDiscarder(logRotator( - numToKeepStr: '20', - daysToKeepStr: '30', - )) - } - - stages { - stage('Prep') { - steps { script { - nix = load('ci/nix.groovy') - } } - } - stage('Setup') { - steps { script { - nix.shell('nix-env -i openssh', pure: false) - /* some build targets don't build on MacOS */ - uname = sh(script: 'uname', returnStdout: true) - } } - } - stage('Build status-go') { - steps { script { - def platforms = ['android', 'desktop', 'ios'] - if (uname != "Darwin") { - platforms.removeAll { it == "ios" } - } - platforms.each { os -> - nix.build( - attr: "targets.status-go.${os}.buildInputs", - sandbox: false, - link: false - ) - } - } } - } - stage('Build android jsbundle') { - steps { script { - /* build/fetch things required to produce a js-bundle for android - * (e.g. maven and node repos) */ - nix.build( - attr: 'targets.mobile.android.jsbundle', - sandbox: false, - pure: false, - link: false - ) - } } - } - stage('Build android deps') { - steps { script { - /* build/fetch things required to build jsbundle and android */ - nix.build( - attr: 'targets.mobile.android.buildInputs', - sandbox: false, - pure: false, - link: false - ) - } } - } - stage('Build nix shell deps') { - steps { script { - /* build/fetch things required to instantiate shell.nix for TARGET=all */ - nix.build( - attr: 'shells.default.buildInputs', - sandbox: false, - link: false - ) - } } - } - stage('Upload') { - steps { script { - sshagent(credentials: ['nix-cache-ssh']) { - nix.shell(""" - find /nix/store/ -mindepth 1 -maxdepth 1 -type d \ - -not -name '*.links' -and -not -name '*-status-react-*' \ - | xargs nix-copy-closure -v --to ${NIX_CACHE_USER}@${NIX_CACHE_HOST} - """, - pure: false - ) - } - } } - } - } - post { - always { script { - nix.shell('nix-store --optimize', pure: false) - nix.shell('nix/scripts/clean.sh', pure: false) - } } - } -} diff --git a/ci/Jenkinsfile.tests b/ci/Jenkinsfile.tests new file mode 100644 index 00000000000..d043c846bdc --- /dev/null +++ b/ci/Jenkinsfile.tests @@ -0,0 +1,100 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +/* Options section can't access functions in objects. */ +def isPRBuild = utils.isPRBuild() + +pipeline { + agent { label 'linux && x86_64 && nix-2.24' } + + options { + timestamps() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 20, unit: 'MINUTES') + /* Limit builds retained */ + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '20', + artifactNumToKeepStr: '1', + )) + /* Abort old PR builds. */ + disableConcurrentBuilds( + abortPrevious: isPRBuild + ) + } + + parameters { + string( + name: 'BUILD_TYPE', + description: 'Specify build type. Values: pr / e2e / nightly / release', + defaultValue: 'pr', + ) + booleanParam( + name: 'RUN_CONTRACT_TESTS', + description: 'Whether to run optional and slow contract tests.', + defaultValue: false, + ) + } + + environment { + LANG = 'en_US.UTF-8' + LC_ALL = 'en_US.UTF-8' + LANGUAGE = 'en_US.UTF-8' + PLATFORM = 'tests' + BUILD_ENV = 'prod' + NIX_CONF_DIR = "${env.WORKSPACE}/nix" + LOG_FILE = utils.pkgFilename(ext: 'log', arch: 'tests') + CLJ_LINTER_PRINT_WARNINGS = 'true' + } + + stages { + stage('Test') { + parallel { + stage('Lint') { + steps { make('lint') } + } + stage('Unit') { + steps { make('test-unit') } + } + stage('Component') { + steps { make('test-component') } + } + } + } + stage('Heavy Test') { + parallel { + stage('Contract') { + when { expression { params.RUN_CONTRACT_TESTS } } + steps { make('test-contract') } + } + stage('Integration') { + steps { make('test-integration') } + } + } + } + stage('Upload') { + steps { + script { + env.PKG_URL = s5cmd.upload(LOG_FILE) + } + } + } + stage('Commit Checks') { + steps { + make('lint-commits') + } + } + } + post { + success { script { github.notifyPR(true) } } + failure { script { github.notifyPR(false) } } + always { sh 'make purge' } + } +} + +def make(target) { + sh """#!/bin/bash + set -eo pipefail + make ${target} 2>&1 | tee -a ${LOG_FILE} + """ +} diff --git a/ci/Jenkinsfile.windows b/ci/Jenkinsfile.windows deleted file mode 100644 index 3db1a5403bd..00000000000 --- a/ci/Jenkinsfile.windows +++ /dev/null @@ -1,117 +0,0 @@ -pipeline { - agent { label 'linux' } - - parameters { - string( - name: 'BUILD_TYPE', - description: 'Specify build type. Values: pr / nightly / release', - defaultValue: 'pr', - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 45, unit: 'MINUTES') - /* Limit builds retained */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '20', - artifactNumToKeepStr: '10', - )) - } - - /** - * WARNING: Jenkins ignores PATH changes in Docker - * https://issues.jenkins-ci.org/browse/JENKINS-49076 - **/ - environment { - LANG = "en_US.UTF-8" - LC_ALL = "en_US.UTF-8" - LANGUAGE = "en_US.UTF-8" - TARGET = 'windows' - NIX_CONF_DIR = "${env.WORKSPACE}/nix" - VERBOSE_LEVEL = '3' - /* Conan settings */ - CONAN_PRINT_RUN_COMMANDS = '1' - CONAN_SYSREQUIRES_MODE = 'disabled' - CONAN_SYSREQUIRES_SUDO = '0' - /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ - LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" - YARN_CACHE_FOLDER = "/var/tmp/yarn-${EXECUTOR_NUMBER}" - } - - stages { - stage('Prep') { - steps { - script { - /* Necessary to load methods */ - desktop = load 'ci/desktop.groovy' - cmn = load 'ci/common.groovy' - btype = cmn.utils.getBuildType() - print "Running ${btype} build!" - cmn.ci.abortPreviousRunningBuilds() - /* Cleanup and Prep */ - cmn.prep(btype) - } - } - } - stage('Parallel Assemble') { - parallel { - stage('Checks') { stages { - stage('Lint') { - steps { - script { cmn.nix.shell('lein cljfmt check', attr: 'shells.lein') } - } - } - stage('Tests') { - steps { - script { cmn.nix.shell('lein test-cljs', attr: 'shells.lein') } - } - } - } } - stage('Build') { stages { - stage('JSBundle') { - steps { - script { desktop.buildJSBundle() } - } - } - stage('Compile') { - steps { - script { desktop.compile() } - } - } - stage('Bundle') { - steps { - script { app = desktop.bundleWindows(btype) } - } - } - } } - } - } - stage('Parallel Upload') { - parallel { - stage('Archive') { - steps { - archiveArtifacts app - } - } - stage('Upload') { - steps { - script { env.PKG_URL = cmn.uploadArtifact(app) } - } - } - } - } - stage('Cleanup') { - steps { - sh 'make watchman-clean' - sh 'make clean' - } - } - } - post { - success { script { load('ci/github.groovy').notifyPR(true) } } - failure { script { load('ci/github.groovy').notifyPR(false) } } - } -} diff --git a/ci/README.md b/ci/README.md new file mode 100644 index 00000000000..6a087094855 --- /dev/null +++ b/ci/README.md @@ -0,0 +1,16 @@ +# Description + +This folder contains files defininf [Jenkins pipelines](https://jenkins.io/doc/book/pipeline/) that run on https://ci.status.im/. + +# Libraries + +All `Jenkinsfile`s contain the following line: +```groovy +library 'status-jenkins-lib@master' +``` + +Which loads the used methods - like `nix.shell()` - from a separate private repo: + +https://github.com/status-im/status-jenkins-lib + +This is done to improve security of our CI setup. diff --git a/ci/android.groovy b/ci/android.groovy deleted file mode 100644 index b13640e8b21..00000000000 --- a/ci/android.groovy +++ /dev/null @@ -1,178 +0,0 @@ -nix = load 'ci/nix.groovy' -utils = load 'ci/utils.groovy' - -def bundle() { - /* we use the method because parameter build type does not take e2e into account */ - def btype = utils.getBuildType() - /* Disable Gradle Daemon https://stackoverflow.com/questions/38710327/jenkins-builds-fail-using-the-gradle-daemon */ - def gradleOpt = "-PbuildUrl='${currentBuild.absoluteUrl}' --console plain " - /* Can't take more digits than unsigned int */ - def buildNumber = utils.readBuildNumber().substring(0, 10) - /* we don't need x86 for any builds except e2e */ - env.ANDROID_ABI_INCLUDE="armeabi-v7a;arm64-v8a" - env.ANDROID_ABI_SPLIT="false" - - /* some builds tyes require different architectures */ - switch (btype) { - case 'e2e': - env.ANDROID_ABI_INCLUDE="x86" /* e2e builds are used with simulators */ - break - case 'release': - env.ANDROID_ABI_SPLIT="true" - gradleOpt += "-PreleaseVersion='${utils.getVersion()}'" - break - } - - /* credentials necessary to open the keystore and sign the APK */ - withCredentials([ - file( - credentialsId: 'status-im.keystore', - variable: 'KEYSTORE_PATH' - ), - string( - credentialsId: 'android-keystore-pass', - variable: 'KEYSTORE_PASSWORD' - ), - usernamePassword( - credentialsId: 'android-keystore-key-pass', - usernameVariable: 'KEYSTORE_ALIAS', - passwordVariable: 'KEYSTORE_KEY_PASSWORD' - ) - ]) { - /* Nix target which produces the final APKs */ - nix.build( - attr: 'targets.mobile.android.release', - conf: [ - 'status-im.ci': '1', - 'status-im.build-type': btype, - 'status-im.status-react.gradle-opts': gradleOpt, - 'status-im.status-react.build-number': buildNumber, - ], - safeEnv: [ - 'KEYSTORE_ALIAS', - 'KEYSTORE_PASSWORD', - 'KEYSTORE_KEY_PASSWORD', - ], - keepEnv: [ - 'ANDROID_ABI_SPLIT', - 'ANDROID_ABI_INCLUDE', - 'KEYSTORE_PATH', - ], - sandboxPaths: [ - env.KEYSTORE_PATH, - ], - link: false - ) - } - /* necessary for Fastlane */ - def apks = renameAPKs() - /* for use with Fastlane */ - env.APK_PATHS = apks.join(";") - return apks -} - -def extractArchFromAPK(name) { - def pattern = /app-(.+)-[^-]+.apk/ - /* extract architecture from filename */ - def matches = (name =~ pattern) - if (matches.size() > 0) { - return matches[0][1] - } - if (utils.isE2EBuild()) { - return 'x86' - } - /* non-release builds make universal APKs */ - return 'universal' -} - -/** - * We need more informative filenames for all builds. - * For more details on the format see utils.pkgFilename(). - **/ -def renameAPKs() { - /* find all APK files */ - def apkGlob = 'result/*.apk' - def found = findFiles(glob: apkGlob) - if (found.size() == 0) { - throw "APKs not found via glob: ${apkGlob}" - } - def renamed = [] - /* rename each for upload & archiving */ - for (apk in found) { - def arch = extractArchFromAPK(apk) - def pkg = utils.pkgFilename(env.BUILD_TYPE, 'apk', arch) - def newApk = "result/${pkg}" - renamed += newApk - sh "cp ${apk.path} ${newApk}" - } - return renamed -} - -def uploadToPlayStore(type = 'nightly') { - withCredentials([ - string(credentialsId: "SUPPLY_JSON_KEY_DATA", variable: 'GOOGLE_PLAY_JSON_KEY'), - ]) { - nix.shell( - "fastlane android ${type}", - keepEnv: ['FASTLANE_DISABLE_COLORS', 'APK_PATHS', 'GOOGLE_PLAY_JSON_KEY'], - attr: 'shells.fastlane', - pure: false - ) - } -} - -def uploadToSauceLabs() { - def changeId = utils.changeId() - if (changeId != null) { - env.SAUCE_LABS_NAME = "${changeId}.apk" - } else { - def pkg = utils.pkgFilename(env.BUILD_TYPE, 'apk', 'x86') - env.SAUCE_LABS_NAME = "${pkg}" - } - withCredentials([ - usernamePassword( - credentialsId: 'sauce-labs-api', - usernameVariable: 'SAUCE_USERNAME', - passwordVariable: 'SAUCE_ACCESS_KEY' - ), - ]) { - nix.shell( - 'fastlane android saucelabs', - keepEnv: [ - 'FASTLANE_DISABLE_COLORS', 'APK_PATHS', - 'SAUCE_ACCESS_KEY', 'SAUCE_USERNAME', 'SAUCE_LABS_NAME' - ], - attr: 'shells.fastlane', - pure: false - ) - } - return env.SAUCE_LABS_NAME -} - -def uploadToDiawi() { - withCredentials([ - string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'), - ]) { - nix.shell( - 'fastlane android upload_diawi', - keepEnv: ['FASTLANE_DISABLE_COLORS', 'APK_PATHS', 'DIAWI_TOKEN'], - attr: 'shells.fastlane', - pure: false - ) - } - diawiUrl = readFile "${env.WORKSPACE}/fastlane/diawi.out" - return diawiUrl -} - -def coverage() { - withCredentials([ - string(credentialsId: 'coveralls-status-react-token', variable: 'COVERALLS_REPO_TOKEN'), - ]) { - nix.shell( - 'make coverage', - keepEnv: ['COVERALLS_REPO_TOKEN', 'COVERALLS_SERVICE_NAME', 'COVERALLS_SERVICE_JOB_ID'] - ) - } -} - -return this diff --git a/ci/common.groovy b/ci/common.groovy deleted file mode 100644 index 717be12565c..00000000000 --- a/ci/common.groovy +++ /dev/null @@ -1,100 +0,0 @@ -import groovy.json.JsonBuilder - -/* Libraries -----------------------------------------------------------------*/ - -ci = load 'ci/jenkins.groovy' -nix = load 'ci/nix.groovy' -utils = load 'ci/utils.groovy' - -/* Small Helpers -------------------------------------------------------------*/ - -def pkgUrl(build) { - return utils.getEnv(build, 'PKG_URL') -} - -def updateBucketJSON(urls, fileName) { - /* latest.json has slightly different key names */ - def content = [ - DIAWI: urls.Diawi, - APK: urls.Apk, IOS: urls.iOS, - APP: urls.App, MAC: urls.Mac, - WIN: urls.Win, SHA: urls.SHA - ] - def filePath = "${pwd()}/pkg/${fileName}" - /* it might not exist */ - sh "mkdir -p ${pwd()}/pkg" - def contentJson = new JsonBuilder(content).toPrettyString() - println "${filePath}:\n${contentJson}" - writeFile(file: filePath, text: contentJson) - return uploadArtifact(filePath) -} - -def prep(type = 'nightly') { - /* build/downloads all nix deps in advance */ - nix.prepEnv() - /* rebase unless this is a release build */ - utils.doGitRebase() - /* ensure that we start from a known state */ - sh 'make clean' - /* Disable git hooks in CI, it's not useful, takes time and creates weird errors at times - (e.g. bin/sh: 2: /etc/ssl/certs/ca-certificates.crt: Permission denied) */ - sh 'make disable-githooks' - - /* pick right .env and update from params */ - utils.updateEnv(type) - - if (['android', 'ios'].contains(env.TARGET)) { - /* Run at start to void mismatched numbers */ - utils.genBuildNumber() - } - - nix.shell('watchman watch-del-all', attr: 'shells.watchman') - - if (env.TARGET == 'ios') { - /* install ruby dependencies */ - nix.shell( - 'bundle install --gemfile=fastlane/Gemfile --quiet', - attr: 'shells.fastlane') - } - - if (['macos', 'linux', 'windows'].contains(env.TARGET)) { - /* node deps, pods, and status-go download */ - nix.shell('scripts/prepare-for-desktop-platform.sh', pure: false) - } - /* run script in the nix shell so that node_modules gets instantiated before attempting the copies */ - nix.shell('scripts/copy-translations.sh chmod', attr: "shells.${env.TARGET}") -} - -def uploadArtifact(path) { - /* defaults for upload */ - def domain = 'ams3.digitaloceanspaces.com' - def bucket = 'status-im' - /* There's so many PR builds we need a separate bucket */ - if (utils.isPRBuild()) { - bucket = 'status-im-prs' - } - /* WARNING: s3cmd can't guess APK MIME content-type */ - def customOpts = '' - if (path.endsWith('apk')) { - customOpts += "--mime-type='application/vnd.android.package-archive'" - } - /* We also need credentials for the upload */ - withCredentials([usernamePassword( - credentialsId: 'digital-ocean-access-keys', - usernameVariable: 'DO_ACCESS_KEY', - passwordVariable: 'DO_SECRET_KEY' - )]) { - sh(""" - s3cmd ${customOpts} \\ - --acl-public \\ - --host="${domain}" \\ - --host-bucket="%(bucket)s.${domain}" \\ - --access_key=${DO_ACCESS_KEY} \\ - --secret_key=${DO_SECRET_KEY} \\ - put ${path} s3://${bucket}/ - """) - } - return "https://${bucket}.${domain}/${utils.getFilename(path)}" -} - -return this diff --git a/ci/desktop.groovy b/ci/desktop.groovy deleted file mode 100644 index 70b96a6c209..00000000000 --- a/ci/desktop.groovy +++ /dev/null @@ -1,109 +0,0 @@ -nix = load 'ci/nix.groovy' -utils = load 'ci/utils.groovy' - -packageFolder = './StatusImPackage' - -def buildJSBundle() { - nix.shell( - ''' - make jsbundle-desktop && \ - ./scripts/build-desktop.sh buildJSBundle - ''', - keepEnv: ['VERBOSE_LEVEL'] - ) -} - -def uploadArtifact(filename) { - def domain = 'ams3.digitaloceanspaces.com' - def bucket = 'status-im-desktop' - withCredentials([usernamePassword( - credentialsId: 'digital-ocean-access-keys', - usernameVariable: 'DO_ACCESS_KEY', - passwordVariable: 'DO_SECRET_KEY' - )]) { - sh """ - s3cmd \\ - --acl-public \\ - --host='${domain}' \\ - --host-bucket='%(bucket)s.${domain}' \\ - --access_key=${DO_ACCESS_KEY} \\ - --secret_key=${DO_SECRET_KEY} \\ - put ${filename} s3://${bucket}/ - """ - - } - def url = "https://${bucket}.${domain}/${filename}" - return url -} - -/* MAIN --------------------------------------------------*/ - -def compile() { - /* disable logs for desktop builds when releasing */ - if (params.BUILD_TYPE == 'release') { - env.STATUS_NO_LOGGING = 1 - } - /* since QT is in a custom path we need to add it to PATH */ - if (env.QT_PATH) { - env.PATH = "${env.QT_PATH}:${env.PATH}" - } - nix.shell( - './scripts/build-desktop.sh compile', - keepEnv: ['VERBOSE_LEVEL'] - ) -} - -def bundleWindows(type = 'nightly') { - def pkg - - nix.shell( - './scripts/build-desktop.sh bundle', - keepEnv: ['VERBOSE_LEVEL'] - ) - dir(packageFolder) { - pkg = utils.pkgFilename(type, 'exe') - sh "mv ../Status-x86_64-setup.exe ${pkg}" - } - return "${packageFolder}/${pkg}".drop(2) -} - -def bundleLinux(type = 'nightly') { - def pkg - nix.shell( - './scripts/build-desktop.sh bundle', - keepEnv: ['VERBOSE_LEVEL'] - ) - dir(packageFolder) { - pkg = utils.pkgFilename(type, 'AppImage') - sh "mv ../Status-x86_64.AppImage ${pkg}" - } - return "${packageFolder}/${pkg}".drop(2) -} - -def bundleMacOS(type = 'nightly') { - def pkg = utils.pkgFilename(type, 'dmg') - nix.shell( - './scripts/build-desktop.sh bundle', - keepEnv: ['VERBOSE_LEVEL'] - ) - dir(packageFolder) { - withCredentials([ - string(credentialsId: 'desktop-gpg-outer-pass', variable: 'GPG_PASS_OUTER'), - string(credentialsId: 'desktop-gpg-inner-pass', variable: 'GPG_PASS_INNER'), - string(credentialsId: 'desktop-keychain-pass', variable: 'KEYCHAIN_PASS') - ]) { - nix.shell( - """ - ../scripts/sign-macos-pkg.sh Status.app ../deployment/macos/macos-developer-id.keychain-db.gpg && \ - ../node_modules/appdmg/bin/appdmg.js ../deployment/macos/status-dmg.json ${pkg} && \ - ../scripts/sign-macos-pkg.sh ${pkg} ../deployment/macos/macos-developer-id.keychain-db.gpg - """, - pure: false, - keepEnv: ['GPG_PASS_OUTER', 'GPG_PASS_INNER', 'KEYCHAIN_PASS'] - ) - } - } - return "${packageFolder}/${pkg}".drop(2) -} - -return this diff --git a/ci/ghcmgr.groovy b/ci/ghcmgr.groovy deleted file mode 100644 index 96f4e5c7a1a..00000000000 --- a/ci/ghcmgr.groovy +++ /dev/null @@ -1,62 +0,0 @@ -import groovy.json.JsonBuilder - -utils = load 'ci/utils.groovy' - -/** - * Methods for interacting with ghcmgr API. - * For more details see: - * https://github.com/status-im/github-comment-manager - **/ - -def buildObj(success) { - def pkg_url = env.PKG_URL - /* a bare ipa file is not installable on iOS */ - if (env.TARGET == 'ios' && env.DIAWI_URL != "") { - pkg_url = env.DIAWI_URL - } - /* assemble build object valid for ghcmgr */ - return [ - id: env.BUILD_DISPLAY_NAME, - commit: GIT_COMMIT.take(8), - success: success != null ? success : true, - platform: env.TARGET + (utils.isE2EBuild() ? '-e2e' : ''), - duration: utils.buildDuration(), - url: currentBuild.absoluteUrl, - pkg_url: pkg_url, - ] -} - -def postBuild(success) { - /** - * This is our own service for avoiding comment spam. - * https://github.com/status-im/github-comment-manager - **/ - def ghcmgrurl = 'https://ghcmgr.status.im' - def body = buildObj(success) - def json = new JsonBuilder(body).toPrettyString() - def stdout = null - withCredentials([usernamePassword( - credentialsId: 'ghcmgr-auth', - usernameVariable: 'GHCMGR_USER', - passwordVariable: 'GHCMGR_PASS' - )]) { - stdout = sh( - returnStdout: true, - script: """ - curl --silent \ - -XPOST --data '${json}' \ - -u '${GHCMGR_USER}:${GHCMGR_PASS}' \ - -w '\nHTTP_CODE:%{http_code}' \ - -H "content-type: application/json" \ - '${ghcmgrurl}/builds/status-react/${utils.changeId()}' - """ - ) - } - /* We're not using --fail because it suppresses server response */ - if (!stdout.contains('HTTP_CODE:201')) { - println("STDOUT:\n${stdout}") - error("Notifying GHCMGR failed") - } -} - -return this diff --git a/ci/github.groovy b/ci/github.groovy deleted file mode 100644 index fdee24c4600..00000000000 --- a/ci/github.groovy +++ /dev/null @@ -1,205 +0,0 @@ -import groovy.json.JsonBuilder - -/* I'm using utils from ghcmgr to avoid another load */ -ghcmgr = load 'ci/ghcmgr.groovy' - -/** - * Methods for interacting with GitHub API and related tools. - **/ - -/* Comments -------------------------------------------------------*/ - -def notify(message) { - def githubIssuesUrl = 'https://api.github.com/repos/status-im/status-react/issues' - def changeId = ghcmgr.utils.changeId() - if (changeId == null) { return } - def msgObj = [body: message] - def msgJson = new JsonBuilder(msgObj).toPrettyString() - withCredentials([usernamePassword( - credentialsId: 'status-im-auto', - usernameVariable: 'GH_USER', - passwordVariable: 'GH_PASS' - )]) { - sh """ - curl --silent \ - -u '${GH_USER}:${GH_PASS}' \ - --data '${msgJson}' \ - -H "Content-Type: application/json" \ - "${githubIssuesUrl}/${changeId}/comments" - """.trim() - } -} - -def notifyFull(urls) { - def msg = "#### :white_check_mark: " - msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) " - msg += "CI BUILD SUCCESSFUL in ${ghcmgr.utils.buildDuration()} (${GIT_COMMIT.take(8)})\n" - msg += '| | | | | |\n' - msg += '|-|-|-|-|-|\n' - msg += "| [Android](${urls.Apk}) ([e2e](${urls.Apke2e})) " - msg += "| [iOS](${urls.iOS}) ([e2e](${urls.iOSe2e})) |" - if (urls.Mac != null) { - msg += " [MacOS](${urls.Mac}) | [AppImage](${urls.App}) | [Windows](${urls.Win}) |" - } else { - msg += " ~~MacOS~~ | ~~AppImage~~ | ~~Windows~~~ |" - } - notify(msg) -} - -def notifyPRFailure() { - def d = ":small_orange_diamond:" - def msg = "#### :x: " - msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) ${d} " - msg += "${ghcmgr.utils.buildDuration()} ${d} ${GIT_COMMIT.take(8)} ${d} " - msg += "[:page_facing_up: build log](${currentBuild.absoluteUrl}/consoleText)" - //msg += "Failed in stage: ${env.STAGE_NAME}\n" - //msg += "```${currentBuild.rawBuild.getLog(5)}```" - notify(msg) -} - -def notifyPRSuccess() { - def d = ":small_blue_diamond:" - def msg = "#### :heavy_check_mark: " - def type = ghcmgr.utils.isE2EBuild() ? ' e2e' : '' - msg += "[${env.JOB_NAME}${currentBuild.displayName}](${currentBuild.absoluteUrl}) ${d} " - msg += "${ghcmgr.utils.buildDuration()} ${d} ${GIT_COMMIT.take(8)} ${d} " - msg += "[:package: ${env.TARGET}${type} package](${env.PKG_URL})" - notify(msg) -} - -/* Releases -------------------------------------------------------*/ - -def getPrevRelease() { - return sh(returnStdout: true, - script: "git for-each-ref --format '%(refname)' --sort=committerdate refs/remotes/origin/release" - ).trim().split('\\r?\\n').last() -} - -def getDiffUrl(prev, current) { - prev = prev.replaceAll(/.*origin\//, '') - return "https://github.com/status-im/status-react/compare/${prev}...${current}" -} - -def getReleaseChanges() { - def prevRelease = getPrevRelease() - def curRelease = ghcmgr.utils.branchName() - def changes = '' - try { - changes = sh(returnStdout: true, - script: """ - git log \ - --cherry-pick \ - --right-only \ - --no-merges \ - --format='%h %s' \ - ${prevRelease}..HEAD - """ - ).trim() - } catch (Exception ex) { - println 'ERROR: Failed to retrieve changes.' - println ex.message - return ':warning: __Please fill me in!__' - } - /* remove single quotes to not confuse formatting */ - changes = changes.replace('\'', '') - return changes + '\nDiff:' + getDiffUrl(prevRelease, curRelease) -} - -def releaseExists(Map args) { - def output = sh( - returnStdout: true, - script: """ - github-release info --json \ - -u '${args.user}' \ - -r '${args.repo}' \ - | jq '.Releases[].tag_name' - """ - ) - return output.contains(args.version) -} - -def releaseDelete(Map args) { - if (!releaseExists(args)) { - return - } - sh """ - github-release delete \ - -u '${args.user}' \ - -r '${args.repo}' \ - -t '${args.version}' \ - """ -} - -def releaseUpload(Map args) { - args.files.each { - sh """ - github-release upload \ - -u '${args.user}' \ - -r '${args.repo}' \ - -t '${args.version}' \ - -n ${it} \ - -f ${it} - """ - } -} - -def releasePublish(Map args) { - sh """ - github-release release \ - -u '${args.user}' \ - -r '${args.repo}' \ - -n '${args.version}' \ - -t '${args.version}' \ - -c '${args.branch}' \ - -d '${args.desc}' \ - ${args.draft ? '--draft' : ''} - """ -} - -def publishRelease(Map args) { - def config = [ - draft: true, - user: 'status-im', - repo: 'status-react', - files: args.files, - version: args.version, - branch: ghcmgr.utils.branchName(), - desc: getReleaseChanges(), - ] - /* we release only for mobile right now */ - withCredentials([usernamePassword( - credentialsId: 'status-im-auto', - usernameVariable: 'GITHUB_USER', - passwordVariable: 'GITHUB_TOKEN' - )]) { - releaseDelete(config) /* so we can re-release it */ - releasePublish(config) - releaseUpload(config) - } -} - -def publishReleaseMobile(path='pkg') { - def found = findFiles(glob: "${path}/*") - if (found.size() == 0) { - sh "ls ${path}" - error("No file to release in ${path}") - } - publishRelease( - version: ghcmgr.utils.getVersion(), - files: found.collect { it.path }, - ) -} - -def notifyPR(success) { - if (ghcmgr.utils.changeId() == null) { return } - try { - ghcmgr.postBuild(success) - } catch (ex) { /* fallback to posting directly to GitHub */ - println "Failed to use GHCMGR: ${ex}" - switch (success) { - case true: notifyPRSuccess(); break - } - } -} - -return this diff --git a/ci/ios.groovy b/ci/ios.groovy deleted file mode 100644 index 9580ed1db44..00000000000 --- a/ci/ios.groovy +++ /dev/null @@ -1,102 +0,0 @@ -nix = load('ci/nix.groovy') -utils = load('ci/utils.groovy') - -def plutil(name, value) { - return """ - plutil -replace ${name} -string ${value} ios/StatusIm/Info.plist; -""" -} - -def bundle() { - def btype = utils.getBuildType() - def target - switch (btype) { - case 'release': target = 'release'; break; - case 'testflight': target = 'release'; break; - case 'e2e': target = 'e2e'; break; - default: target = 'nightly'; - } - /* configure build metadata */ - nix.shell(plutil('CFBundleShortVersionString', utils.getVersion()), attr: 'shells.ios') - nix.shell(plutil('CFBundleVersion', utils.genBuildNumber()), attr: 'shells.ios') - nix.shell(plutil('CFBundleBuildUrl', currentBuild.absoluteUrl), attr: 'shells.ios') - /* the dir might not exist */ - sh 'mkdir -p status-e2e' - /* build the actual app */ - withCredentials([ - string(credentialsId: "slave-pass-${env.NODE_NAME}", variable: 'KEYCHAIN_PASSWORD'), - string(credentialsId: 'fastlane-match-password', variable: 'MATCH_PASSWORD'), - usernamePassword( - credentialsId: 'fastlane-match-apple-id', - usernameVariable: 'FASTLANE_APPLE_ID', - passwordVariable: 'FASTLANE_PASSWORD' - ), - ]) { - nix.shell( - "bundle exec --gemfile=fastlane/Gemfile fastlane ios ${target}", - keepEnv: [ - 'FASTLANE_DISABLE_COLORS', - 'FASTLANE_PASSWORD', 'KEYCHAIN_PASSWORD', - 'MATCH_PASSWORD', 'FASTLANE_APPLE_ID', - ], - attr: 'shells.ios' - ) - } - /* rename built file for uploads and archivization */ - def pkg = '' - if (btype == 'release') { - pkg = utils.pkgFilename('release', 'ipa') - sh "cp status_appstore/StatusIm.ipa ${pkg}" - } else if (btype == 'e2e') { - pkg = utils.pkgFilename('e2e', 'app.zip') - sh "cp status-e2e/StatusIm.app.zip ${pkg}" - } else if (btype != 'testflight') { - pkg = utils.pkgFilename(btype, 'ipa') - sh "cp status-adhoc/StatusIm.ipa ${pkg}" - } - /* necessary for Diawi upload */ - env.DIAWI_IPA = pkg - return pkg -} - -def uploadToDiawi() { - withCredentials([ - string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'), - ]) { - /* This can silently fail with 'File is not processed.' */ - nix.shell( - 'bundle exec --verbose --gemfile=fastlane/Gemfile fastlane ios upload_diawi', - keepEnv: ['FASTLANE_DISABLE_COLORS', 'DIAWI_TOKEN'], - attr: 'shells.fastlane' - ) - } - diawiUrl = readFile "${env.WORKSPACE}/fastlane/diawi.out" - /* Save the URL in the build description */ - currentBuild.description = "Diawi Link" - return diawiUrl -} - -def uploadToSauceLabs() { - def changeId = utils.getParentRunEnv('CHANGE_ID') - if (changeId != null) { - env.SAUCE_LABS_NAME = "${changeId}.app.zip" - } else { - env.SAUCE_LABS_NAME = "im.status.ethereum-e2e-${utils.gitCommit()}.app.zip" - } - withCredentials([ - usernamePassword( - credentialsId: 'sauce-labs-api', - usernameVariable: 'SAUCE_USERNAME', - passwordVariable: 'SAUCE_ACCESS_KEY' - ), - ]) { - nix.shell( - 'bundle exec --gemfile=fastlane/Gemfile fastlane ios saucelabs', - keepEnv: ['FASTLANE_DISABLE_COLORS', 'SAUCE_ACCESS_KEY', 'SAUCE_USERNAME'], - attr: 'shells.fastlane' - ) - } - return env.SAUCE_LABS_NAME -} - -return this diff --git a/ci/jenkins.groovy b/ci/jenkins.groovy deleted file mode 100644 index 2d97a6fee10..00000000000 --- a/ci/jenkins.groovy +++ /dev/null @@ -1,92 +0,0 @@ -import jenkins.model.CauseOfInterruption.UserInterruption -import hudson.model.Result -import hudson.model.Run - -utils = load 'ci/utils.groovy' - -@NonCPS -def abortPreviousRunningBuilds() { - /* Aborting makes sense only for PR builds, since devs start so many of them */ - if (!env.JOB_NAME.contains('status-react/prs')) { - println ">> Not aborting any previous jobs. Not a PR build." - return - } - Run previousBuild = currentBuild.rawBuild.getPreviousBuildInProgress() - - while (previousBuild != null) { - if (previousBuild.isInProgress()) { - def executor = previousBuild.getExecutor() - if (executor != null) { - println ">> Aborting older build #${previousBuild.number}" - executor.interrupt(Result.ABORTED, new UserInterruption( - "newer build #${currentBuild.number}" - )) - } - } - - previousBuild = previousBuild.getPreviousBuildInProgress() - } -} - -def strParam(key, value) { - /* just a helper for making string params */ - return [ - name: key, - value: value, - $class: 'StringParameterValue', - ] -} - -def Build(name = null) { - /** - * Generate parameters to pass from current params - * This allows utils.updateEnv() to work in sub-jobs - **/ - parameters = params.keySet().collectEntries { key -> - [(key): strParam(key, params.get(key))] - } - /* default to current build type */ - parameters['BUILD_TYPE'] = strParam('BUILD_TYPE', utils.getBuildType()) - /* need to drop origin/ to match definitions of child jobs */ - parameters['BRANCH'] = strParam('BRANCH', utils.branchName()) - /* necessary for updating GitHub PRs */ - parameters['CHANGE_ID'] = strParam('CHANGE_ID', env.CHANGE_ID) - /* always pass the BRANCH and BUILD_TYPE params with current branch */ - def b = build( - job: name, - /* this allows us to analize the job even after failure */ - propagate: false, - parameters: parameters.values() - ) - /* BlueOcean seems to not show child-build links */ - println "Build: ${b.getAbsoluteUrl()} (${b.result})" - if (b.result != 'SUCCESS') { - error("Build Failed") - } - return b -} - -def copyArts(build) { - /** - * The build argument is of class RunWrapper. - * https://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html - **/ - copyArtifacts( - projectName: build.fullProjectName, - target: 'pkg', - flatten: true, - selector: specific("${build.number}") - ) -} - -def setBuildDesc(Map links) { - def desc = 'Links: \n' - links.each { type, url -> - if (url != null) { - desc += "${type} \n" - } - } - currentBuild.description = desc -} - -return this diff --git a/ci/nix.groovy b/ci/nix.groovy deleted file mode 100644 index caefd2fa6c6..00000000000 --- a/ci/nix.groovy +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Arguments: - * - pure - Use --pure mode with Nix for more deterministic behaviour - * - args - Map of arguments to provide to --argstr - * - keepEnv - List of env variables to keep even in pure mode - **/ -def shell(Map opts = [:], String cmd) { - def defaults = [ - pure: true, - args: ['target': env.TARGET ? env.TARGET : 'default'], - keepEnv: ['LOCALE_ARCHIVE_2_27'], - sandbox: true, - ] - /* merge defaults with received opts */ - opts = defaults + opts - /* previous merge overwrites the array */ - opts.keepEnv = (opts.keepEnv + defaults.keepEnv).unique() - /* not all targets can use a pure build */ - if (env.TARGET in ['windows', 'ios']) { - opts.pure = false - } - sh(""" - set +x - . ~/.nix-profile/etc/profile.d/nix.sh - set -x - nix-shell --run \'${cmd}\' ${_getNixCommandArgs(opts, true)} - """) -} - -/** - * Arguments: - * - pure - Use --pure mode with Nix for more deterministic behaviour - * - link - Bu default build creates a `result` directory, you can turn that off - * - conf - Map of config values to provide to --arg config - * - args - Map of arguments to provide to --argstr - * - attr - Name of attribute to use with --attr flag - * - keepEnv - List of env variables to pass through to Nix build - * - safeEnv - Name of env variables to pass securely through to Nix build (they won't get captured in Nix derivation file) - * - sandbox - If build process should run inside of a sandbox - * - sandboxPaths - List of file paths to make available in Nix sandbox - **/ -def build(Map opts = [:]) { - def defaults = [ - pure: true, - link: true, - args: ['target': env.TARGET], - conf: [:], - attr: null, - keepEnv: [], - safeEnv: [], - sandbox: true, - sandboxPaths: [], - ] - /* merge defaults with received opts */ - opts = defaults + opts - /* Previous merge overwrites the array */ - opts.args = defaults.args + opts.args - opts.keepEnv = (opts.keepEnv + defaults.keepEnv).unique() - - def nixPath = sh( - returnStdout: true, - script: """ - set +x - . ~/.nix-profile/etc/profile.d/nix.sh - set -x - nix-build ${_getNixCommandArgs(opts, false)} - """ - ).trim() - /* if not linking, copy results, but only if there's just one path */ - if (!opts.link && nixPath && !nixPath.contains('\n')) { - copyResults(nixPath) - } - return nixPath -} - -private def copyResults(path) { - def resultsPath = "${env.WORKSPACE}/result" - sh "rm -fr ${resultsPath}" - sh "mkdir -p ${resultsPath}" - sh "cp -fr ${path}/* ${resultsPath}/" - sh "chmod -R 755 ${resultsPath}" -} - -private makeNixBuildEnvFile(Map opts = [:]) { - File envFile = File.createTempFile("nix-env", ".tmp") - if (!opts.safeEnv.isEmpty()) { - // Export the environment variables we want to keep into a temporary script we can pass to Nix and source it from the build script - def exportCommandList = opts.safeEnv.collect { envVarName -> """ - echo \"export ${envVarName}=\\\"\$(printenv ${envVarName})\\\"\" >> ${envFile.absolutePath} - """ } - def exportCommands = exportCommandList.join("") - sh """ - ${exportCommands} - chmod u+x ${envFile.absolutePath} - """ - - opts.args = opts.args + [ 'secrets-file': envFile.absolutePath ] - opts.sandboxPaths = opts.sandboxPaths + envFile.absolutePath - } - - return envFile -} - -private def _getNixCommandArgs(Map opts = [:], boolean isShell) { - def keepFlags = [] - def entryPoint = "\'${env.WORKSPACE}/shell.nix\'" - if (!isShell || opts.attr != null) { - entryPoint = "\'${env.WORKSPACE}/default.nix\'" - } - /* don't let nix.conf control sandbox status */ - def extraSandboxPathsFlag = "--option sandbox ${opts.sandbox}" - - if (isShell) { - keepFlags = opts.keepEnv.collect { var -> "--keep ${var} " } - } else { - def envVarsList = opts.keepEnv.collect { var -> "${var}=\"${env[var]}\";" } - keepFlags = ["--arg env \'{${envVarsList.join("")}}\'"] - - /* Export the environment variables we want to keep into - * a Nix attribute set we can pass to Nix and source it from the build script */ - def envFile = makeNixBuildEnvFile(opts) - envFile.deleteOnExit() - } - - def configFlag = '' - def argsFlags = opts.args.collect { key,val -> "--argstr ${key} \'${val}\'" } - def attrFlag = '' - if (opts.attr != null) { - attrFlag = "--attr '${opts.attr}'" - } - if (opts.conf != null && opts.conf != [:]) { - def configFlags = opts.conf.collect { key,val -> "${key}=\"${val}\";" } - configFlag = "--arg config \'{${configFlags.join('')}}\'" - } - if (opts.sandboxPaths != null && !opts.sandboxPaths.isEmpty()) { - extraSandboxPathsFlag += " --option extra-sandbox-paths \"${opts.sandboxPaths.join(' ')}\"" - } - - return [ - opts.pure ? "--pure" : "", - opts.link ? "" : "--no-out-link", - configFlag, - keepFlags.join(" "), - argsFlags.join(" "), - extraSandboxPathsFlag, - attrFlag, - entryPoint, - ].join(" ") -} - -def prepEnv() { - if (env.TARGET in ['linux', 'windows', 'android']) { - def glibcLocales = sh( - returnStdout: true, - script: """ - . ~/.nix-profile/etc/profile.d/nix.sh && \\ - nix-build --no-out-link '' -A glibcLocales - """ - ).trim() - /** - * This is a hack to fix missing locale errors. - * See: - * - https://github.com/NixOS/nixpkgs/issues/38991 - * - https://qiita.com/kimagure/items/4449ceb0bda5c10ca50f - **/ - env.LOCALE_ARCHIVE_2_27 = "${glibcLocales}/lib/locale/locale-archive" - } -} - -return this diff --git a/ci/tests/Jenkinsfile.e2e-nightly b/ci/tests/Jenkinsfile.e2e-nightly index 0758471d6b0..355d1c64673 100644 --- a/ci/tests/Jenkinsfile.e2e-nightly +++ b/ci/tests/Jenkinsfile.e2e-nightly @@ -1,32 +1,69 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + pipeline { agent { label 'linux' } parameters { string( - name: 'NETWORK', - description: 'Name of test network to use.', - defaultValue: 'ropsten', + name: 'APK_BUILD_NUMBER', + description: 'platform/e2e build number for apk artifact', + ) + string( + name: 'KEYWORD_EXPRESSION', + description: 'This will run tests which contain names that match the given string expression (Optional)', + defaultValue: '', ) string( - name: 'APK_NAME', - description: 'Filename of APK uploaded to SauceLabs.', + name: 'BRANCH', + description: 'Name of the branch to checkout and build.', + defaultValue: 'develop', + ) + string( + name: 'TR_CASE_IDS', + description: 'IDs of the TestRail case, separated by a comma (Optional)', + defaultValue: '', ) } options { disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '30', + artifactNumToKeepStr: '1', + )) } + environment { + /* Avoid race conditions with other builds using virtualenv. */ + VIRTUAL_ENV = "${WORKSPACE_TMP}/venv" + PATH = "${VIRTUAL_ENV}/bin:${PATH}" + } stages { + stage('Fetch') { + steps { script { + copyArtifacts( + projectName: "status-mobile/platforms/android-e2e", + filter: 'result/*-x86_64.apk', + selector: specific(env.APK_BUILD_NUMBER), + ) + apk_path = "${env.WORKSPACE}/${utils.findFile('result/*-x86_64.apk')}" + + } } + } + stage('Setup') { steps { script { dir('test/appium') { - sh 'pip3 install --user -r requirements.txt' + sh "python3 -m venv ${VIRTUAL_ENV}" + sh 'pip3 install -r requirements.txt' } } } } + stage('Test') { steps { withCredentials([ @@ -36,22 +73,34 @@ pipeline { passwordVariable: 'TESTRAIL_PASS' ), usernamePassword( - credentialsId: 'sauce-labs-api', - usernameVariable: 'SAUCE_USERNAME', - passwordVariable: 'SAUCE_ACCESS_KEY' + credentialsId: 'lambda-test-api', + usernameVariable: 'LAMBDA_TEST_USERNAME', + passwordVariable: 'LAMBDA_TEST_ACCESS_KEY' ), string( credentialsId: 'etherscan-api-key', variable: 'ETHERSCAN_API_KEY' ), + string( + credentialsId: 'infura-e2e-token', + variable: 'WEB3_INFURA_PROJECT_ID' + ), + file( + credentialsId: "mobile-tests-eth-accounts", + variable: 'TEST_ETH_ACCOUNTS_FILE' + ), ]) { dir('test/appium/tests') { + /* Provide Eth test accounts secrets. */ + sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py' sh """ - python3 -m pytest -m testrail_id \ - -n24 --rerun_count=2 \ + python3 -m pytest \ + --numprocesses 9 \ --testrail_report=True \ - --network=${params.NETWORK} \ - --apk=${params.APK_NAME} + -m testrail_id \ + -m \"nightly\" \ + -k \"${params.KEYWORD_EXPRESSION}\" \ + --apk=${params.APK_URL ?: apk_path} """ } } @@ -60,20 +109,8 @@ pipeline { } post { - always { - script { - sauce('sauce-labs-cred') { - saucePublisher() - } - } - } - success { - script { - junit( - testDataPublishers: [[$class: 'SauceOnDemandReportPublisher', jobVisibility: 'public']], - testResults: 'test/appium/tests/*.xml' - ) - } + cleanup { + sh 'make purge' } } } diff --git a/ci/tests/Jenkinsfile.e2e-prs b/ci/tests/Jenkinsfile.e2e-prs index bf7741493fd..909eafce2af 100644 --- a/ci/tests/Jenkinsfile.e2e-prs +++ b/ci/tests/Jenkinsfile.e2e-prs @@ -1,3 +1,6 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + pipeline { agent { label 'linux' } @@ -9,60 +12,96 @@ pipeline { defaultValue: 'develop', ) string( - name: 'NETWORK', - description: 'Name of test network to use.', - defaultValue: 'ropsten', - ) - string( - name: 'TEST_MARKERS', - description: 'Marker expression for matching tests to run.', - defaultValue: 'critical or high', + name: 'PR_ID', + description: 'ID of the Pull Request triggering this build.', ) string( - name: 'APK_NAME', - description: 'Filename of APK uploaded to SauceLabs, path, or URL.', + name: 'APK_URL', + description: 'Optional, set if job require APK to be downloaded from URL.', ) string( - name: 'PR_ID', - description: 'ID of the Pull Request triggering this build.', + name: 'KEYWORD_EXPRESSION', + description: 'This will run tests which contain names that match the given string expression (Optional)', + defaultValue: '', ) string( name: 'TR_CASE_IDS', - description: 'IDs of the TestRail case, separated by a comma. (Optional)', + description: 'IDs of the TestRail case, separated by a comma (Optional)', defaultValue: '', ) + /* FIXME: Remove this no longer relevant argument */ + string( + name: 'APK_NAME', + description: 'OBSOLETE ARGUMENT TO BE REMOVED', + defaultValue: 'DUMMY', + ) + string( + name: 'TEST_MARKERS', + description: 'Marker expression for matching tests to run.', + defaultValue: 'smoke', + ) } options { disableConcurrentBuilds() + timeout(time: 90, unit: 'MINUTES') + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '30', + artifactNumToKeepStr: '1', + )) + } + + environment { + /* Avoid race conditions with other builds using virtualenv. */ + VIRTUAL_ENV = "${WORKSPACE_TMP}/venv" + PATH = "${VIRTUAL_ENV}/bin:${PATH}" } stages { - stage('Checks') { + stage('Prep') { + steps { script { + currentBuild.displayName = "PR-${params.PR_ID}" + if (params.PR_ID == null) { + error("PR_ID parameter not set!") + } + } } + } + + stage('Fetch') { + when { expression { !params.APK_URL } } steps { script { - if (params.APK_NAME == null) { error("APK_NAME parameter not set!") } - if (params.PR_ID == null) { error("PR_ID parameter not set!") } + copyArtifacts( + projectName: "status-mobile/prs/android-e2e/PR-${params.PR_ID}", + /* WARNING: This copies the latest available artifact. */ + selector: lastWithArtifacts(), + ) + apk_path = "${env.WORKSPACE}/${utils.findFile('result/*.apk')}" } } } + stage('Setup') { steps { script { dir('test/appium') { - sh 'pip3 install --user -r requirements.txt' + sh "python3 -m venv ${VIRTUAL_ENV}" + sh 'pip3 install -r requirements.txt' } } } } + stage('Test') { steps { script { - currentBuild.displayName = "PR-${params.PR_ID}" /* for managing optional arguments */ def extraPytestOpts = '' if (params.TR_CASE_IDS != '') { extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'" + } else { + extraPytestOpts = "-m \"${params.TEST_MARKERS}\"" } withCredentials([ usernamePassword( - credentialsId: 'status-im-auto-token', + credentialsId: 'status-im-auto', usernameVariable: 'GIT_HUB_USER', /* ignored */ passwordVariable: 'GIT_HUB_TOKEN' ), @@ -72,24 +111,33 @@ pipeline { passwordVariable: 'TESTRAIL_PASS' ), usernamePassword( - credentialsId: 'sauce-labs-api', - usernameVariable: 'SAUCE_USERNAME', - passwordVariable: 'SAUCE_ACCESS_KEY' + credentialsId: 'lambda-test-api', + usernameVariable: 'LAMBDA_TEST_USERNAME', + passwordVariable: 'LAMBDA_TEST_ACCESS_KEY' ), string( credentialsId: 'etherscan-api-key', variable: 'ETHERSCAN_API_KEY' ), + string( + credentialsId: 'infura-e2e-token', + variable: 'WEB3_INFURA_PROJECT_ID' + ), + file( + credentialsId: "mobile-tests-eth-accounts", + variable: 'TEST_ETH_ACCOUNTS_FILE' + ), ]) { dir('test/appium/tests') { + /* Provide Eth test account secrets. */ + sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py' sh """ - python3 -m pytest -n24 \ - --rerun_count=2 \ + python3 -m pytest \ + --numprocesses 9 \ --testrail_report=True \ - -m "${params.TEST_MARKERS}" \ - --network=${params.NETWORK} \ - --apk=${params.APK_NAME} \ - --build=PR-${params.PR_ID} \ + -k \"${params.KEYWORD_EXPRESSION}\" \ + --apk=${params.APK_URL ?: apk_path} \ + --build=PR-${params.PR_ID}-${utils.timestamp()} \ --pr_number=${params.PR_ID} \ ${extraPytestOpts} """ @@ -98,4 +146,9 @@ pipeline { } } } } + post { + cleanup { + sh 'make purge' + } + } } diff --git a/ci/tests/Jenkinsfile.e2e-upgrade b/ci/tests/Jenkinsfile.e2e-upgrade new file mode 100644 index 00000000000..32ac6064eae --- /dev/null +++ b/ci/tests/Jenkinsfile.e2e-upgrade @@ -0,0 +1,136 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + + agent { label 'linux' } + + parameters { + string( + name: 'APK_URL', + description: 'URL of APK to be tested(base for upgrade, usually release build)', + ) + string( + name: 'APK_URL_UPGRADE', + description: 'URL of APK of upgraded application (installed on top of base)', + ) + string( + name: 'KEYWORD_EXPRESSION', + description: 'This will run tests which contain names that match the given string expression (Optional)', + defaultValue: '', + ) + string( + name: 'TR_CASE_IDS', + description: 'IDs of the TestRail case, separated by a comma (Optional)', + defaultValue: '', + ) + } + + options { + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '10', + daysToKeepStr: '30', + artifactNumToKeepStr: '1', + )) + } + + environment { + /* Avoid race conditions with other builds using virtualenv. */ + VIRTUAL_ENV = "${WORKSPACE_TMP}/venv" + PATH = "${VIRTUAL_ENV}/bin:${PATH}" + } + + stages { + stage('Prep') { + steps { script { + if (params.APK_URL == null) { + error("APK_URL parameter not set!") + } + if (params.APK_URL_UPGRADE == null) { + error("APK_URL_UPGRADE parameter not set!") + } + } } + } + + stage('Setup') { + steps { script { + dir('test/appium') { + sh "python3 -m venv ${VIRTUAL_ENV}" + sh 'pip3 install -r requirements.txt' + } + } } + } + + stage('Test') { + steps { script { + /* for managing optional arguments */ + def extraPytestOpts = '' + if (params.TR_CASE_IDS != '') { + extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'" + } + withCredentials([ + usernamePassword( + credentialsId: 'test-rail-api', + usernameVariable: 'TESTRAIL_USER', + passwordVariable: 'TESTRAIL_PASS' + ), + usernamePassword( + credentialsId: 'sauce-labs-api', + usernameVariable: 'SAUCE_USERNAME', + passwordVariable: 'SAUCE_ACCESS_KEY' + ), + string( + credentialsId: 'etherscan-api-key', + variable: 'ETHERSCAN_API_KEY' + ), + string( + credentialsId: 'infura-e2e-token', + variable: 'WEB3_INFURA_PROJECT_ID' + ), + file( + credentialsId: "mobile-tests-eth-accounts", + variable: 'TEST_ETH_ACCOUNTS_FILE' + ), + ]) { + dir('test/appium/tests') { + /* Provide Eth test accounts secrets. */ + sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py' + sh """ + python3 -m pytest \ + -m "upgrade" \ + -k \"${params.KEYWORD_EXPRESSION}\" \ + --numprocesses 4 \ + --rerun_count=2 \ + --testrail_report=True \ + --apk=${params.APK_URL} \ + --apk_upgrade=${params.APK_URL_UPGRADE} \ + ${extraPytestOpts} + """ + } + } + } + } } + } + + post { + always { + script { + sauce('sauce-labs-cred') { + saucePublisher() + } + } + } + success { + script { + junit( + testDataPublishers: [[$class: 'SauceOnDemandReportPublisher', jobVisibility: 'public']], + testResults: 'test/appium/tests/*.xml' + ) + } + } + cleanup { + sh 'make purge' + } + } +} diff --git a/ci/tools/Jenkinsfile.fastlane-clean b/ci/tools/Jenkinsfile.fastlane-clean new file mode 100644 index 00000000000..b5019384776 --- /dev/null +++ b/ci/tools/Jenkinsfile.fastlane-clean @@ -0,0 +1,54 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + agent { label 'macos' } + + environment { + LANG = 'en_US.UTF-8' + LANGUAGE = 'en_US.UTF-8' + LC_ALL = 'en_US.UTF-8' + PLATFORM = 'ios' + FASTLANE_DISABLE_COLORS = 1 + /* avoid writing to r/o /nix */ + GEM_HOME = '~/.rubygems' + } + + options { + timestamps() + /* Disable concurrent jobs */ + disableConcurrentBuilds() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 45, unit: 'MINUTES') + /* Don't keep more than 50 builds */ + buildDiscarder(logRotator(numToKeepStr: '50')) + } + + stages { + stage('Prep') { + steps { script { + nix.shell( + 'bundle install --gemfile=fastlane/Gemfile', + attr: 'shells.fastlane', + ) + } } + } + stage('Clean Users'){ + steps { script { + withCredentials([ + usernamePassword( + credentialsId: 'fastlane-match-apple-id', + usernameVariable: 'FASTLANE_APPLE_ID', + passwordVariable: 'FASTLANE_PASSWORD' + ), + ]) { + nix.shell( + 'bundle exec --gemfile=fastlane/Gemfile fastlane ios clean', + keepEnv: ['FASTLANE_APPLE_ID', 'FASTLANE_PASSWORD'], + attr: 'shells.fastlane', + ) + } + } } + } + } +} diff --git a/ci/tools/Jenkinsfile.nix-cache b/ci/tools/Jenkinsfile.nix-cache new file mode 100644 index 00000000000..f2ea808d9b4 --- /dev/null +++ b/ci/tools/Jenkinsfile.nix-cache @@ -0,0 +1,178 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + agent { label params.AGENT_LABEL } + + parameters { + string( + name: 'NIX_CACHE_HOST', + description: 'FQDN of Nix binary cache host.', + defaultValue: params.NIX_CACHE_HOST ?: 'cache-01.he-eu-hel1.ci.nix.status.im' + ) + string( + name: 'NIX_CACHE_USER', + description: 'Username for Nix binary cache host.', + defaultValue: params.NIX_CACHE_USER ?: 'nix-cache' + ) + booleanParam( + name: 'BUILD_COMPONENTS', + description: 'Whether to build Mobile components first.', + defaultValue: params.BUILD_COMPONENTS ?: true, + ) + } + + environment { + NIX_SSHOPTS = "-oStrictHostKeyChecking=accept-new" + NIX_CONF_DIR = "${env.WORKSPACE}/nix" + NIX_STORE_CMD = '/nix/var/nix/profiles/default/bin/nix-store' + NIX_SSH_REMOTE = "ssh://${params.NIX_CACHE_USER}@${params.NIX_CACHE_HOST}?remote-program=${env.NIX_STORE_CMD}" + } + + options { + timestamps() + disableConcurrentBuilds() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 120, unit: 'MINUTES') + /* Limit builds retained */ + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + artifactNumToKeepStr: '1', + )) + } + + stages { + stage('Setup') { + steps { script { + nix.shell('nix-env -i openssh', sandbox: false, pure: false) + /* some build targets don't build on MacOS */ + os = sh(script: 'uname', returnStdout: true).trim() + arch = sh(script: 'arch', returnStdout: true).trim() + } } + } + + stage('Build status-go') { + when { expression { params.BUILD_COMPONENTS } } + steps { script { + def platforms = ['mobile.android', 'mobile.ios', 'library'] + if (os != 'Darwin') { platforms.removeAll { it == 'mobile.ios' } } + /* FIXME: "'x86_64-darwin' with features {} is required to build" */ + if (arch == 'arm64') { platforms.removeAll { it == 'mobile.android' } } + platforms.each { platform -> + /* Allow for Android builds on Apple ARM. */ + env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, platform) + nix.build( + attr: "targets.status-go.${platform}", + sandbox: false, + link: false + ) + } + } } + } + + stage('Build android jsbundle') { + when { expression { params.BUILD_COMPONENTS } } + steps { script { + /* Build/fetch deps required for jsbundle build. */ + nix.build( + attr: 'targets.mobile.jsbundle', + sandbox: false, + pure: false, + link: false + ) + } } + } + + stage('Build android deps') { + when { expression { params.BUILD_COMPONENTS } } + steps { script { + /* Allow for Android builds on Apple ARM. */ + env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, 'android') + /* Build/fetch deps required to build android release. */ + nix.build( + attr: 'targets.mobile.android.build.buildInputs', + sandbox: false, + pure: false, + link: false + ) + } } + } + + stage('Build nix shell deps') { + when { expression { params.BUILD_COMPONENTS } } + steps { script { + def shells = ['android', 'ios', 'fastlane', 'keytool', 'clojure', 'gradle'] + if (os != 'Darwin') { shells.removeAll { it == 'ios' } } + /* FIXME: "'x86_64-darwin' with features {} is required to build" */ + if (arch == 'arm64') { shells.removeAll { it == 'android' } } + /* Build/fetch deps required to start default Nix shell. */ + shells.each { shell -> + /* Allow for Android builds on Apple ARM. */ + env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, shell) + nix.build( + attr: "shells.${shell}.buildInputs", + sandbox: false, + link: false + ) + } + } } + } + + stage('Collect') { + steps { script { + exitCode = nix.shell( + """ + find /nix/store/ -mindepth 1 -maxdepth 1 \ + | grep -v -e '.*.links\$' -e '.*.lock\$' -e '.*.drv\$' -e '.*.drv\$' -e '.*-status-mobile-.*' \ + | xargs nix path-info --recursive \ + > "${WORKSPACE_TMP}/store-paths.txt" + """, + pure: false, + returnStatus: true + ) + /* Some paths can throw 'path is not valid' errors, but it's not fatal. */ + if (exitCode != 0) { + currentBuild.result = 'UNSTABLE' + } + if (lineCount("${WORKSPACE_TMP}/store-paths.txt") == 0) { + throw new Exception("No Nix store paths found to copy.") + } + } } + } + + stage('Upload') { + steps { script { + sshagent(credentials: ['nix-cache-ssh']) { + nix.shell( + """ + cat "${WORKSPACE_TMP}/store-paths.txt" \ + | nix copy --stdin --to "${NIX_SSH_REMOTE}" + """, + pure: false + ) + } + } } + } + } + post { + always { script { + nix.shell('nix-store --optimize', pure: false) + } } + } +} + +def nixSysOverride(os, arch, target='android') { + return ( + os == 'Darwin' && + arch == 'arm64' && + target =~ /.*android$/ + ) ? 'x86_64-darwin' : '' +} + +def lineCount(filePath) { + return sh( + script: "wc -l ${filePath}", + returnStdout: true + ).trim() +} diff --git a/ci/tools/Jenkinsfile.playstore-meta b/ci/tools/Jenkinsfile.playstore-meta new file mode 100644 index 00000000000..fcdc6950aaa --- /dev/null +++ b/ci/tools/Jenkinsfile.playstore-meta @@ -0,0 +1,54 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + agent { label 'linux' } + + environment { + LANG = 'en_US.UTF-8' + LANGUAGE = 'en_US.UTF-8' + LC_ALL = 'en_US.UTF-8' + PLATFORM = 'ios' + FASTLANE_DISABLE_COLORS = 1 + /* avoid writing to r/o /nix */ + GEM_HOME = '~/.rubygems' + } + + options { + timestamps() + /* Disable concurrent jobs */ + disableConcurrentBuilds() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 5, unit: 'MINUTES') + /* Don't keep more than 50 builds */ + buildDiscarder(logRotator(numToKeepStr: '50')) + } + + stages { + stage('Prep') { + steps { script { + nix.shell( + 'bundle install --gemfile=fastlane/Gemfile', + attr: 'shells.fastlane', + ) + } } + } + stage('Play Store Update'){ + steps { script { + withCredentials([ + string( + credentialsId: 'google-play-api-key-json', + variable: 'GOOGLE_PLAY_JSON_KEY' + ), + ]) { + nix.shell( + 'bundle exec --gemfile=fastlane/Gemfile fastlane android upload_metadata', + keepEnv: ['FASTLANE_DISABLE_COLORS', 'GOOGLE_PLAY_JSON_KEY'], + attr: 'shells.fastlane', + pure: false + ) + } + } } + } + } +} diff --git a/ci/tools/Jenkinsfile.pod-repo-update b/ci/tools/Jenkinsfile.pod-repo-update new file mode 100644 index 00000000000..c212c3eda87 --- /dev/null +++ b/ci/tools/Jenkinsfile.pod-repo-update @@ -0,0 +1,44 @@ +#!/usr/bin/env groovy +/** + * This job runs daily and executes `pod repo update` on MacOS + * This is done to avoid issues with out of date repo causing errors like: + * + * Failed with exit code 1 (in target 'StatusImPR' from project 'StatusIm') + **/ + +pipeline { + agent { + label params.HOST_LABEL + } + + triggers { + /* Run daily at 2am */ + cron('H 2 * * *') + } + options { + timestamps() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 5, unit: 'MINUTES') + /* Limit builds retained */ + buildDiscarder(logRotator( + numToKeepStr: '20', + )) + } + + parameters { + string( + name: 'HOST_LABEL', + description: 'Label of host to run on', + /* Using startTimeInMillis to randomize which host gets the update. */ + defaultValue: "maci7-0${(currentBuild.startTimeInMillis % 3) + 1}", + ) + } + + stages { + stage('Update') { + steps { + sh 'pod repo update' + } + } + } +} diff --git a/ci/tools/Jenkinsfile.xcode-clean b/ci/tools/Jenkinsfile.xcode-clean new file mode 100644 index 00000000000..fbdfd0d4805 --- /dev/null +++ b/ci/tools/Jenkinsfile.xcode-clean @@ -0,0 +1,48 @@ +#!/usr/bin/env groovy +library 'status-jenkins-lib@v1.9.24' + +pipeline { + agent { + label 'linux' + } + + triggers { + cron('H 5 * * *') + } + + options { + timestamps() + /* Prevent Jenkins jobs from running forever */ + timeout(time: 15, unit: 'MINUTES') + /* Disable concurrent jobs */ + disableConcurrentBuilds() + /* Don't keep more than 50 builds */ + buildDiscarder(logRotator(numToKeepStr: '10')) + } + + stages { + stage('Get Nodes') { + steps { script { + stagePerNode = nodesByLabel('macos').collectEntries { + ["${it}" : generateNodeCleanupStage(it)] + } + } } + } + + stage('Clean Xcode') { + steps { script { + parallel stagePerNode + } } + } + } +} + +def generateNodeCleanupStage(nodeLabel) { + return { stage(nodeLabel) { + node(nodeLabel) { + dir('/Users/jenkins/Library/Developer/Xcode') { + sh 'rm -fr Archives DerivedData' + } + } + } } +} diff --git a/ci/utils.groovy b/ci/utils.groovy deleted file mode 100644 index ebaf7cf7e2c..00000000000 --- a/ci/utils.groovy +++ /dev/null @@ -1,151 +0,0 @@ -def getVersion() { - def path = "${env.WORKSPACE}/VERSION" - return readFile(path).trim() -} - -def branchName() { - return env.GIT_BRANCH.replaceAll(/.*origin\//, '') -} - -def parentOrCurrentBuild() { - def c = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause) - if (c == null) { return currentBuild } - return c.getUpstreamRun() -} - -def timestamp() { - /* we use parent if available to make timestmaps consistent */ - def now = new Date(parentOrCurrentBuild().timeInMillis) - return now.format('yyMMdd-HHmmss', TimeZone.getTimeZone('UTC')) -} - -def gitCommit() { - return GIT_COMMIT.take(6) -} - -def pkgFilename(type, ext, arch=null) { - /* the grep removes the null arch */ - return [ - "StatusIm", timestamp(), gitCommit(), type, arch, - ].grep().join('-') + ".${ext}" -} - -def doGitRebase() { - if (!isPRBuild()) { - println 'Skipping rebase due for non-PR build...' - return - } - def rebaseBranch = 'develop' - if (env.CHANGE_TARGET) { /* This is available for PR builds */ - rebaseBranch = env.CHANGE_TARGET - } - sh 'git status' - sh "git fetch --force origin ${rebaseBranch}:${rebaseBranch}" - try { - sh "git rebase ${rebaseBranch}" - } catch (e) { - sh 'git rebase --abort' - throw e - } -} - -def genBuildNumber() { - def number = sh( - returnStdout: true, - script: "${env.WORKSPACE}/scripts/version/gen_build_no.sh" - ).trim() - println "Build Number: ${number}" - return number -} - -def readBuildNumber() { - def number = sh( - returnStdout: true, - script: "${env.WORKSPACE}/scripts/version/build_no.sh" - ).trim() - return number -} - -def getDirPath(path) { - return path.tokenize('/')[0..-2].join('/') -} - -def getFilename(path) { - return path.tokenize('/')[-1] -} - -def getEnv(build, envvar) { - return build.getBuildVariables().get(envvar) -} - -def buildDuration() { - def duration = currentBuild.durationString - return '~' + duration.take(duration.lastIndexOf(' and counting')) -} - -def pkgFind(glob) { - def fullGlob = "pkg/*${glob}" - def found = findFiles(glob: fullGlob) - if (found.size() == 0) { - sh 'ls -l pkg/' - error("File not found via glob: ${fullGlob} ${found.size()}") - } - return found[0].path -} - -def isPRBuild() { - return env.JOB_NAME.startsWith('status-react/prs') -} - -def isE2EBuild() { - return env.JOB_NAME.contains('e2e') -} - -def getBuildType() { - def jobName = env.JOB_NAME - if (isE2EBuild()) { - return 'e2e' - } - if (isPRBuild()) { - return 'pr' - } - if (jobName.startsWith('status-react/nightly')) { - return 'nightly' - } - if (jobName.startsWith('status-react/release')) { - return 'release' - } - return params.BUILD_TYPE -} - -def getParentRunEnv(name) { - def c = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause) - if (c == null) { return null } - return c.getUpstreamRun().getEnvironment()[name] -} - -def changeId() { - /* CHANGE_ID can be provided via the build parameters or from parent */ - def changeId = env.CHANGE_ID - changeId = params.CHANGE_ID ? params.CHANGE_ID : changeId - changeId = getParentRunEnv('CHANGE_ID') ? getParentRunEnv('CHANGE_ID') : changeId - if (!changeId) { - println('This build is not related to a PR, CHANGE_ID missing.') - println('GitHub notification impossible, skipping...') - return null - } - return changeId -} - -def updateEnv(type) { - def envFile = "${env.WORKSPACE}/.env.jenkins" - /* select .env based on type of build */ - if (['nightly', 'release', 'e2e'].contains(type)) { - envFile = "${env.WORKSPACE}/.env.${type}" - } - sh "ln -sf ${envFile} .env" - /* show contents for debugging purposes */ - sh "cat ${envFile}" -} - -return this diff --git a/clj-rn.conf.edn b/clj-rn.conf.edn deleted file mode 100644 index af0853dadd2..00000000000 --- a/clj-rn.conf.edn +++ /dev/null @@ -1,115 +0,0 @@ -{:name "StatusIm" - - :run-options {:android {"appIdSuffix" "debug"}} - - :figwheel-bridge "./figwheel-bridge.js" - ;; JS modules - :js-modules ["buffer" - "bignumber.js" - "react-native-languages" - "i18n-js" - "react-native-splash-screen" - "react-native-status" - "react-native-status-keycard" - "react-native-camera" - "qrcode" - "react-native-fs" - "react-native-dialogs" - "react-native-image-resizer" - "react-native-image-crop-picker" - "react-native-svg" - "react-native-webview-bridge" - "react-native-touch-id" - "web3-utils" - "chance" - "emojilib" - "eth-phishing-detect" - "react-native-config" - "react-native-screens" - "react-native-keychain" - "rn-snoopy" - "rn-snoopy/stream/bars" - "rn-snoopy/stream/filter" - "rn-snoopy/stream/buffer" - "react-native/Libraries/vendor/emitter/EventEmitter" - "react-native-background-timer" - "react-native-fetch-polyfill" - "react-navigation" - "react-native-navigation-twopane" - "hi-base32" - "functional-red-black-tree" - "react-native-mail" - "react-native-shake" - "@react-native-community/netinfo" - "react-native-safe-area-context"] - ;; Desktop modules - :desktop-modules ["buffer" - "bignumber.js" - "react-native-languages" - "i18n-js" - "dismissKeyboard" - "react-native-splash-screen" - "react-native-status" - "qrcode" - "identicon.js" - "react-native-fs" - "react-native-dialogs" - "react-native-image-crop-picker" - "react-native-webview-bridge" - "chance" - "emojilib" - "eth-phishing-detect" - "react-native-config" - "react-native-keychain" - "rn-snoopy" - "rn-snoopy/stream/bars" - "rn-snoopy/stream/filter" - "rn-snoopy/stream/buffer" - "react-native/Libraries/vendor/emitter/EventEmitter" - "react-native-fetch-polyfill" - "react-native-desktop-linking" - "react-native-desktop-menu" - "react-native-desktop-config" - "react-native-desktop-shortcuts" - "react-native-desktop-notification" - "react-native-desktop-gesture-handler" - "web3-utils" - "react-navigation" - "functional-red-black-tree" - "react-native-navigation-twopane" - "hi-base32"] - - ;; Resoures - :resource-dirs ["resources/images" - "desktop/resources"] - - :figwheel-options {:nrepl-port 7888 - :nrepl-middleware ["cider.nrepl/cider-middleware" - "refactor-nrepl.middleware/wrap-refactor" - "cider.piggieback/wrap-cljs-repl"]} - - :builds [{:id :desktop - :source-paths ["react-native/src/desktop" "src" "env/dev" "components/src" "dev"] - :compiler {:output-to "target/desktop/app.js" - :main "env.desktop.main" - :output-dir "target/desktop" - :npm-deps false - :optimizations :none} - :figwheel true} - {:id :ios - :source-paths ["react-native/src/mobile" "src" "env/dev" "components/src" "dev"] - :compiler {:output-to "target/ios/app.js" - :main "env.ios.main" - :output-dir "target/ios" - :npm-deps false - :optimizations :none} - :figwheel true} - {:id :android - :source-paths ["react-native/src/mobile" "src" "env/dev" "components/src" "dev"] - :compiler {:output-to "target/android/app.js" - :main "env.android.main" - :output-dir "target/android" - :npm-deps false - :optimizations :none} - :warning-handlers [status-im.utils.build/warning-handler] - :figwheel true}]} diff --git a/components/src/status_im/react_native/resources.cljs b/components/src/status_im/react_native/resources.cljs deleted file mode 100644 index 98375fca5fd..00000000000 --- a/components/src/status_im/react_native/resources.cljs +++ /dev/null @@ -1,39 +0,0 @@ -(ns status-im.react-native.resources) - -(def ui - {:empty-chats-header (js/require "./resources/images/ui/empty-chats-header.png") - :welcome (js/require "./resources/images/ui/welcome.jpg") - :intro1 (js/require "./resources/images/ui/intro1.jpg") - :intro2 (js/require "./resources/images/ui/intro2.jpg") - :intro3 (js/require "./resources/images/ui/intro3.jpg") - :sample-key (js/require "./resources/images/ui/sample-key.jpg") - :lock (js/require "./resources/images/ui/lock.png") - :tribute-to-talk (js/require "./resources/images/ui/tribute-to-talk.png") - :hardwallet-card (js/require "./resources/images/ui/hardwallet-card.png") - :keycard-lock (js/require "./resources/images/ui/keycard-lock.png") - :keycard (js/require "./resources/images/ui/keycard.png") - :keycard-logo (js/require "./resources/images/ui/keycard-logo.png") - :keycard-logo-blue (js/require "./resources/images/ui/keycard-logo-blue.png") - :keycard-logo-gray (js/require "./resources/images/ui/keycard-logo-gray.png") - :keycard-key (js/require "./resources/images/ui/keycard-key.png") - :keycard-empty (js/require "./resources/images/ui/keycard-empty.png") - :keycard-phone (js/require "./resources/images/ui/keycard-phone.png") - :keycard-connection (js/require "./resources/images/ui/keycard-connection.png") - :keycard-wrong (js/require "./resources/images/ui/keycard-wrong.png") - :not-keycard (js/require "./resources/images/ui/not-keycard.png") - :status-logo (js/require "./resources/images/ui/status-logo.png") - :warning-sign (js/require "./resources/images/ui/warning-sign.png") - :phone-nfc-on (js/require "./resources/images/ui/phone-nfc-on.png") - :phone-nfc-off (js/require "./resources/images/ui/phone-nfc-off.png") - :dapp-store (js/require "./resources/images/ui/dapp-store.png") - :ens-header (js/require "./resources/images/ui/ens-header.png") - :new-chat-header (js/require "./resources/images/ui/new-chat-header.png") - :onboarding-phone (js/require "./resources/images/ui/onboarding-phone.png")}) - -(def loaded-images (atom {})) - -(defn get-image [k] - (if (contains? @loaded-images k) - (get @loaded-images k) - (get (swap! loaded-images assoc k - (get ui k)) k))) diff --git a/components/src/status_im/ui/components/react.cljs b/components/src/status_im/ui/components/react.cljs deleted file mode 100644 index d3957ce58b1..00000000000 --- a/components/src/status_im/ui/components/react.cljs +++ /dev/null @@ -1,323 +0,0 @@ -(ns status-im.ui.components.react - (:require-macros [status-im.utils.views :as views]) - (:require [goog.object :as object] - [reagent.core :as reagent] - [status-im.ui.components.styles :as styles] - [status-im.utils.utils :as utils] - [status-im.utils.core :as utils.core] - [status-im.utils.platform :as platform] - [status-im.i18n :as i18n] - [status-im.react-native.js-dependencies :as js-dependencies] - [status-im.ui.components.colors :as colors] - [status-im.ui.components.typography :as typography])) - -(defn get-react-property [name] - (if js-dependencies/react-native - (or (object/get js-dependencies/react-native name) {}) - #js {})) - -(defn adapt-class [class] - (when class - (reagent/adapt-react-class class))) - -(defn get-class [name] - (adapt-class (get-react-property name))) - -(def native-modules (.-NativeModules js-dependencies/react-native)) -(def device-event-emitter (.-DeviceEventEmitter js-dependencies/react-native)) - -(def splash-screen (.-SplashScreen native-modules)) - -;; React Components - -(def app-registry (get-react-property "AppRegistry")) -(def app-state (get-react-property "AppState")) -(def view (get-class "View")) -(def progress-bar (get-class "ProgressBarAndroid")) - -(def status-bar-class (when-not platform/desktop? (get-react-property "StatusBar"))) - -(def scroll-view-class (get-class "ScrollView")) -(def keyboard-avoiding-view-class (get-class "KeyboardAvoidingView")) - - -(def text-class (get-class "Text")) -(def text-input-class (get-class "TextInput")) -(def image-class (get-class "Image")) -(def picker-class (get-class "Picker")) -(def picker-item-class (adapt-class (.-Item (get-react-property "Picker")))) - -(defn valid-source? [source] - (or (not (map? source)) - (not (contains? source :uri)) - (and (contains? source :uri) - (:uri source)))) - -(defn image [{:keys [source] :as props}] - (when (valid-source? source) - [image-class props])) - -(def switch-class (get-class "Switch")) - -(defn switch [props] - [switch-class props]) - -(def touchable-highlight-class (get-class "TouchableHighlight")) -(def touchable-without-feedback-class (get-class "TouchableWithoutFeedback")) -(def touchable-opacity-class (get-class "TouchableOpacity")) -(def activity-indicator-class (get-class "ActivityIndicator")) - -(defn activity-indicator [props] - [activity-indicator-class props]) - -(def modal (get-class "Modal")) - -(def pan-responder (.-PanResponder js-dependencies/react-native)) -(def animated (.-Animated js-dependencies/react-native)) - -(def animated-view-class - (reagent/adapt-react-class (.-View animated))) - -(def animated-flat-list-class - (reagent/adapt-react-class (.-FlatList animated))) - -(defn animated-view [props & content] - (vec (conj content props animated-view-class))) - -(def dimensions (.-Dimensions js-dependencies/react-native)) -(def keyboard (.-Keyboard js-dependencies/react-native)) -(defn dismiss-keyboard! [] (.dismiss keyboard)) -(def linking (.-Linking js-dependencies/react-native)) -(def desktop-notification (.-DesktopNotification (.-NativeModules js-dependencies/react-native))) - -(def max-font-size-multiplier 1.25) - -(defn prepare-text-props [props] - (-> props - (update :style typography/get-style) - (assoc :max-font-size-multiplier max-font-size-multiplier))) - -(defn prepare-nested-text-props [props] - (-> props - (update :style typography/get-nested-style) - (assoc :parseBasicMarkdown true) - (assoc :nested? true))) - -;; Accessor methods for React Components -(defn text - "For nested text elements, use nested-text instead" - ([text-element] - (text {} text-element)) - ([options text-element] - [text-class (prepare-text-props options) text-element])) - -(defn nested-text - "Returns nested text elements with proper styling and typography - Do not use the nested? option, it is for internal usage of the function only" - [options & nested-text-elements] - (let [options-with-style (if (:nested? options) - (prepare-nested-text-props options) - (prepare-text-props options))] - (reduce (fn [acc text-element] - (conj acc - (if (string? text-element) - text-element - (let [[options & nested-text-elements] text-element] - (apply nested-text (prepare-nested-text-props options) - nested-text-elements))))) - [text-class (dissoc options-with-style :nested?)] - nested-text-elements))) - -;; We track all currently mounted text input refs -;; in a ref-to-defaultValue map -;; so that we can clear them (restore their default values) -;; when global react-navigation's onWillBlur event is invoked -(def text-input-refs (atom {})) - -(defn text-input - [options text] - (let [render-fn (fn [options text] - [text-input-class - (merge - {:underline-color-android :transparent - :max-font-size-multiplier max-font-size-multiplier - :placeholder-text-color colors/text-gray - :placeholder (i18n/label :t/type-a-message) - :value text} - (-> options - (dissoc :preserve-input?) - (update :style typography/get-style) - (update :style dissoc :line-height)))])] - (if (:preserve-input? options) - render-fn - (let [input-ref (atom nil)] - (reagent/create-class - {:component-will-unmount #(when @input-ref - (swap! text-input-refs dissoc @input-ref)) - :reagent-render - (fn [options text] - (render-fn (assoc options :ref - (fn [r] - ;; Store input and its defaultValue - ;; one we receive a non-nil ref - (when (and r (nil? @input-ref)) - (swap! text-input-refs assoc r (:default-value options))) - (reset! input-ref r) - (when (:ref options) - ((:ref options) r)))) text))}))))) - -(defn i18n-text - [{:keys [style key]}] - [text {:style style} (i18n/label key)]) - -(defn icon - ([n] (icon n styles/icon-default)) - ([n style] - [image {:source {:uri (keyword (str "icon_" (name n)))} - :resizeMode "contain" - :style style}])) - -(defn touchable-opacity [props content] - [touchable-opacity-class props content]) - -(defn touchable-highlight [props content] - [touchable-highlight-class - (merge {:underlay-color :transparent} props) - content]) - -(defn touchable-without-feedback [props content] - [touchable-without-feedback-class - props - content]) - -(defn get-dimensions [name] - (js->clj (.get dimensions name) :keywordize-keys true)) - -(defn list-item [component] - (reagent/as-element component)) - -(defn value->picker-item [{:keys [value label]}] - [picker-item-class {:value (or value "") :label (or label value "")}]) - -(defn picker [{:keys [style on-change selected enabled data]}] - (into - [picker-class (merge (when style {:style style}) - (when enabled {:enabled enabled}) - (when on-change {:on-value-change on-change}) - (when selected {:selected-value selected}))] - (map value->picker-item data))) - -;; Image picker - -(def image-picker-class js-dependencies/image-crop-picker) - -(defn show-access-error [o] - (when (= "E_PERMISSION_MISSING" (object/get o "code")) - (utils/show-popup (i18n/label :t/error) - (i18n/label :t/photos-access-error)))) - -(defn show-image-picker - ([images-fn] - (show-image-picker images-fn nil)) - ([images-fn media-type] - (let [image-picker (.-default image-picker-class)] - (-> image-picker - (.openPicker (clj->js {:multiple false :mediaType (or media-type "any")})) - (.then images-fn) - (.catch show-access-error))))) - -;; Net info -(def net-info (if platform/desktop? - (get-react-property "NetInfo") - (.-default js-dependencies/net-info))) - -;; Clipboard - -(def sharing - (.-Share js-dependencies/react-native)) - -(defn copy-to-clipboard [text] - (.setString (.-Clipboard js-dependencies/react-native) text)) - -(defn get-from-clipboard [clbk] - (let [clipboard-contents (.getString (.-Clipboard js-dependencies/react-native))] - (.then clipboard-contents #(clbk %)))) - -;; KeyboardAvoidingView - -(defn keyboard-avoiding-view [props & children] - (let [view-element (if platform/ios? - [keyboard-avoiding-view-class (merge {:behavior :padding} props)] - [view props])] - (vec (concat view-element children)))) - -(defn scroll-view [props & children] - (vec (conj children props scroll-view-class))) - -(views/defview with-activity-indicator - [{:keys [timeout style enabled? preview]} comp] - (views/letsubs - [loading (reagent/atom true)] - {:component-did-mount (fn [] - (if (or (nil? timeout) - (> 100 timeout)) - (reset! loading false) - (utils/set-timeout #(reset! loading false) - timeout)))} - (if (and (not enabled?) @loading) - (or preview - [view {:style (or style {:justify-content :center - :align-items :center})} - [activity-indicator {:animating true}]]) - comp))) - -(defn navigation-wrapper - "Wraps component so that it will be shown only when current-screen is one of views" - [{:keys [component views current-view hide?] - :or {hide? false}}] - (let [current-view? (if (set? views) - (views current-view) - (= views current-view)) - - style (if current-view? - {:flex 1 - :zIndex 0} - {:opacity 0 - :flex 0 - :zIndex -1}) - - component' (if (fn? component) [component] component)] - - (when (or (not hide?) (and hide? current-view?)) - (if hide? - component' - [view style (if (fn? component) [component] component)])))) - -(defn with-empty-preview [comp] - [with-activity-indicator - {:preview [view {}]} - comp]) - -(def safe-area-provider (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaProvider"))) -(def safe-area-consumer (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaConsumer"))) - -(defn create-main-screen-view [current-view] - (fn [props & children] - (apply - vector - (adapt-class (object/get js-dependencies/safe-area-context "SafeAreaView")) - (cond-> props - (= current-view :qr-scanner) - (assoc :background-color :black)) - children))) - -(defn main-screen-modal-view [current-view & components] - [(create-main-screen-view current-view) - styles/flex - [(if (= current-view :chat-modal) - view - keyboard-avoiding-view) - (merge {:flex 1 :flex-direction :column} - (when platform/android? - {:background-color :white})) - (apply vector view styles/flex components)]]) diff --git a/default.nix b/default.nix index 8d6380b48ff..3b2898217c5 100644 --- a/default.nix +++ b/default.nix @@ -1,9 +1,10 @@ -{ - config ? { status-im = { build-type = ""; }; }, # for passing build options, see nix/README.md -}: +# for passing build options, see nix/README.md +{ config ? { } }: let - main = import ./nix/default.nix { inherit config; }; + main = import ./nix { inherit config; }; in { + # this is where the --attr argument selects the shell or target inherit (main) pkgs targets shells; + inherit (main.pkgs) config; } diff --git a/deployment/linux/usr/share/applications/Status.desktop b/deployment/linux/usr/share/applications/Status.desktop deleted file mode 100644 index a753f7d0c0d..00000000000 --- a/deployment/linux/usr/share/applications/Status.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Status -Comment=Status Desktop -Exec=Status -Icon=Status -Categories=Network; diff --git a/deployment/linux/usr/share/icons/hicolor/1024x1024/apps/Status.png b/deployment/linux/usr/share/icons/hicolor/1024x1024/apps/Status.png deleted file mode 100644 index c19a8246180..00000000000 Binary files a/deployment/linux/usr/share/icons/hicolor/1024x1024/apps/Status.png and /dev/null differ diff --git a/deployment/macos/Info.plist b/deployment/macos/Info.plist deleted file mode 100644 index a0a8ae9f02a..00000000000 --- a/deployment/macos/Info.plist +++ /dev/null @@ -1,43 +0,0 @@ - - - - - CFBundleDisplayName - Status - CFBundleExecutable - Status - CFBundleIconFile - status-icon - CFBundleIdentifier - im.status.statusim - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Status - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.1 - CFBundleVersion - 0.1 - - LSMinimumSystemVersion - 10.9.0 - NSHighResolutionCapable - True - NSPrincipalClass - NSApplication - - CFBundleURLTypes - - - CFBundleURLSchemes - - status-im - - CFBundleURLName - im.status.ethereum.applink-desktop - - - - diff --git a/deployment/macos/create-icon.sh b/deployment/macos/create-icon.sh deleted file mode 100755 index fd1bb76da2e..00000000000 --- a/deployment/macos/create-icon.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -function make_icns { - local file="../status-icon.png" - local iconset="$(mktemp -d)" - local output_icon="status-icon.icns" - - for size in {16,32,64,128,256,512}; do - sips --resampleHeightWidth "${size}" "${size}" "${file}" --out "${iconset}/icon_${size}x${size}.png" &> /dev/null - sips --resampleHeightWidth "$((size * 2))" "$((size * 2))" "${file}" --out "${iconset}/icon_${size}x${size}@2x.png" &> /dev/null - done - - mv "${iconset}" "${iconset}.iconset" - iconutil --convert icns "${iconset}.iconset" --output "${output_icon}" - - echo "${output_icon}" # so its path is returned when the function ends -} - -make_icns diff --git a/deployment/macos/dmg-background.png b/deployment/macos/dmg-background.png deleted file mode 100644 index d42d96bf70c..00000000000 Binary files a/deployment/macos/dmg-background.png and /dev/null differ diff --git a/deployment/macos/dmg-background@2x.png b/deployment/macos/dmg-background@2x.png deleted file mode 100644 index 2afecc542e1..00000000000 Binary files a/deployment/macos/dmg-background@2x.png and /dev/null differ diff --git a/deployment/macos/dmg-background@3x.png b/deployment/macos/dmg-background@3x.png deleted file mode 100644 index ba70a181647..00000000000 Binary files a/deployment/macos/dmg-background@3x.png and /dev/null differ diff --git a/deployment/macos/macos-developer-id.keychain-db.gpg b/deployment/macos/macos-developer-id.keychain-db.gpg deleted file mode 100644 index 70fb6c93485..00000000000 Binary files a/deployment/macos/macos-developer-id.keychain-db.gpg and /dev/null differ diff --git a/deployment/macos/qt-reportApp.conf b/deployment/macos/qt-reportApp.conf deleted file mode 100644 index df50e9dba0d..00000000000 --- a/deployment/macos/qt-reportApp.conf +++ /dev/null @@ -1,4 +0,0 @@ -[Paths] -Plugins = ../PlugIns -Imports = ../Resources/qml -Qml2Imports = ../Resources/qml diff --git a/deployment/macos/status-dmg.json b/deployment/macos/status-dmg.json deleted file mode 100644 index d70adc9d49c..00000000000 --- a/deployment/macos/status-dmg.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Status", - "background": "dmg-background.png", - "contents": [ - { - "x": 385, - "y": 235, - "type": "link", - "path": "/Applications" - }, - { - "x": 170, - "y": 236, - "type": "file", - "path": "../../StatusImPackage/Status.app" - } - ] -} diff --git a/deployment/macos/status-icon.icns b/deployment/macos/status-icon.icns deleted file mode 100644 index 35e982c298b..00000000000 Binary files a/deployment/macos/status-icon.icns and /dev/null differ diff --git a/deployment/status-icon.png b/deployment/status-icon.png deleted file mode 100644 index 24dd1b4877a..00000000000 Binary files a/deployment/status-icon.png and /dev/null differ diff --git a/deployment/status-icon.svg b/deployment/status-icon.svg deleted file mode 100644 index 12f39c42ae3..00000000000 --- a/deployment/status-icon.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/deployment/windows/Status.rc.in b/deployment/windows/Status.rc.in deleted file mode 100644 index 6e4bd8e9460..00000000000 --- a/deployment/windows/Status.rc.in +++ /dev/null @@ -1,71 +0,0 @@ -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE resource. -// -#ifndef APSTUDIO_INVOKED -#include "targetver.h" -#endif -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. - -IDI_STATUS ICON "${ICO_RESOURCE_PATH}" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#ifndef APSTUDIO_INVOKED\r\n" - "#include ""targetver.h""\r\n" - "#endif\r\n" - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE resource. -// - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/deployment/windows/nsis/include/SnoreNotify.nsh b/deployment/windows/nsis/include/SnoreNotify.nsh deleted file mode 100644 index 37744a5508d..00000000000 --- a/deployment/windows/nsis/include/SnoreNotify.nsh +++ /dev/null @@ -1,23 +0,0 @@ -!include LogicLib.nsh -!include WordFunc.nsh - -Function SnoreWinVer - ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - ${VersionCompare} "6.2" $R0 $R0 - ${If} $R0 == 1 - Push "NotWin8" - ${Else} - Push "AtLeastWin8" - ${EndIf} -FunctionEnd - -!macro SnoreShortcut path exe appID - Call SnoreWinVer - Pop $0 - ${If} $0 == "AtLeastWin8" - nsExec::ExecToLog '"${SnoreToastExe}" -install "${path}" "${exe}" "${appID}"' - ${Else} - DetailPrint "Creating shortcut to ${exe}" - CreateShortCut "${path}" "${exe}" - ${EndIf} -!macroend \ No newline at end of file diff --git a/deployment/windows/nsis/include/UAC.nsh b/deployment/windows/nsis/include/UAC.nsh deleted file mode 100644 index 08979aba97e..00000000000 --- a/deployment/windows/nsis/include/UAC.nsh +++ /dev/null @@ -1,299 +0,0 @@ -/*** UAC Plug-in *** - -Interactive User (MediumIL) Admin user (HighIL) -***[Setup.exe]************* ***[Setup.exe]************** -* * * * -* +++[.OnInit]+++++++++++ * * +++[.OnInit]++++++++++++ * -* + UAC_RunElevated >---+-+----> * + + * -* + NSIS.Quit + * * + + * -* +++++++++++++++++++++++ * * ++++++++++++++++++++++++ * -* * * * -* * * * -* +++[Section]+++++++++++ * * +++[Section]++++++++++++ * -* + + * /--+-+- -** -** Get integrity level of current process -** -**/ -!macro UAC_GetIntegrityLevel outvar -UAC::_ 6 -!if "${outvar}" != "s" - Pop ${outvar} -!endif -!macroend - - - -/* UAC_IsAdmin -** -** Is the current process running with administrator privileges? Result in $0 -** -** ${If} ${UAC_IsAdmin} ... -** -**/ -!macro UAC_IsAdmin -UAC::_ 2 -!macroend -!define UAC_IsAdmin `"" UAC_IsAdmin ""` -!macro _UAC_IsAdmin _a _b _t _f -!insertmacro _UAC_MakeLL_Cmp _!= 0 2s -!macroend - - - -/* UAC_IsInnerInstance -** -** Does the current process have a NSIS/UAC parent process that is part of the elevation operation? -** -** ${If} ${UAC_IsInnerInstance} ... -** -**/ -!macro UAC_IsInnerInstance -UAC::_ 3 -!macroend -!define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""` -!macro _UAC_IsInnerInstance _a _b _t _f -!insertmacro _UAC_MakeLL_Cmp _!= 0 3s -!macroend - - - -/* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit, -** -** Helper macros for elevation on a custom elevation page, see the DualMode example for more information. -** -**/ -!macro UAC_Notify_OnGuiInit -UAC::_ 4 -!macroend -!macro UAC_PageElevation_OnGuiInit -!insertmacro UAC_Notify_OnGuiInit -!macroend -!macro UAC_PageElevation_OnInit -UAC::_ 5 -${IfThen} ${Errors} ${|} Quit ${|} -!macroend - - - -/* UAC_AsUser_Call -** -** Calls a function or label in the user process instance. -** All the UAC_AsUser_* macros use this helper macro. -** -**/ -!define UAC_SYNCREGISTERS 0x1 -;define UAC_SYNCSTACK 0x2 -!define UAC_SYNCOUTDIR 0x4 -!define UAC_SYNCINSTDIR 0x8 -;define UAC_CLEARERRFLAG 0x10 -!macro UAC_AsUser_Call type name flags -push $0 -Get${type}Address $0 ${name} -!verbose push -!verbose ${UAC_VERBOSE} -!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags} -!verbose pop -StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}" -!undef _UAC_AsUser_Call__flags -Exch $0 -UAC::_ -!macroend - - - -/* -** UAC_AsUser_GetSection -*/ -!macro UAC_AsUser_GetSection secprop secidx outvar -!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} "" -!macroend - - - -/* -** UAC_AsUser_GetGlobalVar -** UAC_AsUser_GetGlobal -*/ -!macro UAC_AsUser_GetGlobalVar var -!insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var} -!macroend -!macro UAC_AsUser_GetGlobal outvar srcvar -!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar} -!macroend - - - -/* -** UAC_AsUser_ExecShell -** -** Call ExecShell in the user process instance. -** -*/ -!macro UAC_AsUser_ExecShell verb command params workdir show -!insertmacro _UAC_IncL -goto _UAC_L_E_${__UAC_L} -_UAC_L_F_${__UAC_L}: -ExecShell "${verb}" "${command}" '${params}' ${show} -return -_UAC_L_E_${__UAC_L}: -!if "${workdir}" != "" - push $outdir - SetOutPath "${workdir}" -!endif -!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG} -!if "${workdir}" != "" - pop $outdir - SetOutPath $outdir -!endif -!macroend - - - -!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams -!insertmacro _LOGICLIB_TEMP -UAC::_ ${pluginparams} -pop $_LOGICLIB_TEMP -!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}` -!macroend -!macro _UAC_definemath def val1 op val2 -!define /math _UAC_definemath "${val1}" ${op} ${val2} -!ifdef ${def} - !undef ${def} -!endif -!define ${def} "${_UAC_definemath}" -!undef _UAC_definemath -!macroend -!macro _UAC_ParseDefineFlags_orin parse outflags -!searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2 -!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1} -!undef ${parse} -!define ${parse} ${_UAC_ParseDefineFlags_orin_f2} -!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}} -!undef ${outflags} -!define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}" -!undef _UAC_ParseDefineFlags_orin_saveout -!undef _UAC_ParseDefineFlags_orin_this -!ifdef _UAC_ParseDefineFlags_orin_f1 - !undef _UAC_ParseDefineFlags_orin_f1 -!endif -!ifdef _UAC_ParseDefineFlags_orin_f2 - !undef _UAC_ParseDefineFlags_orin_f2 -!endif -!macroend -!macro _UAC_ParseDefineFlags_Begin _outdef _in -!define _UAC_PDF${_outdef}_parse "${_in}" -!define _UAC_PDF${_outdef}_flags "" -!define _UAC_PDF${_outdef}_r 0 -!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x1 -!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x2 -!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x4 -!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x8 -!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x10 -!macroend -!macro _UAC_ParseDefineFlags_End _outdef -!define ${_outdef} ${_UAC_PDF${_outdef}_r} -!undef _UAC_PDF${_outdef}_r -!undef _UAC_PDF${_outdef}_flags -!undef _UAC_PDF${_outdef}_parse -!macroend -!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag -!if ${_UAC_PDF${_outdef}_flags} & ${flag} - !insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag} -!endif -!macroend -!macro _UAC_ParseDefineFlagsToInt _outdef _in -!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}" -!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags} -!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp -!undef _UAC_ParseDefineFlagsToInt_tmp -!macroend -!macro _UAC_IncL -!insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1 -!macroend -!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2 -!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2} -!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? - !if ${outvar} == $0 - !define ${_UAC_AUGOGR_ID} $1 - !else - !define ${_UAC_AUGOGR_ID} $0 - !endif - !if "${opparam1}" == "" - !define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}} - !define _UAC_AUGOGR_OPP2 ${opparam2} - !else - !define _UAC_AUGOGR_OPP1 ${opparam1} - !define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}} - !endif - goto ${_UAC_AUGOGR_ID}_C - ${_UAC_AUGOGR_ID}_F: - ${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2} - return - ${_UAC_AUGOGR_ID}_C: - !undef _UAC_AUGOGR_OPP1 - !undef _UAC_AUGOGR_OPP2 -!endif -push ${${_UAC_AUGOGR_ID}} -!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS} -StrCpy ${outvar} ${${_UAC_AUGOGR_ID}} -pop ${${_UAC_AUGOGR_ID}} -!undef _UAC_AUGOGR_ID -!macroend - - - -!verbose pop -!endif /* UAC_HDR__INC */ \ No newline at end of file diff --git a/deployment/windows/nsis/include/nsProcess.nsh b/deployment/windows/nsis/include/nsProcess.nsh deleted file mode 100644 index 84278b02b03..00000000000 --- a/deployment/windows/nsis/include/nsProcess.nsh +++ /dev/null @@ -1,28 +0,0 @@ -!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess` - -!macro nsProcess::FindProcess _FILE _ERR - nsProcess::_FindProcess /NOUNLOAD `${_FILE}` - Pop ${_ERR} -!macroend - - -!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess` - -!macro nsProcess::KillProcess _FILE _ERR - nsProcess::_KillProcess /NOUNLOAD `${_FILE}` - Pop ${_ERR} -!macroend - -!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess` - -!macro nsProcess::CloseProcess _FILE _ERR - nsProcess::_CloseProcess /NOUNLOAD `${_FILE}` - Pop ${_ERR} -!macroend - - -!define nsProcess::Unload `!insertmacro nsProcess::Unload` - -!macro nsProcess::Unload - nsProcess::_Unload -!macroend \ No newline at end of file diff --git a/deployment/windows/nsis/plugins/x86-ansi/SimpleFC.dll b/deployment/windows/nsis/plugins/x86-ansi/SimpleFC.dll deleted file mode 100644 index 73b7d9634de..00000000000 Binary files a/deployment/windows/nsis/plugins/x86-ansi/SimpleFC.dll and /dev/null differ diff --git a/deployment/windows/nsis/plugins/x86-ansi/UAC.dll b/deployment/windows/nsis/plugins/x86-ansi/UAC.dll deleted file mode 100644 index 57a58c5399a..00000000000 Binary files a/deployment/windows/nsis/plugins/x86-ansi/UAC.dll and /dev/null differ diff --git a/deployment/windows/nsis/plugins/x86-ansi/nsProcess.dll b/deployment/windows/nsis/plugins/x86-ansi/nsProcess.dll deleted file mode 100644 index 4ce012103f9..00000000000 Binary files a/deployment/windows/nsis/plugins/x86-ansi/nsProcess.dll and /dev/null differ diff --git a/deployment/windows/nsis/plugins/x86-unicode/UAC.dll b/deployment/windows/nsis/plugins/x86-unicode/UAC.dll deleted file mode 100644 index 97e7d15eae6..00000000000 Binary files a/deployment/windows/nsis/plugins/x86-unicode/UAC.dll and /dev/null differ diff --git a/deployment/windows/nsis/plugins/x86-unicode/nsProcess.dll b/deployment/windows/nsis/plugins/x86-unicode/nsProcess.dll deleted file mode 100644 index 2478624ee0b..00000000000 Binary files a/deployment/windows/nsis/plugins/x86-unicode/nsProcess.dll and /dev/null differ diff --git a/deployment/windows/nsis/setup.nsi b/deployment/windows/nsis/setup.nsi deleted file mode 100644 index d7ff5e72be9..00000000000 --- a/deployment/windows/nsis/setup.nsi +++ /dev/null @@ -1,1034 +0,0 @@ -;-------------------------------- -; Build environment -;-------------------------------- - - ;Unicode true - ;!define top_srcdir @top_srcdir@ - ;!define base_image_dir "" - ;!define srcdir @srcdir@ - !define VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD} - !define VERSION_FULL ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}.0 - ;!define PUBLISHER "Status.im" - ;!define WEBSITE_URL "https://status.im/" - !define AppUserModelId "StatusIm.Status.Desktop.1" ; app.id must match ID in modules/react-native-desktop-notification/desktop/desktopnotification.cpp - !define SnoreToastExe "$INSTDIR\SnoreToast.exe" - !define AppLinkFileName "Status.lnk" - !define AppExeName "Status.exe" - !define UninstallExeName "Uninstall.exe" - !define UninstallLinkName "Uninstall.lnk" - !define NodeJsServerExeName "ubuntu-server.exe" - !define SetupExeFileName "Status-x86_64-setup.exe" - !define OrgRegistryKeyPath "Software\${PUBLISHER}" - !define AppRegistryKeyPath "${OrgRegistryKeyPath}\Status Desktop" - !define UninstallRegKeyPath "Software\Microsoft\Windows\CurrentVersion\Uninstall\Status Desktop" - - !addplugindir plugins/x86-ansi - -;-------------------------------- -;General -;-------------------------------- - - ;Name and file - Name "Status Desktop ${VERSION}" - OutFile "${top_srcdir}/${SetupExeFileName}" - - SetCompressor /FINAL ${COMPRESSION_TYPE} ${COMPRESSION_ALGO} - - ; Default installation folder - InstallDir "$PROGRAMFILES64\${PUBLISHER}" - - ; Get installation folder from registry if available - InstallDirRegKey HKLM "${AppRegistryKeyPath}" "" - - RequestExecutionLevel user - - !define DUMP_KEY "SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" - -;-------------------------------- -; Include Modern UI and functions -;-------------------------------- - - !include "MUI2.nsh" - !include "WordFunc.nsh" - !include "Library.nsh" - !include "WinVer.nsh" - !include "FileFunc.nsh" -; !include "Memento.nsh" - !include "StrFunc.nsh" - !include "include/UAC.nsh" - !include "include/SnoreNotify.nsh" - !include "include/nsProcess.nsh" - - ${StrRep} - -;-------------------------------- -; Installer's VersionInfo -;-------------------------------- - - VIProductVersion "${VERSION_FULL}" - VIAddVersionKey "CompanyName" "${PUBLISHER}" - VIAddVersionKey "ProductName" "Status Desktop" - VIAddVersionKey "ProductVersion" "${VERSION}" - VIAddVersionKey "FileDescription" "Status Desktop Client" - VIAddVersionKey "FileVersion" "${VERSION}" - VIAddVersionKey "LegalCopyright" "${PUBLISHER}" - VIAddVersionKey "OriginalFilename" "${SetupExeFileName}" - -;-------------------------------- -; Required functions -;-------------------------------- - - !insertmacro GetParameters - !insertmacro GetOptions - !insertmacro un.GetParameters - !insertmacro un.GetOptions - -;-------------------------------- -;Variables -;-------------------------------- - - Var MUI_TEMP - Var STARTMENU_FOLDER - Var PREVIOUS_INSTALLDIR - Var PREVIOUS_VERSION - Var PREVIOUS_VERSION_STATE - Var REINSTALL_UNINSTALL - Var ALL_USERS_DEFAULT - Var ALL_USERS - Var IS_ADMIN - Var USERNAME - Var PERFORM_UPDATE - Var SKIPLICENSE - Var SKIPUAC - Var GetInstalledSize.total - Var OldRunDir - Var CommandLine - Var Quiet - -;-------------------------------- -;Interface Settings -;-------------------------------- - - !define MUI_ICON "${top_srcdir}/deployment/windows/status.ico" - ;!define MUI_UNICON "${srcdir}/uninstall.ico" - - !define MUI_ABORTWARNING - -;-------------------------------- -;Memento settings -;-------------------------------- - -;!define MEMENTO_REGISTRY_ROOT SHELL_CONTEXT -;!define MEMENTO_REGISTRY_KEY "${AppRegistryKeyPath}" - -;-------------------------------- -;Pages - - !define MUI_PAGE_CUSTOMFUNCTION_PRE PageDirectoryPre - !insertmacro MUI_PAGE_DIRECTORY - - ; Start Menu Folder Page Configuration - !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" - !define MUI_STARTMENUPAGE_REGISTRY_KEY "${AppRegistryKeyPath}" - !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Startmenu" - !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Status Desktop" - - !define MUI_PAGE_CUSTOMFUNCTION_PRE PageStartmenuPre - !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER - - !define MUI_PAGE_CUSTOMFUNCTION_LEAVE PostInstPage - !insertmacro MUI_PAGE_INSTFILES - - !define MUI_PAGE_CUSTOMFUNCTION_PRE un.ConfirmPagePre - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - !define MUI_PAGE_CUSTOMFUNCTION_PRE un.FinishPagePre - !insertmacro MUI_UNPAGE_FINISH - -Function GetUserInfo - ClearErrors - UserInfo::GetName - ${If} ${Errors} - StrCpy $IS_ADMIN 1 - Return - ${EndIf} - Pop $USERNAME - - ${If} ${UAC_IsAdmin} - StrCpy $IS_ADMIN 1 - ${Else} - StrCpy $IS_ADMIN 0 - ${EndIf} - -FunctionEnd - -Function UpdateShellVarContext - - ${If} $ALL_USERS == 1 - SetShellVarContext all - DetailPrint "Installing for all users" - ${Else} - SetShellVarContext current - DetailPrint "Installing for current user" - ${EndIf} - -FunctionEnd - -!Macro MessageBoxImpl options text sdreturn checks - ${If} $Quiet == 1 - MessageBox ${options} `${text}` ${checks} - ${Else} - MessageBox ${options} `${text}` /SD ${sdreturn} ${checks} - ${Endif} - -!MacroEnd - -!define MessageBox `!insertmacro MessageBoxImpl` - -Function ReadAllUsersCommandline - - ${GetOptions} $CommandLine "/user" $R1 - - ${Unless} ${Errors} - ${If} $R1 == "current" - ${OrIf} $R1 == "=current" - StrCpy $ALL_USERS 0 - ${ElseIf} $R1 == "all" - ${OrIf} $R1 == "=all" - StrCpy $ALL_USERS 1 - ${Else} - ${MessageBox} MB_ICONSTOP "Invalid option for /user. Has to be either /user=all or /user=current" IDOK '' - Abort - ${EndIf} - ${EndUnless} - Call UpdateShellVarContext - -FunctionEnd - -Function CheckPrevInstallDirExists - - ${If} $PREVIOUS_INSTALLDIR != "" - - ; Make sure directory is valid - Push $R0 - Push $R1 - StrCpy $R0 "$PREVIOUS_INSTALLDIR" "" -1 - ${If} $R0 == '\' - ${OrIf} $R0 == '/' - StrCpy $R0 $PREVIOUS_INSTALLDIR*.* - ${Else} - StrCpy $R0 $PREVIOUS_INSTALLDIR\*.* - ${EndIf} - ${IfNot} ${FileExists} $R0 - StrCpy $PREVIOUS_INSTALLDIR "" - ${EndIf} - Pop $R1 - Pop $R0 - - ${EndIf} - -FunctionEnd - -Function ReadPreviousVersion - - ReadRegStr $PREVIOUS_INSTALLDIR HKLM "${AppRegistryKeyPath}" "" - - Call CheckPrevInstallDirExists - - ${If} $PREVIOUS_INSTALLDIR != "" - ; Detect version - ReadRegStr $PREVIOUS_VERSION HKLM "${AppRegistryKeyPath}" "Version" - ${If} $PREVIOUS_VERSION != "" - StrCpy $ALL_USERS 1 - SetShellVarContext all - return - ${EndIf} - ${EndIf} - - ReadRegStr $PREVIOUS_INSTALLDIR HKCU "${AppRegistryKeyPath}" "" - - Call CheckPrevInstallDirExists - - ${If} $PREVIOUS_INSTALLDIR != "" - ; Detect version - ReadRegStr $PREVIOUS_VERSION HKCU "${AppRegistryKeyPath}" "Version" - ${If} $PREVIOUS_VERSION != "" - StrCpy $ALL_USERS 0 - SetShellVarContext current - return - ${EndIf} - ${EndIf} - -FunctionEnd - -Function LoadPreviousSettings - - ; Component selection - ;${MementoSectionRestore} - - ; Startmenu - !define ID "Application" - - !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME - - ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" - - ${if} $mui.StartMenuPage.RegistryLocation != "" - StrCpy "$STARTMENU_FOLDER" $mui.StartMenuPage.RegistryLocation - ${else} - StrCpy "$STARTMENU_FOLDER" "" - ${endif} - - !undef ID - - !endif - - ${If} $PREVIOUS_INSTALLDIR != "" - StrCpy $INSTDIR $PREVIOUS_INSTALLDIR - ${EndIf} - -FunctionEnd - -Function ReadUpdateCommandline - - ${GetOptions} $CommandLine "/update" $R1 - - ${If} ${Errors} - StrCpy $PERFORM_UPDATE 0 - ${Else} - StrCpy $PERFORM_UPDATE 1 - ${EndIf} - -FunctionEnd - -Function ReadSkipLicense - - ${GetOptions} $CommandLine "/skiplicense" $R1 - - ${If} ${Errors} - StrCpy $SKIPLICENSE 0 - ${Else} - StrCpy $SKIPLICENSE 1 - ${EndIf} - -FunctionEnd - -Function ReadSkipUAC - - ${GetOptions} $CommandLine "/skipuac" $R1 - - ${If} ${Errors} - StrCpy $SKIPUAC 0 - ${Else} - StrCpy $SKIPUAC 1 - ${EndIf} - -FunctionEnd - -Function ReadQuiet - - ${GetOptions} $CommandLine "/quiet" $R1 - - ${If} ${Errors} - StrCpy $Quiet 0 - ${Else} - StrCpy $Quiet 1 - SetSilent silent - ${EndIf} - -FunctionEnd - -Function .onInit - - Pop $OldRunDir - - ; Store command line - ${GetParameters} $CommandLine - - Call ReadQuiet - - ${Unless} ${AtLeastWin7} - ${MessageBox} MB_YESNO|MB_ICONSTOP "Unsupported operating system.$\nStatus Desktop ${VERSION} requires at least Windows 7 and may not work correctly on your system.$\nDo you really want to continue with the installation?" IDNO 'IDYES installonoldwindows' - Abort -installonoldwindows: - ${EndUnless} - ${Unless} ${RunningX64} - ${MessageBox} MB_OK|MB_ICONSTOP "Unsupported operating system.$\nThis is the installer for the 64bit version of Status Desktop ${VERSION} and does not run on your operating system which is only 32bit." IDOK '' - Abort - ${EndUnless} - - Call ReadSkipUAC - - ${If} $SKIPUAC != 1 -uac_tryagain: - !insertmacro UAC_RunElevated - - ${Switch} $0 - ${Case} 0 - ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done. - ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on - ${If} $2 = 3 ;RunAs completed successfully, but with a non-admin user - MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Status Desktop setup requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0 - ${EndIf} - ;fall-through and die - ${Case} 1223 - ; User aborted elevation, continue regardless - ${Break} - ${Default} - ${MessageBox} mb_iconstop "Could not elevate process (errorcode $0), continuing with normal user privileges." IDOK '' - ${Break} - ${EndSwitch} - - ; The UAC plugin changes the error level even in the inner process, reset it. - SetErrorLevel -1 - ${EndIf} - - ; /update argument - Call ReadUpdateCommandline - - Call ReadSkipLicense - - Call GetUserInfo - - ; Initialize $ALL_USERS with default value - ${If} $IS_ADMIN == 1 - StrCpy $ALL_USERS 1 - ${Else} - StrCpy $ALL_USERS 0 - ${EndIf} - Call UpdateShellVarContext - - ; See if previous version exists - ; This can change ALL_USERS - Call ReadPreviousVersion - - ${If} $PREVIOUS_VERSION != "" - StrCpy $REINSTALL_UNINSTALL 1 - ${EndIf} - - ; Load _all_ previous settings. - ; Need to do it now as up to now, $ALL_USERS was possibly reflecting a - ; previous installation. After this call, $ALL_USERS reflects the requested - ; installation mode for this installation. - Call LoadPreviousSettings - - Call ReadAllUsersCommandline - - ${If} $ALL_USERS == 1 - ${If} $IS_ADMIN == 0 - - ${If} $PREVIOUS_VERSION != "" - ${MessageBox} MB_ICONSTOP "Status Desktop has been previously installed for all users.$\nPlease restart the installer with Administrator privileges." IDOK '' - Abort - ${Else} - ${MessageBox} MB_ICONSTOP "Cannot install for all users.$\nPlease restart the installer with Administrator privileges." IDOK '' - Abort - ${EndIf} - ${EndIf} - ${EndIf} - - ${If} $PREVIOUS_VERSION == "" - - StrCpy $PERFORM_UPDATE 0 - DetailPrint "No previous version of Status Desktop was found" - - ${Else} - - Push "${VERSION}" - Push $PREVIOUS_VERSION - Call StatusVersionCompare - - DetailPrint "Found previous version: $PREVIOUS_VERSION" - DetailPrint "Installing $PREVIOUS_VERSION_STATE version ${VERSION}" - - ${EndIf} - - StrCpy $ALL_USERS_DEFAULT $ALL_USERS - -FunctionEnd - -Function StatusVersionCompare - - Exch $1 - Exch - Exch $0 - - Push $2 - Push $3 - Push $4 - -versioncomparebegin: - ${If} $0 == "" - ${AndIf} $1 == "" - StrCpy $PREVIOUS_VERSION_STATE "same" - goto versioncomparedone - ${EndIf} - - StrCpy $2 0 - StrCpy $3 0 - - ; Parse rc / beta suffixes for segments - StrCpy $4 $0 2 - ${If} $4 == "rc" - StrCpy $2 100 - StrCpy $0 $0 "" 2 - ${Else} - StrCpy $4 $0 4 - ${If} $4 == "beta" - StrCpy $0 $0 "" 4 - ${Else} - StrCpy $2 10000 - ${EndIf} - ${EndIf} - - StrCpy $4 $1 2 - ${If} $4 == "rc" - StrCpy $3 100 - StrCpy $1 $1 "" 2 - ${Else} - StrCpy $4 $1 4 - ${If} $4 == "beta" - StrCpy $1 $1 "" 4 - ${Else} - StrCpy $3 10000 - ${EndIf} - ${EndIf} - -split1loop: - - StrCmp $0 "" split1loopdone - StrCpy $4 $0 1 - StrCpy $0 $0 "" 1 - StrCmp $4 "." split1loopdone - StrCmp $4 "-" split1loopdone - StrCpy $2 $2$4 - goto split1loop -split1loopdone: - -split2loop: - - StrCmp $1 "" split2loopdone - StrCpy $4 $1 1 - StrCpy $1 $1 "" 1 - StrCmp $4 "." split2loopdone - StrCmp $4 "-" split2loopdone - StrCpy $3 $3$4 - goto split2loop -split2loopdone: - - ${If} $2 > $3 - StrCpy $PREVIOUS_VERSION_STATE "newer" - ${ElseIf} $3 > $2 - StrCpy $PREVIOUS_VERSION_STATE "older" - ${Else} - goto versioncomparebegin - ${EndIf} - - -versioncomparedone: - - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 - -FunctionEnd - -Function PageDirectoryPre - - ${If} $PERFORM_UPDATE == 1 - Abort - ${EndIf} - - ${If} $REINSTALL_UNINSTALL == "1" - ${AndIf} $PREVIOUS_VERSION_STATE != "same" - - Abort - - ${EndIf} - -FunctionEnd - -Function PageStartmenuPre - - ${If} $PERFORM_UPDATE == 1 - Abort - ${EndIf} - - ${If} $REINSTALL_UNINSTALL == "1" - ${AndIf} $PREVIOUS_VERSION_STATE != "same" - - ${If} "$STARTMENU_FOLDER" == "" - - StrCpy "$STARTMENU_FOLDER" ">" - - ${EndIf} - - Abort - - ${EndIf} - -FunctionEnd - -Function .OnInstFailed -FunctionEnd - -Function .onInstSuccess - - ;${MementoSectionSave} - - - ; Detect multiple install directories - ${If} $OldRunDir != '' - ${GetFileVersion} $OldRunDir $R0 - ${GetFileVersion} "$INSTDIR\${AppExeName}" $R1 - - StrCpy $R2 $OldRunDir -14 - - ${If} $R0 != '' - ${AndIf} $R1 != '' - ${AndIf} $R0 != $R1 - ${MessageBox} MB_ICONEXCLAMATION 'Multiple installations of Status Desktop detected.$\n$\nStatus Desktop ${VERSION} has been installed to "$InstDir".$\nAn old installation of Status Desktop $R0 still exists in the "$R2" directory.$\n$\nPlease delete the old version in the "$R2" directory.' IDOK '' - ${EndIf} - ${EndIf} - -FunctionEnd - -;-------------------------------- -; Languages -;-------------------------------- - - !insertmacro MUI_LANGUAGE "English" - -;-------------------------------- -;Installer Sections -;-------------------------------- - -Section "Status Desktop" SecMain - - ;SectionIn 1 RO - - ${nsProcess::FindProcess} "${NodeJsServerExeName}" $R0 - - ${If} $R0 == 0 - DetailPrint "${NodeJsServerExeName} is running. Closing it down" - ${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0 - DetailPrint "Waiting for ${NodeJsServerExeName} to close" - Sleep 2000 - ${Else} - DetailPrint "${NodeJsServerExeName} was not found to be running" - ${EndIf} - - ${nsProcess::Unload} - - SetOutPath "$INSTDIR" - - File "${top_srcdir}\.env" - File "${top_srcdir}\node_modules\node-notifier\vendor\snoreToast\SnoreToast.exe" - File /r "${top_srcdir}\desktop\bin\" - File /r "${base_image_dir}\" - - SetOutPath "$INSTDIR\notifier" - File "${top_srcdir}\node_modules\node-notifier\vendor\notifu\*.exe" - - SetOutPath "$INSTDIR\assets\resources\fonts" - File /r "${top_srcdir}\resources\fonts\" - - SetOutPath "$INSTDIR\assets\desktop\resources" - File /r "${top_srcdir}\desktop\resources\" - - SetOutPath "$INSTDIR\assets\resources\images" - File /r "${top_srcdir}\resources\images\" - - ;Create uninstaller - WriteUninstaller "$INSTDIR\${UninstallExeName}" - - WriteRegStr SHCTX "${AppRegistryKeyPath}" "" $INSTDIR - WriteRegStr SHCTX "${AppRegistryKeyPath}" "Version" "${VERSION}" - - WriteRegDWORD SHCTX "${AppRegistryKeyPath}" "Updated" $PERFORM_UPDATE - - ${StrRep} $R0 "$INSTDIR\${UninstallExeName}" '"' '""' - WriteRegExpandStr SHCTX "${UninstallRegKeyPath}" "UninstallString" '"$R0"' - WriteRegExpandStr SHCTX "${UninstallRegKeyPath}" "InstallLocation" "$INSTDIR" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayName" "Status Desktop ${VERSION}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayIcon" "$INSTDIR\${AppExeName}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayVersion" "${VERSION}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "URLInfoAbout" "${WEBSITE_URL}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "URLUpdateInfo" "${WEBSITE_URL}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "HelpLink" "${WEBSITE_URL}" - WriteRegStr SHCTX "${UninstallRegKeyPath}" "Publisher" "${PUBLISHER}" - WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "VersionMajor" "${VERSION_MAJOR}" - WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "VersionMinor" "${VERSION_MINOR}" - WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "NoModify" "1" - WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "NoRepair" "1" - - Call GetInstalledSize - WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "EstimatedSize" "$GetInstalledSize.total" ; Create/Write the reg key with the dword value - - ;Add applications to the firewall exception list - All Networks - All IP Version - Enabled - SimpleFC::IsApplicationAdded "$INSTDIR\${AppExeName}" - Pop $0 ; return error(1)/success(0) - ${if} $0 == "0" - Pop $1 ; return 1=Added/0=Not added - ${if} $1 == "0" - ; SimpleFC::AddApplication [name] [path] [scope] [ip_version] [remote_addresses] [status] - SimpleFC::AddApplication "Status Desktop Ethereum Node" "$INSTDIR\${AppExeName}" 0 2 "" 1 - SimpleFC::AddApplication "Status Desktop Node.js Server" "$INSTDIR\${NodeJsServerExeName}" 1 2 "" 1 - ${endif} - ${endif} - - !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - - ;Create shortcuts - SetOutPath "$INSTDIR" - CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${UninstallLinkName}" "$INSTDIR\${UninstallExeName}" - - ;CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${AppLinkFileName}" "$INSTDIR\${AppExeName}" - !insertmacro SnoreShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\${AppLinkFileName}" "$INSTDIR\${AppExeName}" "${AppUserModelId}" - - !insertmacro MUI_STARTMENU_WRITE_END - - ; Push $R0 - ; StrCpy $R0 "$STARTMENU_FOLDER" 1 - ; ${if} $R0 == ">" - ; ;Write folder to registry - ; WriteRegStr "${MUI_STARTMENUPAGE_Application_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_Application_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_Application_REGISTRY_VALUENAME}" ">" - ; ${endif} - ; Pop $R0 - - ${If} $ALL_USERS == 1 - ; Enable mini dumps - ${If} ${RunningX64} - SetRegView 64 - ${EndIf} - WriteRegDWORD HKLM "${DUMP_KEY}\${AppExeName}" "DumpType" "1" - WriteRegDWORD HKLM "${DUMP_KEY}\${NodeJsServerExeName}" "DumpType" "1" - ${If} ${RunningX64} - SetRegView lastused - ${EndIf} - ${EndIf} - - ; Register App Path so that typing status in Win+R dialog starts Status Desktop - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" "" "$INSTDIR\${AppExeName}" - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" "Path" "$INSTDIR" - -SectionEnd - -;-------------------------------- -; Functions -;-------------------------------- - -Function PostInstPage - - ; Don't advance automatically if details expanded - FindWindow $R0 "#32770" "" $HWNDPARENT - GetDlgItem $R0 $R0 1016 - System::Call user32::IsWindowVisible(i$R0)i.s - Pop $R0 - - ${If} $R0 != 0 - SetAutoClose false - ${EndIf} - -FunctionEnd - -Function GetInstalledSize - Push $0 - Push $1 - StrCpy $GetInstalledSize.total 0 - ${ForEach} $1 0 256 + 1 - ${if} ${SectionIsSelected} $1 - SectionGetSize $1 $0 - IntOp $GetInstalledSize.total $GetInstalledSize.total + $0 - ${Endif} - ${Next} - Pop $1 - Pop $0 - IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total - Push $GetInstalledSize.total -FunctionEnd - -;-------------------------------- -; Descriptions -;-------------------------------- - - ; Language strings - LangString DESC_SecMain ${LANG_ENGLISH} "Required program files." - ;LangString DESC_SecDesktop ${LANG_ENGLISH} "Create desktop icon for FileZilla" - - ; Assign language strings to sections - !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SecMain} $(DESC_SecMain) - ;!insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(DESC_SecDesktop) - !insertmacro MUI_FUNCTION_DESCRIPTION_END - -;-------------------------------- -; Uninstaller Variables -;-------------------------------- - -Var un.REMOVE_ALL_USERS -Var un.REMOVE_CURRENT_USER - -;-------------------------------- -;Uninstaller Functions -;-------------------------------- - -Function un.GetUserInfo - ClearErrors - UserInfo::GetName - ${If} ${Errors} - StrCpy $IS_ADMIN 1 - Return - ${EndIf} - Pop $USERNAME - - ${If} ${UAC_IsAdmin} - StrCpy $IS_ADMIN 1 - ${Else} - StrCpy $IS_ADMIN 0 - ${EndIf} - -FunctionEnd - -Function un.ReadPreviousVersion - - ReadRegStr $R0 HKLM "${AppRegistryKeyPath}" "" - - ${If} $R0 != "" - ;Detect version - ReadRegStr $R2 HKLM "${AppRegistryKeyPath}" "Version" - ${If} $R2 == "" - StrCpy $R0 "" - ${EndIf} - ${EndIf} - - ReadRegStr $R1 HKCU "${AppRegistryKeyPath}" "" - - ${If} $R1 != "" - ;Detect version - ReadRegStr $R2 HKCU "${AppRegistryKeyPath}" "Version" - ${If} $R2 == "" - StrCpy $R1 "" - ${EndIf} - ${EndIf} - - ${If} $R1 == $INSTDIR - Strcpy $un.REMOVE_CURRENT_USER 1 - ${EndIf} - ${If} $R0 == $INSTDIR - Strcpy $un.REMOVE_ALL_USERS 1 - ${EndIf} - ${If} $un.REMOVE_CURRENT_USER != 1 - ${AndIf} $un.REMOVE_ALL_USERS != 1 - ${If} $R1 != "" - Strcpy $un.REMOVE_CURRENT_USER 1 - ${If} $R0 == $R1 - Strcpy $un.REMOVE_ALL_USERS 1 - ${EndIf} - ${Else} - StrCpy $un.REMOVE_ALL_USERS = 1 - ${EndIf} - ${EndIf} - -FunctionEnd - -Function un.onInit - - ${un.GetParameters} $CommandLine - - ${un.GetOptions} $CommandLine "/quiet" $R1 - ${If} ${Errors} - StrCpy $Quiet 0 - ${Else} - StrCpy $Quiet 1 - SetSilent silent - ${EndIf} - - Call un.GetUserInfo - Call un.ReadPreviousVersion - - ${If} $un.REMOVE_ALL_USERS == 1 - ${AndIf} $IS_ADMIN == 0 -uac_tryagain: - !insertmacro UAC_RunElevated - - ${Switch} $0 - ${Case} 0 - ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done. - ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on - ${If} $2 = 3 ;RunAs completed successfully, but with a non-admin user - MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Status Desktop setup requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0 - Abort - ${EndIf} - ;fall-through and die - ${Default} - ${MessageBox} MB_ICONSTOP "Status Desktop has been installed for all users.$\nPlease restart the uninstaller with Administrator privileges to remove it." IDOK '' - Abort - ${EndSwitch} - - ; The UAC plugin changes the error level even in the inner process, reset it. - SetErrorLevel -1 - ${EndIf} - -FunctionEnd - -Function un.RemoveStartmenu - - !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP - - Delete "$SMPROGRAMS\$MUI_TEMP\${UninstallLinkName}" - Delete "$SMPROGRAMS\$MUI_TEMP\${AppLinkFileName}" - - ${un.GetOptions} $CommandLine "/keepstartmenudir" $R1 - ${If} ${Errors} - - ; Delete empty start menu parent diretories - StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" - - startMenuDeleteLoop: - RMDir $MUI_TEMP - GetFullPathName $MUI_TEMP "$MUI_TEMP\.." - - IfErrors startMenuDeleteLoopDone - - StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop - startMenuDeleteLoopDone: - - ${EndUnless} - -FunctionEnd - -Function un.ConfirmPagePre - - ${un.GetOptions} $CommandLine "/frominstall" $R1 - ${Unless} ${Errors} - Abort - ${EndUnless} - -FunctionEnd - -Function un.FinishPagePre - - ${un.GetOptions} $CommandLine "/frominstall" $R1 - ${Unless} ${Errors} - SetRebootFlag false - Abort - ${EndUnless} - -FunctionEnd - -;-------------------------------- -; Uninstaller Section -;-------------------------------- - -Section "Uninstall" - - SetShellVarContext all - - SetDetailsPrint lastused - - ${nsProcess::FindProcess} "${AppExeName}" $R0 - - ${If} $R0 == 0 - DetailPrint "${AppExeName} is running. Closing it down" - ${nsProcess::CloseProcess} "${AppExeName}" $R0 - DetailPrint "Waiting for ${AppExeName} to close" - Sleep 2000 - ${Else} - DetailPrint "${AppExeName} was not found to be running" - ${EndIf} - - ${nsProcess::FindProcess} "${NodeJsServerExeName}" $R0 - - ${If} $R0 == 0 - DetailPrint "${NodeJsServerExeName} is running. Closing it down" - ${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0 - DetailPrint "Waiting for ${NodeJsServerExeName} to close" - Sleep 2000 - ${Else} - DetailPrint "${NodeJsServerExeName} was not found to be running" - ${EndIf} - - ${nsProcess::Unload} - - SimpleFC::RemoveApplication "$INSTDIR\${AppExeName}" - SimpleFC::RemoveApplication "$INSTDIR\${NodeJsServerExeName}" - - Delete "$INSTDIR\.env" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\${AppExeName}" - Delete "$INSTDIR\reportApp.exe" - Delete "$INSTDIR\vc_redist.x64.exe" - Delete "$INSTDIR\${NodeJsServerExeName}" - Delete "$INSTDIR\${UninstallExeName}" - RMDir /r "$INSTDIR\assets" - Delete "$INSTDIR\bearer\*.dll" - RMDir "$INSTDIR\bearer" - Delete "$INSTDIR\iconengines\*.dll" - RMDir "$INSTDIR\iconengines" - Delete "$INSTDIR\imageformats\*.dll" - RMDir "$INSTDIR\imageformats" - RMDir /r "$INSTDIR\node_modules" - Delete "$INSTDIR\notifier\*.exe" - RMDir "$INSTDIR\notifier" - Delete "$INSTDIR\platforms\*.dll" - RMDir "$INSTDIR\platforms" - RMDir /r "$INSTDIR\QtGraphicalEffects" - RMDir /r "$INSTDIR\QtQml" - RMDir /r "$INSTDIR\QtQuick" - RMDir /r "$INSTDIR\QtQuick.2" - RMDir /r "$INSTDIR\QtWebSockets" - Delete "$INSTDIR\styles\*.dll" - RMDir "$INSTDIR\styles" - Delete "$INSTDIR\translations\*.qm" - RMDir "$INSTDIR\translations" - - Delete "$INSTDIR" - - ${un.GetOptions} $CommandLine "/frominstall" $R1 - ${If} ${Errors} - RMDir /r /REBOOTOK "$INSTDIR" - - DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Package" - DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Updated" - DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Channel" - ${EndIf} - - ${If} $un.REMOVE_ALL_USERS == 1 - SetShellVarContext all - Call un.RemoveStartmenu - - DeleteRegKey /ifempty HKLM "${AppRegistryKeyPath}" - DeleteRegKey /ifempty HKLM "${OrgRegistryKeyPath}" - DeleteRegKey HKLM "${UninstallRegKeyPath}" - - Delete "$DESKTOP\${AppLinkFileName}" - - ; Remove dump key - ${If} ${RunningX64} - SetRegView 64 - ${EndIf} - DeleteRegValue HKLM "${DUMP_KEY}\${AppExeName}" "DumpType" - DeleteRegValue HKLM "${DUMP_KEY}\${NodeJsServerExeName}" "DumpType" - ${If} ${RunningX64} - SetRegView lastused - ${EndIf} - ${EndIf} - - ${If} $un.REMOVE_CURRENT_USER == 1 - SetShellVarContext current - Call un.RemoveStartmenu - - DeleteRegKey /ifempty HKCU "${AppRegistryKeyPath}" - DeleteRegKey /ifempty HKCU "${OrgRegistryKeyPath}" - DeleteRegKey HKCU "${UninstallRegKeyPath}" - - Delete "$DESKTOP\${AppLinkFileName}" - ${EndIf} - - DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" - -SectionEnd diff --git a/deployment/windows/resource.h b/deployment/windows/resource.h deleted file mode 100644 index 8f7a0e1fcaf..00000000000 --- a/deployment/windows/resource.h +++ /dev/null @@ -1,20 +0,0 @@ -//{{NO_DEPENDENCIES}} -// clang-format off -// Used by Status.rc - -#define IDI_STATUS 107 -#ifndef IDC_STATIC -#define IDC_STATIC -1 -#endif -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS - -#define _APS_NO_MFC 130 -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/deployment/windows/status.ico b/deployment/windows/status.ico deleted file mode 100644 index 5a8f1b5c0ef..00000000000 Binary files a/deployment/windows/status.ico and /dev/null differ diff --git a/deployment/windows/targetver.h b/deployment/windows/targetver.h deleted file mode 100644 index 94495af9a9d..00000000000 --- a/deployment/windows/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include \ No newline at end of file diff --git a/deps.edn b/deps.edn deleted file mode 100644 index ea5cd574913..00000000000 --- a/deps.edn +++ /dev/null @@ -1,36 +0,0 @@ -{:paths ["components/src" "src" "react-native/src/cljsjs" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.10.0"} ;; Keep in sync with version from Nix - org.clojure/clojurescript {:mvn/version "1.10.520"} - org.clojure/core.async {:mvn/version "0.4.474"} - reagent {:mvn/version "0.7.0" - :exclusions [cljsjs/react cljsjs/react-dom cljsjs/react-dom-server cljsjs/create-react-class]} - re-frame {:git/url "https://github.com/status-im/re-frame" - :sha "b0d3b0f016f217c6a397a54e5eba9486471fb172" - :deps/manifest :deps} - com.andrewmcveigh/cljs-time {:mvn/version "0.5.2"} - status-im/timbre {:mvn/version "4.10.0-2-status"} - com.taoensso/encore {:mvn/version "2.94.0"} - hickory {:mvn/version "0.7.1"} - cljs-bean {:mvn/version "1.3.0"} - mvxcvi/alphabase {:mvn/version "1.0.0"} - rasom/cljs-react-navigation {:mvn/version "0.1.4"}} - - :aliases - {:dev {:extra-deps - {clj-rn {:git/url "https://github.com/status-im/clj-rn" - :sha "144eeecfb389edd9b5d4d94507acf828c5265b97"} - - ;; Figwheel ClojureScript REPL - cider/piggieback {:mvn/version "0.4.0" - :exclusions [com.google.javascript/closure-compiler]} - figwheel-sidecar {:mvn/version "0.5.18"} - re-frisk-remote {:mvn/version "0.5.5"} - re-frisk-sidecar {:mvn/version "0.5.7"} - hawk {:mvn/version "0.2.11"} - day8.re-frame/tracing {:mvn/version "0.5.0"} - - ;; CIDER compatible nREPL - cider/cider-nrepl {:mvn/version "0.21.1"} - refactor-nrepl {:mvn/version "2.4.0"}}} - :test {:extra-deps {day8.re-frame/test {:mvn/version "0.1.5"} - doo {:mvn/version "0.1.9"}}}}} diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt deleted file mode 100644 index 31ee2fb296d..00000000000 --- a/desktop/CMakeLists.txt +++ /dev/null @@ -1,99 +0,0 @@ - -# Copyright (C) 2016, Canonical Ltd. -# All rights reserved. - -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. - -cmake_minimum_required(VERSION 3.12.1) - -set(APP_NAME Status) -set(JS_APP_NAME StatusIm) -set(REACT_BUILD_STATIC_LIB ON) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNICODE -std=c++11") -if(STATUS_NO_LOGGING) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATUS_NO_LOGGING") -endif() -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -std=c11") -set(CMAKE_INSTALL_PREFIX bin) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}" CACHE PATH "Where to place compiled executables.") - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/") - -project(${APP_NAME} C CXX) -set(${APP_NAME}_BINARY_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) - -set(USED_QT_MODULES Core Concurrent Qml Quick WebSockets Svg) -include(QtConfiguration) - -set(ICON_PNG_RESOURCE_PATH "${CMAKE_SOURCE_DIR}/../deployment/status-icon.png") -if (WIN32) - set(ICO_RESOURCE_PATH "${CMAKE_SOURCE_DIR}/../deployment/windows/status.ico") - set(APPLICATION_MAIN_RC_PATH "${CMAKE_SOURCE_DIR}/../deployment/windows/Status.rc") - - configure_file( - ${CMAKE_SOURCE_DIR}/../deployment/windows/Status.rc.in - ${APPLICATION_MAIN_RC_PATH} - ) -endif() - -message(STATUS "EXTERNAL_MODULES_DIR: ${EXTERNAL_MODULES_DIR}") - -string(REGEX MATCH "BUILD_FOR_BUNDLE" BUILD_FOR_BUNDLE "${CMAKE_CXX_FLAGS}") - -# It is important to distinguish between directory hierarchies -# in release and dev builds. Release contains .env -# in the root dir of the build, while dev build's current dir -# is status-react/desktop/bin, hence the need -# to jump two levels up. -# This is required by react-native-config library which references ENVFILE -# from its own CMakeLists.txt file, so it will read the value set here -if(${BUILD_FOR_BUNDLE} MATCHES "BUILD_FOR_BUNDLE") - set(ENVFILE "/.env") -else() - set(ENVFILE "/../../.env") -endif() - -foreach(external_module ${EXTERNAL_MODULES_DIR}) - message(STATUS "external_module: ${external_module}") - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../${external_module} ${CMAKE_CURRENT_BINARY_DIR}/${external_module}) -endforeach(external_module) - -add_subdirectory(reportApp) - -# Import any new Qt modules that have been added by external dependencies -import_qt_modules() - -# APPLICATION_MAIN_CPP_PATH contains absolute path to generated template copy of main.cpp for application executable -get_filename_component(APPLICATION_MAIN_CPP_PATH main.cpp ABSOLUTE) - -set(REACTQT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../node_modules/react-native/React) -include_directories(${REACTQT_DIR}/Layout) -add_subdirectory(${REACTQT_DIR}Qt/runtime/src ${CMAKE_CURRENT_BINARY_DIR}/lib) -add_subdirectory(${REACTQT_DIR}Qt/application/src ${CMAKE_CURRENT_BINARY_DIR}/bin) - -if (Qt5_POSITION_INDEPENDENT_CODE) - SET(CMAKE_POSITION_INDEPENDENT_CODE ON) -endif(Qt5_POSITION_INDEPENDENT_CODE) - -target_sources(${APP_NAME} - PRIVATE - "${CMAKE_CURRENT_LIST_DIR}/appconfig.h" - "${CMAKE_CURRENT_LIST_DIR}/appconfig.cpp") - -#set(SOURCE_ROOT ${CMAKE_SOURCE_DIR}) -include(CompleteBundle) - -if (WIN32) - set(RUN_SCRIPT_FILE_NAME "run-app.bat") -else() - set(RUN_SCRIPT_FILE_NAME "run-app.sh") -endif() - -configure_file( - ${RUN_SCRIPT_FILE_NAME}.in - ${CMAKE_CURRENT_BINARY_DIR}/${RUN_SCRIPT_FILE_NAME} - @ONLY -) diff --git a/desktop/CMakeModules/CompleteBundle.cmake b/desktop/CMakeModules/CompleteBundle.cmake deleted file mode 100644 index 39151c73c40..00000000000 --- a/desktop/CMakeModules/CompleteBundle.cmake +++ /dev/null @@ -1,12 +0,0 @@ -if(APPLE) - set(SCRIPT CompleteBundleOSX) -elseif(WIN32) - set(SCRIPT CompleteBundleWin) -elseif(UNIX) - set(SCRIPT CompleteBundleLinux) -endif(APPLE) - -if(SCRIPT AND EXISTS ${CMAKE_SOURCE_DIR}/CMakeModules/${SCRIPT}.cmake.in) - configure_file(${CMAKE_SOURCE_DIR}/CMakeModules/${SCRIPT}.cmake.in ${SCRIPT}.cmake @ONLY) - include(${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT}.cmake) -endif() diff --git a/desktop/CMakeModules/CompleteBundleWin.cmake.in b/desktop/CMakeModules/CompleteBundleWin.cmake.in deleted file mode 100644 index 7722cd4fcba..00000000000 --- a/desktop/CMakeModules/CompleteBundleWin.cmake.in +++ /dev/null @@ -1,62 +0,0 @@ -# windeployqt should be used here, but since we get the `Not implemented` error from it, we're trying to manually copy artifacts to output directory -set(TARGET_DIR "${@APP_NAME@_BINARY_DIR}") - -########################################################################################################## -# -# NOTE: Remember to reflect any changes on the setup generation procedure in /deployment/windows/nsis/setup.nsi -# -########################################################################################################## - -set(qtmodules Core Quick QuickTemplates2 QuickControls2 WebSockets Widgets Gui Network Svg Qml Concurrent) -if(USE_QTWEBKIT) - set(qtmodules ${qtmodules} Multimedia WebKit WebKitWidgets WebChannel) - - add_custom_command(TARGET @APP_NAME@ POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "@CONAN_BIN_DIRS_QT5-MXE@/QtWebProcess.exe" - ${TARGET_DIR} - BYPRODUCTS ${TARGET_DIR}/QtWebProcess.exe) -endif() -foreach(qtmodule ${qtmodules}) - message(STATUS "Copying ${qtmodule} module to ${TARGET_DIR}") - file(COPY "@CONAN_BIN_DIRS_QT5-MXE@/Qt5${qtmodule}.dll" DESTINATION "${TARGET_DIR}") -endforeach(qtmodule ${qtmodules}) -if(EXISTS "@QTROOT@/translations") - message(STATUS "Copying translations module to ${TARGET_DIR}") - file(COPY "@QTROOT@/translations" DESTINATION "${TARGET_DIR}") -endif() - -set(qtplugindirs "bearer" "platforms" "styles" "iconengines" "imageformats") -foreach(qtplugindir ${qtplugindirs}) - message(STATUS "Copying plugin ${qtplugindir} to ${TARGET_DIR}/${qtplugindir}") - file(COPY "@CONAN_BIN_DIRS_QT5-MXE@/../plugins/${qtplugindir}/" DESTINATION "${TARGET_DIR}/${qtplugindir}") -endforeach() - -set(qtqmldirs "QtQuick" "QtQuick.2" "QtGraphicalEffects" "QtWebSockets" "QtQml") -if(USE_QTWEBKIT) - set(qtqmldirs ${qtqmldirs} "QtWebKit" "QtWebChannel") -endif() -foreach(qtqmldir ${qtqmldirs}) - message(STATUS "Copying QML dir for ${qtqmldir} to ${TARGET_DIR}/${qtqmldir}") - file(COPY "@CONAN_BIN_DIRS_QT5-MXE@/../qml/${qtqmldir}/" DESTINATION "${TARGET_DIR}/${qtqmldir}") -endforeach() - -set(deps_qt5 "libpng16-16" "libharfbuzz-0" "zlib1" "libpcre2-16-0" - "libpcre-1" "libcrypto-1_1-x64" "libssl-1_1-x64" "libfreetype-6" - "libglib-2.0-0" "libstdc++-6" "libbz2" "libintl-8" "libiconv-2" - "icuin56" "icuuc56" "icudt56" "libjpeg-9" "libsqlite3-0" "libwebp-5" "libgcc_s_seh-1") -set(TOOLCHAIN_BINDIRS "@CONAN_BIN_DIRS_MXETOOLCHAIN-X86_64-W64-MINGW32@") -separate_arguments(TOOLCHAIN_BINDIRS) -foreach(lib ${deps_qt5}) - foreach(bindir ${TOOLCHAIN_BINDIRS}) - set(lib_full_path "${bindir}/${lib}.dll") - if(EXISTS "${lib_full_path}") - break() - endif() - endforeach() - if(NOT EXISTS "${lib_full_path}") - set(lib_full_path "@CONAN_BIN_DIRS_QT5-MXE@/${lib}.dll") - endif() - message(STATUS "Copying ${lib_full_path} to ${TARGET_DIR}") - file(COPY ${lib_full_path} DESTINATION ${TARGET_DIR}) -endforeach(lib ${deps_qt5}) diff --git a/desktop/CMakeModules/QtConfiguration.cmake b/desktop/CMakeModules/QtConfiguration.cmake deleted file mode 100644 index 47e756e20da..00000000000 --- a/desktop/CMakeModules/QtConfiguration.cmake +++ /dev/null @@ -1,86 +0,0 @@ -macro(import_qt_modules) - set(REQUIRED_QT_VERSION "5.9.1") - - set(QTCONFIGROOT ${QTROOT}/lib/cmake/Qt5) - - foreach(COMP ${USED_QT_MODULES}) - set(mod Qt5${COMP}) - - # look for the config files in the QtConfigRoot defined above - set(${mod}_DIR ${QTCONFIGROOT}${COMP}) - - # look for the actual package - find_package(${mod} ${REQUIRED_QT_VERSION} REQUIRED) - - #message("${mod}_INCLUDE_DIRS: include_directories(${${mod}_INCLUDE_DIRS})") - include_directories(${${mod}_INCLUDE_DIRS}) - if (${COMP} STREQUAL "Quick") - # We need to include the private headers for QZipWriter. If in the future we can't use that class anymore, we can always resort to the QuaZIP OSS library - include_directories(${${mod}_PRIVATE_INCLUDE_DIRS}) - endif() - - list(APPEND QT5_LIBRARIES ${${mod}_LIBRARIES}) - list(APPEND QT5_CFLAGS ${${mod}_EXECUTABLE_COMPILE_FLAGS}) - endforeach(COMP ${USED_QT_MODULES}) -endmacro(import_qt_modules) - -if(WIN32) - # Download automatically, you can also just copy the conan.cmake file - # TODO: Create packages of qt5 for Linux and MacOS too, so that we can rely strictly on this branch of code - if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") - message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") - file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/9cc97acda619b7917f140415241785a864482b11/conan.cmake" - "${CMAKE_BINARY_DIR}/conan.cmake") - endif() - - include(${CMAKE_BINARY_DIR}/conan.cmake) - - conan_check() - - if(USE_QTWEBKIT) - set(_QT_PACKAGE_OPTIONS "qt5-mxe:webkit=True") - endif() - conan_cmake_run(REQUIRES qt5-mxe/5.11.2@status-im/stable - PROFILE ../node_modules/status-conan/profiles/status-mingw32-x86_64 - SETTINGS "qt5-mxe:os=Windows" "qt5-mxe:arch=x86_64" - OPTIONS ${_QT_PACKAGE_OPTIONS} - BUILD never) - - set(QTROOT "${CONAN_QT5-MXE_ROOT}") -else(WIN32) - set(QTROOT "$ENV{QT_PATH}") -endif(WIN32) - -if(NOT EXISTS ${QTROOT}/bin/qt.conf) - if(EXISTS ${QTROOT}/gcc_64/bin/qt.conf) - set(QTROOT "${QTROOT}/gcc_64") - elseif(EXISTS ${QTROOT}/clang_64/bin/qt.conf) - set(QTROOT "${QTROOT}/clang_64") - else() - message(FATAL_ERROR "Could not find qt.conf in ${QTROOT}/bin nor in ${QTROOT}/clang_64/bin nor in ${QTROOT}/gcc_64/bin. Is QTROOT correctly defined?") - endif() -endif() - -if(WIN32) - set(WINARCHSTR ARCHSTR windows-x86_64) -endif(WIN32) - -message(STATUS "Qt root directory: ${QTROOT}") - -list(APPEND CMAKE_FIND_ROOT_PATH ${QTROOT}) -list(APPEND CMAKE_PREFIX_PATH ${QTROOT}) -include_directories(${QTROOT}/include) - -import_qt_modules() - -if(QT5_CFLAGS) - list(REMOVE_DUPLICATES QT5_CFLAGS) - if(WIN32) - list(REMOVE_ITEM QT5_CFLAGS -fPIC) - endif(WIN32) -endif(QT5_CFLAGS) - -message(STATUS "Qt version: ${Qt5Core_VERSION_STRING}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${QT5_CFLAGS}") - -set(CMAKE_REQUIRED_LIBRARIES ${QT5_LIBRARIES}) diff --git a/desktop/Toolchain-Ubuntu-mingw64.cmake b/desktop/Toolchain-Ubuntu-mingw64.cmake deleted file mode 100644 index 1ca2df5a487..00000000000 --- a/desktop/Toolchain-Ubuntu-mingw64.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# Toolchain file for building for Windows from an Ubuntu Linux system. -# -# Typical usage: -# *) install cross compiler: `sudo apt-get install mingw-w64 g++-mingw-w64` -# *) cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-Ubuntu-mingw64.cmake .. - -message(STATUS "Cross-compiling for Windows") - -set(CMAKE_SYSTEM_NAME Windows) -if(NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux") - message(FATAL_ERROR "Can only cross-compile to Windows from Linux") -endif() - -set(USE_QTWEBKIT OFF) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/toolchain/") -include(conanbuildinfo) -#conan_basic_setup() -conan_global_flags() diff --git a/desktop/appconfig.cpp b/desktop/appconfig.cpp deleted file mode 100644 index 7a90204414e..00000000000 --- a/desktop/appconfig.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "appconfig.h" - -#include - -#include - -const QStringList loggingCategories = - {"UIManager", - "Flexbox", - "WebSocketModule", - "Networking", - "ViewManager", - "RCTNotification", - "default", - "RCTStatus", - "jsserver", - "status"}; - -const QString SETTINGS_GROUP_NAME = "im/status"; -const QString AppConfig::LOGGING_ENABLED = "logging_enabled"; - -Q_LOGGING_CATEGORY(APPCONFIG, "AppConfig") - -AppConfig AppConfig::appConfig; - -AppConfig::AppConfig() -: settings("Status.im", "StatusDesktop") { - settings.beginGroup(SETTINGS_GROUP_NAME); - - // Set default values - if (settings.value(LOGGING_ENABLED).isNull()) { - settings.setValue(LOGGING_ENABLED, false); - } - - QStringList keys = settings.allKeys(); - for (int i = 0; i < keys.size(); ++i) { - processFx(keys[i], settings.value(keys[i])); - } -} - -AppConfig& AppConfig::inst() { - return appConfig; -} - -QVariant AppConfig::getValue(const QString& name) const { - return settings.value(name); -} - -void AppConfig::setValue(const QString& name, const QVariant& value) { - processFx(name, value); - settings.setValue(name, value); -} - -// This fn is for processing side-effects of a particular value -void AppConfig::processFx(const QString& name, const QVariant& value) const { - //qCDebug(APPCONFIG) << "### processFx group" << settings.group() << " " << name << ": " << value; - if (name == LOGGING_ENABLED) { - bool enabled = value.toBool(); - //qCDebug(APPCONFIG) << "### processFx" << name << ": " << value << ": " << enabled; - QLoggingCategory::setFilterRules(getLoggingFilterRules(enabled)); - } -} - -QString AppConfig::getLoggingFilterRules(bool enabled) const { - if (enabled) { - return "UIManager=false\nFlexbox=false\nViewManager=false\nNetworking=false\nWebSocketModule=false"; - } - else { - QString filterRules; - for (int i = 0; i < loggingCategories.size(); ++i) { - filterRules += (loggingCategories.at(i) + "=false\n"); - } - return filterRules; - } -} - diff --git a/desktop/appconfig.h b/desktop/appconfig.h deleted file mode 100644 index 812fc75935e..00000000000 --- a/desktop/appconfig.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef APPCONFIG_H -#define APPCONFIG_H - -#include -#include -#include - -// This class is intended to store app configuration -// modifiable from JS side -// Currently, only logging-related settings are here -// that are used by react-native-desktop-config module -class AppConfig { -public: - - static AppConfig& inst(); - - QVariant getValue(const QString& name) const; - void setValue(const QString& name, const QVariant& value); - - const static QString LOGGING_ENABLED; -private: - AppConfig(); - - static AppConfig appConfig; - QSettings settings; - - QString getLoggingFilterRules(bool enabled) const; - void processFx(const QString& name, const QVariant& value) const; -}; -#endif // APPCONFIG_H - diff --git a/desktop/build.bat b/desktop/build.bat deleted file mode 100644 index 9158b84b08a..00000000000 --- a/desktop/build.bat +++ /dev/null @@ -1,36 +0,0 @@ -@rem Copyright (c) 2017-present, Status Research and Development GmbH. -@rem All rights reserved. -@rem -@rem This source code is licensed under the BSD-style license found in the -@rem LICENSE file in the root directory of this source tree. An additional grant -@rem of patent rights can be found in the PATENTS file in the same directory. - -@echo off -setlocal EnableDelayedExpansion - -set "option=" -for %%a in (%*) do ( - if not defined option ( - set arg=%%a - if "!arg:~0,1!" equ "-" set "option=!arg!" - ) else ( - set "option!option!=%%a" - set "option=" - ) -) - -SET option -@echo on - -echo "build.bat external modules paths: "%option-e% -echo "build.bat JS bundle path: "%option-j% -echo "build.bat desktop fonts: "%option-f% -echo "build.bat desktop images: "%option-i% -echo "build.bat cmake generator: "%option-g% - -@rem Workaround -@rem rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile - -@rem Build project -echo %CD% -cmake -DCMAKE_BUILD_TYPE=Debug -G %option-g% -DEXTERNAL_MODULES_DIR=%option-e% -DJS_BUNDLE_PATH=%option-j% -DDESKTOP_FONTS=%option-f% -DDESKTOP_IMAGES=%option-i% . && cmake --build . diff --git a/desktop/build.sh b/desktop/build.sh deleted file mode 100755 index 0767e2cc660..00000000000 --- a/desktop/build.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (C) 2016, Canonical Ltd. -# All rights reserved. - -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. - -# XXX: Don't move this script -cd $(dirname $0) - -while (( "$#" )); do -if [[ $1 == "-e" ]]; then - shift - ExternalModulesPaths="$1" -fi -if [[ $1 == "-j" ]]; then - shift - JsBundlePath="$1" -fi -if [[ $1 == "-f" ]]; then - shift - desktopFonts="$1" -fi -if [[ $1 == "-i" ]]; then - shift - desktopImages="$1" -fi -shift -done - -echo "build.sh external modules paths: "$ExternalModulesPaths -echo "build.sh JS bundle path: "$JsBundlePath -echo "build.sh desktop fonts: "$desktopFonts -echo "build.sh desktop images: "$desktopImages - -# Workaround -rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile - -# Build project -cmake -DCMAKE_BUILD_TYPE=Debug \ - -DEXTERNAL_MODULES_DIR="$ExternalModulesPaths" \ - -DJS_BUNDLE_PATH="$JsBundlePath" \ - -DDESKTOP_FONTS="$desktopFonts" \ - -DDESKTOP_IMAGES="$desktopImages" \ - -DCMAKE_INSTALL_COMPONENT='' \ - . && \ -make diff --git a/desktop/js_files/package.json b/desktop/js_files/package.json deleted file mode 100644 index b3dbae5f237..00000000000 --- a/desktop/js_files/package.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "name": "StatusIm-Desktop", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node node_modules/react-native/local-cli/cli.js start", - "prepare": "patch-package" - }, - "dependencies": { - "assert": "^1.4.1", - "bignumber.js": "git+https://github.com/status-im/bignumber.js.git#v4.0.2-status", - "buffer": "^3.6.0", - "chance": "^1.1.3", - "create-react-class": "^15.6.2", - "emojilib": "^2.2.9", - "eth-phishing-detect": "^1.1.13", - "events": "^1.1.1", - "functional-red-black-tree": "^1.0.1", - "google-breakpad": "git+https://github.com/status-im/google-breakpad.git#v0.9.0", - "hi-base32": "^0.5.0", - "i18n-js": "^3.5.0", - "identicon.js": "git+https://github.com/status-im/identicon.js.git#v1.2.1-status", - "metro": "^0.48.1", - "nfc-react-native": "git+https://github.com/status-im/nfc-react-native.git#v0.3.8-status", - "qrcode": "^1.4.4", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "react-native": "git+https://github.com/status-im/react-native-desktop.git#v0.57.8_11", - "react-native-background-timer": "^2.0.0", - "react-native-camera": "^3.9.0", - "react-native-config": "git+https://github.com/status-im/react-native-config.git#v0.11.2-status", - "react-native-dialogs": "^0.0.20", - "react-native-fetch-polyfill": "^1.1.2", - "react-native-fs": "git+https://github.com/status-im/react-native-fs.git#v2.9.7-status", - "react-native-gesture-handler": "^1.5.0", - "react-native-image-crop-picker": "^0.26.1", - "react-native-image-resizer": "^1.1.0", - "react-native-keychain": "git+https://github.com/status-im/react-native-keychain.git#v.3.0.0-4-status", - "react-native-languages": "git+https://github.com/status-im/react-native-languages.git#v0.1.1-status", - "react-native-navigation-twopane": "git+https://github.com/status-im/react-native-navigation-twopane.git#v0.0.2-status", - "react-native-os": "^1.1.0", - "react-native-splash-screen": "^3.0.6", - "react-native-webview-bridge": "git+https://github.com/status-im/react-native-webview-bridge.git#0.33.16-status-rn049-desktop", - "react-navigation": "^3.11.0", - "status-conan": "git+https://github.com/status-im/status-conan.git#v1.0.0", - "web3-utils": "^1.2.4" - }, - "devDependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/helper-builder-react-jsx": "^7.7.0", - "@babel/plugin-transform-block-scoping": "7.0.0", - "@babel/preset-env": "^7.7.1", - "@babel/register": "^7.7.0", - "babel-preset-react-native": "^5.0.2", - "coveralls": "^3.0.7", - "metro-react-native-babel-preset": "^0.57.0", - "nyc": "^14.1.1", - "patch-package": "^5.1.1", - "rn-snoopy": "git+https://github.com/status-im/rn-snoopy.git#v2.0.2-status" - }, - "optionalDependencies": { - "appdmg": "^0.6.0" - }, - "desktopExternalModules": [ - "node_modules/react-native-languages/desktop", - "node_modules/react-native-config/desktop", - "node_modules/react-native-fs/desktop", - "node_modules/react-native-webview-bridge/desktop", - "node_modules/react-native-keychain/desktop", - "modules/react-native-status/desktop", - "modules/react-native-desktop-linking/desktop", - "modules/react-native-desktop-menu/desktop", - "modules/react-native-desktop-config/desktop", - "modules/react-native-desktop-shortcuts/desktop", - "modules/react-native-desktop-notification/desktop", - "modules/react-native-desktop-gesture-handler/desktop", - "node_modules/google-breakpad" - ], - "desktopFonts": [ - "../../../../../resources/fonts/Inter-BlackItalic.otf", - "../../../../../resources/fonts/Inter-Black.otf", - "../../../../../resources/fonts/Inter-BoldItalic.otf", - "../../../../../resources/fonts/Inter-Bold.otf", - "../../../../../resources/fonts/Inter-ExtraBoldItalic.otf", - "../../../../../resources/fonts/Inter-ExtraBold.otf", - "../../../../../resources/fonts/Inter-ExtraLight-BETA.otf", - "../../../../../resources/fonts/Inter-ExtraLightItalic-BETA.otf", - "../../../../../resources/fonts/Inter-Italic.otf", - "../../../../../resources/fonts/Inter-Light-BETA.otf", - "../../../../../resources/fonts/Inter-LightItalic-BETA.otf", - "../../../../../resources/fonts/Inter-MediumItalic.otf", - "../../../../../resources/fonts/Inter-Medium.otf", - "../../../../../resources/fonts/Inter-Regular.otf", - "../../../../../resources/fonts/Inter-SemiBoldItalic.otf", - "../../../../../resources/fonts/Inter-SemiBold.otf", - "../../../../../resources/fonts/Inter-Thin-BETA.otf", - "../../../../../resources/fonts/Inter-ThinItalic-BETA.otf" - ], - "desktopImages": [ - "../../../../../desktop/resources/add.png", - "../../../../../desktop/resources/address.png", - "../../../../../desktop/resources/add_contact.png", - "../../../../../desktop/resources/arrow_left.png", - "../../../../../desktop/resources/arrow_right.png", - "../../../../../desktop/resources/arrow_up.png", - "../../../../../desktop/resources/back.png", - "../../../../../desktop/resources/backspace.png", - "../../../../../desktop/resources/bell.png", - "../../../../../desktop/resources/browser.png", - "../../../../../desktop/resources/camera.png", - "../../../../../desktop/resources/cancel.png", - "../../../../../desktop/resources/change.png", - "../../../../../desktop/resources/check.png", - "../../../../../desktop/resources/close.png", - "../../../../../desktop/resources/commands.png", - "../../../../../desktop/resources/copy.png", - "../../../../../desktop/resources/corner_left_bottom.png", - "../../../../../desktop/resources/corner_left_top.png", - "../../../../../desktop/resources/corner_right_bottom.png", - "../../../../../desktop/resources/corner_right_top.png", - "../../../../../desktop/resources/dapp.png", - "../../../../../desktop/resources/delete.png", - "../../../../../desktop/resources/desktop.png", - "../../../../../desktop/resources/download.png", - "../../../../../desktop/resources/dropdown.png", - "../../../../../desktop/resources/dropdown_up.png", - "../../../../../desktop/resources/edit.png", - "../../../../../desktop/resources/filter.png", - "../../../../../desktop/resources/fingerprint.png", - "../../../../../desktop/resources/flash.png", - "../../../../../desktop/resources/flash_active.png", - "../../../../../desktop/resources/group_chat.png", - "../../../../../desktop/resources/help.png", - "../../../../../desktop/resources/history.png", - "../../../../../desktop/resources/home.png", - "../../../../../desktop/resources/home_1.png", - "../../../../../desktop/resources/icon_action_back.png", - "../../../../../desktop/resources/icon_action_forward.png", - "../../../../../desktop/resources/icon_action_fullscreen_collapse.png", - "../../../../../desktop/resources/icon_action_fullscreen_expand.png", - "../../../../../desktop/resources/icon_arrow_top.png", - "../../../../../desktop/resources/icon_avatar.png", - "../../../../../desktop/resources/icon_check_on.png", - "../../../../../desktop/resources/icon_close_light_gray.png", - "../../../../../desktop/resources/icon_forward_gray.png", - "../../../../../desktop/resources/icon_lock_gray.png", - "../../../../../desktop/resources/icon_lock_white.png", - "../../../../../desktop/resources/icon_menu_group.png", - "../../../../../desktop/resources/icon_money_white.png", - "../../../../../desktop/resources/icon_muted.png", - "../../../../../desktop/resources/icon_notifications_on.png", - "../../../../../desktop/resources/icon_phone_white.png", - "../../../../../desktop/resources/ic_background.png", - "../../../../../desktop/resources/ic_foreground.png", - "../../../../../desktop/resources/ic_stat_status_notification.png", - "../../../../../desktop/resources/info.png", - "../../../../../desktop/resources/in_contacts.png", - "../../../../../desktop/resources/keycard.png", - "../../../../../desktop/resources/keycard_logo.png", - "../../../../../desktop/resources/language.png", - "../../../../../desktop/resources/launch_logo.png", - "../../../../../desktop/resources/link.png", - "../../../../../desktop/resources/logo.png", - "../../../../../desktop/resources/log_out.png", - "../../../../../desktop/resources/mailserver.png", - "../../../../../desktop/resources/make_admin.png", - "../../../../../desktop/resources/max.png", - "../../../../../desktop/resources/message.png", - "../../../../../desktop/resources/mobile.png", - "../../../../../desktop/resources/more.png", - "../../../../../desktop/resources/network.png", - "../../../../../desktop/resources/next.png", - "../../../../../desktop/resources/notification.png", - "../../../../../desktop/resources/one_on_one_chat.png", - "../../../../../desktop/resources/password.png", - "../../../../../desktop/resources/paste.png", - "../../../../../desktop/resources/photo.png", - "../../../../../desktop/resources/profile.png", - "../../../../../desktop/resources/public_chat.png", - "../../../../../desktop/resources/qr.png", - "../../../../../desktop/resources/receive.png", - "../../../../../desktop/resources/refresh.png", - "../../../../../desktop/resources/remove_contact.png", - "../../../../../desktop/resources/reply.png", - "../../../../../desktop/resources/rotate_camera.png", - "../../../../../desktop/resources/search.png", - "../../../../../desktop/resources/security.png", - "../../../../../desktop/resources/send.png", - "../../../../../desktop/resources/settings.png", - "../../../../../desktop/resources/settings_advanced.png", - "../../../../../desktop/resources/share.png", - "../../../../../desktop/resources/stickers.png", - "../../../../../desktop/resources/text.png", - "../../../../../desktop/resources/tiny_arrow_down.png", - "../../../../../desktop/resources/tiny_check.png", - "../../../../../desktop/resources/tiny_clear.png", - "../../../../../desktop/resources/tiny_edit.png", - "../../../../../desktop/resources/tiny_external.png", - "../../../../../desktop/resources/tiny_group.png", - "../../../../../desktop/resources/tiny_lock.png", - "../../../../../desktop/resources/tiny_lock_broken.png", - "../../../../../desktop/resources/tiny_new_contact.png", - "../../../../../desktop/resources/tiny_pending.png", - "../../../../../desktop/resources/tiny_public.png", - "../../../../../desktop/resources/tiny_settings.png", - "../../../../../desktop/resources/tiny_tribute_to_talk.png", - "../../../../../desktop/resources/tribute_to_talk.png", - "../../../../../desktop/resources/two_arrows.png", - "../../../../../desktop/resources/username.png", - "../../../../../desktop/resources/user_profile.png", - "../../../../../desktop/resources/user_profile_1.png", - "../../../../../desktop/resources/wallet.png", - "../../../../../desktop/resources/warning.png" - ] -} diff --git a/desktop/js_files/yarn.lock b/desktop/js_files/yarn.lock deleted file mode 100644 index 460788d77d0..00000000000 --- a/desktop/js_files/yarn.lock +++ /dev/null @@ -1,8133 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" - integrity sha512-W7IeG4MoVf4oUvWfHUx9VG9if3E0xSUDf1urrnNYtC2ow1dz2ptvQ6YsJfyVXDuPTFXz66jkHhzMW7a5Eld7TA== - dependencies: - "@babel/highlight" "7.0.0-beta.47" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.0.0": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" - integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.4" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.4" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.3" - "@babel/types" "^7.6.3" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" - integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helpers" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.7.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.47.tgz#1835709f377cc4d2a4affee6d9258a10bbf3b9d1" - integrity sha512-fJP+9X+gqgTTZzTqrKJHwebPwt6S/e/4YuyRyKyWHAIirGgUwjRoZgbFci24wwGYMJW7nlkCSwWG7QvCVsG0eg== - dependencies: - "@babel/types" "7.0.0-beta.47" - jsesc "^2.5.1" - lodash "^4.17.5" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.0.0", "@babel/generator@^7.4.0", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" - integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== - dependencies: - "@babel/types" "^7.6.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" - integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== - dependencies: - "@babel/types" "^7.7.2" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.47.tgz#354fb596055d9db369211bf075f0d5e93904d6f6" - integrity sha512-Pjxb/PrxyKWc7jcAXlawvNAQMxxY+tSSNC5wxJstJjpO10mocmGzBOqNYjxdvVhMb3d0BEPQ8mR+D65fFpZ+TA== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-annotate-as-pure@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e" - integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.47.tgz#d5917c29ee3d68abc2c72f604bc043f6e056e907" - integrity sha512-nv8d6TcDBb1CJMQzwab/e0rqyqoP9d2AQBjr4GdSiVRpJX4aiLEiLBm2XprdEb/sVIRmmBnVxPXJaHDsS/K2fw== - dependencies: - "@babel/helper-explode-assignable-expression" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-builder-react-jsx@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0-beta.47.tgz#e39bbce315743044c0d64b31f82f20600f761729" - integrity sha512-oBGX/MyT4kNGuINK2k/KLHD77Ih1oTROtoxnV3uAPS9rLYhmZn3W8qy2L4bbyMwQ89nVSM427b0bTTXUEEReXA== - dependencies: - "@babel/types" "7.0.0-beta.47" - esutils "^2.0.0" - -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== - dependencies: - "@babel/types" "^7.3.0" - esutils "^2.0.0" - -"@babel/helper-builder-react-jsx@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz#c6b8254d305bacd62beb648e4dea7d3ed79f352d" - integrity sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A== - dependencies: - "@babel/types" "^7.7.0" - esutils "^2.0.0" - -"@babel/helper-call-delegate@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.47.tgz#96b7804397075f722a4030d3876f51ec19d8829b" - integrity sha512-Rx9TRmCCEP0pWau9gfR6ubcbbX3nVc4ImNY143ftC70jrKdSv5rS20yz2cmCilDzhexwGZQ3PFwOLKe3C/5aEg== - dependencies: - "@babel/helper-hoist-variables" "7.0.0-beta.47" - "@babel/traverse" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-create-class-features-plugin@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" - integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" - -"@babel/helper-create-regexp-features-plugin@^7.7.0": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6" - integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ== - dependencies: - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" - -"@babel/helper-define-map@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.47.tgz#43a9def87c5166dc29630d51b3da9cc4320c131c" - integrity sha512-pLB9RY7GZKcc/frzgfDY/HwdqxWPe60qMAvNUef1V1bDZ8i4AUgxAANgltFzj61t100WGhqaS0xGkALD+9VA+g== - dependencies: - "@babel/helper-function-name" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-define-map@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529" - integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.47.tgz#56b688e282a698f4d1cf135453a11ae8af870a19" - integrity sha512-1mwk27zmhSuMUcVWxw5ZKiPYfuWXviZNqgA4OvFBloPf9R+dKDhNgP2uUrkHh68ltVVc3Bup1nsbd/2KM5AxEw== - dependencies: - "@babel/traverse" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.47.tgz#8057d63e951e85c57c02cdfe55ad7608d73ffb7d" - integrity sha512-0LSvt95XCYaOrDA5K68KkTyldKXizDwBnKACdYzQszp1GdbtzmSeGwFU5Ecw86fU6bkYXtDvkFTOQwk/WQSJPw== - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.47" - "@babel/template" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3" - integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q== - dependencies: - "@babel/helper-get-function-arity" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-get-function-arity@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.47.tgz#2de04f97c14b094b55899d3fa83144a16d207510" - integrity sha512-63j0i3YUW8CO//uQc3ACffJdIlYcIlysuHjMF0yzQhqKoQ/CUPv0hf3nBwdRGjiWrr3JcL6++NF4XmXdwSU+fA== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d" - integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-hoist-variables@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.47.tgz#ce295d1d723fe22b2820eaec748ed701aa5ae3d0" - integrity sha512-5BcKFhyzrsInlrfO/tGoe6khUuJzGfROD7oozF/5MWsKo/c3gVJfQ5y83lZ4XoTKJt/x4PQlLU0aHd/SJpYONA== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-hoist-variables@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81" - integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-member-expression-to-functions@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.47.tgz#35bfcf1d16dce481ef3dec66d5a1ae6a7d80bb45" - integrity sha512-gpipslnZw2hcVGADUtqQII9KF8FPpRZsVUXwKP/0EnWwtujRFSVL+u2Fh+VXODRAxFmTLo6eGcOr/Vfan0MqYw== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== - dependencies: - "@babel/types" "^7.5.5" - -"@babel/helper-member-expression-to-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a" - integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-imports@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.47.tgz#5af072029ffcfbece6ffbaf5d9984c75580f3f04" - integrity sha512-Rk43Ty+a6npu9znK22IqFlseStRGWxEHi2cjmLbbi63VGiseofdUtIJI65F9MTCuMTXAX7VbY/ghef1Jp5qpvw== - dependencies: - "@babel/types" "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" - integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-module-transforms@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.47.tgz#7eff91fc96873bd7b8d816698f1a69bbc01f3c38" - integrity sha512-CziMe30ZunAhe6j05oNOFOg7im1lcv3dYuMxrwBYVe9YdP4NHPU7a1wrDBUhaPmyqTIZDwGnFne7k1KP79SeGQ== - dependencies: - "@babel/helper-module-imports" "7.0.0-beta.47" - "@babel/helper-simple-access" "7.0.0-beta.47" - "@babel/helper-split-export-declaration" "7.0.0-beta.47" - "@babel/template" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-module-transforms@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786" - integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-simple-access" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.47.tgz#085d864d0613c5813c1b7c71b61bea36f195929e" - integrity sha512-NhnGhjwrhzGas4A/PoBDEtEPCGJHrzhaT6qGmo1hmkA2orG4UNi7KENC38DhJII0n2oUrKUuzTwgCvxKOTiHbw== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-optimise-call-expression@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365" - integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-plugin-utils@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.47.tgz#4f564117ec39f96cf60fafcde35c9ddce0e008fd" - integrity sha512-GR67o8boOKVJRKM5Nhk7oVEHpxYy8R00lwu0F82WxxBH+iiT26DqW1e/4w/mo7Bdn1A6l0pNaOlNk1PdM2Hgag== - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.47.tgz#b8e3b53132c4edbb04804242c02ffe4d60316971" - integrity sha512-dafidvVkjJP5AIWkJspV+7RGj1jeNts0qYvlmVzqAGb6BmQzEldJr6ZPzrmlpW/AW1YJGdw7br2yiwvlCRqDvQ== - dependencies: - lodash "^4.17.5" - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== - dependencies: - lodash "^4.17.13" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-remap-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7" - integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-wrap-function" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-replace-supers@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.47.tgz#310b206a302868a792b659455ceba27db686cbb7" - integrity sha512-yf2JAD1+xNTjavqazqknRgPfd6MbGfvfIcAkxWsPURynAwOMSs4zThED8ImT2d5a97rGPysRJcq1jNh2L0WYxg== - dependencies: - "@babel/helper-member-expression-to-functions" "7.0.0-beta.47" - "@babel/helper-optimise-call-expression" "7.0.0-beta.47" - "@babel/traverse" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - -"@babel/helper-replace-supers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512" - integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-simple-access@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.47.tgz#234d754acbda9251a10db697ef50181eab125042" - integrity sha512-sd2t3QDKjd+hHkJKaC2AX39l6oIil1N548oMZAtV5YHlVGoWWkAVGnPMxRg7ICEjIftCU3ZI6UeaogyEhF8t7Q== - dependencies: - "@babel/template" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-simple-access@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d" - integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helper-split-export-declaration@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.47.tgz#e11277855472d8d83baf22f2d0186c4a2059b09a" - integrity sha512-jx8GmxryT6Qy4+24W6M6TnVL9T8bxqdyg5UKHjxBdw0Y2Sano1n0WphUS2seuOugn04W2ZQLqGc0ut8nGe/taA== - dependencies: - "@babel/types" "7.0.0-beta.47" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-split-export-declaration@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300" - integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA== - dependencies: - "@babel/types" "^7.7.0" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helper-wrap-function@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" - integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== - dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" - -"@babel/helpers@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b" - integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g== - dependencies: - "@babel/template" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/highlight@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" - integrity sha512-d505K3Hth1eg0b2swfEF7oFMw3J9M8ceFg0s6dhCSxOOF+07WDvJ0HKT/YbK/Jk9wn8Wyr6HIRAUPKJ9Wfv8Rg== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" - integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== - -"@babel/parser@^7.7.0", "@babel/parser@^7.7.2": - version "7.7.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043" - integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A== - -"@babel/plugin-external-helpers@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" - integrity sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-async-generator-functions@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971" - integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-class-properties@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.47.tgz#08c1a1dfc92d0f5c37b39096c6fb883e1ca4b0f5" - integrity sha512-6yuCiF+ZZHPLgAa+0a6/teNeAMsWqY6AVtZA4NhCWnwP4OH0JrRaY7rwvFCJSqNGurf8rF65W9IucM/l0+HOCg== - dependencies: - "@babel/helper-function-name" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/helper-replace-supers" "7.0.0-beta.47" - "@babel/plugin-syntax-class-properties" "7.0.0-beta.47" - -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" - integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-dynamic-import@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f" - integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz#2c0ac2dcc36e3b2443fead2c3c5fc796fb1b5145" - integrity sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" - integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.47.tgz#e1529fddc88e948868ee1d0edaa27ebd9502322d" - integrity sha512-ujUjQUyTxUWHfixRD7Y5Nm8VCgHSf6YgbM37LEnojKp5lPahZO42qJfDty+Kh0tEanpI5H8BLPkJbFSzx6TNEw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.47" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-optional-chaining@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.0.0-beta.47.tgz#099e5720121f91eb36544575f98d44cd57865ea5" - integrity sha512-5jlVmdC1Lv874h2553xAp50jVv3L/23KksOLUZdF/9+ZdbAzOlhX6spHiVy/jjfU9G1MFZtZTlxhV5roGkqZvg== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/plugin-syntax-optional-chaining" "7.0.0-beta.47" - -"@babel/plugin-proposal-optional-chaining@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" - integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d" - integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-class-properties@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.47.tgz#de52bed12fd472c848e1562f57dd4a202fe27f11" - integrity sha512-vLoAuLSjHSenX3TQmri6ttQWZp3rEtGcRp4LgYEBQ012fN5h+KmcssvkCAqm6V6ozS5KzUWpBlZ6t7YhZG6oBw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" - integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" - integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-flow@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.47.tgz#9d0b09b9af6fec87a7b22e406bf948089d58c188" - integrity sha512-+3ZLKNV8tSDnTWL4QRNx5uZB/hUzY71WcgCwoXWy+8ma7EjZ3e3vbR69VR8dJwG1DqGsug6ZzM+afR0G4gKgPA== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" - integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.47.tgz#f3849d94288695d724bd205b4f6c3c99e4ec24a4" - integrity sha512-5scuJzIYZY8M+A1ra8mcKANIwB5TtsRD6Aw94xZxfvnjhhVMFR5RYE9HshVlBrZVY+r3cJDNIQLJMC/fGJHImA== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" - integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.47.tgz#21da514d94c138b2261ca09f0dec9abadce16185" - integrity sha512-UOGQCmzvNlZMQOuys7xPiTa2EjTT3xHuhUghcdJnYikqGV43obpIIaP+VDCWPvIT8g0QDIvmRWx5UefvkWXN+w== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-chaining@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.0.0-beta.47.tgz#f1febe859d9dde26f2b2e1f20cf679925d1fab23" - integrity sha512-lt6JV/D7QeAEf3qqUT4JTPkbU6vNCfeMW7BB7JD+HYivITkmXuGIVl7w4JrRB9LkfjkYE5vgiz3Nc733AD7v8w== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-syntax-optional-chaining@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" - integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-top-level-await@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d" - integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-typescript@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" - integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.47.tgz#d6eecda4c652b909e3088f0983ebaf8ec292984b" - integrity sha512-xiU+7RJAsqx+iZqWSQQWBu9ZDTruWimkg4puDSdRVfEwgZQdOtiU2LuO0+xGFyitJPHkKuje0WvK1tFu1dmxCw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-async-to-generator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492" - integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.0" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" - integrity sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" - -"@babel/plugin-transform-block-scoping@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.47.tgz#b737cc58a81bea57efd5bda0baef9a43a25859ad" - integrity sha512-V/u3Zdy40KjVQeyYUaQnCGiHQbRNJoc6IEtNDERltuW9vYPHS1n6YGc+EHKi8JVYT4kE6UHOjD+BrbCCV4kjRw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-block-scoping@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.47.tgz#7aff9cbe7b26fd94d7a9f97fa90135ef20c93fb6" - integrity sha512-hzW/jL6TPBMHJXeXwzuxMN0PFAfjVD0UzATHrFSejY5A7SvhWWrv1cZ3K0/SzCXJ9LpMdxCNiREvVjeD/Tyx2g== - dependencies: - "@babel/helper-annotate-as-pure" "7.0.0-beta.47" - "@babel/helper-define-map" "7.0.0-beta.47" - "@babel/helper-function-name" "7.0.0-beta.47" - "@babel/helper-optimise-call-expression" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/helper-replace-supers" "7.0.0-beta.47" - "@babel/helper-split-export-declaration" "7.0.0-beta.47" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a" - integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.7.0" - "@babel/helper-define-map" "^7.7.0" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-optimise-call-expression" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.47.tgz#56ef2a021769a2b65e90a3e12fd10b791da9f3e0" - integrity sha512-V78qyzmjj4aq/tjpkMFbV5gPtrx7xdclW1Rn6vV9hIwMSMbtstYEXF4msy614MofvYj6gYbPbNfyhXFIUvz/xw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.47.tgz#452b607775fd1c4d10621997837189efc0a6d428" - integrity sha512-3AaXC9H7qPybJbSs/QMhhj9EZF9MYrb/HRytwki1tckaYifqCJquENIZxDAYmwsWIGIHiq34WqwPRMIsz/b5uQ== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b" - integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.47.tgz#930e1abf5db9f4db5b63dbf97f3581ad0be1e907" - integrity sha512-vyGG3kLIXpMuaPL485aqowdWFrxCxXtbzMXy9p1QTK5Q/+9UHpK9XoAVJZGknnsm091m0Ss7spo8uHaxbzYVog== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-flow-strip-types@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.47.tgz#fa45811094c10d70c84efdd0eac62ebd2a634bf7" - integrity sha512-X/8Gd4CxdBx7LOtW2wPSzr83bYyndqYbnJoUEosPJXOG2aRmgVo4hn+wk97vtDH+hMP7HsTApVBffrZNXS3erA== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/plugin-syntax-flow" "7.0.0-beta.47" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" - integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - -"@babel/plugin-transform-for-of@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.47.tgz#527d5dc24e4a4ad0fc1d0a3990d29968cb984e76" - integrity sha512-tfH5OMzV9fWLYJTzWDhoRJKr8kvBZWH26jiCgM0ayNq75ES/X947MqMNAgBjJdTAVEV2kOyks2ItgNAJT4rOUw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.47.tgz#fb443c81cc77f3206a863b730b35c8c553ce5041" - integrity sha512-/5I/f8NCouugsRT6ORB1UjCP3N+Rgv/OB6SzmaeIUEpYYPM6D7WQ+4BaRYXQn4eqtOJmTgxDXYa8FgYtoeqP9A== - dependencies: - "@babel/helper-function-name" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-function-name@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a" - integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA== - dependencies: - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.47.tgz#448fad196f062163684a38f10f14e83315892e9c" - integrity sha512-PxBw+52qWypwR76YfS2FlW4wZfp61SjIyt3OSPZeWnf0zVQWNVrlRRunJ7lBYudDYvyMwStAE/VynZ0fHtPgng== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.47.tgz#dfe5c6d867aa9614e55f7616736073edb3aab887" - integrity sha512-MYoLyexybBJ9ODWWMsMFzxAQey68RzhQNPjfNAYPhPPB3X160EZ5qOjWxRS2rYNvuYAxs6guy5OdrDpESqFSrQ== - dependencies: - "@babel/helper-module-transforms" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/helper-simple-access" "7.0.0-beta.47" - -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" - integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-systemjs@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417" - integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg== - dependencies: - "@babel/helper-hoist-variables" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-umd@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966" - integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA== - dependencies: - "@babel/helper-module-transforms" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf" - integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-assign@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.0.0-beta.47.tgz#aaf0e4593c1e9b1ceb48fc8770736a029b17ed64" - integrity sha512-5Cc/5TsUjxiAuEQ4WUu+ccP0RI2/qcZWEZA7U87RH26rnhc0NDBZfUbEf1RGM5gBFLFVNzUAoFX8kRykHvl/nQ== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-object-assign@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" - integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - -"@babel/plugin-transform-parameters@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.47.tgz#46a4236040a6552a5f165fb3ddd60368954b0ddd" - integrity sha512-UzQG8draO+30Y8eNEREuGBfmEHLL7WFxOjmTBbaTrbdOrm/znCUThqcuNz8cyn2nrZbln7M/loQ3stjf9Pt9fQ== - dependencies: - "@babel/helper-call-delegate" "7.0.0-beta.47" - "@babel/helper-get-function-arity" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0-beta.47.tgz#7a45c1703b8b33f252148ecf1b50dd54809de952" - integrity sha512-Rw1KWihSkGHbqHiQuiFu/beMakDtobW3eLSABw1w3BvRIc/UhBXxwyIxa/q/R9hWFBholAjmx9cKey8FnZPykw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-jsx-source@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0-beta.47.tgz#da8c01704b896409eae168a15045216e72d278dc" - integrity sha512-oZ6D9z+qql+tz7PjGp1CaxepxqDQQTusyjeKsWr7NdEa0v2j3sWLkfK4Aa7kU9BT0+j+r/LN4u33UBkBNVoVvw== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/plugin-syntax-jsx" "7.0.0-beta.47" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-react-jsx@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0-beta.47.tgz#98c99a69be748d966c0aea08b5ca942ba3fc9ed1" - integrity sha512-HGian2BbCsyAqs6LntVVRpjXG9TkzhHfTynjUoMxOFL29doKEy/0s96SMvmbBSR/wMRKMd1OPvCiEYYxqZtr3g== - dependencies: - "@babel/helper-builder-react-jsx" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/plugin-syntax-jsx" "7.0.0-beta.47" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== - dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-regenerator@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.47.tgz#86500e1c404055fb98fc82b73b09bd053cacb516" - integrity sha512-JEPIiJyqYRfjOYUTZguLkb2HTwudReqLyOljpOXnJ/1ymwsiof4D6ul611DGlMxJMZJGQ6TBi59iY9GoJ6j4Iw== - dependencies: - regenerator-transform "^0.12.3" - -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-regenerator@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc" - integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-runtime@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" - integrity sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.47.tgz#00be44c4fad8fe2c00ed18ea15ea3c88dd519dbb" - integrity sha512-+o7/yb0Nrk4Gg/tnBgfBf+G1uGZbtkSluUnj8RyD37ajpDlWmysDjFEHSfktKcuD8YHeGz2M9AYNGcClk1fr/g== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.47.tgz#3feadb02292ed1e9b75090d651b9df88a7ab5c50" - integrity sha512-LFAozFdfT4bE2AQw2BnjzLufTX4GBsTUHUGRhT8XNoDYuGnV+7k9Yj6JU3/7csJc9u6W91PArYgoO+D56CMw6Q== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-spread@^7.0.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.47.tgz#c0aa347d76b5dc87d3b37ac016ada3f950605131" - integrity sha512-+Rc6NihGoXcwAqAxbiumvzOYxRR0aUg1ZExfyHnI5QnQf0sf4xAfgT/YpGvEgLd5Ci0rka+IWSj54PhzZkhuTg== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/helper-regex" "7.0.0-beta.47" - -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.47.tgz#5f7b5badf64c4c5da79026aeab03001e62a6ee5f" - integrity sha512-ORfrfN/gQoRuI+xf+kOa2i/yvXfedFRgH+KtgoIrpUQom7OhexxzD280x80LMCIkdaVGzYhvlC3kdJkFMWAfUg== - dependencies: - "@babel/helper-annotate-as-pure" "7.0.0-beta.47" - "@babel/helper-plugin-utils" "7.0.0-beta.47" - -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typescript@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" - integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.2.0" - -"@babel/plugin-transform-unicode-regex@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.47.tgz#efed0b2f1dfbf28283502234a95b4be88f7fdcb6" - integrity sha512-44nWn421tMVZ/A4+1uppzoAO7nrlwWzefMr9JUi5G+tXl0DLEtWy+F7L6zCVw19C4OAOA6WlolVro5CEs6g6AQ== - dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.47" - "@babel/helper-regex" "7.0.0-beta.47" - regexpu-core "^4.1.3" - -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-transform-unicode-regex@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3" - integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/preset-env@^7.7.1": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb" - integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA== - dependencies: - "@babel/helper-module-imports" "^7.7.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.0" - "@babel/plugin-proposal-dynamic-import" "^7.7.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-syntax-top-level-await" "^7.7.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.7.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.3" - "@babel/plugin-transform-classes" "^7.7.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.7.0" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.7.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.7.0" - "@babel/plugin-transform-modules-systemjs" "^7.7.0" - "@babel/plugin-transform-modules-umd" "^7.7.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.7.0" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.6.2" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.7.0" - "@babel/types" "^7.7.1" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/register@^7.0.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.6.2.tgz#25765a922202cb06f8bdac5a3b1e70cd6bf3dd45" - integrity sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - mkdirp "^0.5.1" - pirates "^4.0.0" - source-map-support "^0.5.9" - -"@babel/register@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.7.0.tgz#4e23ecf840296ef79c605baaa5c89e1a2426314b" - integrity sha512-HV3GJzTvSoyOMWGYn2TAh6uL6g+gqKTgEZ99Q3+X9UURT1VPT/WcU46R61XftIc5rXytcOHZ4Z0doDlsjPomIg== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.0.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205" - integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.47.tgz#0473970a7c0bee7a1a18c1ca999d3ba5e5bad83d" - integrity sha512-mAzrOCLwOb4jAobHi0kTwIkoamP1Do28c6zxvrDXjYSJFZHz6KGuzMaT0AV7ZCq7M3si7QypVVMVX2bE6IsuOg== - dependencies: - "@babel/code-frame" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - babylon "7.0.0-beta.47" - lodash "^4.17.5" - -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/template@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" - integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/types" "^7.7.0" - -"@babel/traverse@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.47.tgz#0e57fdbb9ff3a909188b6ebf1e529c641e6c82a4" - integrity sha512-kYGGs//OnUnei+9TTldxlgf7llprj7VUeDKtG50+g+0k1g0yZyrkEgbyFheYFdnudR8IDEHOEXVsUuY82r5Aiw== - dependencies: - "@babel/code-frame" "7.0.0-beta.47" - "@babel/generator" "7.0.0-beta.47" - "@babel/helper-function-name" "7.0.0-beta.47" - "@babel/helper-split-export-declaration" "7.0.0-beta.47" - "@babel/types" "7.0.0-beta.47" - babylon "7.0.0-beta.47" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.17.5" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" - integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.3" - "@babel/types" "^7.6.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" - integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.2" - "@babel/helper-function-name" "^7.7.0" - "@babel/helper-split-export-declaration" "^7.7.0" - "@babel/parser" "^7.7.2" - "@babel/types" "^7.7.2" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.47.tgz#e6fcc1a691459002c2671d558a586706dddaeef8" - integrity sha512-MOP5pOosg7JETrVGg8OQyzmUmbyoSopT5j2HlblHsto89mPz3cmxzn1IA4UNUmnWKgeticSwfhS+Gdy25IIlBQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": - version "7.7.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" - integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@react-navigation/core@~3.4.1": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.4.2.tgz#bec563e94fde40fbab3730cdc97f22afbb2a1498" - integrity sha512-7G+iDzLSTeOUU4vVZeRZKJ+Bd7ds7ZxYNqZcB8i0KlBeQEQfR74Ounfu/p0KIEq2RiNnaE3QT7WVP3C87sebzw== - dependencies: - hoist-non-react-statics "^3.3.0" - path-to-regexp "^1.7.0" - query-string "^6.4.2" - react-is "^16.8.6" - -"@react-navigation/native@~3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.5.0.tgz#f5d16e0845ac26d1147d1caa481f18a00740e7ae" - integrity sha512-TmGOis++ejEXG3sqNJhCSKqB0/qLu3FQgDtO959qpqif36R/diR8SQwJqeSdofoEiK3CepdhFlTCeHdS1/+MsQ== - dependencies: - hoist-non-react-statics "^3.0.1" - react-native-safe-area-view "^0.14.1" - react-native-screens "^1.0.0 || ^1.0.0-alpha" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= - -accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - -ansi@^0.3.0, ansi@~0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" - integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -appdmg@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/appdmg/-/appdmg-0.6.0.tgz#81b3beab624ab458e6104d87c5cfa4b172203821" - integrity sha512-vDz8cMf5c6BfoS72OmmHzzuxG5DFVDM6YCAkscjYh3GASGEBBRCZ10Bn515ZPSPHOpfI9Xu3MlApbd49C58pJg== - dependencies: - async "^1.4.2" - ds-store "^0.1.5" - execa "^1.0.0" - fs-temp "^1.0.0" - fs-xattr "^0.3.0" - image-size "^0.7.4" - is-my-json-valid "^2.20.0" - minimist "^1.1.3" - parse-color "^1.0.0" - path-exists "^4.0.0" - repeat-string "^1.5.4" - -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== - dependencies: - default-require-extensions "^2.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" - integrity sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-buffer-from-string@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/array-buffer-from-string/-/array-buffer-from-string-0.1.0.tgz#3b14351f86149d84efc612c5ada7ed85169d7b07" - integrity sha1-OxQ1H4YUnYTvxhLFrafthRadewc= - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -art@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/art/-/art-0.10.3.tgz#b01d84a968ccce6208df55a733838c96caeeaea2" - integrity sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^1.4.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.4.0, async@^2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" - integrity sha1-YvWdvFnJ+SQnWco0mWDnov48NsA= - dependencies: - ast-types-flow "0.0.7" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-fbjs@^3.0.1, babel-preset-fbjs@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz#c0e6347d3e0379ed84b3c2434d3467567aa05297" - integrity sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -babel-preset-react-native@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-5.0.2.tgz#dfed62379712a9c017ff99ce4fbeac1e11d42285" - integrity sha512-Ua5JeQ1yGK8UoydMPzE2Ghq5raOKxXzpyApYDuHi4etIbXi5+GnCin19Nu+1obLQCf2Dxy9Y/GZwI0rnNOjggA== - dependencies: - "@babel/plugin-proposal-class-properties" "7.0.0-beta.47" - "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.47" - "@babel/plugin-proposal-optional-chaining" "7.0.0-beta.47" - "@babel/plugin-transform-arrow-functions" "7.0.0-beta.47" - "@babel/plugin-transform-block-scoping" "7.0.0-beta.47" - "@babel/plugin-transform-classes" "7.0.0-beta.47" - "@babel/plugin-transform-computed-properties" "7.0.0-beta.47" - "@babel/plugin-transform-destructuring" "7.0.0-beta.47" - "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.47" - "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.47" - "@babel/plugin-transform-for-of" "7.0.0-beta.47" - "@babel/plugin-transform-function-name" "7.0.0-beta.47" - "@babel/plugin-transform-literals" "7.0.0-beta.47" - "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.47" - "@babel/plugin-transform-object-assign" "7.0.0-beta.47" - "@babel/plugin-transform-parameters" "7.0.0-beta.47" - "@babel/plugin-transform-react-display-name" "7.0.0-beta.47" - "@babel/plugin-transform-react-jsx" "7.0.0-beta.47" - "@babel/plugin-transform-react-jsx-source" "7.0.0-beta.47" - "@babel/plugin-transform-regenerator" "7.0.0-beta.47" - "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.47" - "@babel/plugin-transform-spread" "7.0.0-beta.47" - "@babel/plugin-transform-sticky-regex" "7.0.0-beta.47" - "@babel/plugin-transform-template-literals" "7.0.0-beta.47" - "@babel/plugin-transform-unicode-regex" "7.0.0-beta.47" - "@babel/template" "7.0.0-beta.47" - metro-babel7-plugin-react-transform "^0.39.1" - -babylon@7.0.0-beta.47: - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" - integrity sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs= - -base32-encode@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-0.1.1.tgz#7510f6aa44e2c695b7efcb2673a454f8f8505ea0" - integrity sha512-jjc+6TC8PXrsxJ4CQr9ibioNhhAM1p/RvS9hy3Q+cxPphvXmLnFSkXoen2XXzNBrYjdmzajRtbFDl1x28F5F4A== - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= - -base64-js@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.1.2.tgz#d6400cac1c4c660976d90d07a04351d89395f5e8" - integrity sha1-1kAMrBxMZgl22Q0HoENR2JOV9eg= - -base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -basic-auth@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -big-integer@^1.6.7: - version "1.6.45" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.45.tgz#1bf2fa1271bfd20d4c52c3d6c6f08cab8d91c77e" - integrity sha512-nmb9E7oEtVJ7SmSCH/DeJobXyuRmaofkpoQSimMFu3HKJ5MADtM825SPLhDuWhZ6TElLAQtgJbQmBZuHIRlZoA== - -"bignumber.js@git+https://github.com/status-im/bignumber.js.git#v4.0.2-status": - version "4.0.2" - resolved "git+https://github.com/status-im/bignumber.js.git#cc066a0a3d6bfe0c436c9957f4ea8344bf963c89" - -binaryextensions@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" - integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@4.11.8, bn.js@^4.11.6, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -bplist-creator@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" - integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU= - dependencies: - stream-buffers "~2.2.0" - -bplist-creator@~0.0.3: - version "0.0.8" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" - integrity sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA== - dependencies: - stream-buffers "~2.2.0" - -bplist-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" - integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= - dependencies: - big-integer "^1.6.7" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserslist@^4.6.0, browserslist@^4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" - integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== - dependencies: - caniuse-lite "^1.0.30001004" - electron-to-chromium "^1.3.295" - node-releases "^1.1.38" - -bser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0, buffer-from@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - -buffer@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" - integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caching-transform@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" - integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== - dependencies: - hasha "^3.0.0" - make-dir "^2.0.0" - package-hash "^3.0.0" - write-file-atomic "^2.4.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001004: - version "1.0.30001009" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001009.tgz#69b77997b882a7aee6af24c8d7d2fa27ee41f348" - integrity sha512-M3rEqHN6SaVjgo4bIik7HsGcWXsi+lI9WA0p51RPMFx5gXfduyOXWJrc0R4xBkSK1pgNf4CNgy5M+6H+WiEP8g== - -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= - dependencies: - rsvp "^3.3.3" - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chance@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.3.tgz#414f08634ee479c7a316b569050ea20751b82dd3" - integrity sha512-XeJsdoVAzDb1WRPRuMBesRSiWpW1uNTo5Fd7mYxPJsAfgX71+jfuCOHOdbyBz2uAUZ8TwKcXgWk3DMedFfJkbg== - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chownr@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" - integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@~0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" - integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0, commander@^2.9.0, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== - dependencies: - mime-db ">= 1.40.0 < 2" - -compression@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -connect@^3.6.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -convert-source-map@^1.1.0, convert-source-map@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.1.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246" - integrity sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw== - dependencies: - browserslist "^4.7.2" - semver "^6.3.0" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.2.2, core-js@^2.4.1: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.5: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -coveralls@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.7.tgz#1eca48e47976e9573d6a2f18b97c2fea4026f34a" - integrity sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA== - dependencies: - growl "~> 1.10.0" - js-yaml "^3.13.1" - lcov-parse "^0.0.10" - log-driver "^1.2.7" - minimist "^1.2.0" - request "^2.86.0" - -cp-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== - dependencies: - graceful-fs "^4.1.2" - make-dir "^2.0.0" - nested-error-stacks "^2.0.0" - pify "^4.0.1" - safe-buffer "^5.0.1" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -create-react-class@^15.6.2, create-react-class@^15.6.3: - version "15.6.3" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" - integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - -damerau-levenshtein@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" - integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== - -dargs@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-6.1.0.tgz#1f3b9b56393ecf8caa7cbfd6c31496ffcfb9b272" - integrity sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -dateformat@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -debounce@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" - integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= - dependencies: - strip-bom "^3.0.0" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-conflict@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" - integrity sha1-CIZXpmqWHAUBnbfEIwiDsca0F24= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dijkstrajs@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" - integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs= - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -ds-store@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ds-store/-/ds-store-0.1.6.tgz#d1024ef746ed0c13f0f7fec85c7e858e8c4b7ca7" - integrity sha1-0QJO90btDBPw9/7IXH6FjoxLfKc= - dependencies: - bplist-creator "~0.0.3" - macos-alias "~0.2.5" - tn1150 "^0.1.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -editions@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/editions/-/editions-2.2.0.tgz#dacd0c2a9441ebef592bba316a6264febb337f35" - integrity sha512-RYg3iEA2BDLCNVe8PUkD+ox5vAKxB9XS/mAhx1bdxGCF0CpX077C0pyTA9t5D6idCYA3avl5/XDHKPsHFrygfw== - dependencies: - errlop "^1.1.2" - semver "^6.3.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^2.5.9: - version "2.7.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" - integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== - -electron-to-chromium@^1.3.295: - version "1.3.306" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz#e8265301d053d5f74e36cb876486830261fbe946" - integrity sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A== - -elliptic@^6.4.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" - integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emojilib@^2.2.9: - version "2.4.0" - resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" - integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -envinfo@^5.7.0: - version "5.12.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.12.1.tgz#83068c33e0972eb657d6bc69a6df30badefb46ef" - integrity sha512-pwdo0/G3CIkQ0y6PCXq4RdkvId2elvtPCJMG0konqlrfkWQbf1DWeH9K2b/cvu2YgGvPPTOnonZxXM1gikFu1w== - -errlop@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.2.tgz#a99a48f37aa264d614e342ffdbbaa49eec9220e0" - integrity sha512-djkRp+urJ+SmqDBd7F6LUgm4Be1TTYBxia2bhjNdFBuBDQtJDHExD2VbxR6eyst3h1TZy3qPRCdqb6FBoFttTA== - dependencies: - editions "^2.1.3" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error@^7.0.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/error/-/error-7.2.0.tgz#80c989885635b41df9309d145834a4f125ae2245" - integrity sha512-M6t3j3Vt3uDicrViMP5fLq2AeADNrCVFD8Oj4Qt2MHsX0mPYG7D5XdnEfSdRpaHQzjAJ19wu+I1mw9rQYMTAPg== - dependencies: - string-template "~0.2.1" - -errorhandler@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" - integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== - dependencies: - accepts "~1.3.7" - escape-html "~1.0.3" - -es-abstract@^1.13.0, es-abstract@^1.7.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.1.tgz#6e8d84b445ec9c610781e74a6d52cc31aac5b4ca" - integrity sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.0.0" - string.prototype.trimright "^2.0.0" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-plugin-jsx-a11y@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" - integrity sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ== - dependencies: - aria-query "^0.7.0" - array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^1.4.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eth-lib@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" - integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-phishing-detect@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/eth-phishing-detect/-/eth-phishing-detect-1.1.13.tgz#ed718b933c8a69fef0cefa6604538824b472dbea" - integrity sha512-1KQcKvAQIjJgFMVwxaw2+BlzM9Momzl0e+/torPdMjg7WGq6LmCIS7ddg84diH5zIQp9quGyRVIEawCCuErgVQ== - dependencies: - fast-levenshtein "^2.0.6" - -ethereum-bloom-filters@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz#9cdebb3ec20de96ec4a434c6bad6ea5a513037aa" - integrity sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA== - dependencies: - js-sha3 "^0.8.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -event-target-shim@^1.0.5: - version "1.1.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" - integrity sha1-qG5e5r2qFgVEddp5fM3fDFVphJE= - -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - -events@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs-scripts@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^0.8.9: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -first-chunk-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" - integrity sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA= - dependencies: - readable-stream "^2.0.2" - -fmix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw= - dependencies: - imul "^1.0.0" - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -foreground-child@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= - dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - -fs-extra@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" - integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== - dependencies: - minipass "^2.2.1" - -fs-temp@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fs-temp/-/fs-temp-1.1.2.tgz#cc52f038bbefe510f6bcd09ec592b79d0f69253f" - integrity sha1-zFLwOLvv5RD2vNCexZK3nQ9pJT8= - dependencies: - random-path "^0.1.0" - -fs-xattr@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fs-xattr/-/fs-xattr-0.3.0.tgz#019642eacc49f343061af19de4c13543895589ad" - integrity sha512-BixjoRM9etRFyWOtJRcflfu5HqBWLGTYbeHiL196VRUcc/nYgS2px6w4yVaj3XmrN1bk4rZBH82A8u5Z64YcXQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.3: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -function-bind@^1.0.2, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" - integrity sha1-6c7FSD09TuDvRLYKfZnkk14TbZM= - dependencies: - ansi "^0.3.0" - has-unicode "^2.0.0" - lodash.pad "^4.1.0" - lodash.padend "^4.1.0" - lodash.padstart "^4.1.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -generate-function@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== - dependencies: - is-property "^1.0.2" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= - dependencies: - is-property "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -gh-got@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0" - integrity sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw== - dependencies: - got "^7.0.0" - is-plain-obj "^1.1.0" - -github-username@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" - integrity sha1-y+KABBiDIG2kISrp5LXxacML9Bc= - dependencies: - gh-got "^6.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -global@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -"google-breakpad@git+https://github.com/status-im/google-breakpad.git#v0.9.0": - version "1.0.0" - resolved "git+https://github.com/status-im/google-breakpad.git#9fcfdc23010ce2b0742d276e2959ab13e7cf0dc7" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== - -grouped-queue@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" - integrity sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw= - dependencies: - lodash "^4.17.2" - -"growl@~> 1.10.0": - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -hammerjs@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" - integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= - -handlebars@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" - integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasha@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" - integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= - dependencies: - is-stream "^1.0.1" - -hi-base32@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.0.tgz#61329f76a31f31008533f1c36f2473e259d64571" - integrity sha512-DDRmxSyoYuvjUb9EnXdoiMChBZ7ZcUVJsK5Frd3kqMhuBxvmZdnBeynAVfj7/ECbn++CekcoprvC/rprHPAtow== - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" - integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" - integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -i18n-js@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/i18n-js/-/i18n-js-3.5.0.tgz#e2c41e1f90405d691d33ddce260f3dff9743215e" - integrity sha512-XosH7plfEisWo5XEYxkdlwONsDVQ3sYI3ZoKXcjXdyq+9eVNIJg2h2oPsgadfqcXxpPHMVMNBgmiyW3aEJXg1g== - -iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -"identicon.js@git+https://github.com/status-im/identicon.js.git#v1.2.1-status": - version "1.2.1" - resolved "git+https://github.com/status-im/identicon.js.git#4cd179daaf6f01384502b4b2c1876f982db0f57e" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== - -image-size@^0.7.4: - version "0.7.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" - integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -imul@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk= - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -invariant@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.0.tgz#c8d7e847366a49cc18b622f058a689d481e895f2" - integrity sha1-yNfoRzZqScwYtiLwWKaJ1IHolfI= - dependencies: - loose-envify "^1.0.0" - -invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ== - -is-my-json-valid@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a" - integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA== - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-property@^1.0.0, is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= - -is-scoped@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" - integrity sha1-RJypgpnnEwOCViieyytUDcQ3yzA= - dependencies: - scoped-regex "^1.0.0" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isarray@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isbinaryfile@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-hook@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" - integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== - dependencies: - append-transform "^1.0.0" - -istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -istextorbinary@^2.2.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.5.1.tgz#14a33824cf6b9d5d7743eac1be2bd2c310d0ccbd" - integrity sha512-pv/JNPWnfpwGjPx7JrtWTwsWsxkrK3fNzcEVnt92YKEIErps4Fsk49+qzCe9iQF2hjqK8Naqf8P9kzoeCuQI1g== - dependencies: - binaryextensions "^2.1.2" - editions "^2.1.3" - textextensions "^2.4.0" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -jest-docblock@23.2.0, jest-docblock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" - integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c= - dependencies: - detect-newline "^2.1.0" - -jest-haste-map@23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.5.0.tgz#d4ca618188bd38caa6cb20349ce6610e194a8065" - integrity sha512-bt9Swigb6KZ6ZQq/fQDUwdUeHenVvZ6G/lKwJjwRGp+Fap8D4B3bND3FaeJg7vXVsLX8hXshRArbVxLop/5wLw== - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - invariant "^2.2.4" - jest-docblock "^23.2.0" - jest-serializer "^23.0.1" - jest-worker "^23.2.0" - micromatch "^2.3.11" - sane "^2.0.0" - -jest-serializer@23.0.1, jest-serializer@^23.0.1: - version "23.0.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" - integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= - -jest-worker@23.2.0, jest-worker@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" - integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk= - dependencies: - merge-stream "^1.0.1" - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-tokens@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== - dependencies: - minimist "^1.2.0" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" - integrity sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE= - -keymirror@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35" - integrity sha1-kYiJ6hP40KQufFVyUO7nE63JXDU= - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcov-parse@^0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - -lodash.pad@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - integrity sha1-QzCUmoM6fI2iLMIPaibE1Z3runA= - -lodash.padend@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= - -lodash.padstart@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= - -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash@^3.10.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= - -lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.2, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -macos-alias@~0.2.5: - version "0.2.11" - resolved "https://registry.yarnpkg.com/macos-alias/-/macos-alias-0.2.11.tgz#feeea6c13ba119814a43fc43c470b31e59ef718a" - integrity sha1-/u6mwTuhGYFKQ/xDxHCzHlnvcYo= - dependencies: - nan "^2.4.0" - -make-dir@^1.0.0, make-dir@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -mem-fs-editor@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-5.1.0.tgz#51972241640be8567680a04f7adaffe5fc603667" - integrity sha512-2Yt2GCYEbcotYbIJagmow4gEtHDqzpq5XN94+yAx/NT5+bGqIjkXnm3KCUQfE6kRfScGp9IZknScoGRKu8L78w== - dependencies: - commondir "^1.0.1" - deep-extend "^0.6.0" - ejs "^2.5.9" - glob "^7.0.3" - globby "^8.0.1" - isbinaryfile "^3.0.2" - mkdirp "^0.5.0" - multimatch "^2.0.0" - rimraf "^2.2.8" - through2 "^2.0.0" - vinyl "^2.0.1" - -mem-fs@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" - integrity sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw= - dependencies: - through2 "^2.0.0" - vinyl "^1.1.0" - vinyl-file "^2.0.0" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - -merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -metro-babel-register@^0.48.1: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.48.5.tgz#ece8131f959a1f7acf37af83c8e5696bfd0a448e" - integrity sha512-bJCessd7THqEfXrKEoj284XVjg9AGYbGqZiyV622l6ex9TvtVi1lToDY0TuAAuDXOm+V4vQXV7/HvR6JPP0dTQ== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - core-js "^2.2.2" - escape-string-regexp "^1.0.5" - -metro-babel7-plugin-react-transform@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.48.5.tgz#312eb0adf3764357c79b79acc6eb92646051b349" - integrity sha512-S0cA0msHBGw7PSwB6nAsvtHEpQXVwzKBaE4AibLpaBiIVdWkYpIOok653zs9x+E9QvQgcghAnlVnDV+MDM+rSw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - -metro-babel7-plugin-react-transform@^0.39.1: - version "0.39.1" - resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.39.1.tgz#deb851fa6904ed5b9f4e38f69e3f318a0fb670e6" - integrity sha512-7atigK+8EZ1DAWhpcw2a60OhCPihe9TsRHGOKUUwJjXmXDxmYxoxejh1kK5vJSaW38P45PkUBwnfNwISWFv4mQ== - dependencies: - "@babel/helper-module-imports" "7.0.0-beta.47" - lodash "^4.17.5" - -metro-cache@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.48.5.tgz#5ab3ad13c9df527f4196f0de096a3d496db97a6b" - integrity sha512-vlUf3A6+U3LXcf6wAn42N22q1h7MMoopA25w5KR4Flwd0xKVokxHwsTo9v06vpn4gqFtpXWCpEJSBaYRrWYJwg== - dependencies: - jest-serializer "23.0.1" - metro-core "0.48.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - -metro-config@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.48.5.tgz#05624064617eb648ee6e336951b60ac665230a45" - integrity sha512-b+EmFgBOAEUM5THjJ2EU6CJxnULLC5V1Q8S8dz4xX4v96eLIsRCLPrXgYKATHJTVi0qw99ATVRsOBZVZ77fwjg== - dependencies: - cosmiconfig "^5.0.5" - metro "0.48.5" - metro-cache "0.48.5" - metro-core "0.48.5" - pretty-format "^23.4.1" - -metro-core@0.48.5, metro-core@^0.48.1: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.48.5.tgz#eef57d0ea947cfd2e44d86b20592a321ca234b89" - integrity sha512-Yp0BOAHhxf/qdNkwJhemVdD2Y59iyaTjwxUimCmeD8u5VEL6mLgEC1S0KczyWEiAgX3Fs48rezCAcx3mo67wXg== - dependencies: - jest-haste-map "23.5.0" - lodash.throttle "^4.1.1" - metro-resolver "0.48.5" - wordwrap "^1.0.0" - -metro-memory-fs@^0.48.1: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.48.5.tgz#ae390f494ff0d54f2fb60531a3e4b83282a6b66d" - integrity sha512-dxN0dBtMOR1CvyRIOM/NE+uFirybWb4y2PZke0Z8bpYn6ttmv8ZF3PVdFxJf9v9irVBSOIPD0mD5zllxQkXzhg== - -metro-minify-uglify@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.48.5.tgz#c8e878ce31adc1f9af3550917da7028b9eb91bc1" - integrity sha512-tiHVYlUMuL91YjQPx9BzzzXy5jAAA5SWLqlvWfmM6m9faWtFeCv8Se27vVNuPDkOPYyL8qPCRhUpZMUhA0yN2g== - dependencies: - uglify-es "^3.1.9" - -metro-react-native-babel-preset@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.48.5.tgz#cafa1c3ea326a447a89031928b0932f38a65815c" - integrity sha512-ldG1bsusB5zlS1fhAiSLRjUA7I/Chn/dniaXTlkUpgiqyEAaDDmqhkDJ8gyZw3rhlLMVswlBd3o6I8yYti+57w== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.0.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - metro-babel7-plugin-react-transform "0.48.5" - react-transform-hmr "^1.0.4" - -metro-react-native-babel-preset@^0.57.0: - version "0.57.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.57.0.tgz#bbbce26a20d9ca3fdc08f0df564bc982b82651b7" - integrity sha512-pvLh1QOwdxsjgYE2a+4aTKs3LSF3+t4jscxHtkND6wsJnKVVspLt8FkDaORa6zr3Fq12tVpEt5NJMdgtWqBpaA== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.0.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-resolver@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.48.5.tgz#d2ff84afab13ec3962685953ebd03d878e1f4c36" - integrity sha512-lScSpLJKZMmNPRwvcY6zj28AwMOcI1M5bCCv+m06VWcISCTq1KlaKVwqLKmFgUtPkoFtFLD+PVKRKCRUxj1opg== - dependencies: - absolute-path "^0.0.0" - -metro-source-map@0.48.5: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.48.5.tgz#ab738f5cea4627fdae839d09237f85dd13d972ab" - integrity sha512-+BbcU9vfEl/XhMlVV0RwuHuEkai4lq7RmlQkxgoOoWl1u0yXCAPRZ5sqa326fPlJzElOR3cp0y7+Oc2nbIguyg== - dependencies: - source-map "^0.5.6" - -metro@0.48.5, metro@^0.48.1: - version "0.48.5" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.48.5.tgz#94fb4476ea18d3cf2e96e5c37dc85a21b69b4bf1" - integrity sha512-aCarzjxdYqh+9I40bF+Hh1ayrwfPrnDwVOvpQg3VZFWU4wfeMiJb+tzeRN9p94cC/MKhBTOjRmUF3plzrHoe0w== - dependencies: - "@babel/core" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-external-helpers" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - absolute-path "^0.0.0" - async "^2.4.0" - babel-preset-fbjs "^3.0.1" - chalk "^1.1.1" - concat-stream "^1.6.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - eventemitter3 "^3.0.0" - fbjs "^1.0.0" - fs-extra "^1.0.0" - graceful-fs "^4.1.3" - image-size "^0.6.0" - jest-docblock "23.2.0" - jest-haste-map "23.5.0" - jest-worker "23.2.0" - json-stable-stringify "^1.0.1" - lodash.throttle "^4.1.1" - merge-stream "^1.0.1" - metro-cache "0.48.5" - metro-config "0.48.5" - metro-core "0.48.5" - metro-minify-uglify "0.48.5" - metro-react-native-babel-preset "0.48.5" - metro-resolver "0.48.5" - metro-source-map "0.48.5" - mime-types "2.1.11" - mkdirp "^0.5.1" - node-fetch "^2.2.0" - nullthrows "^1.1.0" - react-transform-hmr "^1.0.4" - resolve "^1.5.0" - rimraf "^2.5.4" - serialize-error "^2.1.0" - source-map "^0.5.6" - temp "0.8.3" - throat "^4.1.0" - wordwrap "^1.0.0" - write-file-atomic "^1.2.0" - ws "^1.1.0" - xpipe "^1.0.5" - yargs "^9.0.0" - -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - -"mime-db@>= 1.40.0 < 2": - version "1.41.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0" - integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw== - -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= - -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= - dependencies: - mime-db "~1.23.0" - -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - dependencies: - mime-db "1.40.0" - -mime@1.6.0, mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.0, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.2.1, minipass@^2.3.5: - version "2.5.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.5.0.tgz#dddb1d001976978158a05badfcbef4a771612857" - integrity sha512-9FwMVYhn6ERvMR8XFdOavRz4QK/VJV8elU1x50vYexf9lslDcWe/f4HBRxCPd185ekRSjU6CfYyJCECa/CQy7Q== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== - dependencies: - minipass "^2.2.1" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -morgan@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" - integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== - dependencies: - basic-auth "~2.0.0" - debug "2.6.9" - depd "~1.1.2" - on-finished "~2.3.0" - on-headers "~1.0.1" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -murmur-32@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/murmur-32/-/murmur-32-0.1.0.tgz#c1a79d4fc5fabf0405749d0aff77c41402055861" - integrity sha1-waedT8X6vwQFdJ0K/3fEFAIFWGE= - dependencies: - array-buffer-from-string "^0.1.0" - fmix "^0.1.0" - imul "^1.0.0" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.12.1, nan@^2.4.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -nested-error-stacks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - -"nfc-react-native@git+https://github.com/status-im/nfc-react-native.git#v0.3.8-status": - version "0.3.8" - resolved "git+https://github.com/status-im/nfc-react-native.git#ecdb55e470bb9fa569d26fcc8af4e5169511a4d3" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.2.1: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.38: - version "1.1.40" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.40.tgz#a94facfa8e2d612302601ca1361741d529c4515a" - integrity sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ== - dependencies: - semver "^6.3.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npmlog@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" - integrity sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI= - dependencies: - ansi "~0.3.1" - are-we-there-yet "~1.1.2" - gauge "~1.2.5" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nullthrows@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -nyc@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" - integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== - dependencies: - archy "^1.0.0" - caching-transform "^3.0.2" - convert-source-map "^1.6.0" - cp-file "^6.2.0" - find-cache-dir "^2.1.0" - find-up "^3.0.0" - foreground-child "^1.5.6" - glob "^7.1.3" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-hook "^2.0.7" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" - js-yaml "^3.13.1" - make-dir "^2.1.0" - merge-source-map "^1.1.0" - resolve-from "^4.0.0" - rimraf "^2.6.3" - signal-exit "^3.0.2" - spawn-wrap "^1.4.2" - test-exclude "^5.2.3" - uuid "^3.3.2" - yargs "^13.2.2" - yargs-parser "^13.0.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1, on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -opn@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" - integrity sha1-ttmec5n3jWXDuq/+8fsojpuFJDo= - dependencies: - object-assign "^4.0.1" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0, p-try@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" - integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== - dependencies: - graceful-fs "^4.1.15" - hasha "^3.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parse-color@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" - integrity sha1-e3SLlag/A/FqlPU15S1/PZRlhhk= - dependencies: - color-convert "~0.5.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-headers@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" - integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== - dependencies: - for-each "^0.3.3" - string.prototype.trim "^1.1.2" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -patch-package@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-5.1.2.tgz#01753261026dbf6fb223cc0bbd2931a29da9dfc2" - integrity sha512-6NA7/hcAG/eZ6TcugOIkmRMA9wg/CVm+gyJpWJwc7Z8E0dkMeQwnVw5oDvhG+bEHBhsQLn+rF7PAx7p2QWnfNA== - dependencies: - chalk "^1.1.3" - cross-spawn "^5.1.0" - fs-extra "^4.0.1" - minimist "^1.2.0" - rimraf "^2.6.1" - slash "^1.0.0" - tmp "^0.0.31" - update-notifier "^2.2.0" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= - dependencies: - isarray "0.0.1" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pirates@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -plist@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b" - integrity sha1-CjLKlIGxw2TpLhjcVch23p0B2os= - dependencies: - base64-js "1.1.2" - xmlbuilder "8.2.2" - xmldom "0.1.x" - -plist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" - integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== - dependencies: - base64-js "^1.2.3" - xmlbuilder "^9.0.7" - xmldom "0.1.x" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -pngjs@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -pretty-bytes@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" - integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== - -pretty-format@^23.4.1: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d" - integrity sha1-UwvlxCs8BbNkFKeipDN6qArNDo0= - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24: - version "1.3.1" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.1.tgz#d5aa3873a35ec450bc7db9012ad5a7246f6fc8bd" - integrity sha512-2KLd5fKOdAfShtY2d/8XDWVRnmp3zp40Qt6ge2zBPFARLXOGUf2fHD5eg+TV/5oxBtQKVhjUaKFsAaE4HnwfSA== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qrcode@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" - integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== - dependencies: - buffer "^5.4.3" - buffer-alloc "^1.2.0" - buffer-from "^1.1.1" - dijkstrajs "^1.0.1" - isarray "^2.0.1" - pngjs "^3.3.0" - yargs "^13.2.4" - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -query-string@^6.4.2: - version "6.8.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" - integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ== - dependencies: - decode-uri-component "^0.2.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -random-path@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/random-path/-/random-path-0.1.1.tgz#f8f4d36f75a134ca15fd39c7d7505fbf163b634c" - integrity sha1-+PTTb3WhNMoV/TnH11BfvxY7Y0w= - dependencies: - base32-encode "^0.1.0" - murmur-32 "^0.1.0" - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-clone-referenced-element@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz#9cdda7f2aeb54fea791f3ab8c6ab96c7a77d0158" - integrity sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg== - -react-deep-force-update@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" - integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== - -react-devtools-core@^3.4.2: - version "3.6.3" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.3.tgz#977d95b684c6ad28205f0c62e1e12c5f16675814" - integrity sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ== - dependencies: - shell-quote "^1.6.1" - ws "^3.3.1" - -react-dom@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.18.0" - -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" - integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-native-background-timer@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-native-background-timer/-/react-native-background-timer-2.1.1.tgz#9a2489681ab2f8033c213c73272e9d4c47572cd5" - integrity sha512-cuXIIv+dcG8a8qkTD8pMzeqOEZCO+UGKglZWIe1osve+yJslmCowYQff+bI9xa7NOt2w+Vtd4L3d9JonlSqODg== - -react-native-camera@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/react-native-camera/-/react-native-camera-3.9.0.tgz#334d9d7be5476d673af4df954929958ecc36ed55" - integrity sha512-qUhog1yd7FQ9xRTxN1SP+T5f4uLuVY5eXx6mMlBCNsqvYSoKCWFHH1Kpil9fx7d2iOl/o09o/7kHNcSl9RkrkQ== - dependencies: - prop-types "^15.6.2" - -"react-native-config@git+https://github.com/status-im/react-native-config.git#v0.11.2-status": - version "0.11.2" - resolved "git+https://github.com/status-im/react-native-config.git#e705dac8ab459614906c060dcf699e5fe5c05d9d" - -react-native-dialogs@^0.0.20: - version "0.0.20" - resolved "https://registry.yarnpkg.com/react-native-dialogs/-/react-native-dialogs-0.0.20.tgz#f3fb48eadba9d83fb9d4e6d7eca573494a8cefaa" - integrity sha512-HeoU9d7wWUUAtxjcIJLaeIs/eYS2ZHTNh3kboeCKngLvfvgptd/7vZXwXdQ+xeOEek+cm95kDfMJQd2xnb+4wA== - -react-native-fetch-polyfill@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/react-native-fetch-polyfill/-/react-native-fetch-polyfill-1.1.3.tgz#a02d9069a2f7108ca0b70b8469085c67cc02949c" - integrity sha512-zr5yXQftuGq+ABGa3n4ZE+vkL1lBsMSePkRINm3/6vlpbwnLXYoijwazTO/W8GjsV4LAgGmzuieZxKO/NxW19A== - -"react-native-fs@git+https://github.com/status-im/react-native-fs.git#v2.9.7-status": - version "2.9.7" - resolved "git+https://github.com/status-im/react-native-fs.git#e60e5cd6062e8c33379dd50f09b76f4f5024d5c0" - dependencies: - base-64 "^0.1.0" - utf8 "^2.1.1" - -react-native-gesture-handler@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.5.0.tgz#df7dc5285c152e0656db70f55200fa632c4f45af" - integrity sha512-YUOXHsGLajK1cFReQ4Xh0H9GUTxDW9cUZEVu1q+dVqur2urSKi63KklAFB2l8Neob9nl1E/w0c5hGcBP9FMCIA== - dependencies: - hammerjs "^2.0.8" - hoist-non-react-statics "^2.3.1" - invariant "^2.2.4" - prop-types "^15.7.2" - -react-native-image-crop-picker@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/react-native-image-crop-picker/-/react-native-image-crop-picker-0.26.1.tgz#3499ff5d4a09c9a9e927eb4f6ff936015ff594f1" - integrity sha512-5JdOjQS2V5L/vfb8+jPTUYx4VZPLvhZTyCUjiG0BZCbh+N1L24Kj2C+8EOuWS7xXXHrz5Bpe/eq5lQO1Efc+Yw== - -react-native-image-resizer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-native-image-resizer/-/react-native-image-resizer-1.1.0.tgz#90646bb6dbf0ccc81e53cba69130479e9198d88b" - integrity sha512-OgDOV/0J5ERy6qqu9PTSEiJmNkDrsJluqGM20Tj3JX1836VPO3oeIzQvd8pVdvBiuDq+Z6ZKrsy5SdxP8/O+Ig== - -"react-native-keychain@git+https://github.com/status-im/react-native-keychain.git#v.3.0.0-4-status": - version "3.0.0-rc.3" - resolved "git+https://github.com/status-im/react-native-keychain.git#5895bafa11e734325eaaffd56dda8ca50bfc5275" - -"react-native-languages@git+https://github.com/status-im/react-native-languages.git#v0.1.1-status": - version "3.0.2" - resolved "git+https://github.com/status-im/react-native-languages.git#60338ff3040b8af68d33233aebeb36db4d31aed0" - -"react-native-navigation-twopane@git+https://github.com/status-im/react-native-navigation-twopane.git#v0.0.2-status": - version "0.0.2" - resolved "git+https://github.com/status-im/react-native-navigation-twopane.git#04ed5fddfb46a6a3ee30776987acb4d3b11c27d4" - -react-native-os@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.1.0.tgz#bfbe1c44d8a5b14a6f3a3a405d8ada6f547a516e" - integrity sha1-v74cRNilsUpvOjpAXYrab1R6UW4= - -react-native-safe-area-view@^0.14.1: - version "0.14.6" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.6.tgz#9a9d37d9f8f3887d60c4076eae7b5d2319539446" - integrity sha512-dbzuvaeHFV1VBpyMaC0gtJ2BqFt6ls/405A0t78YN1sXiTrVr3ki86Ysct8mzifWqLdvWzcWagE5wfMtdxnqoA== - dependencies: - hoist-non-react-statics "^2.3.1" - -"react-native-screens@^1.0.0 || ^1.0.0-alpha": - version "1.0.0-alpha.23" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.23.tgz#25d7ea4d11bda4fcde2d1da7ae50271c6aa636e0" - integrity sha512-tOxHGQUN83MTmQB4ghoQkibqOdGiX4JQEmeyEv96MKWO/x8T2PJv84ECUos9hD3blPRQwVwSpAid1PPPhrVEaw== - dependencies: - debounce "^1.2.0" - -react-native-splash-screen@^3.0.6: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.2.0.tgz#d47ec8557b1ba988ee3ea98d01463081b60fff45" - integrity sha512-Ls9qiNZzW/OLFoI25wfjjAcrf2DZ975hn2vr6U9gyuxi2nooVbzQeFoQS5vQcbCt9QX5NY8ASEEAtlLdIa6KVg== - -react-native-tab-view@^1.2.0, react-native-tab-view@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz#f113cd87485808f0c991abec937f70fa380478b9" - integrity sha512-Bke8KkDcDhvB/z0AS7MnQKMD2p6Kwfc1rSKlMOvg9CC5CnClQ2QEnhPSbwegKDYhUkBI92iH/BYy7hNSm5kbUQ== - dependencies: - prop-types "^15.6.1" - -"react-native-webview-bridge@git+https://github.com/status-im/react-native-webview-bridge.git#0.33.16-status-rn049-desktop": - version "0.33.16" - resolved "git+https://github.com/status-im/react-native-webview-bridge.git#da824f59731af37b877e325204637d7c52e170f6" - dependencies: - invariant "2.2.0" - keymirror "0.1.1" - -"react-native@git+https://github.com/status-im/react-native-desktop.git#v0.57.8_11": - version "0.57.8" - resolved "git+https://github.com/status-im/react-native-desktop.git#6cf317a82ef82ad1102e292110928929c3b68aec" - dependencies: - "@babel/runtime" "^7.0.0" - absolute-path "^0.0.0" - art "^0.10.0" - base64-js "^1.1.2" - chalk "^1.1.1" - commander "^2.9.0" - compression "^1.7.1" - connect "^3.6.5" - create-react-class "^15.6.3" - debug "^2.2.0" - denodeify "^1.2.1" - envinfo "^5.7.0" - errorhandler "^1.5.0" - escape-string-regexp "^1.0.5" - event-target-shim "^1.0.5" - fbjs "^1.0.0" - fbjs-scripts "^1.0.0" - fs-extra "^1.0.0" - glob "^7.1.1" - graceful-fs "^4.1.3" - inquirer "^3.0.6" - lodash "^4.17.5" - metro "^0.48.1" - metro-babel-register "^0.48.1" - metro-core "^0.48.1" - metro-memory-fs "^0.48.1" - mime "^1.3.4" - minimist "^1.2.0" - mkdirp "^0.5.1" - morgan "^1.9.0" - node-fetch "^2.2.0" - node-notifier "^5.2.1" - npmlog "^2.0.4" - opn "^3.0.2" - optimist "^0.6.1" - plist "^3.0.0" - pretty-format "^4.2.1" - promise "^7.1.1" - prop-types "^15.5.8" - react-clone-referenced-element "^1.0.1" - react-devtools-core "^3.4.2" - react-timer-mixin "^0.13.2" - regenerator-runtime "^0.11.0" - rimraf "^2.5.4" - semver "^5.0.3" - serve-static "^1.13.1" - shell-quote "1.6.1" - stacktrace-parser "^0.1.3" - ws "^1.1.5" - xcode "^1.0.0" - xmldoc "^0.4.0" - yargs "^9.0.0" - yeoman-environment "^2.3.4" - yeoman-generator "^3.2.0" - -react-navigation-drawer@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-1.2.1.tgz#7bd5efeee7d2f611d3ebb0933e0c8e8eb7cafe52" - integrity sha512-T2kaBjY2c4/3I6noWFnaf/c18ntNH5DsST38i+pdc2NPxn5Yi5lkK+ZZTeKuHSFD4a7G0jWY9OGf1iRkHWLMAQ== - dependencies: - react-native-tab-view "^1.2.0" - -react-navigation-stack@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/react-navigation-stack/-/react-navigation-stack-1.4.0.tgz#69cdb029ea4ee5877d7e933b3117dc90bc841eb2" - integrity sha512-zEe9wCA0Ot8agarYb//0nSWYW1GM+1R0tY/nydUV0EizeJ27At0EklYVWvYEuYU6C48va6cu8OPL7QD/CcJACw== - -react-navigation-tabs@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-1.1.4.tgz#00a312250df3c519c60b7815a523ace5ee11163a" - integrity sha512-py2hLCRxPwXOzmY1W9XcY1rWXxdK6RGW/aXh56G9gIf8cpHNDhy/bJV4e46/JrVcse3ybFaN0liT09/DM/NdwQ== - dependencies: - hoist-non-react-statics "^2.5.0" - prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - react-native-tab-view "^1.4.1" - -react-navigation@^3.11.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/react-navigation/-/react-navigation-3.11.1.tgz#ba696ad6b512088a97a20cc7e6a250c53dbddd26" - integrity sha512-n64HxLG5s5ucVFo1Gs+D9ujChhHDd98lpQ1p27wL7gq8V1PaRJMvsBEIsguhtc2rTIL/TWDynOesXQDG+Eg6FQ== - dependencies: - "@react-navigation/core" "~3.4.1" - "@react-navigation/native" "~3.5.0" - react-navigation-drawer "~1.2.1" - react-navigation-stack "~1.4.0" - react-navigation-tabs "~1.1.4" - -react-proxy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - integrity sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo= - dependencies: - lodash "^4.6.1" - react-deep-force-update "^1.0.0" - -react-refresh@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334" - integrity sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ== - -react-timer-mixin@^0.13.2: - version "0.13.4" - resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" - integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q== - -react-transform-hmr@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - integrity sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s= - dependencies: - global "^4.3.0" - react-proxy "^1.1.7" - -react@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -read-chunk@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca" - integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== - dependencies: - pify "^4.0.1" - with-open-file "^0.1.6" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -"readable-stream@2 || 3": - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.12.3: - version "0.12.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.12.4.tgz#aa9b6c59f4b97be080e972506c560b3bccbfcff0" - integrity sha512-p2I0fY+TbSLD2/VFTFb/ypEHxs3e3AjU0DzttdPqk2bSmDhfSh5E54b86Yc6XhUa5KykK1tgbvZ4Nr82oCJWkQ== - dependencies: - private "^0.1.6" - -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^4.1.3, regexpu-core@^4.5.4: - version "4.5.5" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.5.tgz#aaffe61c2af58269b3e516b61a73790376326411" - integrity sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - dependencies: - es6-error "^4.0.1" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - -request@^2.86.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= - -"rn-snoopy@git+https://github.com/status-im/rn-snoopy.git#v2.0.2-status": - version "2.0.2" - resolved "git+https://github.com/status-im/rn-snoopy.git#f23dc13469c6c2a694649f658cdc1d1eaf8def64" - dependencies: - eslint-plugin-jsx-a11y "5.1.1" - lodash "^3.10.0" - rxjs "5.5.2" - -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== - -run-async@^2.0.0, run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - -rxjs@5.5.2: - version "5.5.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3" - integrity sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA== - dependencies: - symbol-observable "^1.0.1" - -rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^2.0.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -sax@~1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" - integrity sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA= - -scheduler@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" - integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scoped-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" - integrity sha1-o0a7Gs1CB65wvXwMfKnlZra63bg= - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= - -serve-static@^1.13.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shell-quote@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -shelljs@^0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -simple-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-plist@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.2.1.tgz#71766db352326928cf3a807242ba762322636723" - integrity sha1-cXZts1IyaSjPOoByQrp2IyJjZyM= - dependencies: - bplist-creator "0.0.7" - bplist-parser "0.1.1" - plist "2.0.1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.16: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.9: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-wrap@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" - integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== - dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" - signal-exit "^3.0.2" - which "^1.3.0" - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stacktrace-parser@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.7.tgz#9ed005638a5e79dcf256611da1dfb4871e6fd14d" - integrity sha512-Evm+NuZ2ZTwGazsbsZC+EV1EGsvyxgIvtNwbyFfeXaq/8L78M5Kdh0qpmQaTkUpbOAKbbPP7c7qZa7u8XFsrUA== - dependencies: - type-fest "^0.7.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"status-conan@git+https://github.com/status-im/status-conan.git#v1.0.0": - version "1.0.0" - resolved "git+https://github.com/status-im/status-conan.git#47a1b8264cd321ed3122762e9a07a6df1dea5d8e" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-buffers@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - -string-template@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" - integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trim@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" - integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.13.0" - function-bind "^1.1.1" - -string.prototype.trimleft@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff" - integrity sha1-aLaqjhYsaoDnbjqKDC50cYbicf8= - dependencies: - define-properties "^1.1.2" - function-bind "^1.0.2" - -string.prototype.trimright@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd" - integrity sha1-q0pW2AKgH75yk+EehPJNyBZGYd0= - dependencies: - define-properties "^1.1.2" - function-bind "^1.0.2" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" - integrity sha1-+H217yYT9paKpUWr/h7HKLaoKco= - dependencies: - first-chunk-stream "^2.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "1.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -symbol-observable@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -tar@^4: - version "4.4.10" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.5" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -textextensions@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.5.0.tgz#e21d3831dafa37513dd80666dff541414e314293" - integrity sha512-1IkVr355eHcomgK7fgj1Xsokturx6L5S2JRT5WcRdA6v5shk9sxWuO/w/VbpQexwkXJMQIa/j1dBi3oo7+HhcA== - -throat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== - dependencies: - readable-stream "2 || 3" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= - dependencies: - os-tmpdir "~1.0.1" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -tn1150@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tn1150/-/tn1150-0.1.0.tgz#673503d24d56b87de8b8c77fee3fc0853d59a18d" - integrity sha1-ZzUD0k1WuH3ouMd/7j/AhT1ZoY0= - dependencies: - unorm "^1.4.1" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -ua-parser-js@^0.7.18: - version "0.7.20" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" - integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== - -uglify-es@^3.1.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unorm@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" - integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -update-notifier@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -utf8@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY= - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" - integrity sha1-p+v1/779obfRjRQPyweyI++2dRo= - dependencies: - graceful-fs "^4.1.2" - pify "^2.3.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - strip-bom-stream "^2.0.0" - vinyl "^1.1.0" - -vinyl@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - -web3-utils@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951" - integrity sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -whatwg-fetch@>=0.10.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -with-open-file@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.6.tgz#0bc178ecab75f6baac8ae11c85e07445d690ea50" - integrity sha512-SQS05JekbtwQSgCYlBsZn/+m2gpn4zWsqpCYIrCHva0+ojXcnmUEPsBN6Ipoz3vmY/81k5PvYEWSxER2g4BTqA== - dependencies: - p-finally "^1.0.0" - p-try "^2.1.0" - pify "^4.0.1" - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^1.2.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^1.1.0, ws@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -ws@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -xcode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-1.1.0.tgz#9fcb63f417a9af377bfb743a5c22afce4e1da964" - integrity sha512-hllHFtfsNu5WbVzj8KbGNdI3NgOYmTLZqyF4a9c9J1aGMhAdxmLLsXlpG0Bz8fEtKh6I3pyargRXN0ZlLpcF5w== - dependencies: - simple-plist "^0.2.1" - uuid "^3.3.2" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xhr-request-promise@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d" - integrity sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0= - dependencies: - xhr-request "^1.0.1" - -xhr-request@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr@^2.0.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M= - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -xmldoc@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" - integrity sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg= - dependencies: - sax "~1.1.1" - -xmldom@0.1.x: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= - -xpipe@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" - integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== - -yargs-parser@^13.0.0, yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - -yargs@^13.2.2, yargs@^13.2.4: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yeoman-environment@^2.0.5, yeoman-environment@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.4.0.tgz#4829445dc1306b02d9f5f7027cd224bf77a8224d" - integrity sha512-SsvoL0RNAFIX69eFxkUhwKUN2hG1UwUjxrcP+T2ytwdhqC/kHdnFOH2SXdtSN1Ju4aO4xuimmzfRoheYY88RuA== - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - debug "^3.1.0" - diff "^3.5.0" - escape-string-regexp "^1.0.2" - globby "^8.0.1" - grouped-queue "^0.3.3" - inquirer "^6.0.0" - is-scoped "^1.0.0" - lodash "^4.17.10" - log-symbols "^2.2.0" - mem-fs "^1.1.0" - strip-ansi "^4.0.0" - text-table "^0.2.0" - untildify "^3.0.3" - -yeoman-generator@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-3.2.0.tgz#02077d2d7ff28fedc1ed7dad7f9967fd7c3604cc" - integrity sha512-iR/qb2je3GdXtSfxgvOXxUW0Cp8+C6LaZaNlK2BAICzFNzwHtM10t/QBwz5Ea9nk6xVDQNj4Q889TjCXGuIv8w== - dependencies: - async "^2.6.0" - chalk "^2.3.0" - cli-table "^0.3.1" - cross-spawn "^6.0.5" - dargs "^6.0.0" - dateformat "^3.0.3" - debug "^4.1.0" - detect-conflict "^1.0.0" - error "^7.0.2" - find-up "^3.0.0" - github-username "^4.0.0" - istextorbinary "^2.2.1" - lodash "^4.17.10" - make-dir "^1.1.0" - mem-fs-editor "^5.0.0" - minimist "^1.2.0" - pretty-bytes "^5.1.0" - read-chunk "^3.0.0" - read-pkg-up "^4.0.0" - rimraf "^2.6.2" - run-async "^2.0.0" - shelljs "^0.8.0" - text-table "^0.2.0" - through2 "^3.0.0" - yeoman-environment "^2.0.5" diff --git a/desktop/main.cpp b/desktop/main.cpp deleted file mode 100644 index 15b16ed04ab..00000000000 --- a/desktop/main.cpp +++ /dev/null @@ -1,545 +0,0 @@ -/** - * Copyright (C) 2016, Canonical Ltd. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -// #define BUILD_FOR_BUNDLE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "attachedproperties.h" -#include "reactitem.h" -#include "rootview.h" -#include "utilities.h" - -#include "exceptionglobalhandler.h" - -#include "appconfig.h" -Q_DECLARE_LOGGING_CATEGORY(JSSERVER) -Q_DECLARE_LOGGING_CATEGORY(STATUS) -Q_LOGGING_CATEGORY(JSSERVER, "jsserver") -Q_LOGGING_CATEGORY(STATUS, "status") - -static QStringList consoleOutputStrings; -static QMutex consoleOutputMutex; - -#ifdef BUILD_FOR_BUNDLE -bool nodeJsServerStarted = false; -QProcess *g_nodeJsServerProcess = nullptr; -#define NODEJS_SERVER_NAME "ubuntu-server" -#endif - -const int MAIN_WINDOW_WIDTH = 1024; -const int MAIN_WINDOW_HEIGHT = 768; -const QString CRASH_REPORT_EXECUTABLE = QStringLiteral("reportApp"); - -const char *ENABLE_LOG_FILE_ENV_VAR_NAME = "STATUS_LOG_FILE_ENABLED"; -const char *LOG_FILE_PATH_ENV_VAR_NAME = "STATUS_LOG_PATH"; - -// TODO: some way to change while running -class ReactNativeProperties : public QObject { - Q_OBJECT - Q_PROPERTY( - bool liveReload READ liveReload WRITE setLiveReload NOTIFY liveReloadChanged) - Q_PROPERTY( - QUrl codeLocation READ codeLocation WRITE setCodeLocation NOTIFY codeLocationChanged) - Q_PROPERTY( - QString pluginsPath READ pluginsPath WRITE setPluginsPath NOTIFY pluginsPathChanged) - Q_PROPERTY( - QString executor READ executor WRITE setExecutor NOTIFY executorChanged) - Q_PROPERTY( - QVariantMap initialProps READ initialProps WRITE setInitialProps NOTIFY initialPropsChanged) -public: - ReactNativeProperties(QObject *parent = nullptr) : QObject(parent) { - m_codeLocation = m_packagerTemplate.arg(m_packagerHost).arg(m_packagerPort); - } - bool liveReload() const { return m_liveReload; } - void setLiveReload(bool liveReload) { - if (m_liveReload == liveReload) - return; - m_liveReload = liveReload; - Q_EMIT liveReloadChanged(); - } - QUrl codeLocation() const { return m_codeLocation; } - void setCodeLocation(const QUrl &codeLocation) { - if (m_codeLocation == codeLocation) - return; - m_codeLocation = codeLocation; - Q_EMIT codeLocationChanged(); - } - QString pluginsPath() const { return m_pluginsPath; } - void setPluginsPath(const QString &pluginsPath) { - if (m_pluginsPath == pluginsPath) - return; - m_pluginsPath = pluginsPath; - Q_EMIT pluginsPathChanged(); - } - QString executor() const { return m_executor; } - void setExecutor(const QString &executor) { - if (m_executor == executor) - return; - m_executor = executor; - Q_EMIT executorChanged(); - } - QVariantMap initialProps() const { return m_initialProps; } - void setInitialProps(const QVariantMap &initialProps) { - if (m_initialProps == initialProps) - return; - m_initialProps = initialProps; - Q_EMIT initialPropsChanged(); - } - - QString packagerHost() const { return m_packagerHost; } - void setPackagerHost(const QString &packagerHost) { - if (m_packagerHost == packagerHost) - return; - m_packagerHost = packagerHost; - setCodeLocation(m_packagerTemplate.arg(m_packagerHost).arg(m_packagerPort)); - } - QString packagerPort() const { return m_packagerPort; } - void setPackagerPort(const QString &packagerPort) { - if (m_packagerPort == packagerPort) - return; - m_packagerPort = packagerPort; - setCodeLocation(m_packagerTemplate.arg(m_packagerHost).arg(m_packagerPort)); - } - void setLocalSource(const QString &source) { - if (m_localSource == source) - return; - - // overrides packager* - if (source.startsWith("file:")) { - setCodeLocation(source); - } else { - QFileInfo fi(source); - if (!fi.exists()) { - qCWarning(STATUS) << "Attempt to set non-existent local source file"; - return; - } - setCodeLocation(QUrl::fromLocalFile(fi.absoluteFilePath())); - setLiveReload(false); - } - } - -Q_SIGNALS: - void liveReloadChanged(); - void codeLocationChanged(); - void pluginsPathChanged(); - void executorChanged(); - void initialPropsChanged(); - -private: - bool m_liveReload = false; - QString m_packagerHost = "localhost"; - QString m_packagerPort = "8081"; - QString m_localSource; - QString m_packagerTemplate = - "http://%1:%2/index.desktop.bundle?platform=desktop&dev=true"; - QUrl m_codeLocation; - QString m_pluginsPath; -#ifdef BUILD_FOR_BUNDLE - QString m_executor = "RemoteServerConnection"; -#else - QString m_executor = "LocalServerConnection"; -#endif - QVariantMap m_initialProps; -}; - -void saveMessage(QtMsgType type, const QMessageLogContext &context, - const QString &msg); -void writeLogsToFile(); -void writeLogFromJSServer(const QString &msg); -void writeSingleLineLogFromJSServer(const QString &msg); - -#ifdef BUILD_FOR_BUNDLE - -void killZombieJsServer(); -bool runNodeJsServer(); - -#endif - -void loadFontsFromResources() { - QDirIterator it(":", QDirIterator::Subdirectories); - while (it.hasNext()) { - QString resourceFile = it.next(); - if (resourceFile.endsWith(".otf", Qt::CaseInsensitive) || - resourceFile.endsWith(".ttf", Qt::CaseInsensitive)) { - qint32 fontId = QFontDatabase::addApplicationFont(resourceFile); - if (Q_UNLIKELY(fontId == -1)) { - qCDebug(STATUS) << "Unable to install font" << resourceFile; - } - } - } -} - -void exceptionPostHandledCallback() { -#ifdef BUILD_FOR_BUNDLE - if (g_nodeJsServerProcess) { - g_nodeJsServerProcess->kill(); - } -#endif -} - -bool redirectLogIntoFile() { -#ifdef BUILD_FOR_BUNDLE - return true; -#else - return qEnvironmentVariable(ENABLE_LOG_FILE_ENV_VAR_NAME, "") == - QStringLiteral("1"); -#endif -} - -QString getDataStoragePath() { - QString statusDataDir = qgetenv("STATUS_DATA_DIR"); - QString dataStoragePath; - if (!statusDataDir.isEmpty()) { - dataStoragePath = statusDataDir; - } else { - dataStoragePath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); - } - QDir dir(dataStoragePath); - if (!dir.exists()) { - dir.mkpath("."); - } - return dataStoragePath; -} - -int main(int argc, char **argv) { - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QApplication app(argc, argv); - - QCoreApplication::setApplicationName("Status"); - - // Init AppConfig - AppConfig::inst().getValue(AppConfig::LOGGING_ENABLED); - - QString appPath = QCoreApplication::applicationDirPath(); - QString dataStoragePath = getDataStoragePath(); -#ifdef BUILD_FOR_BUNDLE - if (qgetenv("STATUS_DATA_DIR").isEmpty()) { - killZombieJsServer(); - } -#else - dataStoragePath = ""; -#endif - - ExceptionGlobalHandler exceptionHandler( - appPath + QDir::separator() + CRASH_REPORT_EXECUTABLE, - exceptionPostHandledCallback, dataStoragePath); - - Q_INIT_RESOURCE(react_resources); - - loadFontsFromResources(); - if (redirectLogIntoFile()) { - qInstallMessageHandler(saveMessage); - } - - //qCDebug(STATUS) << "###STATUS_NO_LOGGING"; - - -#ifdef BUILD_FOR_BUNDLE - if (!runNodeJsServer()) { - if (g_nodeJsServerProcess->state() == QProcess::NotRunning) { - // If we failed to start the Node.js server (happens on Windows if the Node.js server process was previously running), let's do a final attempt - delete g_nodeJsServerProcess; - if (!runNodeJsServer()) { - return 1; - } - } - } - - app.setWindowIcon(QIcon(":/icon.png")); -#endif - - QQuickView view; - ReactNativeProperties *rnp = new ReactNativeProperties(&view); - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - QVariantMap initialProps; - QString statusNodePort = env.value("STATUS_NODE_PORT"); - QString statusDataDir = env.value("STATUS_DATA_DIR"); - if (!statusNodePort.isEmpty()) { - initialProps["STATUS_NODE_PORT"] = statusNodePort; - } - if (!statusDataDir.isEmpty()) { - initialProps["STATUS_DATA_DIR"] = statusDataDir; - } - - rnp->setInitialProps(initialProps); - -#ifdef BUILD_FOR_BUNDLE - rnp->setCodeLocation("file:" + QGuiApplication::applicationDirPath() + - "/assets"); -#endif - - utilities::registerReactTypes(); - - QCommandLineParser p; - p.setApplicationDescription("React Native host application"); - p.addHelpOption(); - p.addOptions({ - {{"R", "live-reload"}, "Enable live reload."}, - {{"H", "host"}, "Set packager host address.", rnp->packagerHost()}, - {{"P", "port"}, "Set packager port number.", rnp->packagerPort()}, - {{"L", "local"}, "Set path to the local packaged source", "not set"}, - {{"M", "plugins-path"}, "Set path to node modules", "./plugins"}, - {{"E", "executor"}, "Set Javascript executor", rnp->executor()}, - }); - p.process(app); - rnp->setLiveReload(p.isSet("live-reload")); - if (p.isSet("host")) - rnp->setPackagerHost(p.value("host")); - if (p.isSet("port")) - rnp->setPackagerPort(p.value("port")); - if (p.isSet("local")) - rnp->setLocalSource(p.value("local")); - if (p.isSet("plugins-path")) - rnp->setPluginsPath(p.value("plugins-path")); - if (p.isSet("executor")) - rnp->setExecutor(p.value("executor")); - - view.rootContext()->setContextProperty("ReactNativeProperties", rnp); - view.setSource(QUrl("qrc:///main.qml")); - view.setResizeMode(QQuickView::SizeRootObjectToView); - view.resize(MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT); - view.show(); - - QTimer flushLogsToFileTimer; - if (redirectLogIntoFile()) { - flushLogsToFileTimer.setInterval(500); - QObject::connect(&flushLogsToFileTimer, &QTimer::timeout, - [=]() { writeLogsToFile(); }); - flushLogsToFileTimer.start(); - } - - return app.exec(); -} - -QString getLogFilePath() { - QString logFilePath; -#ifdef BUILD_FOR_BUNDLE - logFilePath = getDataStoragePath() + QDir::separator() + "Status.log"; -#else - logFilePath = qEnvironmentVariable(LOG_FILE_PATH_ENV_VAR_NAME, ""); - if (logFilePath.isEmpty()) { - logFilePath = getDataStoragePath() + QDir::separator() + "StatusDev.log"; - } -#endif - return logFilePath; -} - -void writeLogsToFile() { - QMutexLocker locker(&consoleOutputMutex); - if(consoleOutputStrings.isEmpty()) - return; - - QFile logFile(getLogFilePath()); - if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) { - for (QString message : consoleOutputStrings) { - logFile.write(message.toStdString().c_str()); - } - consoleOutputStrings.clear(); - - logFile.flush(); - logFile.close(); - } -} - -#ifdef BUILD_FOR_BUNDLE - -#ifdef Q_OS_WIN - -#include -#include - -bool IsProcessRunning(const wchar_t *processName) { - bool exists = false; - PROCESSENTRY32 entry = { sizeof(PROCESSENTRY32) }; - - HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (snapshot != NULL) { - if (::Process32First(snapshot, &entry)) { - do { - if (!wcsicmp(entry.szExeFile, processName)) { - exists = true; - break; - } - } while (::Process32Next(snapshot, &entry)); - } - - ::CloseHandle(snapshot); - } - return exists; -} - -#endif - -void killZombieJsServer() { - // Ensure that a zombie Node.js server process is not still running in the background before we spawn a new one - QString cmd; -#ifdef Q_OS_LINUX - cmd = QString("pkill -f %1").arg(NODEJS_SERVER_NAME); -#elif defined(Q_OS_MAC) - cmd = QString("killall -9 %1").arg(NODEJS_SERVER_NAME); -#elif defined(Q_OS_WIN) -#define _CAT(A, B) A##B -#define _W(A) _CAT(L, #A) - WCHAR exeName[_MAX_PATH]; - wsprintf(exeName, L"%s.exe", _W(NODEJS_SERVER_NAME)); - if (IsProcessRunning(exeName)) { - qCDebug(STATUS) << NODEJS_SERVER_NAME << "is running, killing it"; - ::ShellExecuteW(NULL, NULL, L"tskill", _W(NODEJS_SERVER_NAME), NULL, SW_HIDE); - } else { - qCDebug(STATUS) << NODEJS_SERVER_NAME << "is not running"; - } -#endif - - if (!cmd.isEmpty()) { - qCDebug(STATUS) << "Running " << cmd; - QByteArray cmdArray = cmd.toLocal8Bit(); - system(cmdArray.data()); - } -} - -bool runNodeJsServer() { - g_nodeJsServerProcess = new QProcess(); - g_nodeJsServerProcess->setWorkingDirectory(getDataStoragePath()); - g_nodeJsServerProcess->setProgram(QGuiApplication::applicationDirPath() + QDir::separator() + NODEJS_SERVER_NAME); - QString port = qgetenv("REACT_SERVER_PORT"); - if (!port.isEmpty()) { - QStringList arguments = (QStringList() << "--port" << port); - g_nodeJsServerProcess->setArguments(arguments); - } - QObject::connect(g_nodeJsServerProcess, &QProcess::errorOccurred, - [=](QProcess::ProcessError) { - qCWarning(JSSERVER) << "process name: " - << qUtf8Printable(g_nodeJsServerProcess->program()); - qCWarning(JSSERVER) << "process error: " - << qUtf8Printable(g_nodeJsServerProcess->errorString()); - }); - - QObject::connect( - g_nodeJsServerProcess, &QProcess::readyReadStandardOutput, [=] { - writeLogFromJSServer(g_nodeJsServerProcess->readAllStandardOutput().trimmed()); - }); - QObject::connect( - g_nodeJsServerProcess, &QProcess::readyReadStandardError, [=] { - QString output = - g_nodeJsServerProcess->readAllStandardError().trimmed(); - writeLogFromJSServer(output); - if (output.contains("Server starting")) { - nodeJsServerStarted = true; - } - }); - - QObject::connect(QGuiApplication::instance(), &QCoreApplication::aboutToQuit, - [=]() { - qCDebug(STATUS) << "Kill node.js server process"; - g_nodeJsServerProcess->kill(); - }); - - qCDebug(STATUS) << "starting node.js server process..."; - g_nodeJsServerProcess->start(); - qCDebug(STATUS) << "wait for started..."; - - if (g_nodeJsServerProcess->waitForReadyRead(10000)) { - // We know that the process started, now wait until it communicates that it has started - while (!nodeJsServerStarted) { - QGuiApplication::processEvents(); - } - qCDebug(STATUS) << "waiting finished"; - - return true; - } else { - qCDebug(STATUS) << "failed to start process"; - } - - return false; -} - -#endif - -void writeLogFromJSServer(const QString &msg) { - if (msg.contains("\\n")) { - QStringList lines = msg.split("\\n"); - foreach (const QString &line, lines) { - writeSingleLineLogFromJSServer(line); - } - } else { - writeSingleLineLogFromJSServer(msg); - } -} - -QString extractJSServerMessage(const QString& msg, int prefixLength) { - return msg.mid(prefixLength); -} - -void writeSingleLineLogFromJSServer(const QString &msg) { - if (msg.startsWith("TRACE ")) - qCDebug(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 6)); - else if (msg.startsWith("DEBUG ")) - qCDebug(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 6)); - else if (msg.startsWith("INFO ")) - qCInfo(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 5)); - else if (msg.startsWith("WARN ")) - qCWarning(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 5)); - else if (msg.startsWith("ERROR ")) - qCWarning(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 6)); - else if (msg.startsWith("FATAL ")) - qCCritical(JSSERVER) << qUtf8Printable(extractJSServerMessage(msg, 6)); - else - qCDebug(JSSERVER) << qUtf8Printable(msg); -} - -void appendConsoleString(const QString &msg) { - QMutexLocker locker(&consoleOutputMutex); - consoleOutputStrings << msg; -} - -void saveMessage(QtMsgType type, const QMessageLogContext &context, - const QString &msg) { - - Q_UNUSED(context); - QByteArray localMsg = msg.toLocal8Bit(); - QString message = localMsg + "\n"; - QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss.zzz"); - QString typeStr; - - switch (type) { - case QtDebugMsg: - typeStr = "D"; - break; - case QtInfoMsg: - typeStr = "I"; - break; - case QtWarningMsg: - typeStr = "W"; - break; - case QtCriticalMsg: - typeStr = "C"; - break; - case QtFatalMsg: - typeStr = "F"; - } - appendConsoleString(QString("%1 - %2 - [%3] - %4").arg(timestamp, typeStr, context.category, message)); - if (type == QtFatalMsg) { - writeLogsToFile(); - abort(); - } -} - -#include "main.moc" - diff --git a/desktop/reportApp/CMakeLists.txt b/desktop/reportApp/CMakeLists.txt deleted file mode 100644 index c766f07dd22..00000000000 --- a/desktop/reportApp/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2017-present, Status Research and Development GmbH. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(APP_NAME "reportApp") - -set(MAIN_CPP_SOURCE reportpublisher.cpp - main.cpp) - -add_executable( - ${APP_NAME} - ${MAIN_CPP_SOURCE} - main.qrc -) - -set(USED_QT_MODULES Core Qml Quick WebSockets Widgets Svg) - -qt5_use_modules(${APP_NAME} ${USED_QT_MODULES}) - -set(REACT_NATIVE_DESKTOP_EXTERNAL_PROJECT_DEPS ${REACT_NATIVE_DESKTOP_EXTERNAL_PROJECT_DEPS} reportApp PARENT_SCOPE) diff --git a/desktop/reportApp/main.cpp b/desktop/reportApp/main.cpp deleted file mode 100644 index d319079cd7c..00000000000 --- a/desktop/reportApp/main.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2017-present, Status Research and Development GmbH. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#include -#include -#include -#include - -#include "reportpublisher.h" - -const int MAIN_WINDOW_WIDTH = 1024; -const int MAIN_WINDOW_HEIGHT = 768; -const int INPUT_ARGUMENTS_COUNT = 6; - -const int MINIDUMP_FILE_PATH_ARG_INDEX = 1; -const int CRASHED_EXECUTABLE_PATH_ARG_INDEX = 2; -const int LOGS_PATH_INDEX = 5; - -int main(int argc, char **argv) { - - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QGuiApplication app(argc, argv); - - if (argc != INPUT_ARGUMENTS_COUNT) { - return 1; - } - - app.setApplicationName("Crash Report"); - - ReportPublisher reportPublisher(argv[MINIDUMP_FILE_PATH_ARG_INDEX], - argv[CRASHED_EXECUTABLE_PATH_ARG_INDEX], - argv[LOGS_PATH_INDEX]); - - QQuickView view; - view.rootContext()->setContextProperty("reportPublisher", &reportPublisher); - view.setSource(QUrl("qrc:///main.qml")); - view.setResizeMode(QQuickView::SizeRootObjectToView); - view.resize(MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT); - view.show(); - - return app.exec(); -} diff --git a/desktop/reportApp/main.qml b/desktop/reportApp/main.qml deleted file mode 100644 index 77880b45ab6..00000000000 --- a/desktop/reportApp/main.qml +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2017-present, Status Research and Development GmbH. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -import QtQuick 2.4 -import QtQuick.Controls 2.2 -import QtQuick.Layouts 1.3 - -Rectangle { - id: root - width: 384 - height: 640 - - ColumnLayout { - anchors.centerIn: parent - Text { - Layout.alignment: Qt.AlignCenter - text: "Oh, no! Status application just crashed!" - font.bold: true - font.pointSize: 25 - } - Text { - Layout.alignment: Qt.AlignCenter - Layout.topMargin: 20 - text: "Please report us crash.dmp and Status executable files to allow us fix the issue!" - font.bold: true - font.pointSize: 20 - } - RowLayout { - Layout.alignment: Qt.AlignCenter - Layout.topMargin: 40 - spacing: 25 - - Button { - Layout.minimumWidth: 150 - text: "Report (highly appreciated)" - onClicked: reportPublisher.submit() - } - - Button { - text: "Restart and Quit" - onClicked: reportPublisher.restartAndQuit() - } - - Button { - text: "Just Quit" - onClicked: reportPublisher.quit() - } - } - RowLayout { - Layout.alignment: Qt.AlignCenter - Layout.topMargin: 100 - - TextEdit { - readOnly: true - Layout.maximumWidth: 500 - wrapMode: TextEdit.Wrap - selectByMouse: true - font.pointSize: 12 - textFormat: TextEdit.RichText - text: "
Please upload both crash.dmp and Status executable files from the report directory:
" + reportPublisher.resolveDataStoragePath() + "
" - } - - Button { - text: "View" - onClicked: reportPublisher.showDirectory() - } - } - } -} - diff --git a/desktop/reportApp/main.qrc b/desktop/reportApp/main.qrc deleted file mode 100644 index 79babe091cf..00000000000 --- a/desktop/reportApp/main.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - main.qml - - diff --git a/desktop/reportApp/reportpublisher.cpp b/desktop/reportApp/reportpublisher.cpp deleted file mode 100644 index 8eff4626106..00000000000 --- a/desktop/reportApp/reportpublisher.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) 2017-present, Status Research and Development GmbH. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#include "reportpublisher.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -const QString REPORT_SUBMIT_URL = - QStringLiteral("https://goo.gl/forms/0705ZN0EMW3xLDpI2"); - -ReportPublisher::ReportPublisher(QString minidumpFilePath, - QString crashedExecutablePath, - QString logsPath, QObject *parent) - : QObject(parent), m_minidumpFilePath(minidumpFilePath), - m_logsPath(logsPath), m_crashedExecutablePath(crashedExecutablePath) {} - -void ReportPublisher::submit() { - QDesktopServices::openUrl(QUrl(REPORT_SUBMIT_URL)); - showDirectory(); -} - -void ReportPublisher::restartAndQuit() { - QString appPath = m_crashedExecutablePath; - -#if defined(Q_OS_MACOS) || defined(Q_OS_LINUX) - QFileInfo crashedExecutableFileInfo(m_crashedExecutablePath); - QString fullPath = crashedExecutableFileInfo.dir().absolutePath(); - #ifdef Q_OS_MACOS - const QString bundleExtension = QStringLiteral(".app"); - const QString cmdTemplate = QStringLiteral("open \"%1\""); - #else - const QString bundleExtension = QStringLiteral(".AppImage"); - const QString cmdTemplate = QStringLiteral("\"%1\""); - #endif - if (fullPath.contains(bundleExtension)) { - appPath = fullPath.left(fullPath.indexOf(bundleExtension) + - bundleExtension.size()); - } - QString cmd = QString(cmdTemplate).arg(appPath); -#else - QString cmd = QString("\"%1\"").arg(appPath);; -#endif - - QProcess::startDetached(cmd); - - qApp->quit(); -} - -void ReportPublisher::quit() { qApp->quit(); } - -void ReportPublisher::showDirectory() { - QString dataStoragePath = resolveDataStoragePath(); - if (!m_logFilesPrepared) { - m_logFilesPrepared = prepareReportFiles(dataStoragePath); - } - - QDesktopServices::openUrl(QUrl::fromLocalFile(dataStoragePath)); -} - -bool ReportPublisher::prepareReportFiles(QString reportDirPath) { - QFileInfo minidumpFileInfo(m_minidumpFilePath); - QFileInfo crashedExecutableFileInfo(m_crashedExecutablePath); - if (!minidumpFileInfo.exists() || !crashedExecutableFileInfo.exists()) - return false; - - return QFile::copy(m_minidumpFilePath, - reportDirPath + QDir::separator() + "crash.dmp") && - QFile::copy(m_crashedExecutablePath, - reportDirPath + QDir::separator() + - crashedExecutableFileInfo.fileName()) && - prepareLogFiles(reportDirPath); -} - -bool ReportPublisher::prepareLogFiles(QString reportDirPath) { - if (reportDirPath.isEmpty()) - return true; - - QDirIterator filesIterator(m_logsPath, QStringList() << "*.log", QDir::Files); - while (filesIterator.hasNext()) { - QFileInfo logFile(filesIterator.next()); - QFile::copy(logFile.absoluteFilePath(), - reportDirPath + QDir::separator() + logFile.fileName()); - } - return true; -} - -QString ReportPublisher::resolveDataStoragePath() { - QFileInfo minidumpFileInfo(m_minidumpFilePath); - QString dataStoragePath = - QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + - QDir::separator() + minidumpFileInfo.baseName(); - QDir dir(dataStoragePath); - if (!dir.exists()) { - dir.mkpath("."); - } - return dir.path(); -} diff --git a/desktop/reportApp/reportpublisher.h b/desktop/reportApp/reportpublisher.h deleted file mode 100644 index 695dbd34454..00000000000 --- a/desktop/reportApp/reportpublisher.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2017-present, Status Research and Development GmbH. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#ifndef REPORTPUBLISHER -#define REPORTPUBLISHER - -#include -#include - -class ReportPublisher : public QObject { - Q_OBJECT - -public: - ReportPublisher(QString minidumpFilePath, QString crashedExecutablePath, - QString logsPath, QObject *parent = 0); - - Q_INVOKABLE void submit(); - Q_INVOKABLE void restartAndQuit(); - Q_INVOKABLE void quit(); - Q_INVOKABLE void showDirectory(); - Q_INVOKABLE QString resolveDataStoragePath(); - -private: - bool prepareReportFiles(QString reportDirPath); - bool prepareLogFiles(QString reportDirPath); - - QString m_minidumpFilePath; - QString m_crashedExecutablePath; - QString m_logsPath; - bool m_logFilesPrepared = false; -}; - -#endif // REPORTPUBLISHER diff --git a/desktop/resources/add.png b/desktop/resources/add.png deleted file mode 100644 index 21b37f431d9..00000000000 Binary files a/desktop/resources/add.png and /dev/null differ diff --git a/desktop/resources/add_contact.png b/desktop/resources/add_contact.png deleted file mode 100644 index b6dde36dd05..00000000000 Binary files a/desktop/resources/add_contact.png and /dev/null differ diff --git a/desktop/resources/address.png b/desktop/resources/address.png deleted file mode 100644 index c3bdccdc79f..00000000000 Binary files a/desktop/resources/address.png and /dev/null differ diff --git a/desktop/resources/arrow_left.png b/desktop/resources/arrow_left.png deleted file mode 100644 index f44762016de..00000000000 Binary files a/desktop/resources/arrow_left.png and /dev/null differ diff --git a/desktop/resources/arrow_right.png b/desktop/resources/arrow_right.png deleted file mode 100644 index 673ef5572e8..00000000000 Binary files a/desktop/resources/arrow_right.png and /dev/null differ diff --git a/desktop/resources/arrow_up.png b/desktop/resources/arrow_up.png deleted file mode 100644 index 41f9f45652b..00000000000 Binary files a/desktop/resources/arrow_up.png and /dev/null differ diff --git a/desktop/resources/back.png b/desktop/resources/back.png deleted file mode 100644 index 874105736a7..00000000000 Binary files a/desktop/resources/back.png and /dev/null differ diff --git a/desktop/resources/backspace.png b/desktop/resources/backspace.png deleted file mode 100644 index f412af1d034..00000000000 Binary files a/desktop/resources/backspace.png and /dev/null differ diff --git a/desktop/resources/bell.png b/desktop/resources/bell.png deleted file mode 100644 index 76ee86e8680..00000000000 Binary files a/desktop/resources/bell.png and /dev/null differ diff --git a/desktop/resources/browser.png b/desktop/resources/browser.png deleted file mode 100644 index c9349a2005e..00000000000 Binary files a/desktop/resources/browser.png and /dev/null differ diff --git a/desktop/resources/camera.png b/desktop/resources/camera.png deleted file mode 100644 index eae2bedfbf4..00000000000 Binary files a/desktop/resources/camera.png and /dev/null differ diff --git a/desktop/resources/cancel.png b/desktop/resources/cancel.png deleted file mode 100644 index 89a4086f8ca..00000000000 Binary files a/desktop/resources/cancel.png and /dev/null differ diff --git a/desktop/resources/change.png b/desktop/resources/change.png deleted file mode 100644 index 143002657ff..00000000000 Binary files a/desktop/resources/change.png and /dev/null differ diff --git a/desktop/resources/check.png b/desktop/resources/check.png deleted file mode 100644 index acfb992f608..00000000000 Binary files a/desktop/resources/check.png and /dev/null differ diff --git a/desktop/resources/close.png b/desktop/resources/close.png deleted file mode 100644 index 65e1b4f7350..00000000000 Binary files a/desktop/resources/close.png and /dev/null differ diff --git a/desktop/resources/commands.png b/desktop/resources/commands.png deleted file mode 100644 index 06d320983f1..00000000000 Binary files a/desktop/resources/commands.png and /dev/null differ diff --git a/desktop/resources/copy.png b/desktop/resources/copy.png deleted file mode 100644 index 9c19da8d237..00000000000 Binary files a/desktop/resources/copy.png and /dev/null differ diff --git a/desktop/resources/corner_left_bottom.png b/desktop/resources/corner_left_bottom.png deleted file mode 100644 index 1c9c9b446d2..00000000000 Binary files a/desktop/resources/corner_left_bottom.png and /dev/null differ diff --git a/desktop/resources/corner_left_top.png b/desktop/resources/corner_left_top.png deleted file mode 100644 index 1a0a4e57f82..00000000000 Binary files a/desktop/resources/corner_left_top.png and /dev/null differ diff --git a/desktop/resources/corner_right_bottom.png b/desktop/resources/corner_right_bottom.png deleted file mode 100644 index e6071d1ae10..00000000000 Binary files a/desktop/resources/corner_right_bottom.png and /dev/null differ diff --git a/desktop/resources/corner_right_top.png b/desktop/resources/corner_right_top.png deleted file mode 100644 index 6eaca3cd9a0..00000000000 Binary files a/desktop/resources/corner_right_top.png and /dev/null differ diff --git a/desktop/resources/dapp.png b/desktop/resources/dapp.png deleted file mode 100644 index 8cd519e6b04..00000000000 Binary files a/desktop/resources/dapp.png and /dev/null differ diff --git a/desktop/resources/delete.png b/desktop/resources/delete.png deleted file mode 100644 index 5c5ed9404e3..00000000000 Binary files a/desktop/resources/delete.png and /dev/null differ diff --git a/desktop/resources/desktop.png b/desktop/resources/desktop.png deleted file mode 100644 index 2b03362c968..00000000000 Binary files a/desktop/resources/desktop.png and /dev/null differ diff --git a/desktop/resources/download.png b/desktop/resources/download.png deleted file mode 100644 index 0da5eaa1cd4..00000000000 Binary files a/desktop/resources/download.png and /dev/null differ diff --git a/desktop/resources/dropdown.png b/desktop/resources/dropdown.png deleted file mode 100644 index 228e20283e3..00000000000 Binary files a/desktop/resources/dropdown.png and /dev/null differ diff --git a/desktop/resources/dropdown_up.png b/desktop/resources/dropdown_up.png deleted file mode 100644 index 23efec887e8..00000000000 Binary files a/desktop/resources/dropdown_up.png and /dev/null differ diff --git a/desktop/resources/edit.png b/desktop/resources/edit.png deleted file mode 100644 index f2e54d497cd..00000000000 Binary files a/desktop/resources/edit.png and /dev/null differ diff --git a/desktop/resources/filter.png b/desktop/resources/filter.png deleted file mode 100644 index 3c7985a3d90..00000000000 Binary files a/desktop/resources/filter.png and /dev/null differ diff --git a/desktop/resources/fingerprint.png b/desktop/resources/fingerprint.png deleted file mode 100644 index 17137fe9699..00000000000 Binary files a/desktop/resources/fingerprint.png and /dev/null differ diff --git a/desktop/resources/flash.png b/desktop/resources/flash.png deleted file mode 100644 index d2486fa6c06..00000000000 Binary files a/desktop/resources/flash.png and /dev/null differ diff --git a/desktop/resources/flash_active.png b/desktop/resources/flash_active.png deleted file mode 100644 index 15bbb77c8e6..00000000000 Binary files a/desktop/resources/flash_active.png and /dev/null differ diff --git a/desktop/resources/group_chat.png b/desktop/resources/group_chat.png deleted file mode 100644 index 27cf5107b3e..00000000000 Binary files a/desktop/resources/group_chat.png and /dev/null differ diff --git a/desktop/resources/help.png b/desktop/resources/help.png deleted file mode 100644 index f0e3656711f..00000000000 Binary files a/desktop/resources/help.png and /dev/null differ diff --git a/desktop/resources/history.png b/desktop/resources/history.png deleted file mode 100644 index c8e753b116b..00000000000 Binary files a/desktop/resources/history.png and /dev/null differ diff --git a/desktop/resources/home.png b/desktop/resources/home.png deleted file mode 100644 index 19ddc6d532d..00000000000 Binary files a/desktop/resources/home.png and /dev/null differ diff --git a/desktop/resources/home_1.png b/desktop/resources/home_1.png deleted file mode 100644 index afb65ba21ef..00000000000 Binary files a/desktop/resources/home_1.png and /dev/null differ diff --git a/desktop/resources/ic_background.png b/desktop/resources/ic_background.png deleted file mode 100644 index 0265779ac7f..00000000000 Binary files a/desktop/resources/ic_background.png and /dev/null differ diff --git a/desktop/resources/ic_foreground.png b/desktop/resources/ic_foreground.png deleted file mode 100644 index ef8ffe231a9..00000000000 Binary files a/desktop/resources/ic_foreground.png and /dev/null differ diff --git a/desktop/resources/ic_stat_status_notification.png b/desktop/resources/ic_stat_status_notification.png deleted file mode 100755 index a040aa06c8b..00000000000 Binary files a/desktop/resources/ic_stat_status_notification.png and /dev/null differ diff --git a/desktop/resources/icon_action_back.png b/desktop/resources/icon_action_back.png deleted file mode 100644 index 89db7e29865..00000000000 Binary files a/desktop/resources/icon_action_back.png and /dev/null differ diff --git a/desktop/resources/icon_action_forward.png b/desktop/resources/icon_action_forward.png deleted file mode 100644 index b8abf47c489..00000000000 Binary files a/desktop/resources/icon_action_forward.png and /dev/null differ diff --git a/desktop/resources/icon_action_fullscreen_collapse.png b/desktop/resources/icon_action_fullscreen_collapse.png deleted file mode 100644 index 8bc5016f2ce..00000000000 Binary files a/desktop/resources/icon_action_fullscreen_collapse.png and /dev/null differ diff --git a/desktop/resources/icon_action_fullscreen_expand.png b/desktop/resources/icon_action_fullscreen_expand.png deleted file mode 100644 index d5b72bb7689..00000000000 Binary files a/desktop/resources/icon_action_fullscreen_expand.png and /dev/null differ diff --git a/desktop/resources/icon_arrow_top.png b/desktop/resources/icon_arrow_top.png deleted file mode 100644 index 193fe2261df..00000000000 Binary files a/desktop/resources/icon_arrow_top.png and /dev/null differ diff --git a/desktop/resources/icon_avatar.png b/desktop/resources/icon_avatar.png deleted file mode 100644 index d28594fcf10..00000000000 Binary files a/desktop/resources/icon_avatar.png and /dev/null differ diff --git a/desktop/resources/icon_check_on.png b/desktop/resources/icon_check_on.png deleted file mode 100644 index d8318e7fcb1..00000000000 Binary files a/desktop/resources/icon_check_on.png and /dev/null differ diff --git a/desktop/resources/icon_close_light_gray.png b/desktop/resources/icon_close_light_gray.png deleted file mode 100644 index 4b6d97ccefc..00000000000 Binary files a/desktop/resources/icon_close_light_gray.png and /dev/null differ diff --git a/desktop/resources/icon_forward_gray.png b/desktop/resources/icon_forward_gray.png deleted file mode 100644 index 9b96935894e..00000000000 Binary files a/desktop/resources/icon_forward_gray.png and /dev/null differ diff --git a/desktop/resources/icon_lock_gray.png b/desktop/resources/icon_lock_gray.png deleted file mode 100644 index 5e7c9580466..00000000000 Binary files a/desktop/resources/icon_lock_gray.png and /dev/null differ diff --git a/desktop/resources/icon_lock_white.png b/desktop/resources/icon_lock_white.png deleted file mode 100644 index 700c8fdf815..00000000000 Binary files a/desktop/resources/icon_lock_white.png and /dev/null differ diff --git a/desktop/resources/icon_menu_group.png b/desktop/resources/icon_menu_group.png deleted file mode 100644 index 40e9b7dc416..00000000000 Binary files a/desktop/resources/icon_menu_group.png and /dev/null differ diff --git a/desktop/resources/icon_money_white.png b/desktop/resources/icon_money_white.png deleted file mode 100755 index 6510ff9c047..00000000000 Binary files a/desktop/resources/icon_money_white.png and /dev/null differ diff --git a/desktop/resources/icon_muted.png b/desktop/resources/icon_muted.png deleted file mode 100644 index 2c862042ba2..00000000000 Binary files a/desktop/resources/icon_muted.png and /dev/null differ diff --git a/desktop/resources/icon_notifications_on.png b/desktop/resources/icon_notifications_on.png deleted file mode 100644 index 207cb4c16f4..00000000000 Binary files a/desktop/resources/icon_notifications_on.png and /dev/null differ diff --git a/desktop/resources/icon_phone_white.png b/desktop/resources/icon_phone_white.png deleted file mode 100755 index d60a9ac7a20..00000000000 Binary files a/desktop/resources/icon_phone_white.png and /dev/null differ diff --git a/desktop/resources/in_contacts.png b/desktop/resources/in_contacts.png deleted file mode 100644 index 704533ffcc8..00000000000 Binary files a/desktop/resources/in_contacts.png and /dev/null differ diff --git a/desktop/resources/info.png b/desktop/resources/info.png deleted file mode 100644 index 6d1080e39b8..00000000000 Binary files a/desktop/resources/info.png and /dev/null differ diff --git a/desktop/resources/keycard.png b/desktop/resources/keycard.png deleted file mode 100644 index 8dc1c79dff8..00000000000 Binary files a/desktop/resources/keycard.png and /dev/null differ diff --git a/desktop/resources/keycard_logo.png b/desktop/resources/keycard_logo.png deleted file mode 100644 index 0546b5458bc..00000000000 Binary files a/desktop/resources/keycard_logo.png and /dev/null differ diff --git a/desktop/resources/language.png b/desktop/resources/language.png deleted file mode 100644 index 289bf5270f3..00000000000 Binary files a/desktop/resources/language.png and /dev/null differ diff --git a/desktop/resources/launch_logo.png b/desktop/resources/launch_logo.png deleted file mode 100644 index b6252c8da30..00000000000 Binary files a/desktop/resources/launch_logo.png and /dev/null differ diff --git a/desktop/resources/link.png b/desktop/resources/link.png deleted file mode 100644 index 557c9bd19f0..00000000000 Binary files a/desktop/resources/link.png and /dev/null differ diff --git a/desktop/resources/log_out.png b/desktop/resources/log_out.png deleted file mode 100644 index 370625beeb9..00000000000 Binary files a/desktop/resources/log_out.png and /dev/null differ diff --git a/desktop/resources/logo.png b/desktop/resources/logo.png deleted file mode 100644 index f703708c1db..00000000000 Binary files a/desktop/resources/logo.png and /dev/null differ diff --git a/desktop/resources/mailserver.png b/desktop/resources/mailserver.png deleted file mode 100644 index 51389784c70..00000000000 Binary files a/desktop/resources/mailserver.png and /dev/null differ diff --git a/desktop/resources/make_admin.png b/desktop/resources/make_admin.png deleted file mode 100644 index b2d9b8ecdc7..00000000000 Binary files a/desktop/resources/make_admin.png and /dev/null differ diff --git a/desktop/resources/max.png b/desktop/resources/max.png deleted file mode 100644 index 096b9a0b35b..00000000000 Binary files a/desktop/resources/max.png and /dev/null differ diff --git a/desktop/resources/message.png b/desktop/resources/message.png deleted file mode 100644 index 74e7ef02a1f..00000000000 Binary files a/desktop/resources/message.png and /dev/null differ diff --git a/desktop/resources/mobile.png b/desktop/resources/mobile.png deleted file mode 100644 index 0a8e141fab5..00000000000 Binary files a/desktop/resources/mobile.png and /dev/null differ diff --git a/desktop/resources/more.png b/desktop/resources/more.png deleted file mode 100644 index d7acbc67583..00000000000 Binary files a/desktop/resources/more.png and /dev/null differ diff --git a/desktop/resources/network.png b/desktop/resources/network.png deleted file mode 100644 index 801c5fdc51b..00000000000 Binary files a/desktop/resources/network.png and /dev/null differ diff --git a/desktop/resources/next.png b/desktop/resources/next.png deleted file mode 100644 index 9bb116be24f..00000000000 Binary files a/desktop/resources/next.png and /dev/null differ diff --git a/desktop/resources/notification.png b/desktop/resources/notification.png deleted file mode 100644 index a0a02e2152b..00000000000 Binary files a/desktop/resources/notification.png and /dev/null differ diff --git a/desktop/resources/one_on_one_chat.png b/desktop/resources/one_on_one_chat.png deleted file mode 100644 index b94487fe605..00000000000 Binary files a/desktop/resources/one_on_one_chat.png and /dev/null differ diff --git a/desktop/resources/password.png b/desktop/resources/password.png deleted file mode 100644 index e22a7f6f4e6..00000000000 Binary files a/desktop/resources/password.png and /dev/null differ diff --git a/desktop/resources/paste.png b/desktop/resources/paste.png deleted file mode 100644 index fd139764574..00000000000 Binary files a/desktop/resources/paste.png and /dev/null differ diff --git a/desktop/resources/photo.png b/desktop/resources/photo.png deleted file mode 100644 index 762a6eae62b..00000000000 Binary files a/desktop/resources/photo.png and /dev/null differ diff --git a/desktop/resources/profile.png b/desktop/resources/profile.png deleted file mode 100644 index 9fd10682663..00000000000 Binary files a/desktop/resources/profile.png and /dev/null differ diff --git a/desktop/resources/public_chat.png b/desktop/resources/public_chat.png deleted file mode 100644 index e1a76390710..00000000000 Binary files a/desktop/resources/public_chat.png and /dev/null differ diff --git a/desktop/resources/qr.png b/desktop/resources/qr.png deleted file mode 100644 index 2e03d17323c..00000000000 Binary files a/desktop/resources/qr.png and /dev/null differ diff --git a/desktop/resources/receive.png b/desktop/resources/receive.png deleted file mode 100644 index 6b9a0c09fff..00000000000 Binary files a/desktop/resources/receive.png and /dev/null differ diff --git a/desktop/resources/refresh.png b/desktop/resources/refresh.png deleted file mode 100644 index 533559c3dc2..00000000000 Binary files a/desktop/resources/refresh.png and /dev/null differ diff --git a/desktop/resources/remove_contact.png b/desktop/resources/remove_contact.png deleted file mode 100644 index f801fd89f3c..00000000000 Binary files a/desktop/resources/remove_contact.png and /dev/null differ diff --git a/desktop/resources/reply.png b/desktop/resources/reply.png deleted file mode 100644 index 144b8512eb6..00000000000 Binary files a/desktop/resources/reply.png and /dev/null differ diff --git a/desktop/resources/rotate_camera.png b/desktop/resources/rotate_camera.png deleted file mode 100644 index 9e59fd92072..00000000000 Binary files a/desktop/resources/rotate_camera.png and /dev/null differ diff --git a/desktop/resources/search.png b/desktop/resources/search.png deleted file mode 100644 index 14ad5a0adfa..00000000000 Binary files a/desktop/resources/search.png and /dev/null differ diff --git a/desktop/resources/security.png b/desktop/resources/security.png deleted file mode 100644 index 6cc34a56343..00000000000 Binary files a/desktop/resources/security.png and /dev/null differ diff --git a/desktop/resources/send.png b/desktop/resources/send.png deleted file mode 100644 index 565006f41b7..00000000000 Binary files a/desktop/resources/send.png and /dev/null differ diff --git a/desktop/resources/settings.png b/desktop/resources/settings.png deleted file mode 100644 index 3d1d718f74d..00000000000 Binary files a/desktop/resources/settings.png and /dev/null differ diff --git a/desktop/resources/settings_advanced.png b/desktop/resources/settings_advanced.png deleted file mode 100644 index f7ac1c697a7..00000000000 Binary files a/desktop/resources/settings_advanced.png and /dev/null differ diff --git a/desktop/resources/share.png b/desktop/resources/share.png deleted file mode 100644 index f70ab8f28b6..00000000000 Binary files a/desktop/resources/share.png and /dev/null differ diff --git a/desktop/resources/stickers.png b/desktop/resources/stickers.png deleted file mode 100644 index 63acc9b8bd9..00000000000 Binary files a/desktop/resources/stickers.png and /dev/null differ diff --git a/desktop/resources/text.png b/desktop/resources/text.png deleted file mode 100644 index cab051f1382..00000000000 Binary files a/desktop/resources/text.png and /dev/null differ diff --git a/desktop/resources/tiny_arrow_down.png b/desktop/resources/tiny_arrow_down.png deleted file mode 100644 index 51ee3d99f81..00000000000 Binary files a/desktop/resources/tiny_arrow_down.png and /dev/null differ diff --git a/desktop/resources/tiny_check.png b/desktop/resources/tiny_check.png deleted file mode 100644 index 0f33ab5cd01..00000000000 Binary files a/desktop/resources/tiny_check.png and /dev/null differ diff --git a/desktop/resources/tiny_clear.png b/desktop/resources/tiny_clear.png deleted file mode 100644 index b047208c4b9..00000000000 Binary files a/desktop/resources/tiny_clear.png and /dev/null differ diff --git a/desktop/resources/tiny_edit.png b/desktop/resources/tiny_edit.png deleted file mode 100644 index 60851f1aa88..00000000000 Binary files a/desktop/resources/tiny_edit.png and /dev/null differ diff --git a/desktop/resources/tiny_external.png b/desktop/resources/tiny_external.png deleted file mode 100644 index 8a6956b60bd..00000000000 Binary files a/desktop/resources/tiny_external.png and /dev/null differ diff --git a/desktop/resources/tiny_group.png b/desktop/resources/tiny_group.png deleted file mode 100644 index 9b2a355e1f6..00000000000 Binary files a/desktop/resources/tiny_group.png and /dev/null differ diff --git a/desktop/resources/tiny_lock.png b/desktop/resources/tiny_lock.png deleted file mode 100644 index 842deab5a33..00000000000 Binary files a/desktop/resources/tiny_lock.png and /dev/null differ diff --git a/desktop/resources/tiny_lock_broken.png b/desktop/resources/tiny_lock_broken.png deleted file mode 100644 index c1a89d012c6..00000000000 Binary files a/desktop/resources/tiny_lock_broken.png and /dev/null differ diff --git a/desktop/resources/tiny_new_contact.png b/desktop/resources/tiny_new_contact.png deleted file mode 100644 index fc273529cd0..00000000000 Binary files a/desktop/resources/tiny_new_contact.png and /dev/null differ diff --git a/desktop/resources/tiny_pending.png b/desktop/resources/tiny_pending.png deleted file mode 100644 index 912c8ac4495..00000000000 Binary files a/desktop/resources/tiny_pending.png and /dev/null differ diff --git a/desktop/resources/tiny_public.png b/desktop/resources/tiny_public.png deleted file mode 100644 index b763156f1b8..00000000000 Binary files a/desktop/resources/tiny_public.png and /dev/null differ diff --git a/desktop/resources/tiny_settings.png b/desktop/resources/tiny_settings.png deleted file mode 100644 index 52d1b243628..00000000000 Binary files a/desktop/resources/tiny_settings.png and /dev/null differ diff --git a/desktop/resources/tiny_tribute_to_talk.png b/desktop/resources/tiny_tribute_to_talk.png deleted file mode 100644 index a4f970e105d..00000000000 Binary files a/desktop/resources/tiny_tribute_to_talk.png and /dev/null differ diff --git a/desktop/resources/tribute_to_talk.png b/desktop/resources/tribute_to_talk.png deleted file mode 100644 index 8bb9575d92d..00000000000 Binary files a/desktop/resources/tribute_to_talk.png and /dev/null differ diff --git a/desktop/resources/two_arrows.png b/desktop/resources/two_arrows.png deleted file mode 100644 index 7b561d17482..00000000000 Binary files a/desktop/resources/two_arrows.png and /dev/null differ diff --git a/desktop/resources/user_profile.png b/desktop/resources/user_profile.png deleted file mode 100644 index 2035b006631..00000000000 Binary files a/desktop/resources/user_profile.png and /dev/null differ diff --git a/desktop/resources/user_profile_1.png b/desktop/resources/user_profile_1.png deleted file mode 100644 index 2035b006631..00000000000 Binary files a/desktop/resources/user_profile_1.png and /dev/null differ diff --git a/desktop/resources/username.png b/desktop/resources/username.png deleted file mode 100644 index 819ea7d3e39..00000000000 Binary files a/desktop/resources/username.png and /dev/null differ diff --git a/desktop/resources/wallet.png b/desktop/resources/wallet.png deleted file mode 100644 index 99d2618ff45..00000000000 Binary files a/desktop/resources/wallet.png and /dev/null differ diff --git a/desktop/resources/warning.png b/desktop/resources/warning.png deleted file mode 100644 index 05f8a6db8a1..00000000000 Binary files a/desktop/resources/warning.png and /dev/null differ diff --git a/desktop/run-app.bat.in b/desktop/run-app.bat.in deleted file mode 100644 index f4dc903d550..00000000000 --- a/desktop/run-app.bat.in +++ /dev/null @@ -1,11 +0,0 @@ -@rem Copyright (c) 2017-present, Status Research and Development GmbH. -@rem All rights reserved. -@rem -@rem This source code is licensed under the BSD-style license found in the -@rem LICENSE file in the root directory of this source tree. An additional grant -@rem of patent rights can be found in the PATENTS file in the same directory. - - -@rem Run app locally -@CMAKE_BINARY_DIR@/bin/@APP_NAME@ - diff --git a/desktop/run-app.sh.in b/desktop/run-app.sh.in deleted file mode 100755 index 02bae1ad280..00000000000 --- a/desktop/run-app.sh.in +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (C) 2016, Canonical Ltd. -# All rights reserved. - -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. - -args="" -on_device=0 -plugins_path="" -asset_path="share" -executor="" - -# Parse args -for arg in "$@" -do - IFS="=" read -a parts <<< "$arg" - if [[ $parts == "--on-device" ]]; then - on_device=1 - elif [[ $parts == "--plugins-path" ]]; then - plugins_path=${parts[1]} - args=$args" --plugins-path=./plugins" - elif [[ $parts == "--asset-path" ]]; then - asset_path=${parts[1]} - elif [[ $parts == "--executor" ]]; then - if [[ $on_device == 1 ]]; then - # Force net executor for now - executor="ReactNetExecutor" - else - executor=${parts[1]} - fi - args=$args" --executor=$executor" - else - args=$args" $parts" - fi -done - -# Handle defaults -if [[ -z "$executor" ]]; then - if [[ $on_device == 1 ]]; then - executor="ReactNetExecutor" - args=$args" --executor=ReactNetExecutor" - fi - - # The RN application selects pipe executor by default -fi - -# For net case, try and run executor; it is probably OK if this fails - it's -# just running elsewhere -if [[ "$executor" == "ReactNetExecutor" ]]; then - (node @CMAKE_BINARY_DIR@/bin/ubuntu-server.js 2>&1 > /dev/null) & -fi - -if [[ $on_device == 1 ]]; then - app_path="/home/phablet/@APP_NAME@" - -# Push binaries - adb push @CMAKE_BINARY_DIR@/bin/@APP_NAME@ "$app_path/@APP_NAME@" - [ -d "$plugins_path" ] && adb push "$plugins_path" "$app_path/plugins/" - [ -d "$asset_path" ] && adb push "$asset_path" "$app_path/share/" -# adb reverse --no-rebind tcp:8081 tcp:808 - -# Run app on device - react_host=`hostname -I` - - adb shell "cd $app_path && REACT_SERVER_HOST=$react_host ./@APP_NAME@ --host $react_host $args -- --desktop_file_hint=/usr/share/applications/webbrowser-app.desktop" -else -# Run app locally - # Note: Needed to add QT_XCB_GL_INTEGRATION=none when migrating to Nix, since running the app in debug mode inside Nix shell was failing at run time with "qt.glx: qglx_findConfig: Failed to finding matching FBConfig (1 1 1 0)\nCould not initialize GLX" - QT_XCB_GL_INTEGRATION=none @CMAKE_BINARY_DIR@/bin/@APP_NAME@ $args -fi - diff --git a/dev/status_im/i18n_resources.cljs b/dev/status_im/i18n_resources.cljs deleted file mode 100644 index a462e4b98bf..00000000000 --- a/dev/status_im/i18n_resources.cljs +++ /dev/null @@ -1,21 +0,0 @@ -(ns status-im.i18n-resources - (:require-macros [status-im.i18n :as i18n]) - (:require [status-im.react-native.js-dependencies :as rn-dependencies] - [status-im.utils.types :as types] - [clojure.string :as string])) - -(def default-device-language - (keyword (.-language rn-dependencies/react-native-languages))) - -;; translations -(def translations-by-locale - (->> (i18n/translations [:en :es_419 :fa :ko :ms :pl :ru :zh :zh_Hans_CN]) - (map (fn [[k t]] - (let [k' (-> (name k) - (string/replace "_" "-") - keyword)] - [k' (types/json->clj t)]))) - (into {}))) - -;; API compatibility -(defn load-language [lang]) diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 00000000000..0d769b6c036 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,45 @@ +## Getting Started + +- [Starting Guide](starting-guide.md) +- [IDE Setup](ide-setup.md) + +## Development Process + +- [Coding guidelines](new-guidelines.md) +- [Layered architecture](architecture-layers.md) +- [UI components coding guidelines](ui-guidelines.md) +- [Release Checklist](release-checklist.md) +- [Release Guide](release-guide.md) +- [Merging PR process](merging-pr-process.md) +- [PR Review Policy](pr-review-policy.md) +- [Working on PR together with QA team](pipeline_process.md) +- [Debugging](debugging.md) +- [Patching](patching.md) +- [Creating a pixel perfect UI](pixel-perfection.md) +- [Contributing to status-go](status-go-changes.md) +- [Status Backend Server](use-status-backend-server.md) +- [Malli schemas (recorded demo)](https://www.youtube.com/watch?v=SlRio70aYVI) ([slides](files/forging-code-with-schemas-sep-2023-slides.pdf)) + +## Testing + +- [Overview](tests/tests-overview.md) +- [How to run local tests](tests/how-to-run-local-tests.md) +- [End-to-end tests (e2e) overview](tests/how-to-launch-e2e.md) +- [Component tests (jest) overview](tests/component-tests-overview.md) + +## Project details + +- [status-go introduction (recorded meeting)](https://drive.google.com/file/d/1B7TljmTZ8fHkqJH8ChU1Cp4FGDFM03gq/view) +- [re-frame usage (recorded meeting)](https://drive.google.com/file/d/1qv_E0CEGzQpu_zGXD0gCTU5EvhC2k8Jy/view) +- [status app functionality demo](https://drive.google.com/file/u/0/d/1PmwsMLTLDNNIdv5_6wvMOwoj2PfT50c6/view) + +## Misc + +- [Importing assets from Figma into project](import-assets.md) +- [Updating Status APK builds for the F-Droid Android application catalogue](fdroid.md) +- [Troubleshooting for known errors](troubleshooting.md) + +## Outdated: + +- [Old guidelines](codebase-structure-and-guidelines.md) +- [Post mortem analysis](post-mortem.md) diff --git a/doc/adding-new-chains.md b/doc/adding-new-chains.md new file mode 100644 index 00000000000..54c0db38c78 --- /dev/null +++ b/doc/adding-new-chains.md @@ -0,0 +1,18 @@ +# Adding new chains + +This doc only describes how to add new chains on the client side, so make sure the chain is added on `status-go` first (see [eth-rpc-proxy:ADD_NEW_CHAINS.md](https://github.com/status-im/eth-rpc-proxy/blob/master/ADD_NEW_CHAINS.md)) + +## Steps +1. Add the chain image (.png) to `resources/images/networks/` +2. Add the chain name (keyword) and the path to the chain image to `quo.foundations.resources/networks` +3. Add the mainnet (and/or testnet) `chain-id` constant(s) to `status-im.contexts.wallet.networks.config` +4. Add additional chain information in the same namespace, under `mainnets` and `testnets` respectively, including the chain name keyword added for the image. +5. In case the network should be highlighted as _new_ in the UI, add the chain id to `status-im.contexts.wallet.networks.config/new-networks` + +## Future steps to improve addition of new chains and facilitate the addition of custom chains by the user +1. Remove reliance on the `network-name` and refer to a chain solely by its `chain-id` +2. Remove the definition of the network images from `quo.foundations.resources/networks` by relying on the images provided by `status-go` +3. `quo` components that should render a network image should get the image source as a prop +4. The chain data added in `status-im.contexts.wallet.networks.config` should be received from `status-go` or derived on the client, instead of being added manually. +5. Ideally, when adding a new chain, we shouln't bring new changes on the client. All the changes should happen on the `status-go` side +6. Remove deprecated namespaces dealing with chains e.g. `utils.ethereum.chains` diff --git a/doc/architecture-layers.md b/doc/architecture-layers.md new file mode 100644 index 00000000000..0bb9cac7e49 --- /dev/null +++ b/doc/architecture-layers.md @@ -0,0 +1,240 @@ +# Mobile app architecture - WIP + +## Problems we are trying to solve + +- Mixed layers of abstraction. +in the same event we sometimes process data from UI, perform application logic and send data to the backend. +- Inconsistent re-frame `app-db`. +UI state, data from backend, and application flow data are mixed, making it hard to track what belongs where. + +**Why is this bad?** +Intertwining different levels of abstraction in the same code increases cognitive load for developers and also makes code less testable. + +## Layered architecture +Architecture described below was inspired by [clean architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) but does not strictly folow it. +The core idea is to highlight 4 logical layers, each responsible for own set of tasks and to organize the code in a way that each layer is clearly separated. + +![layers](images/architecture.png) + + +## Layers + +### Gateway +`Gateway` is a layer that responsible for communication with "outer" services. +The main "outer" service that we depend on is `status-go` so most of the code here deals with connections to `status-go`. + +> **Reasoning for considering `status-go` an "outer" service?** +> - It’s accessed via remote procedure calls +> - It is a subject to change () +> - pieces of `status-go` functionality could be theoretically replaced by a another providers which confirms it "outer" nature. + +`Gateway` layer abstracts the rest of the application from changes that happen in outer services. +Which means it: +- hides implementation details of outer services. +- transforms data that arrives from outer services to those used in the app. + +#### Example +Market data is provided by `status-go` via api call to `FetchMarketTokenPageAsync` function. That function **uses pagination** (has `page` and `page-size` arguments). +After that function called `status-go` starts to regularly emit signals that **in json format** contain information about tokens: their name, price, image, market cap, position in "tokens leaderboard", price change in last 24h, etc. + +It is `gateway` layer responsibility to abstract other parts of app of such implementation details as using pagination and using json format. And it is up to gateway to dissect the incoming big ball of data to smaller and more coherent structures to be used in other layers. + +Which means `gateway` should: +- maintain the `current-page` variable and increase/reset it as needed to pass to `FetchMarketTokenPageAsync` +- maintain `page-size` variable +- convert incoming structure from json to edn +- split incoming structure to smaller and more coherent ones: token-info, token-price, tokens-leaderboard + +### Domain +`Domain` is a layer where business logic lives. It contains the entities of our knowledge domain and operations on them. +For example for `messenger` part of our app such entities are: message, chat, contact, etc. Those are concepts that all messenger apps share. + +For `wallet` part of our app domain entities are: accout, token, network, address. All wallets use those because their are part of "crypto" knowledge domain. + +So in the `domain` level of our app we define data structures for such concepts and functions to operate on them. + +**What entities belong to `domain`?** + +There is a simple question you can ask yourself to check if some data belongs to `domain` layer: "If I will write console version of our application (which means different UI and different user flows), can I reuse the same structures and functions?". +If answer is "yes" - most probably it is a domain-level entities. + +#### Example +`network` is a concept from "blockchain" domain. Representations of network can be found in code of any wallet. + +In our code `network` is represented by datastructure with fields: +```clojure +{:testnet? + :chain-id + :short-name + :full-name + :native-currency-symbol + ...} +``` + +And there are functions that work with `network` datastructure +```clojure +(defn ethereum-network? + [network] + ...) + +(defn get-networks-for-layer + "Returns networks for the layer (`1` or `2`)" + [networks layer] + ...) +``` + +If we will make a console version of the app we can reuse that datastructure and functions which means they should be stored in `domain` level. + +### Application +`Application` is a level that manages **user flows**. It is responsible for coordination between inner `domain` layer and outer layers. +When user interacts with `UI` it is up to the `application` layer to make calls to `domain`, `gateway` or `UI`. + +#### Example +Status mobile app has user flow "Send crypto". +That flow consists of few screens and on each screen the data required for sending (network, token, amount) is partially filled. + +What `application` layer **DOES** in this flow: +- when user goes from step to step in user flow, `application` layer knows what UI should be presented. For example if user starting the `send` flow `application` layer checks if user is already inside a wallet account screen. +If yes - next screen will be the token selection. If user is not within an account - next screen will be an account selection. +- when user goes through steps in user flow, `application` layer stores intermediate data acquired on steps. When user selected `token` to send `application` layer should remember the selection to use it in the next screen. +- `application` layer knows when to call `domain` to perform checks. If user entered address to send funds to, `application` layer should call the business logic in `domain` layer to check if address is valid. +If amount of crypto entered - `application` layer redirects to `domain` to check if the amount is less than user owns. +- `application` layer knows when to call `gateway` to communicate with outer services. When user confirms the sending `application` layer should call `gateway` and pass all the collected data to perform sending. + +What `application` layer **DOES NOT** in this flow: +- it does not check if address is correct "ethereum" address - it is up to `domain` layer. +- it does not check if user has sufficient amount of crypto to send - it is up to `domain` layer. +- it does not call `status-go` directly - it is up to `gateway` layer. + +### UI +Here belongs everything related to user interface - views, components, styles, animation. +All logic here should be UI-specific and not application-specific. + +#### Example +Lets say user is in "enter crypto amount" screen of "send crypto" flow. +That screen has the input field for entering amount of crypto, button for switching between crypto and fiat, button for confirming the amount. + +What **ARE** parts of `UI` layer on this screen: +- all the styles, components, animations belong to the `UI` layer +- state of the input field +- state of the fiat/crypto toggle + +What **ARE NOT** parts of `UI` layer on this screen: +- logic of converting between fiat and crypto - should be part of the `domain` +- logic of displaying crypto and fiat values (amount of decimals, prepending with fiat symbol) - should be part of the `domain` + + +## Data management + +Each layer has logic and data. This section clarifies which data belons to which layer. + +### Gateway data +Here goes data related to the **mechanics** of interaction with outer services: +- connection states +- timeouts values +- current page in paginated request + +If outer service does not respond and we need to make two more tries to reach it before call it "unreachable", the counter of tries should be treated as `gateway` data. + +### Domain data +Here goes all the data related to knowledge domain. Distinctive feature of this data is that it is "persistent" which means it stays actual even if we restart the application. +Wallet part of our application works with user profiles, accounts, balances. When we restart the application all of them stay actual. On contrary with user flow data which could be safely discarded when app closed. + +If user had 4 accounts in wallet and 10 saved contacts in chat they should stay intact after app reloading. `accounts` and `contacts` are concepts from our knowledge domain, plus they are presistent - that means it is a `domain` level data. + +Note: There are other types of data that should survive data restart. For example user visual settings like light/dark mode. +This data belongs to `UI` layer because it would survive app restart but wouldn't survive rewriting our mobile app to console app. + + +### Application data +`Application` layer data contains the state of current "user flow". +This data can be safely discarded after user has finished the flow. + +If user entered some chat we store `current-chat` as piece of `application` data. +If user is in "send crypto" flow that consist of few consecutive screens, the selections made on all screens (account, token, receiver address) is stored as `application`-layer data. + +### UI data +`UI` data contains UI settings or states of the particular screen. + +User can switch between fiat and crypto on `enter amount` screen of `send crypto` user flow. But the state of that toggle does not influence any other screens, it is solely UI feature and should be stored under `UI` layer. + +### re-frame db organization + +Data stored in re-frame db should be normalized, which means: +- each entity is stored only once +- relationships between entities handled using IDs +- redundancy is minimized + +`rf-db` keys names should have the structure: `:layer.context/entity`. Where `layer` is a logical layer where data belongs. `context` is an area of application and `entity` is a name of stored data. + +Layer names are shortened for convenience `application`->`app`, `gateway`->`gate`. + +From previous examples: +- last page fetched from `FetchMarketTokenPageAsync` call to `status-go` can be stored in rf-db under the name `:gate.market/last-fetched-page`. +- token prices extracted from status-go signal payload could be stored under the name `:domain.market/prices` +- `:app.wallet/send-flow` can contain structure the whole state of the "send-flow" - selected account, selected token, destination address + + +## Communications between layers + +![layers](images/layers-relationships.png) + +- `Domain` layer does not communicate with any other layer and not aware about their existence +- `Application` layer makes calls to `Domain` via events or functions +- `Application` layer makes calls to `UI` via events or functions +- `UI` layer makes calls to `Application` layer via events or functions +- `UI` layer uses subscriptions defined in `Domain` layer +- `UI` layer uses subscriptions defined in `Application` layer +- `UI` layer uses subscriptions defined in `UI` layer + + +### Subscriptions +Subscriptions can be declared on `Domain`, `Application`, or `UI` level. +- `Domain` layer subscriptions provide access to domain data (most likely without any data transformation) +- `Application` layer subscriptions provide access to state of the current user flows +- `UI` layer subscriptions provide access to ui screen states and also consumes `domain` and `application` layer subscriptions to extract data needed for particular ui elements. + +Subscriptions are named using `:layer.context/entity` pattern. + +### Examples: +Domain-level subscriptions to access normalized tokens data: +```clojure +(rf/reg-root-key-sub :domain.market/leaderboard :domain.market/leaderboard) +(rf/reg-root-key-sub :domain.market/prices :domain.market/prices) +(rf/reg-root-key-sub :domain.market/tokens :domain.market/tokens) +``` + +UI-level subscription that consumes domain data and "massages" it for UI: +```clojure +(rf/reg-sub + :ui.market/token + :<- [:domain.market/prices] + :<- [:domain.market/tokens] + :<- [:domain.market/leaderboard] + (fn [[token-prices token-details leaderboard] [_ token-id]] + (let [{:keys [current-price price-change-percentage-24h market-cap]} (get token-prices token-id) + {short-name :symbol name :name image :image} (get token-details token-id) + position (get leaderboard token-id)] + {:price (wallet.utils/prettify-balance "$" current-price) + :percentage-change (utils.number/naive-round price-change-percentage-24h 2) + :market-cap (utils.number/format-number-with-si-suffix market-cap) + :short-name (when short-name (string/upper-case short-name)) + :token-rank position + :token-name (utils.string/truncate name 18) + :image image}))) +``` + + + + +### Events +Events are named using `:layer.context/entity` pattern. + +#### Example +```clojure +(rf/reg-event-fx :app.market/close-leaderboard + (fn [{:keys [_db]}] + {:fx [[:dispatch [:gate.market/stop-fetching-tokens]] + [:dispatch [:domain.market/clear-market-data]]]})) +``` + diff --git a/doc/codebase-structure-and-guidelines.md b/doc/codebase-structure-and-guidelines.md index 1dcad99085e..e4ec779c4ce 100644 --- a/doc/codebase-structure-and-guidelines.md +++ b/doc/codebase-structure-and-guidelines.md @@ -1,4 +1,14 @@ -# Business Logic Modules +# Codebase Structure and Guidelines + +As of Nov/2022, we're starting to document and migrate the codebase to [new +guidelines](new-guidelines.md), which will supersede some of the guidelines in +this document. + +## Starting the app + +The app is bundled and run in a Nix environment. Information regarding how to run it locally can be found [here](https://status.im/technical/build_status/). + +## Business Logic Modules Each business logic module is managed in a module directory. @@ -31,7 +41,7 @@ Rationale and how to get there: Currently a lot of business logic is lost in utils and screens namespaces and should be moved to dedicated top level directories. This should make core logic of the app more accessible and organized -## core.cljs +### core.cljs Core namespace must only contain functions that can be called outside of the module (i.e. in events or other modules): @@ -45,9 +55,8 @@ Core namespace must only contain functions that can be called outside of the mod {:db (module.db/set-current-account db)}) ``` -## db.cljs +### db.cljs -- must contain specs for the app-db subpart the module modifies - must contain getter and setter functions used by fx producing functions and subscriptions - db logic called by other modules @@ -55,26 +64,51 @@ Rationale: These guidelines make db.cljs namespaces the place to go when making changes to the db layout and minimize breaking changes when adding/refactoring features -# Subscriptions +## re-frame + +### Subscriptions - all subscriptions must be defined in the single `status-im.subs` namespace - subscriptions must subscribe only on other subscriptions, and never on app-db itself - `reg-root-key-sub` should be used for the root keys subscriptions -# Events +### Events -- all events must be defined in the single `status-im.events` namespace which can be considered as an index of everything going on in the app -- events must always be declared with `register-handler-fx`, no `register-handler-db` -- events must never use the `trim-v` interceptor -- events must only contain a function call defined in a module - ```clojure - (handlers/register-handler-fx - :notifications/handle-push-notification-open - (fn [cofx [_ event]] - (notifications/handle-push-notification-open event cofx))) - ``` -- events must use synthetic namespaces: +- all events must be defined in the `core.cljs` namespaces +- events must always be declared with `fx/defn` macro + +## Testing flow +- All PRs automatically go to "REVIEW" column on [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) project on Github. This is our main board for QA / devs interaction +- After the PR gets at least 1 approval, it should be moved to "E2E Tests" column. Some PRs may need approvals from more than one person. +- Critical path tests are automatically run for all PRs in "E2E Tests" column. +- If E2E tests pass: + - If PR doesn't need manual QA (it is small change or change doesn't relate to app) - after passing e2e tests it can be merged (don't use the Github UI to merge, check section on merging PRs). + + - If manual QA needed - add label 'request manual qa'. The QA team will process it (make sure the summary and test instructions are clear). QA team will review results and test PR on different platforms and assign one of the three labels: + - No issues - label 'TESTED-OK' and then you can merge it. + - If issues - label 'TESTED-ISSUES' and comment from QA with bugs. + - After fix and/or discussion the process is repeated. + + - If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated. + +## Translations +The app relies on system locale to select a language from the [list of supported languages](https://github.com/status-im/status-mobile/blob/bda73867471cf2bb8a68b1cc27c9f94b92d9a58b/src/status_im/i18n_resources.cljs#L9). It falls back to English in cash the system locale is not supported. + +We use Lokalise App to manage [translations](https://translate.status.im/). In case you need to add/remove a key to translations, you only need to change `en.json`. Missing keys fallback to `en.json`. The actual translations will be added by Lokalise. + +## Merging approved PRs + +We don't Github's UI to merge. Instead `./scripts/merge-pr.sh` is used to sign and merge PR to `develop`. You first need to enable [GPG signing on you commits](https://github.com/status-im/status-mobile/blob/develop/STARTING_GUIDE.md#configure-gpg-keys-for-signing-commits). + +Once your commits are verified and PR approved, you can run the script like so: + +```bash +$ git checkout develop +$ git fetch +$ git reset --hard origin/develop +$ ./scripts/merge-pr.sh 11370 +``` +Replace 11370 with your PR id. - - `:module.ui/` for user triggered events - - `:module.callback/` for callback events, which are events bringing back the result of an fx to the event loop, the name of the event should end with `-success` or `-error` most of the time. Other possibilities can be `-granted`, `-denied` for instance. - - `:module/` for internal events, examples are time based events marked `-timed-out`, external changes marked `-changed` or reception of external events marked `-received`. +## Release process +TODO(shivekkhurana): Compile release notes diff --git a/doc/debugging.md b/doc/debugging.md new file mode 100644 index 00000000000..a9fde18b011 --- /dev/null +++ b/doc/debugging.md @@ -0,0 +1,169 @@ +# Debugging + +## Inspecting re-frame with re-frisk +`re-frisk` is a state visualization tool written by our very own Andrey (@flexsurfer). With its help you can inspect the current state of app-db, watch event, etc. + +![re-frisk](images/debugging/re-frisk.png) + +To start `re-frisk`, execute the following command: +```bash +$ yarn shadow-cljs run re-frisk-remote.core/start +``` + +or you can also use make: + +```bash +$ make run-re-frisk +``` + +A server will be started at http://localhost:4567. It might show "not connected" at first. Don't worry and just start using the app. The events and state will populate. + +More details about re-frisk are on the [project page](https://github.com/flexsurfer/re-frisk). + +## Debugging with FlowStorm + +[FlowStorm](http://www.flow-storm.org/) is a free and open-source time-travel +debugger for Clojure and ClojureScript. It is capable of recording almost any +code execution path in the Status' mobile app. + +FlowStorm is independent of editor/IDE, but a tighter [integration with +Emacs](https://github.com/jpmonettas/cider-storm) is available. + +If you are developing with Android, run `make android-ports` first. If you are +behind a firewall, allow TCP traffic on port `7722`, then: + +```bash +make run-flow-storm +``` + +You will know FlowStorm is correctly running if you see the status bar with +green `REPL` and `RUNTIME` indicators. + +With FlowStorm running, you can now add `#trace` on any top-level form, reload +the code, or evaluate the traced form in the REPL, and FlowStorm will start +recording data. Avoid `#rtrace` (with `r`) because it can cause massive spikes +in CPU which will make the app hang and you might need to forcefully kill +processes. + +```clojure +#trace ; => Add this line to tell FlowStorm to instrument the function. +(defn say-hello [] + (str "Hello world")) +``` + +There are other ways to debug, but this is a good start. + +## Enabling debug logs +Calls to `log/debug` will not be printed to the console by default. It can be enabled under "Advanced settings" in the app: + +![Enable Debug Logs](images/debugging/log-settings.png) + + +## Checking status-go logs +While status mobile works it saves logs from `status-go` to `geth.log` file. + + +### Checking logs from physical device +To obtain `geth.log` from physical device you need to shake it and in an opened menu select "Share logs". + +![Share logs](images/debugging/share-logs.jpeg) + + +### Checking logs from iOS Simulator +When developing with iOS simulator it is more convenient to see the `geth.log` updates in real-time. +To do this: +- open Activity Monitor +- find the "StatusIm" app and doubleclick it +- in the opened window select "Open files and ports" and find the full path to `geth.log` (note that it won't appear until you login to Status app) + +![geth.log path](images/debugging/geth-path.png) + +## Inspecting database content + +Encrypted database can be found using commands: +``` +cd ~/Library/Developer/CoreSimulator/Devices +find ./ -name accounts.sql +``` + +To get unencrypted database you need to export it first: +- open the status app in simulator +- on login screen enter the correct password without logging in +- using repl execute statement to export db: + ``` + (re-frame.core/dispatch [:multiaccounts.login.ui/export-db-submitted]) + ``` +- save generated `export.db` file + +Now you can locate the `export.db` and open it with preferred db viewer. + +**Android:** + +```sh +adb root +adb pull /storage/emulated/0/Android/data/im.status.ethereum.debug/files/Download/export.db /path/to/store/export.db +``` + +If you're using a release build, change the path to `/storage/emulated/0/Android/data/im.status.ethereum/files/Download` + +**iOS** + +``` +cd ~/Library/Developer/CoreSimulator/Devices +find ./ -name export.db +``` + + + +## Tips +### From @ilmotta: + +Something I find extremely convenient for Android is to use `adb` to tail logs. I don't use macOS so I don't know if the iOS simulator offers a CLI interface with the same capabilities. + +But here's what I use for example: + +``` + adb shell tail -n 10 -f /storage/emulated/0/Android/data/im.status.ethereum.debug/files/Download/geth.log | grep 'waku.relay' +``` + +Also to inspect logs in a more flexible manner, instead of the strict output from `make run-metro`, I prefer `adb logcat`. Combined with enabling status-mobile logs in debug by default plus filtering the logs to only what I care during development, I find this helps me inspect the app without running re-frisk because with the debug log level I can already see which events are dispatched (one of the features I like the most from re-frisk). + +``` +adb logcat | grep 'ReactNativeJS\|StatusModule\|GoLog' +``` + +### From @clauxx (visual debugging): + +When building/fixing/refactoring components, it can be annoying to set-up the component for instant visual feedback (i.e. finding it in the UI when fixing/refactoring; finding a place for it when building from scratch). Very often if the location of the screen containing your component nested deeply in the app, you might have to do a lot of repeated navigation, nevermind logging in every time the app reloads (even with fast refresh disabled this happens quite often). + +To alleviate this discomfort and make the development cycle more *pleasant*, you can use one of the following options (*_both of which involve the ... REPL ༼ つ ╹ ╹ ༽つ, so make sure you have that set-up with your IDE/editor_*) + +#### REPL-ing to a screen + +This one is straightforward, just evaluate a navigation dispatch form from anywhere: + +```cljs +(comment (rf/dispatch [:navigate-to :your-favorite-buggy-screen])) +``` + +> TIP: you can run this from an untracked user namespace `(ns user)`, from which you can experiment or interact with the REPL. This is where I usually keep my development navigation forms. + +#### REPL-ing a component + +This is also straightforward, but there are some small differences. Just like above, we only have to evaluate a dispatch form, as follows: + +```cljs +;; example debugging a quo component, although it could be any other component e.g. from the `status-im2` ns. +(comment (re-frame/dispatch [:dev/preview-component + [quo/slide-button + {:track-icon :face-id + :track-text "preview component example" + :customization-color :blue + :on-complete identity}]])) +``` + +When evaluated, a full-screen bottom sheet will appear with your component inside. You can make changes to the props or the component internals and re-evaluate the changed forms, after which the component will be re-mounted without running a reload (unless you save the file). Other times it's quicker to just hit save and the component will be reloaded as usual (except for the props you evaluated, which have to be re-evaluated when changed). + +> TIP: You can have multiple versions of the component as separate comments to check for the component variations + +> TIP: You can leave `comment` blocks at the end of component files (other than quo, since can be previewed in other ways) with usages of components, which other developers can use for visualisation/testing. diff --git a/doc/decisions/0003-geth-node.md b/doc/decisions/0003-geth-node.md index 83a9ad1e1f8..1f663c5d957 100644 --- a/doc/decisions/0003-geth-node.md +++ b/doc/decisions/0003-geth-node.md @@ -49,7 +49,7 @@ decentralization and security. Q2 we will provide two ways of accessing the Ethereum network: - Upstream RPC with Infura (default) -- Custom upstream node (https://github.com/status-im/status-react/issues/3994) +- Custom upstream node (https://github.com/status-im/status-mobile/issues/3994) From a decentralization point of view we need the latter before we can release the beta. diff --git a/doc/decisions/0004-disable-group-chats.md b/doc/decisions/0004-disable-group-chats.md index 3b7bd0c198b..6bbec4aec96 100644 --- a/doc/decisions/0004-disable-group-chats.md +++ b/doc/decisions/0004-disable-group-chats.md @@ -20,11 +20,11 @@ chance to talk to strangers and it is open by default. Whether group chats are in scope or not has been a recurring discussing and a lot of effort has been wasted related to this. -There are currently a lot of outstanding regressions related to group chat: https://github.com/status-im/status-react/labels/group-chat Additionally, since group chats are private the encryption and security of those are generally harder than 1-1 and public chat. +There are currently a lot of outstanding regressions related to group chat: https://github.com/status-im/status-mobile/labels/group-chat Additionally, since group chats are private the encryption and security of those are generally harder than 1-1 and public chat. ## Decision -Disable group chat for beta and don't work on bugs related to it until after. See https://github.com/status-im/status-react/issues/3995 +Disable group chat for beta and don't work on bugs related to it until after. See https://github.com/status-im/status-mobile/issues/3995 This ensures we can release beta without blockers, and then we can take some time to fix group chats properly. diff --git a/doc/decisions/0007-masking-sensitive-data.md b/doc/decisions/0007-masking-sensitive-data.md index f7e55495bf8..14518570b0f 100644 --- a/doc/decisions/0007-masking-sensitive-data.md +++ b/doc/decisions/0007-masking-sensitive-data.md @@ -13,13 +13,15 @@ Proposed We have some data that we don't want to appear in the logs (user passwords are a good example). Currently, they are passed around as strings, that could be -printed out by mistake in a log entry (see https://github.com/status-im/status-react/issues/4053) +printed out by mistake in a log entry (see https://github.com/status-im/status-mobile/issues/4053) ## Decision To minimize the risk of leaking passwords through logs, we should not pass passwords as strings in our codebase. We introduced a new type `MaskedData` in `status-im.utils.security`. +update (16-Dec-2022) `status-im.utils.security` is now moved over to `utils.security.core` + We use `(security/mask-data ` to wrap sensitive data into this type and then use `(security/unmask )` to get the plaintext back. diff --git a/doc/decisions/0009-release-process-mobile.md b/doc/decisions/0009-release-process-mobile.md index 9fb5bb80805..fb0aba66232 100644 --- a/doc/decisions/0009-release-process-mobile.md +++ b/doc/decisions/0009-release-process-mobile.md @@ -95,7 +95,7 @@ We also have an ongoing document with them. #### iOS Test Flight Release **Upload to AppStore Connect** -Use [this Jenkins job](https://jenkins.status.im/job/status-react/job/upload_release_ios/) +Use [this Jenkins job](https://jenkins.status.im/job/status-mobile/job/upload_release_ios/) **“What to test” field** When AppStore Connect asks you to fill in the field called “what to test”, just copy the release notes there. @@ -114,7 +114,7 @@ If reviewed successfully, we can share it to our users by adding “testflight-b The uploaded release is **immediately available**! Do it only if the iOS build is approved by Apple! -Use [this Jenkins job](https://jenkins.status.im/job/status-react/job/upload_release_android/) +Use [this Jenkins job](https://jenkins.status.im/job/status-mobile/job/upload_release_android/) Don’t forget to update the screenshots if necessary! diff --git a/doc/decisions/0010-remove-jail-and-status-api.md b/doc/decisions/0010-remove-jail-and-status-api.md index 048729894eb..2590047a672 100644 --- a/doc/decisions/0010-remove-jail-and-status-api.md +++ b/doc/decisions/0010-remove-jail-and-status-api.md @@ -18,7 +18,7 @@ While neat in theory, it has some serious downsides: As a result of that, more dynamic/state requiring things (like the live tx detail in `/send` command messages) were very hard to do, so instead of "eating our own dogfood", we decided to side-step the API and implement such things as hard-coded logic in the app, while partly retaining the js code for "easier" things (like parameter declaration). - Needles to say, such efforts produced code of very poor quality, riddling our app with hard-coded "magic" everywhere in the codebase, completly + Needles to say, such efforts produced code of very poor quality, riddling our app with hard-coded "magic" everywhere in the codebase, completely defeating the point of "dogfooding" while still requiring more effort and being much more error prone (no way to unit test jail logic) because of the need to asynchronously communicate with jail for leftover logic in command messages (the parts not hardcoded in app). diff --git a/doc/decisions/0011-tweak-pr-process.md b/doc/decisions/0011-tweak-pr-process.md index 4fca2d7982a..30ff27e8978 100644 --- a/doc/decisions/0011-tweak-pr-process.md +++ b/doc/decisions/0011-tweak-pr-process.md @@ -13,7 +13,7 @@ accepted There was a generally dissatisfaction with our PR flow process from multiple stakeholders, including devs, QA and design. These largely centered around size, speed of integration and quality of PRs. -For more details, please see pain points in the meeting notes held end of February here: https://notes.status.im/C5pj8g7gQOu9Wo8PtDZsMw?edit# as well as the preceeding Discuss thread: https://discuss.status.im/t/better-pull-requests-process/1044 +For more details, please see pain points in the meeting notes held end of February here: https://notes.status.im/C5pj8g7gQOu9Wo8PtDZsMw?edit# as well as the preceding Discuss thread: https://discuss.status.im/t/better-pull-requests-process/1044 Also see conversations in Core Dev Call #12 and #13: https://github.com/status-im/pm/ @@ -29,7 +29,7 @@ As a rule of thumb, coverage should increase. **3. Reject PRs that don't write what tests the author have done and what platforms you used to test, including screenshots, videos or logs** This means QA and dev have to spend less time catching obvious problems. -**4. Run tests when a PR is at "Review" stage on https://github.com/status-im/status-react/projects/7 (or add new 'e2e stage' between review and `TO TEST`)** +**4. Run tests when a PR is at "Review" stage on https://github.com/status-im/status-mobile/projects/7 (or add new 'e2e stage' between review and `TO TEST`)** **5. Dev asks for 2-3 reviewers, including a designer if the change affects UI, and these reviewers review within a day.** This ensures we don't have *diffusion of responsibility* and that PRs are reviewed quickly. diff --git a/doc/decisions/0012-using-pivotal-tracker.md b/doc/decisions/0012-using-pivotal-tracker.md index e91f95e6f70..17f0ab52f33 100644 --- a/doc/decisions/0012-using-pivotal-tracker.md +++ b/doc/decisions/0012-using-pivotal-tracker.md @@ -23,8 +23,8 @@ The `State` field in the Pivotal story is used to track the progress of a Pivota | ---------- | -------- | | `Unstarted` | In backlog | | `Started` | Developer has started work on story | -| `Finished` | Developer has finished work on story (Pull Request for story is in [REVIEW](https://github.com/status-im/status-react/projects/7#column-1843024) column in [Pipeline for QA](https://github.com/status-im/status-react/projects/7) board) | -| `Delivered` | Pull Request for story is in testing in [Pipeline for QA](https://github.com/status-im/status-react/projects/7) board) board | +| `Finished` | Developer has finished work on story (Pull Request for story is in [REVIEW](https://github.com/status-im/status-mobile/projects/7#column-1843024) column in [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) board) | +| `Delivered` | Pull Request for story is in testing in [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) board) board | | `Accepted` | PR has been merged | | `Rejected` | PR has been aborted | @@ -45,4 +45,4 @@ The `State` field in the Pivotal story is used to track the progress of a Pivota | 5 points | 2 - 3 days | | 8 points | ~1 week | - We should avoid 8 point stories by breaking them down into smaller stories as much as possible. \ No newline at end of file + We should avoid 8 point stories by breaking them down into smaller stories as much as possible. diff --git a/doc/decisions/0013-tribute-to-talk.md b/doc/decisions/0013-tribute-to-talk.md index 810e96aa4b0..744205417a9 100644 --- a/doc/decisions/0013-tribute-to-talk.md +++ b/doc/decisions/0013-tribute-to-talk.md @@ -18,7 +18,7 @@ The whitepaper also proposes that the deposit is only forfeited to the recipient Considering: - the absence of efficient ways to perform anonymous transactions (zk-snarks could be used in the future for that) -- the impossibility to prove that a recipient has made an actual reply and not some kind of automated reply (captcha solution was proposed, but wouldn't be pratical until we can use a solution such as swarm feeds that allow users to make free updates to their captcha without on-chain transactions) +- the impossibility to prove that a recipient has made an actual reply and not some kind of automated reply (captcha solution was proposed, but wouldn't be practical until we can use a solution such as swarm feeds that allow users to make free updates to their captcha without on-chain transactions) - the limited time to develop the feature We opted for a solution that: @@ -28,8 +28,8 @@ We opted for a solution that: ## Manifests -Since TtT related informations aren't stored on chain, they need to be stored somewhere else. -For the first iteration of TtT we opted for IPFS, which is already used accross the app for other forms of content, through Infura IPFS gateway. +Since TtT related information aren't stored on chain, they need to be stored somewhere else. +For the first iteration of TtT we opted for IPFS, which is already used across the app for other forms of content, through Infura IPFS gateway. On IPFS we store what we call a ttt manifest, which is a json file with the following format: diff --git a/doc/decisions/0014-wallet-team.md b/doc/decisions/0014-wallet-team.md new file mode 100644 index 00000000000..ae014bb3167 --- /dev/null +++ b/doc/decisions/0014-wallet-team.md @@ -0,0 +1,30 @@ +# 0014. Team-structure + +| Date | Tags | +|---|---| +| 2023-06-16 | wallet team | + +## Status + +Proposed + +## Context: + +In order to try out vertical team, which is a structure that is wanted by the company, we will be creating a wallet team within the mobile team. +Some member of the mobile team will join the current wallet team, which is composed by developers from desktop and lead by @alaibe, on a voluntary basis. +The responsibilities of the team are to implement the new wallet UI, with the support of the current wallet team, which will be assisting with the status-go work. + +## Decision + +The team members for the initial wallet team are: + +- @rasom +- @OmarBasem +- @vkjr +- @J-Son89 +- @briansztamfater +- @smohamedjavid +- @ulisesmac +- @erikseppanen +- @mmilad75 +- @tumanov-alex diff --git a/doc/decisions/0015-team-structure.md b/doc/decisions/0015-team-structure.md new file mode 100644 index 00000000000..8bbceee5361 --- /dev/null +++ b/doc/decisions/0015-team-structure.md @@ -0,0 +1,46 @@ +# 0015. Team-structure + +| Date | Tags | +|---|---| +| 2023-06-16 | changes in team structure | + +## Status + +Proposed/partially implemented + +## Context: + +Currently, there is only a single team lead in the mobile development team, and after a meeting with the design team, it has been identified that the mobile app lacks polishness. One of the main issues identified is a lack of oversight in certain areas. To address this problem, it has been decided to create an additional role within the team. For each section of the mobile app (communities, syncing & onboarding, activity center & shell, wallet, messaging), a person will be selected to fulfill the responsibilities outlined below. + +## Decision + +The decision is to create an additional role within the mobile development team for each section. The individuals selected for these roles will have the following responsibilities: + +- Ensure GitHub issues are created for new features/designs of the section. +- Ensure issues are adequately described and linked as best as possible. +- Ensure issues have a grooming session where other developers can provide their feedback before working on the set of issues. +- Ensure all relevant parties are invited, such as designers, QA, Product Owner, leads, etc., as needed (including the designer who created the feature). +- Ensure there is consensus among the developers working on the section about the decided strategy approach. Ideally, this consensus should be documented. +- Ensure UI quality by organizing designer reviews and guaranteeing pixel perfection. +- Ensure overall implementation is satisfactory based on the predefined requirements. +- Ensure alignment between desktop, web, and mobile versions for the respective section in collaboration with the mobile developers and design team. +- Act as a point of contact for the design team with respect to the section. +- Ensure that someone goes through the designs once they are created with the respective designer. +- Assist the design team with technical feasibility analysis and address any product concerns. +- Facilitate the growth of the next team member into the role. + +The people identified for each sections are as follow: + +- Messaging @flexsurfer, followed by @alwx +- Syncing & Onboarding @siddarthkay +- Communities @ilmotta, followed by @ajayesivan +- Activity Center & Shell @J-Son89, followed by @Parveshdhull +- Wallet (once the vertical team is created) @J-Son89, followed by @briansztamfater + +This will be a rotating post, every 4 months it will go to the next in line. + +The wallet team might have longer times for rotation, as stability might be more important. That's still to be decided. + +# Follow-up Actions + +- Find suitable next in line for Messaging, Onboarding, Communities diff --git a/doc/decisions/UI-related/7-august-2023-paste-button-ux.md b/doc/decisions/UI-related/7-august-2023-paste-button-ux.md new file mode 100644 index 00000000000..122f1f50263 --- /dev/null +++ b/doc/decisions/UI-related/7-august-2023-paste-button-ux.md @@ -0,0 +1,31 @@ +### How should the paste button behave when clipboard is empty? + +This question first came up as a review comment to this PR +https://github.com/status-im/status-mobile/pull/16852 + +There were 2 considerations : +- Either keep the paste button disabled when there is nothing in the clipboard OR +- Always keep the paste button enabled + +There were positives and negatives for both approaches. + +Positives of keeping paste button disabled when there is nothing in clipboard would require us to +check the value of clipboard as soon as the component is mounted (i.e when the user first sees +the screen). In iOS this means a native permissions dialog would appear requesting for permissions +to paste from the clipboard. + +Negatives of this approach is that as soon as any user navigates to this screen they are greeted with +this popup which can be annoying sometimes. + +Positives of keeping paste button always enabled is that we can trigger a request to the clipboard on +tap of the paste button which would trigger the native permissions dialog requesting for permissions +to paste from the clipboard. +In this case seeing this dialog is okay because the user has initiated a paste action. + +Negatives of this approach is that in the event the clipboard is empty the user will still see the +system dialog and on approving nothing will be pasted (because the clipboard was empty). +This behaviour can be confusing. + +On consulting the Design Team via discord it was concluded that out of the two approaches +having the paste button always enabled is a better UX overall. + diff --git a/doc/dependencies.md b/doc/dependencies.md new file mode 100644 index 00000000000..9bb6deee3f7 --- /dev/null +++ b/doc/dependencies.md @@ -0,0 +1,156 @@ +## "@react-native-community/netinfo": "^3.2.1" + +no known issue while updating version + +used to monitor network information (connected, expensive, connection type) + +## "bignumber.js": "git+https://github.com/status-im/bignumber.js.git#v4.0.2-status" + +used to work with big numbers in JS +BN.js (used in web3-utils) doesn't support decimals, though we could work without decimals + +should be replaced by JSBI https://github.com/GoogleChromeLabs/jsbi/blob/master/README.md +see web-utils issue: https://github.com/ethereum/web3.js/issues/2171 + +## "buffer": "^5.4.2" + +required by bignumber.js otherwise there is a compilation error + +## "chance": "^1.1.0" + +used to generate guids and random values in `status-im.utils.random` + +## "emojilib": "^2.4.0" + +used for emojis + +## "eth-phishing-detect": "^1.1.13" + +used to check if URL is known for phishing + +## "hi-base32": "^0.5.0" + +used only in `status-im.browser.core` to convert base58 hash into base32 hash +TODO: could be replaced by a simple implementation of ascii to base32 + +## "i18n-js": "^3.3.0" + +used to manage translations + +## "identicon.js": "git+https://github.com/status-im/identicon.js.git#v1.2.1-status" + +TODO: switch to latest upstream version, fork is seriously outdated and changes have been merged to master long time ago +used to generate identicons + +## "qrcode": "^1.4.1" + +used to generate QR code + +## "react": "16.8.3" + +react library, update based on react-native recommendation + +## "react-dom": "16.4.2" + +react library, update based on react-native recommendation + +## "react-native": "git+https://github.com/status-im/react-native.git#v0.59.10" + +react-native + +TODO: forked because of specific markdown handling, should be bountied to be turned into a library so we can go back to upstream version + +## "react-native-background-timer": "^2.1.1" + +used to have setTimeout and setInterval that don't trigger yellow warning about long timeouts + +## "react-native-camera": "git+https://github.com/status-im/react-native-camera.git#v1.1.5-1-status" + +used to read QR code and take profile picture +TODO: update version, this one doesn't work with Android (done in react-native upgrade branch) + +## "react-native-config": "git+https://github.com/status-im/react-native-config.git#0.11.2-1" + +used to fetch config values from env +TODO: not sure fork usage is justified + +## "react-native-dialogs": "^1.0.5" + +used to show dialogs but only in android in list selection `status-im.ui.components.list-selection`, iOS uses action-sheet +TODO: see if we should actually remove it + +## "react-native-fetch-polyfill": "^1.1.3" + +used to be able to put a timeout on fetch request +TODO: check if the fetch timeout is actually aborting the request or only ignoring the callback on the response, if it +doesn't then this is useless and we are better of using a simple seTimeout + +## "react-native-fs": "^2.14.1" + +used for some filesystem related functions, for instance to get no-backup directory in `status-im.utils.platform` + +## "react-native-gesture-handler": "1.3.0" + +library used by react-navigation +use version recommended by react-navigation + +## "react-native-image-crop-picker": "^0.18.2" + +used for profile picture + +## "react-native-image-resizer": "git+https://github.com/status-im/react-native-image-resizer.git#1.0.##-status" + +used for profile picture + +## "react-native-keychain": "git+https://github.com/status-im/react-native-keychain.git#v.3.0.0-status" + +used for storing password when user saves password +TODO: check if fork is necessary, merge with upstream? + +## "react-native-mail": "git+https://github.com/status-im/react-native-mail.git#v3.0.8_status" + +used to send email to support when phone is shaked + +## "react-native-screens": "1.0.0-alpha.22" + +used by react-navigation + +TODO: update once bug is fixed for Android that causes crash when app is back from background after being put in background with hardware backbutton press + +## "react-native-shake": "^3.3.1" + +used to send email to support when phone is shaked + +## "react-native-lottie-splash-screen": "^1.0.1" + +used to make splash screen with lottie animation during initial loading for android, also used as replacement of "react-native-splash-screen" for iOS + +## "react-native-status-keycard": "^2.5.7" + +used for keycard + +## "react-native-svg": "9.7.1" + +used for svg icons, mostly collectibles are using svg +TODO: updating requires a pod update on iOS + +## "react-native-biometrics": "^3.0.1" + +used for biometric authentication on Android and iOS + +## "react-native-webview": "git+https://github.com/status-im/react-native-webview.git#v8.0.7_3" + +used for browser + +## "react-navigation": "3.11.0" + +used for native navigation +fixed because even bugfix version upgrade causes runtime errors with current version of react-native + +## "react-native-draggable-flatlist": "https://github.com/computerjazz/react-native-draggable-flatlist" + +A drag-and-drop-enabled FlatList component for React Native + +## "react-native-shadow-2": "https://github.com/SrBrahma/react-native-shadow-2" + +A shadow component that is consistent across both platforms diff --git a/doc/fdroid.md b/doc/fdroid.md new file mode 100644 index 00000000000..1a80c8770b0 --- /dev/null +++ b/doc/fdroid.md @@ -0,0 +1,214 @@ +# Description + +This document describes how to update Status APK builds for the [F-Droid](https://f-droid.org/) Android application catalogue. + +# Intro + +In simplest terms F-Droid requires a YAML file that defines the steps necessary to create a universal unsigned APK build. This is achieved by submitting a new app version into the `metadata/im.status.ethereum.yml` file in the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository. + +The app builds defined this way run on servers that generate the unsigned APKs using the [fdroidserver](https://gitlab.com/fdroid/fdroidserver) software. The [server setup](https://f-droid.org/en/docs/Build_Server_Setup/) is quite involved but is not necessary unless you want to run your own instance. Normally the applications defined in `fdroiddata` are built by servers maintained by [the F-Droid volunteers](https://f-droid.org/en/contribute/). + +First release of Status app was merged in [fdroid/fdroiddata#7179](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7179). + +:warning: __WARNING__: Once changes are committed into `fdroiddata` repo they __cannot be changed__. + +# Adding New Versions + +There are two ways - automated and manual - described below. + +## Automated + +The script will analyze a provided APK, update the metadata file based on that information, and commit the change to [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo. The creation of merge request is manual. + +#### Requirements: + +- GitLab account +- Forked copy of the [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo +- Link to the release published + +#### Steps + +1. Use the F-Droid PR update script via `make`: + ```sh + make fdroid-pr APK=StatusIm-Mobile-v1.16.0-ef34af.apk + ``` + The script also accepts a URL. +2. Add a fork repo: + ```sh + git remote add john https://gitlab.com/john/fdroiddata.git + ``` +3. Push: + ```sh + git push john status-im/v1.16.0 + ``` +4. [Create a PR via the GitLab interface.](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) + + +## Manual + +You can find our configuration file at [`metadata/im.status.ethereum.yml`](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.status.ethereum.yml) + +The file defines all the necessary metadata like `SourceCode`, `Website`, or `License`, but the most important key is `Builds`, which looks like this: +```yml +Builds: + - versionName: 1.12.0 + versionCode: 2021022512 + commit: cfb825a11b61d312af8cb5d36686af540c31f481 + sudo: + - cd build/im.status.ethereum + - make fdroid-build-env + init: nix/scripts/setup.sh + output: result/app-release-unsigned.apk + scanignore: + - android/build.gradle + scandelete: + - ios + build: make release-fdroid BUILD_NUMBER=$$VERCODE$$ +``` +It contains a list of objects defining each release of the application. In order to add a new release simply copy a previous release object and adjust the following values: + +* `versionName` - String version like `1.12.0`. +* `versionCode` - Android `versionCode`. Normally it is generated from timestamp at build time. +* `commit` - Specific commit SHA1 from which the given release was built. + +The `versionCode` should be the same as the one in build that was uploaded to Play Store. +It can be found in the build logs or by using: +``` + > make shell TARGET=android + > apkanalyzer manifest version-code StatusIm-Mobile-v1.12.0.apk +2021022512 +``` + +At the bottom of the file you should also update the following keys: + +* `CurrentVersion` - Same as the new `versionName` added +* `CurrentVersionCode` - Same as the `versionCode` added + +Then submit a merge request with `Draft: ` prefix to the [fdroid/fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository. +Prefix is necessary to avoid F-Droid people merging the PR before it's ready. + +:warning: __WARNING__: Currently GitLab PR builds will fail due to running as `root` instead of `vagrant` and failing to install Nix. + +# Checking Builds + +The simplest way to test if the app builds via F-Droid is to use the Docker image: +https://gitlab.com/fdroid/docker-executable-fdroidserver + +Which is available under `registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest`. + +Because we use Nix to build the mobile app we need to slightly modify the image with this `Dockerfile`: +```Dockerfile +FROM registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest +ARG BUILDER_UID=1000 +ENV BUILDER_USER=vagrant +RUN useradd -u $BUILDER_UID $BUILDER_USER +RUN mkdir -m 0755 /nix /home/$BUILDER_USER \ + && chown -R $BUILDER_USER /nix /home/$BUILDER_USER +``` +Build it using: +``` +docker build --build-arg=BUILDER_UID=$UID -t statusteam/docker-executable-fdroidserver:latest . +``` +Then clone the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) and [fdroidserver](https://gitlab.com/fdroid/fdroidserver) repos and use it to test the build of a specific Status Android app version: `1.12.0` +``` +git clone https://gitlab.com/fdroid/fdroidserver +git clone https://gitlab.com/fdroid/fdroiddata +docker run --rm \ + -u $UID:$GID -e USER=vagrant \ + -v $PWD/fdroiddata:/repo \ + -v $PWD/fdroidserver:/fdroidserver \ + statusteam/docker-executable-fdroidserver:latest \ + build im.status.ethereum +``` +We have to create a user and specify the UID because Nix cannot run as `root` and that is the default user for the F-Droid Docker image. By adding our own user and setting the UID we also make it possible to mount folders like `fdroiddata` and `fdroidserver`. + +You can specify a `--verbose` flag for `build` command for additional information. +You can provide `--storage-opt size=30G` flag if Docker complains about running out of space. + +You should also run `lint` and `rewritemeta` for the App ID to verify and fix the YAML metadata formatting. + +# Scanning Builds Locally + +Based on the documentation provided here: https://gitlab.com/fdroid/wiki/-/wikis/Tips-for-fdroiddata-contributors/Setting-up-app-submission-development-environment-locally + +We can locally scan our source code and pre-built APKS by using the FDroid CLI tool. We can prepare a FDroid environment by +following [the steps mentioned in these instructions](https://gitlab.com/fdroid/wiki/-/wikis/Tips-for-fdroiddata-contributors/Setting-up-app-submission-development-environment-locally). + * Note, at the time of writing (March 2025), the easiest way to follow these instructions involved: + * Creating a new empty directory outside of the status-mobile repository. + * For this example, let's refer to this directory as `status-fdroid-server` + * Then git cloning the two referenced git repos inside the `status-fdroid-server` directory: + ```shell + git clone https://gitlab.com/fdroid/fdroiddata.git --depth=1 + git clone https://gitlab.com/fdroid/fdroidserver.git --depth=1 + ``` + * Then create a subdirectory inside `status-fdroid-server` named `apks` + * Then create a subdirectory inside `status-fdroid-server` named `scripts` + * Create a file inside the `scripts` folder named `env.sh` + ```shell + source /etc/profile.d/bsenv.sh + export GRADLE_USER_HOME=$home_vagrant/.gradle + export fdroid="sudo --preserve-env --user vagrant + env PATH=$fdroidserver:$PATH + env PYTHONPATH=$fdroidserver:$fdroidserver/examples + env PYTHONUNBUFFERED=true + env TERM=$TERM + env HOME=$home_vagrant + fdroid" + + export build=im.status.ethereum + ``` + * Create a file inside the `scripts` folder named `prep.sh` + ```shell + apt-get update && apt-get install -y make xz-utils + ``` + * Create a file inside the `scripts` folder named `run.sh` + ```shell + docker run --rm -i -t --privileged --pid=host --entrypoint "/bin/bash" \ + -v ${ANDROID_SDK_ROOT}:/opt/android-sdk:Z \ + -v $(pwd)/fdroidserver:/home/vagrant/fdroidserver:Z \ + -v $(pwd)/scripts:/scripts:z \ + -v $(pwd)/fdroiddata:/build:z \ + -v $(pwd)/apks:/apks:z \ + registry.gitlab.com/fdroid/fdroidserver:buildserver + ``` + * Create a file inside the `scripts` folder named `latest-version-code.sh` + ```shell + prefix="versionCode: " + resultLine=$(grep $prefix ./metadata/$build.yml | tail -n 1) + echo $resultLine | sed -e "s/^$prefix//" + ``` + * Then inside a terminal shell run the following command: + * `env ANDROID_SDK_ROOT= sh scripts/run.sh` + * Ensure you replace `` with the path to Android SDK folder. + * On macOS, the value could be: `$HOME/Library/Android/sdk` + * Once inside the Docker shell environment run the following commands: + * `sh /scripts/prep.sh` + * This command should install `xz` utils packages for installing the Nix package manager. + * `source /scripts/env.sh` + * This command should populate the Docker shell environment with the `$fdroid` command. + * Next we can run `cd /build` to enter the `fdroiddata` directory that has been mounted inside the docker environment. + * And now we can run `$fdroid scanner $build:$(sh /scripts/latest-version-code.sh)` to scan the latest version of the status app that has been registered in the `fdroiddata/metadata/im.status.ethereum.yml` file. + * Alternatively, we can also copy an APK into the `apks` folder and run `$fdroid scanner /apks/`. + * Ensure that you replace the `` with the correct name of the pre-built APK. + * For example, after running `make release-fdroid`, you can copy the `app-arm64-v8a-release-unsigned.apk` file into the `apks` folder and run `$fdroid scanner /apks/app-arm64-v8arelease-unsigned.apk` inside the docker shell environment. + +# Details + +The original research was done in [#8512](https://github.com/status-im/status-mobile/issues/8512). + +Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-fdroid` ourselves in `build` step. We also add `android/build.gradle` to `scanignore` to avoid F-Droid trying to use Gradle directly. + +The Android metadata like description or screenshots is [loaded from our repository](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#fastlane-structure) based on the Fastlane [`supply`](https://docs.fastlane.tools/actions/supply/) tool folder structure for updating Google Play store metadata. + +Once the PR is merged it may take a few days for the F-Droid server farm to build and deploy the new version to their site and app. You can look up the current state of builds [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) and look for your App ID and a `deploy` change after it. + +# F-Droid Build + +F-Droid requires submitted applications to be free of non Open Source software. For this reason we need to exclude certain Google libraries at build time. + +This is achieved by setting `GOOGLE_FREE=1` in the `.env.release` file. This affects two things: + +1. [Clojure code conditional](../src/status_im/acquisition/core.cljs) which stops use of `get-referrer`. +2. [Gradle build configuration](../android/app/build.gradle) by excluding Google libraries. + +Both are affected by the `.env` file and both are required. diff --git a/doc/files/forging-code-with-schemas-sep-2023-slides.pdf b/doc/files/forging-code-with-schemas-sep-2023-slides.pdf new file mode 100644 index 00000000000..7d8f65c7f22 Binary files /dev/null and b/doc/files/forging-code-with-schemas-sep-2023-slides.pdf differ diff --git a/doc/how-to-catch-crash-on-ios.md b/doc/how-to-catch-crash-on-ios.md new file mode 100644 index 00000000000..336ec2904f1 --- /dev/null +++ b/doc/how-to-catch-crash-on-ios.md @@ -0,0 +1,40 @@ +# How to catch crash on ios use xcode + +## Overview +Sometimes, we can't reproduce crash with local dev build, probably because your built version differs from the one QA team used. +The QA team mostly used the PR build version. In this guide we will try to make a build as close as possible to the PR build for iOS. + +You may notice various configuration files starting with .env (such as .env, .env.e2e, .env.jenkins) in the project. +The usage of these files and environment variables injected at build time on CI will not be covered in this guide. + +This guide covers how to configure Xcode to capture a crash stack trace with a physical iOS device. This allows debugging crashes by inspecting the stack trace. +I will use [issue #17255](https://github.com/status-im/status-mobile/issues/17255) as an example to reproduce and analyze a crash. + +## Prerequisites +- A physical ios device (simulator is not considered in this doc) +- Xcode installed + +## Steps +1. Prepare Status Mobile + 1. Open Terminal, cd to project root + 2. Run `make run-clojure` in one tab + 3. Run `make run-metro` in a second tab + 4. Run `make pod-install` in a third tab +2. Configure Xcode Project + 1. Open Xcode + 2. Open a project or file, navigate to folder `path_to_root_directory_of_status_mobile/ios` + 3. Set Scheme `StatusImPR` as current scheme ![](images/how-to-catch-crash-on-ios/choose-scheme-StatusImPR.png) + 4. Edit scheme ![](images/how-to-catch-crash-on-ios/edit-scheme.png) + 5. Change `Info` ![](images/how-to-catch-crash-on-ios/config-release.png) + 6. Change `Diagnostics` ![](images/how-to-catch-crash-on-ios/change-diagnostics.png) + 7. Set automatically manage signing ![](images/how-to-catch-crash-on-ios/automatically-manage-signing.png) +3. Update Code + 1. Edit `src/status_im2/setup/dev.cljs`, comment out lines 47-52 ![](images/how-to-catch-crash-on-ios/edit-dev.png) + 2. Edit `shadow-cljs.edn`, comment out `re-frisk-remote.preload`, otherwise it will try to connect `localhost:4567` on physical device which could slow down performance ![](images/how-to-catch-crash-on-ios/edit-shadow-cljs.png) +4. Reproduce Crash And Analyze + 1. Choose your physical ios device as target device and Run + 2. Follow reproduce steps from [issue #17255](https://github.com/status-im/status-mobile/issues/17255) mentioned and xcode will halt at crash point ![](images/how-to-catch-crash-on-ios/located-stack-trace.png) + 3. Inspect stack trace to identify root cause. From the stack trace, we can locate the crash happened in `api/geth_backend.go:1048`(createTempDBFile) clearly! ![](images/how-to-catch-crash-on-ios/located-go-code.png) + +## Links +- [changes](https://github.com/status-im/status-mobile/commit/4306d419de15e737e8ded3a749cc5e8d6a06e627) to source code diff --git a/doc/ide-setup.md b/doc/ide-setup.md new file mode 100644 index 00000000000..aa400509d7c --- /dev/null +++ b/doc/ide-setup.md @@ -0,0 +1,226 @@ +# Setup your Editor/IDE + +You can use any Clojure enabled editor. Here are instructions for developing the status-mobile app using: + +* IntelliJ IDEA and Cursive +* VS Code and Calva +* Emacs/Cider + +(Please add instructions for your favorite editor.) + +## Table of Contents + +- [Using Cursive](#using-cursive) + - [Install Cursive](#install-cursive) + - [Getting Cursive to understand `status-mobile`](#getting-cursive-to-understand-status-mobile) + - [I get a lot of `cannot be resolved`](#i-get-a-lot-of-cannot-be-resolved) + - [REPL!](#repl) + - [Connecting to REPL to IntelliJ](#connecting-to-repl-to-intellij) + - [Connecting REPL and IntelliJ to `status-mobile`](#connecting-repl-and-intellij-to-status-mobile) +- [Visual Studio Code](#visual-studio-code) + - [Set up the REPL](#set-up-the-repl) + - [Auto-format files on save](#auto-format-files-on-save) +- [Using Emacs with CIDER](#using-emacs-with-cider) + +## Using Cursive + +### Install Cursive + +See https://cursive-ide.com/userguide/index.html + +### Getting Cursive to understand `status-mobile` + +- Add this file to the root of the `status-mobile` project dir + - https://gist.github.com/Samyoul/f71a0593ba7a12d24dd0d5ef986ebbec +- Right click and "add as leiningen project" + + + +## I get a lot of `cannot be resolved` + +Are you getting problems where you get a lot of `cannot be resolved` on everything? + + + +See https://cursive-ide.com/userguide/macros.html + +- opt+enter (on macOS) +- resolve defview as fn and letsubs as let +- move selection on resolve and hit enter +- and select defn for defview and let for letsubs + +### REPL! + +#### Connecting to REPL to IntelliJ + +I had a number of problems connecting to REPL, the solution is as follows: + +At the top of IntelliJ IDEA click on the `Add Configuration...` option: + + + +This will load the following menu: + + + +Click on the `+` icon in the top left corner of the menu. + +Select `Clojure REPL > Remote` + + + +Which will load the following menu + + + +Enter the below options: + +- Name = status-mobile +- Display Name = status-mobile +- Connection type = nREPL +- Connection details + - Host = 127.0.0.1 + - Port = 7888 + + + +Press `OK` + +Now the below option will be visible. +Press the green run button + + + +You should now see a dialog with the following message: + +```shell +Connecting to remote nREPL server... +Clojure 1.10.1 +``` + +To confirm you have a working connection with REPL enter the following command in the input box below the output: + +```shell +(prn 1) +``` + +Which should output + +```shell +(prn 1) +1 +=> nil +``` + +See below: + + + +#### Connecting REPL and IntelliJ to `status-mobile` + +**The important next step is telling REPL the context in which to interact with the code.** + +Do the following: + +Ensure you have 2 terminals running the following + +- `make run-clojure` +- `make run-ios` / `make run-android` + +[See the STARTING GUIDE for details](STARTING_GUIDE.md#development) + +Next go back to the REPL input and enter the following commands: + +```clojure +(shadow/watch :mobile) +(shadow/repl :mobile) +``` + +See Below + + + +Which should switch the clj file type target to cljs as shown above + +Finally you are ready to test REPL. + +Create a sample function to evaluate something simple like `(prn "I'm working")`, move your cursor to one of the outer parentheses. Right or `control` click and select the `REPL` option. From there select `Sync files in REPL` and then `Send '...' to REPL'`. + + + +Alternatively you can use the shortcut commands `⇧⌘M` to sync your files and `⇧⌘P` to send the statement to REPL. You may also need to switch the REPL namespace to match the current file, which can be done manually from the dialogue box or using the `⇧⌘N` shortcut key. + +Following the above should give you the below result: + + + +🎉 Tada! Working! 🎉 + +--- + +For additional details on issues you may face when setting up REPL with Cursive [see this document](https://notes.status.im/9Gr7kqF8SzC_SmYK0eB7uQ?view#Connecting-Cursive--IntelliJ-IDEA-to-REPL-Problems) + +## Visual Studio Code + +### Set up the REPL + +1. Install Calva extension. +2. Open the `status-mobile` folder. +3. Start [Status development](starting-guide.md#development) (Starting the + `run-clojure` and `run-metro` jobs in split view in the VS Code integrated + terminal works great). +4. Run the VS Code command: **Calva: Connect to a running REPL Server in the + project**. + - Select the project type `shadow-cljs`. + - Accept the suggested connection `host:port`. + - Select to connect to the `:mobile` build. + +Open any `.cljs` file in the project and evaluate forms in it. See +https://calva.io/try-first/ for some starter tips and links. Confirm that your +REPL is connected to the app by evaluating: + +```clojure +(js/alert "Hello from Status App!") +``` + +🎉 Tada! You are ready to use the REPL to improve Status.im! 🎉 + +Consider bookmarking [calva.io](https://calva.io/) for quick access to the Calva +documentation. + +### Auto-format files on save + +We format Clojure code with [zprint](https://github.com/kkinnear/zprint). We +recommend configuring VSCode to auto-format Clojure files on every save, +otherwise you'll need to constantly rely on the much slower `make lint-fix` +command. + +1. Create a file `~/.zprintrc` and enable the `:search-config?` option. This is + necessary so the VSCode extension finds the project's `.zprintrc`. + +```bash +echo "{:search-config? true}" > ~/.zprintrc +``` + +2. Install the extension + [vscode-clj-zprint](https://github.com/rflagreca/vscode-clj-zprint). By the + way, did you know this extension is written in ClojureScript? +3. Copy the recommended settings from our repository in + [.vscode/settings.example.json](/.vscode/settings.example.json) and merge it + with your workspace settings in `.vscode/settings.json`. + +The extension `vscode-clj-zprint` is only available for VSCode. If you are using +VSCodium, you'll need to build the `vsix` (extension) yourself (it's easy, only +`yarn` and `vsce` are required). + +## Using Emacs with CIDER + +1. Install Emacs/Cider/etc. (there is a lot of variability in how to manage things in emacs, so please google for help with this) +2. Add a local ~/.shadow-cljs/config.edn file like below (corresponding to the version numbers of the packages you are using): + +```clojure +{:dependencies + [[nrepl/nrepl "0.9.0"] + [cider/cider-nrepl "0.28.4"] + [cider/piggieback "0.5.2"]]} +``` diff --git a/doc/images/architecture.png b/doc/images/architecture.png new file mode 100644 index 00000000000..2cc86240d5d Binary files /dev/null and b/doc/images/architecture.png differ diff --git a/doc/images/debugging/geth-path.png b/doc/images/debugging/geth-path.png new file mode 100644 index 00000000000..0fa34ec11f0 Binary files /dev/null and b/doc/images/debugging/geth-path.png differ diff --git a/doc/images/debugging/log-settings.png b/doc/images/debugging/log-settings.png new file mode 100644 index 00000000000..8821d8c218c Binary files /dev/null and b/doc/images/debugging/log-settings.png differ diff --git a/doc/images/debugging/re-frisk.png b/doc/images/debugging/re-frisk.png new file mode 100644 index 00000000000..a34a100728b Binary files /dev/null and b/doc/images/debugging/re-frisk.png differ diff --git a/doc/images/debugging/share-logs.jpeg b/doc/images/debugging/share-logs.jpeg new file mode 100644 index 00000000000..b56d3579b12 Binary files /dev/null and b/doc/images/debugging/share-logs.jpeg differ diff --git a/export-icons.gif b/doc/images/export-icons/export-icons.gif similarity index 100% rename from export-icons.gif rename to doc/images/export-icons/export-icons.gif diff --git a/doc/images/figma-properties.png b/doc/images/figma-properties.png new file mode 100644 index 00000000000..50fc9ca1ffe Binary files /dev/null and b/doc/images/figma-properties.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/automatically-manage-signing.png b/doc/images/how-to-catch-crash-on-ios/automatically-manage-signing.png new file mode 100644 index 00000000000..fba99af587c Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/automatically-manage-signing.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/change-diagnostics.png b/doc/images/how-to-catch-crash-on-ios/change-diagnostics.png new file mode 100644 index 00000000000..38120cff49f Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/change-diagnostics.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/choose-scheme-StatusImPR.png b/doc/images/how-to-catch-crash-on-ios/choose-scheme-StatusImPR.png new file mode 100644 index 00000000000..f7f99b44679 Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/choose-scheme-StatusImPR.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/config-release.png b/doc/images/how-to-catch-crash-on-ios/config-release.png new file mode 100644 index 00000000000..355cdeb15ba Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/config-release.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/edit-dev.png b/doc/images/how-to-catch-crash-on-ios/edit-dev.png new file mode 100644 index 00000000000..ee06ba0a89b Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/edit-dev.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/edit-scheme.png b/doc/images/how-to-catch-crash-on-ios/edit-scheme.png new file mode 100644 index 00000000000..8ec6096a4e1 Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/edit-scheme.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/edit-shadow-cljs.png b/doc/images/how-to-catch-crash-on-ios/edit-shadow-cljs.png new file mode 100644 index 00000000000..4704d3d395c Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/edit-shadow-cljs.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/located-go-code.png b/doc/images/how-to-catch-crash-on-ios/located-go-code.png new file mode 100644 index 00000000000..b8138ce8f0a Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/located-go-code.png differ diff --git a/doc/images/how-to-catch-crash-on-ios/located-stack-trace.png b/doc/images/how-to-catch-crash-on-ios/located-stack-trace.png new file mode 100644 index 00000000000..c0b06d15d8d Binary files /dev/null and b/doc/images/how-to-catch-crash-on-ios/located-stack-trace.png differ diff --git a/doc/images/how-to-launch-e2e/how-to-launch-e2e-1.png b/doc/images/how-to-launch-e2e/how-to-launch-e2e-1.png new file mode 100644 index 00000000000..13bd065b646 Binary files /dev/null and b/doc/images/how-to-launch-e2e/how-to-launch-e2e-1.png differ diff --git a/doc/images/how-to-launch-e2e/how-to-launch-e2e-2.png b/doc/images/how-to-launch-e2e/how-to-launch-e2e-2.png new file mode 100644 index 00000000000..bdde50b4fee Binary files /dev/null and b/doc/images/how-to-launch-e2e/how-to-launch-e2e-2.png differ diff --git a/doc/images/how-to-launch-e2e/how-to-launch-e2e-3.png b/doc/images/how-to-launch-e2e/how-to-launch-e2e-3.png new file mode 100644 index 00000000000..04acac2f9a4 Binary files /dev/null and b/doc/images/how-to-launch-e2e/how-to-launch-e2e-3.png differ diff --git a/doc/images/how-to-launch-e2e/how-to-launch-e2e-4.png b/doc/images/how-to-launch-e2e/how-to-launch-e2e-4.png new file mode 100644 index 00000000000..775364ab787 Binary files /dev/null and b/doc/images/how-to-launch-e2e/how-to-launch-e2e-4.png differ diff --git a/doc/images/ide-setup/10_REPL_8.png b/doc/images/ide-setup/10_REPL_8.png new file mode 100644 index 00000000000..cddbb129fc5 Binary files /dev/null and b/doc/images/ide-setup/10_REPL_8.png differ diff --git a/doc/images/ide-setup/11_REPL_9.png b/doc/images/ide-setup/11_REPL_9.png new file mode 100644 index 00000000000..6237894d5a5 Binary files /dev/null and b/doc/images/ide-setup/11_REPL_9.png differ diff --git a/doc/images/ide-setup/12_REPL_10.png b/doc/images/ide-setup/12_REPL_10.png new file mode 100644 index 00000000000..1b2b56d2d8c Binary files /dev/null and b/doc/images/ide-setup/12_REPL_10.png differ diff --git a/doc/images/ide-setup/1_fake_project_file.png b/doc/images/ide-setup/1_fake_project_file.png new file mode 100644 index 00000000000..e96e9b9c9f1 Binary files /dev/null and b/doc/images/ide-setup/1_fake_project_file.png differ diff --git a/doc/images/ide-setup/2_resolve.jpeg b/doc/images/ide-setup/2_resolve.jpeg new file mode 100644 index 00000000000..a6a79891225 Binary files /dev/null and b/doc/images/ide-setup/2_resolve.jpeg differ diff --git a/doc/images/ide-setup/3_REPL_1.png b/doc/images/ide-setup/3_REPL_1.png new file mode 100644 index 00000000000..585f3ddb7e9 Binary files /dev/null and b/doc/images/ide-setup/3_REPL_1.png differ diff --git a/doc/images/ide-setup/4_REPL_2.png b/doc/images/ide-setup/4_REPL_2.png new file mode 100644 index 00000000000..1cbd4bb81cb Binary files /dev/null and b/doc/images/ide-setup/4_REPL_2.png differ diff --git a/doc/images/ide-setup/5_REPL_3.png b/doc/images/ide-setup/5_REPL_3.png new file mode 100644 index 00000000000..94b60c1bf13 Binary files /dev/null and b/doc/images/ide-setup/5_REPL_3.png differ diff --git a/doc/images/ide-setup/6_REPL_4.png b/doc/images/ide-setup/6_REPL_4.png new file mode 100644 index 00000000000..4ffd02c3264 Binary files /dev/null and b/doc/images/ide-setup/6_REPL_4.png differ diff --git a/doc/images/ide-setup/7_REPL_5.png b/doc/images/ide-setup/7_REPL_5.png new file mode 100644 index 00000000000..5ede5f14c34 Binary files /dev/null and b/doc/images/ide-setup/7_REPL_5.png differ diff --git a/doc/images/ide-setup/8_REPL_6.png b/doc/images/ide-setup/8_REPL_6.png new file mode 100644 index 00000000000..979d47f7f80 Binary files /dev/null and b/doc/images/ide-setup/8_REPL_6.png differ diff --git a/doc/images/ide-setup/9_REPL_7.png b/doc/images/ide-setup/9_REPL_7.png new file mode 100644 index 00000000000..6f5669b45ee Binary files /dev/null and b/doc/images/ide-setup/9_REPL_7.png differ diff --git a/doc/images/layers-relationships.png b/doc/images/layers-relationships.png new file mode 100644 index 00000000000..abc7763716e Binary files /dev/null and b/doc/images/layers-relationships.png differ diff --git a/doc/images/pipeline-process/automation-checks.png b/doc/images/pipeline-process/automation-checks.png new file mode 100644 index 00000000000..cf88b43608c Binary files /dev/null and b/doc/images/pipeline-process/automation-checks.png differ diff --git a/doc/images/pixel-perfection/layer-width.png b/doc/images/pixel-perfection/layer-width.png new file mode 100644 index 00000000000..bebba1e2739 Binary files /dev/null and b/doc/images/pixel-perfection/layer-width.png differ diff --git a/doc/images/quo-component.png b/doc/images/quo-component.png new file mode 100644 index 00000000000..048b077766a Binary files /dev/null and b/doc/images/quo-component.png differ diff --git a/doc/import-assets.md b/doc/import-assets.md new file mode 100644 index 00000000000..66ad0c3cd6e --- /dev/null +++ b/doc/import-assets.md @@ -0,0 +1,23 @@ +# Importing assets from Figma into project + +## Icons + +![](images/export-icons/export-icons.gif) + +1. Export from figma 2 pngs 2x and 3x put them in `./resources/images/icons2` +2. if necessary, rename file so that filename contains only lower case chars, e.g. `"Icon-Name@2x.png"` should be renamed to `"icon_name@2x.png"`. +3. In the app `icon_name.png` still can be accessed as `icon-name`, so in order to use can add the next code: + ```clojure + ;; icon_name.png + [vector-icons/icon :icon-name {:color ...}] + ``` + 2x@2x +4. If you want platform specific icon use `.android` or `.ios` suffixes. Example `icon_name@2x.android.png`.:w + +## Images + +Make sure to compress images before using into project. +``` +make shell +./scripts/compress_image.sh image_path +``` diff --git a/doc/logging-and-sharing-flow.md b/doc/logging-and-sharing-flow.md new file mode 100644 index 00000000000..a95403b8b7c --- /dev/null +++ b/doc/logging-and-sharing-flow.md @@ -0,0 +1,45 @@ +# Status App Logging and Sharing Flow + +## Overview +The Status app maintains four log files to track different aspects of its operation. This document outlines the purpose of each log file, their configuration, storage, and the process for sharing logs. + +## Log Files + +- **api.log** + Records interactions between the frontend and the backend(status-go). + +- **pre-login.log** + Captures logs generated before user login. + +- **Status.log** + Stores logs output by the frontend. + +- **Profile log** + Dynamically named log file that records user-specific logs after successful login. The log file name is generated based on the user's keyUID which is truncated to 8 characters. Each user profile has its own log file. + +## Log Level Configuration + +### pre-login.log +- **Setting Method:** Shake the phone before login to open a dialog box. +- **Options:** Includes a log level setting option (e.g., DEBUG, INFO). +- **Behavior:** The log level setting is only available pre-login. After login, shaking the phone does not display this option. +- **Impact:** The configured log level is inherited by the Profile log for newly created users. + +### Profile Log +- **Setting Method:** Can be configured after user login through app advanced settings. +- **Note:** Inherits the log level from pre-login.log for new users. + +## Log File Storage +- **Default Behavior:** All log files are stored in a protected folder named "logs" within the app to ensure privacy and security. +- **Exception:** On Android e2e build, logs are stored in the publicly accessible Download folder. + +## Log setting storage +- pre-login setting is stored with [mmkv](https://github.com/mrousavy/react-native-mmkv), we have some pre-configured values for log level in files `.env.xxx` e.g `.env` / `.env.e2e` , corresponding field name is `LOG_LEVEL` +- profile log setting is stored in db with status-go + +## Log Sharing +- **Method:** + - Shake the phone to open a dialog box. + - Select the "Share logs" option from the menu. +- **Note:** Be careful when sharing logs with others, as it may leak sensitive information. + diff --git a/doc/merging-pr-process.md b/doc/merging-pr-process.md new file mode 100644 index 00000000000..96f75e1500d --- /dev/null +++ b/doc/merging-pr-process.md @@ -0,0 +1,51 @@ +## PR process + +1) Create a PR in status-mobile +2) Add some reviewers to the PR and wait for feedback +3) Address feedback +4) Make sure builds and tests are green (run `make test` locally, `make lint-fix` to fix any indentation issue and `make lint`) +5) Once the PR has been reviewed by the dev team, run e2e tests on it by going to https://github.com/status-im/status-mobile/projects/7 and move the pr under the column E2E tests. This will trigger tests. **Running E2E tests is required for all PRs.** + 1) Read our [PR Review Policy](pr-review-policy.md) for more details on our approach to PR reviews. + 2) Learn more about our [Pipeline for QA](pipeline_process.md) process +6) Once e2e tests have run, they will report the result on the PR, if it's less than 100%, ask QA to take a look to make sure everything is in order (some might fail for legitimate reasons) +7) Ask QA for manual testing if the PR requires it (more details [here](pipeline_process.md)) +8) Once it has been tested successfully, squash everything into one commit. rebase and merge. The commands we use: +``` + git checkout develop + git pull develop + git checkout your-feature-branch + git rebase develop + git checkout develop + git rebase your-feature-branch + git push +``` + + +## Status-go changes + +If you are introducing status-go changes, the PR process is pretty similar, with some differences. + +The most important thing is that + +status-mobile code that makes it to the `develop` branch, should always point to a tagged version of status-go in the `develop` branch of status-go. + +In practice, this means that sometimes they need to be merged in lockstep. +1) Create a PR in status-go and status-mobile. Update the status-go version to the PR revision `scripts/update-status-go.sh $git_revision`. +2) Get both PRs reviewed and approved. Once status-mobile PR has been approved, go through manual QA testing if necessary. Don't merge status-mobile PR just yet. +3) Now that you know the integration between client & server is working, merge the status-go PR first. +4) Once merged, tag the merged commit with the new version and push the tag: +``` + git checkout develop + git pull develop + make tag-version + git push origin vx.y.z +``` +:warning: If a specific commit need to tagged in status-go, use `make tag-version TARGET_COMMIT={hash}`. More info about tagging in [status-go](https://github.com/status-im/status-go/blob/develop/RELEASING.md#tagging-versions). + +5) Update status-mobile with the new status-go version, using the new tag `scripts/update-status-go.sh "vx.y.z"` +6) If you had to rebase status-go to include new changes, e2e test MUST be re-run. If there's any issue you will + have to fix in status-go with another PR and follow the same process. +7) In status-mobile, push, rebase against `develop` and merge it 🚀 + + +important note : make sure your status-go PRs get a tested-ok by QA before merging them in. diff --git a/doc/new-guidelines.md b/doc/new-guidelines.md new file mode 100644 index 00000000000..93c1a20c5ed --- /dev/null +++ b/doc/new-guidelines.md @@ -0,0 +1,958 @@ +# Code Style Guidelines + +> [!IMPORTANT] +> The goal of this document is to help all contributors (core and external) to +> write code in _unison_ and help establish good practices that serve the Status +> Mobile contributors well. + +We don't want to turn this document into an exhaustive list of rules to be +followed that nobody will read. As much as possible, we'll try to document only +what we consider important for Status Mobile. In other words, we don't want to +maintain a general Clojure convention/style guide, nor do we want to turn this +document into a long tutorial. + +> [!WARNING] +> This is a **work in progress**, and not all conventions are properly +> implemented in the codebase yet. The project structure is also undergoing +> major changes, and it will take a considerable amount of time until we migrate +> the existing code to the new structure. + +If you find out anything is outdated or missing, please, share with us or even +better, create a pull-request! 🤸 + +## Style guide + +We follow the [Clojure Style +Guide](https://github.com/bbatsov/clojure-style-guide) and we use +[zprint](https://github.com/kkinnear/zprint) to format Clojure code. Running +`make lint-fix` should fix most formatting issues, but not all of them. + +## Dos and don'ts + +### Hiccup + +Never use anonymous inline function in hiccup, this will lead to +reinitialization of component on each render of parent component. + +```clojure +;; bad +(defn checkbox-view + [{:keys [size]}] + [rn/view + [(fn [] [rn/view])]]) + +;; good +(defn comp [] + [rn/view]) + +(defn checkbox-view + [{:keys [size]}] + [rn/view + [comp]]) +``` + +This mistake mostly happens with functional components. + +```clojure +;; bad +(fn [] + (let [atom (rf/sub [:sub])] + (fn [] + [:f> + (fn [] + [rn/text atom] + +;; good +(defn f-comp [atom] + [rn/text atom]) + +(fn [] + (let [atom (rf/sub [:sub])] + (fn [] + [:f> f-comp atom]))) +``` + +It's important to name functional components with `f-` prefix. + +### Component props and API scheme to match Figma as closely as possible + +Ideally, the prop names for components (particularly in quo Design System) +should match the Figma properties as best as possible. This makes it easier for +the developer using that component to configure it correctly for the screen it +is being used on and avoids unnecessary overwrites and adjustments being made. + +#### Avoid unnecessarily grouping categories to reduce the number of props + +For example in Figma if there is a component and it has the following variants: + +|theme: "light" blur: "False"|theme: "dark" blur: "False"|theme: "light" blur: "True"|theme: "dark" blur: "True"| +|----------------------------|---------------------------|---------------------------|---------------------------| +| type :neutral label "ABC" | type :neutral label "ABC" | | | +| type :active label "ABC" | type :active label "ABC" | | | +| type :danger label "ABC" | type :danger label "ABC" | type :danger label "ABC" | type :danger label "ABC" | + +```clojure +;; bad +"theme - :light or :dark +type - can be :neutral :active :danger :danger-blur" +(defn my-component [{:keys [theme type]} label]) + +;; good +"theme - :light or :dark + type - can be :neutral :active :danger + blur? - boolean +" +(defn my-component [{:keys [theme blur? type]} label]) +``` + +Please note this is only for the external API of the component and there should +be no restriction of how the component manages its internal API as that will not +affect the developer using the component with the issues described above. + +In some cases this is not always possible or does not make sense. However the +thought process should be how easy will it be for another developer to use this +component with the correct configuration given the screen designs for Figma. + +#### Avoid unnecessarily renaming props + +In general it can be helpful to avoid renaming props from their counterpart in +Figma. + +For example if Figma has sizes `:small`, `:medium` and `:large` + +```clojure +;; bad +":size - :little, :default or :big" +(defn my-component [{:keys [size]}]) + +;; good +":size - :small, :medium or :large" +(defn my-component [{:keys [size]}]) +``` + +### Component styles + +Prefer to define styles in a separate file named `style.cljs`, colocated with +the source file. For a real example, see +[src/quo/components/record_audio/record_audio/style.cljs](../src/quo/components/record_audio/record_audio/style.cljs). + +```clojure +;; bad +(defn checkbox-view + [{:keys [size]}] + [rn/view + {:style {:width size + :height size + :border-radius 4 + :justify-content :center + :align-items :center}} + [rn/view (do-something)]]) + +;; good +(defn checkbox-view + [{:keys [size]}] + [rn/view {:style (style/checkbox size)} + [rn/view (do-something)]]) +``` + +### Always add styles inside the `:style` key + +Although when compiling ReactNative for mobile some components are able work with +their styles in the top-level of the properties map, prefer to add them inside the +`:style` key in order to separate styles from properties: + +```clojure +;; bad +[rn/button {:flex 1 + :padding-vertical 10 + :padding-horizontal 20 + :on-press #(js/alert "Hi!") + :title "Button"}] + +;; good +[rn/button {:style {:flex 1 + :padding-vertical 10 + :padding-horizontal 20} + :on-press #(js/alert "Hi!") + :title "Button"}] + +;; better +;; (define them in a style ns & place them inside `:style` key) +[rn/button {:style (style/button) + :on-press #(js/alert "Hi!") + :title "Button"}] +``` + +Also its fine to keep one liner styles in view + +```clojure +;; ok +[rn/view {:style {:flex 1 :padding-top 5}}] +``` + +### Abstract styles and use the vector syntax + +We modified reagent to support passing styles in the [React Native way](https://reactnative.dev/docs/0.73/style): +by using Clojure vectors (arrays in JS). + +```clojure +;; ...style.cljs +(def absolute-position + {:position :absolute + :top 0 + :left 0 + :right 0 + :bottom 0}) + +(defn padding [amount] + {:background-color :red + :padding amount}) + +;; ...view.cljs + +;; bad +[rn/view {:style style/absolute-position} + [rn/view {:style (merge style/absolute-position ;; <- merge is not performant + (style/padding 20))}]] + +;; good +[rn/view {:style style/absolute-position} + [rn/view {:style [style/absolute-position ;; <- vector syntax, RN merges the styles + (style/padding 20)]}]] + +;; better +;; Reference an already existing JS obj with the required styles, by doing this, Reagent +;; skips the transformation of styles and uses the obj directly. +[rn/view {:style rn/stylesheet-absolute-fill} ;; <- Already provided by RN, used directly + [rn/view {:style [rn/stylesheet-absolute-fill ;; <- Reagent skips this transformation + (style/padding 20)]}]] ;; <- Reagent transforms this map +``` + +### Don't define properties in styles ns + +Properties must be set on view level + +```clojure +;; bad +{:style {:position :absolute + :left 0 + :right 0 + :bottom 0} + :blur-amount 30 + :blur-radius 25 + :blur-type :transparent + :overlay-color :transparent} + +;; good +{:position :absolute + :left 0 + :right 0 + :bottom 0} +``` + +### Animated styles in the style file + +```clojure +;; bad +(defn circle + [] + (let [opacity (reanimated/use-shared-value 1)] + [reanimated/view {:style [{:opacity opacity} + style/circle-container]}])) + +;; good +(defn circle + [] + (let [opacity (reanimated/use-shared-value 1)] + [reanimated/view {:style (style/circle-container opacity)}])) +``` + +### Pass a vector of styles to Reanimated view + +Prefer to pass a vector of styles to `react-native.reanimated/view` `:style` +prop instead of using `apply-animations-to-style` directly. For more details, check out Reanimated docs about [inline +styles](https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/your-first-animation/#defining-a-shared-value) +and [useAnimatedStyle](https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/animating-styles-and-props/#animating-styles). + +```clojure +(defn f-view [] + (let [scroll-x (reanimated/use-shared-value 0) + opacity (reanimated/interpolate scroll-x [0 45 50] [1 1 0])] + [reanimated/view + ;; bad + {:style (reanimated/apply-animations-to-style + {:opacity opacity + :transform [{:translate-x scroll-x}]} + {:flex-direction :row})} + + ;; good + {:style [{:opacity opacity + :transform [{:translate-x scroll-x}]} + {:flex-direction :row}]} + + ;; other valid and good variants + {:style [{:opacity opacity} + {:transform [{:translate-x scroll-x}]} + {:flex-direction :row}]} + + {:style {:opacity opacity + :transform [{:translate-x scroll-x}] + :flex-direction :row}}])) +``` +### Don't use percents to define width/height + +In ReactNative, all layouts use the [flexbox +model](https://reactnative.dev/docs/flexbox), so percentages are unnecessary the +vast majority of the time, don't use them. Check out this great [interactive +flexbox guide](https://www.joshwcomeau.com/css/interactive-guide-to-flexbox/) by +Joshua Comeau. + +```clojure +;; bad +[rn/view {:style {:width "80%"}}] + +;; good +[rn/view {:style {:padding-horizontal 20}}] +``` + +### Use a question mark to convey the value is a boolean + +The Clojure Style Guide suggests using a question mark only in [predicate +functions](https://guide.clojure.style/#naming-predicates), but nothing is +mentioned about other symbols and keywords. We prefer to extend the convention +to all boolean references. + +```clojure +;; bad +(let [is-open? true] ...) +(def flag-is-enabled false) + +;; good +(let [open? true] ...) +(def flag-enabled? false) +``` + +And for keywords too: + +```clojure +;; bad +[some-component {:logged-in true}] + +;; good +[some-component {:logged-in? true}] +``` + +### Styles def vs defn + +Always use `def` over `defn` if there are no dynamic values. This helps cut the +cost of function calls. + +```clojure +;; bad +(defn title-column [] + {:height 56}) + +;; good +(def title-column + {:height 56}) +``` + +```clojure +;; bad +(def community-card + {:background-color (colors/theme-colors colors/white colors/neutral-90)}) + +;; good +(defn community-card [] + {:background-color (colors/theme-colors colors/white colors/neutral-90)}) +``` + +### Custom Colors + +The Status designs have a lot of customization of user and group colors. For +consistency it is best to use `customization-color` as the prop key on pages and +components. This will help easily identify what pages and components in the +application are using customized colors. + +```clojure +;; bad +(defn community-card [{keys [custom-color]}] + ...) + +;; good +(defn community-card [{keys [customization-color]}] + ...) +``` + +### Using TODOs comments + +_TODO_ comments are used extensively in the codebase, but prefer to use them +only when strictly necessary and when an issue is not enough to track the work +left to be done. + +These are all good examples: + +```clojure +;; TODO(@username): +;; TODO(@username): , +;; TODO(YYYY-MM-DD): +;; TODO(@username,YYYY-MM-DD): +``` + +### Subscription names and event names + +Always register events and subscriptions using a meaningful namespace, but don't +namespace them with `::`. We understand it's a controversial decision because +there are both pros and cons to such practice. + +Whenever appropriate, it's also recommended to use _fake_ namespaces to convey +more knowledge in the keyword about which bounded context (domain) it refers to. +You may also use dots to convey hierarchical structures. + +```clojure +;; bad +;; Don't use real namespaced keywords. +(re-frame/reg-sub + ::profile-pictures-visibility + :<- [:multiaccount] + (fn [multiaccount] + (:profile-pictures-visibility multiaccount))) + +;; good +;; Uses a fake namespaced keyword. +(re-frame/reg-sub + :profile/pictures-visibility + :<- [:multiaccount] + (fn [multiaccount] + (:profile-pictures-visibility multiaccount))) + +;; better +;; Uses a fake namespaced keyword with a parent namespace (multiaccount). +(re-frame/reg-sub + :multiaccount.profile/pictures-visibility + :<- [:multiaccount] + (fn [multiaccount] + (:profile-pictures-visibility multiaccount))) +``` + +### Declaring view components + +Use the simple `defn` to declare components. Don't use `utils.views/defview` and +`utils.views/letsubs`. + +```clojure +;; bad +(utils.views/defview browser [] + (utils.views/letsubs [window-width [:dimensions/window-width]] + (do-something window-width))) + +;; good +(defn browser [] + (let [window-width (rf/sub [:dimensions/window-width])] + (do-something window-width))) +``` + +### Use `[]` instead of `()` in Reagent components + +- The `()` version [does NOT work with Form-2 and + Form-3](https://github.com/reagent-project/reagent/blob/master/doc/UsingSquareBracketsInsteadOfParens.md#a-further-significant-why) + components. +- Components defined with `[]` will be [more efficient at re-render + time](https://github.com/reagent-project/reagent/blob/master/doc/UsingSquareBracketsInsteadOfParens.md#which-and-why) + because they're interpreted by Reagent and transformed into distinct React + components, with their own lifecycle. + +```clojure +;; bad +[rn/view + (message-card message)] + +;; good +[rn/view + [message-card message]] +``` + +### Using re-frame subscriptions and dispatching events + +Use the `utils.re-frame` namespace instead of `re-frame.core` to subscribe and +dispatch. + +```clojure +;; bad +(ns my-namespace + (:require [re-frame.core :as rf])) + +(let [username @(rf/subscribe [:username])] + [pressable/pressable {:on-press #(rf/dispatch [:do-something])} + [rn/view + (str "Hello " username)]]) + +;; good +(ns my-namespace + (:require [utils.re-frame :as rf])) + +(let [username (rf/sub [:username])] + [pressable/pressable {:on-press #(rf/dispatch [:do-something])} + [rn/view + (str "Hello " username)]]) +``` + +### Registering effects + +When registering re-frame effects (`reg-fx`), prefer to expose a data-only +interface because that will allow event handlers to stay pure. + +For instance, if an effect needs a `on-success` callback, allow it to receive a +*re-frame event vector*. This approach is used by us in the [json-rpc/call +effect](src/status_im2/common/json_rpc/events.cljs), but also by third-party +effects, such as https://github.com/Day8/re-frame-http-fx. For the complete +rationale, see [PR #15936](https://github.com/status-im/status-mobile/pull/15936). + +### Using the effect `:json-rpc/call` + +Prefer the pure version of `:json-rpc/call` (no callbacks). + +```clojure +;; not as good +(rf/defn accept-contact-request + {:events [:activity-center.contact-requests/accept]} + [_ contact-id] + {:json-rpc/call + [{:method "wakuext_acceptContactRequest" + :params [{:id contact-id}] + :on-success #(rf/dispatch [:sanitize-messages-and-process-response %]) + :on-error #(rf/dispatch [:activity-center.contact-requests/accept-error contact-id %])}]}) + +;; better +(rf/defn accept-contact-request + {:events [:activity-center.contact-requests/accept]} + [_ contact-id] + {:json-rpc/call + [{:method "wakuext_acceptContactRequest" + :params [{:id contact-id}] + :on-success [:sanitize-messages-and-process-response] + :on-error [:activity-center.contact-requests/accept-error contact-id]}]}) +``` + +### Registering event handlers + +Register events with `utils.re-frame/reg-event-fx` and follow [re-frame's best +practice](https://github.com/day8/re-frame/blob/39adca93673f334dc751ee2d99d340b51a9cc6db/docs/FAQs/BestPractice.md#use-the-fx-effect) +so use only `:db` and `:fx` effects. `utils.re-frame/merge` and `utils.re-frame/defn` are deprecated and should not be +used in the new code in `src/status_im2/`. Don't use +`re-frame.core/reg-event-db`. + +```clojure +;; bad +(rf/defn invite-people-pressed + {:events [:communities/invite-people-pressed]} + [cofx id] + (rf/merge cofx + (reset-community-id-input id) + (bottom-sheet/hide-bottom-sheet) + (navigation/open-modal :screen/invite-people-community {:invite? true}))) + +;; good +(re-frame/reg-event-fx :communities/invite-people-pressed + (fn [{:keys [db]} [id]] + {:db (assoc db :communities/community-id-input id) + :fx [[:dispatch [:hide-bottom-sheet]] + [:dispatch [:open-modal :screen/invite-people-community {:invite? true}]]]})) +``` + +### Registering top-level re-frame subscriptions + +Use `subs.root/reg-root-key-sub` to register top-level (root) subscriptions. +Additionally, register root subscriptions in the `subs.root` namespace. + +```clojure +;; bad +(re-frame/reg-sub + :view-id + (fn [db] + (:view-id db))) + +;; good +(reg-root-key-sub :view-id :view-id) +``` + +### Registering layer-3 subscriptions + +The majority of the subscriptions should be defined as [layer-3 +subscriptions](https://day8.github.io/re-frame/subscriptions/#the-four-layer) +due to performance constraints. + +```clojure +;; bad +(re-frame/reg-sub + :ens/preferred-name + (fn [db] + (get-in db [:multiaccount :preferred-name]))) + +;; good +(re-frame/reg-sub + :ens/preferred-name + :<- [:multiaccount] + (fn [multiaccount] + (:preferred-name multiaccount))) +``` + +### Requiring quo components + +Consume `quo` components from `quo.core`, unless the namespace is also inside +the `quo/` directory. + +```clojure +;; bad +(ns my-namespace + (:require [quo.components.icon :as icon])) + +(icon/icon :i/verified) + +;; good +(ns my-namespace + (:require [quo.core :as quo])) + +(quo/icon :i/verified) + +;; also good because both namespaces are inside quo/ +(ns quo.components.tabs.account-selector + (:require [quo.components.markdown.text :as text])) +``` + +### Require/import + +Prefer `:as` instead of `:refer`. There are exceptions to this rule, e.g. the +test macros `deftest` and `is`, which are ubiquitous in the Clojure community. + +```clojure +;; bad +(ns status-im.utils.datetime + (:require [cljs-time.coerce :refer [from-long]])) + +;; good +(ns status-im.utils.datetime + (:require [cljs-time.coerce :as time.coerce])) +``` + +### Javascript interop + +Use [binaryage/oops](https://github.com/binaryage/cljs-oops) macros instead of +core interop macros. + +```clojure +;; bad +(fn [^js event] + (.-width (.-nativeEvent event))) + +;; good +(require '[oops.core :as oops]) +(fn [event] + (oops/oget event "nativeEvent.width")) +``` + +### Accessibility labels + +Accessibility labels are currently used only for end-to-end tests. Use keywords +instead of strings (remember keywords are cached). + +```clojure +;; bad +[text/text {:accessibility-label "profile-nickname"} + "Markov"] + +;; good +[text/text {:accessibility-label :profile-nickname} + "Markov"] +``` + +Avoid dynamic labels, for example to specify an element's index because +[Appium](https://appium.io/) already supports element selection based on +indices. + +```clojure +;; bad +[button {:accessibility-label (str "do-something" index)}] + +;; good +[button {:accessibility-label :do-something}] +``` + +### Icons + +Use the appropriate keyword qualification/namespace. + +```clojure +;; bad +(require '[quo.components.icon :as icons]) +(icons/icon :main-icons2/verified) + +;; good +(require '[quo.core :as quo]) +(quo/icon :i/verified) +``` + +### Translations + +Prefer to use translation placeholders instead of creating multiple translation +keywords and concatenating them into a single string. + +```clojure +;; bad +;; Assume the translation key is: +;; "biometric-auth-error": "Unable perform biometric authentication" +(str (i18n/label :t/biometric-auth-error) "(" error-code ")") + +;; good +;; Assume the translation key is: +;; "biometric-auth-error": "Unable perform biometric authentication ({{code}})" +(i18n/label :t/biometric-auth-error {:code error-code}) +``` + +### Tests +#### Prefer `match?` over `=` when comparing data structures + +Prefer the `match?` directive over `=` when comparing data structures, otherwise +when the check fails the output can be too difficult to read. `match?` is +defined by library https://github.com/nubank/matcher-combinators. + +```clojure +;; bad +(deftest some-test + (let [expected {...} + actual {...}] + (is (= expected actual)))) + +;; good +(deftest some-test + (let [expected {...} + actual {...}] + (is (match? expected actual)))) +``` + +#### Subscription tests + +Test [layer-3 subscriptions](https://day8.github.io/re-frame/subscriptions/) by +actually subscribing to them, so reframe's signal graph gets validated too. + +```clojure +;; bad +(defn user-recipes + [[current-user all-recipes location]] + ...) + +(re-frame/reg-sub + :user/recipes + :<- [:current-user] + :<- [:all-recipes] + :<- [:location] + user-recipes) + +(deftest user-recipes-test + (testing "builds list of recipes" + (let [current-user {...} + all-recipes {...} + location [...]] + (is (= expected (recipes [current-user all-recipes location])))))) + +;; good +(require '[test-helpers.unit :as h]) + +(re-frame/reg-sub + :user/recipes + :<- [:current-user] + :<- [:all-recipes] + :<- [:location] + (fn [[current-user all-recipes location]] + ...)) + +(h/deftest-sub :user/recipes + [sub-name] + (testing "builds list of recipes" + (swap! rf-db/app-db assoc + :current-user {...} + :all-recipes {...} + :location [...]) + (is (= expected (rf/sub [sub-name]))))) +``` + +## Project Structure + +First, the bird's-eye view with some example ClojureScript files: + +``` +src +├── js/ +├── mocks/ +├── quo +│ ├── components/ +│ ├── foundations/ +│ └── theme.cljs +├── react_native +│ ├── gesture.cljs +│ └── platform.cljs +├── status_im/ +├── status_im2 +│ ├── common +│ │ └── components +│ │ └── bottom_sheet.cljs +│ ├── contexts/ +│ ├── setup/ +│ └── subs/ +├── test_helpers/ +└── utils.cljs +``` + +- `src/js`: Raw Javascript files, e.g. React Native Reanimated worklets. +- `src/mocks`: Plumbing configuration to be able to run tests. +- `src/quo/`: The component library for Status Mobile. [Read more...](../src/quo/README.md) +- `src/react_native/`: Contains only low-level constructs to help React Native + work in tandem with Clojure(Script). +- `src/status_im2/`: Directory where we try to be as strict as possible about + our guidelines and where we prefer to write code for the new, redesigned + mobile app. +- `src/status_im/`: Directory containing what we call "old code", not yet + migrated to new guidelines for the new mobile app. +- `src/status_im2/common/`: Directories named `common` can appear at any level + of the directory tree. Just like directories named `utils`, their directory + nesting level communicates their applicable limits. +- `src/status_im2/common/components/`: Contains reusable components that are not + part of the design system (quo). +- `src/status_im2/contexts/`: Contains [bounded contexts](#glossary), like + `browser/`, `messaging/`, etc. As much as possible, _bounded contexts_ should + not directly require each other's namespaces. +- `src/status_im2/setup/`: Contains namespaces that are mostly used to + initialize the application, configure test runners, etc. In general, such + namespaces should not be required from the outside. +- `src/test_helpers/`: Reusable utilities for writing all kinds of tests. +- `src/status_im/subs/`: All subscriptions should live inside it. + +Directories named `utils/` can appear at any level of the directory tree. The +directory nesting level precisely indicates its boundaries. For example, a +`contexts/user_settings/utils/datetime.cljs` file communicates that it should +only be used in the `user_settings` context. + +### src/quo + +The `src/quo/` directory holds all components for the new design system. As +much as possible, its sub-directories and component names should reflect the +same language used by designers. + +Even though the directory lives alongside the rest of the codebase, we should +think of it as an external entity that abstracts away particular Status domain +knowledge. + +Components inside `src/quo/` should not rely on re-frame, i.e. they should not +dispatch events or use subscriptions. + +Example structure: + +``` +src +└── quo + ├── components + │ └── dropdown + │ ├── style.cljs + │ ├── test.cljs + │ └── view.cljs + └── screens + └── dropdown + └── view.cljs +``` + +### Re-frame events + +Event handlers should be defined in files named `events.cljs`, and they should +be _close_ to other _things_, like view files, components, etc. + +For example: + +``` +src +└── contexts + └── browser + ├── bookmarks/ + ├── options/ + ├── permissions/ + ├── events.cljs + ├── events_test.cljs + ├── style.cljs + └── view.cljs +``` + +## Deprecation process + +To deprecate a var, add the `:deprecated` metadata and, if necessary, suggest an +alternative. + +```clojure +;; Good if there's no better alternative yet, but we want to deprecate it anyway. +(defn ^:deprecated foo + [] + (bar)) + +;; Good +(defn foo + {:deprecated "Use some.namespace/var-name instead."} + [] + (bar)) +``` + +Please check the [Clojure Style](https://guide.clojure.style/#deprecated) documentation + +To reduce visual clutter from deprecated methods in your text editor, consult this [example](https://rider-support.jetbrains.com/hc/en-us/community/posts/4419728641810-How-to-disable-the-the-strike-thru-for-deprecated-methods-in-Javascript-#:~:text=Try%20disabling%20%22Preferences%20%7C%20Editor%20%7C,It%20works%20for%20me). The approach can be adapted for settings in VSCode, Emacs, VIM, and others. + +### Test structure + +[Unit tests](#glossary) should be created alongside their respective source +implementation. We prefer them colocated with the source and not like most +Clojure (JVM) codebases which mirror the sources in a top-level test directory. + +``` +├── models +│ ├── message.cljs +│ └── message_test.cljs +├── models.cljs +└── models_test.cljs +``` + +Component tests should be created in the same directory as the source component, +and named as `component_spec.cljs`. + + +``` +└── filter + ├── component_spec.cljs + ├── style.cljs + └── view.cljs +``` + +There's no hard rule on how integration test namespaces should be split, but +we're at least striving to define them under appropriate bounded contexts that +mirror the source code. + +``` +test +├── appium/ +└── integration + ├── browser/ + ├── communities/ + ├── messaging/ + ├── user_settings/ + └── wallet + └── payment_test.cljs +``` + +## Glossary + +**Unit test**: The smallest atomic unit that's meaningful to test. For example, +tests for utility functions and event handlers are considered unit tests in the +mobile codebase. They should be completely deterministic, _fast_, and they +should work flawlessly in the REPL. + +**Bounded context**: A logical separation between different domains. It's an +important concept in the [Domain-Driven +Design](https://en.wikipedia.org/wiki/Domain-driven_design) literature. See +[Bounded Context, by Martin +Fowler](https://martinfowler.com/bliki/BoundedContext.html) for an introduction +to the topic. diff --git a/doc/patching.md b/doc/patching.md new file mode 100644 index 00000000000..f0de38639d7 --- /dev/null +++ b/doc/patching.md @@ -0,0 +1,13 @@ +# Patching + +## Libraries +If 3rd party library has an issue and fix is not yet released (or we can't switch to a new release), we use forks. Fix should be committed to the fork, tagged and referenced from package.json. + +Example: [`react-native-hole-view`](https://github.com/status-im/react-native-hole-view#refs/tags/v2.1.1-status) + +## React Native +When patch need to be applied to React Native itself Status does patching with Nix instead of doing it nodejs-way. + +Patches should be added to [this file](https://github.com/status-im/status-mobile/blob/develop/nix/deps/nodejs-patched/default.nix). + +Example: [patching `react-native/Yoga` to build app with XCode 14.3](https://github.com/status-im/status-mobile/pull/15589) diff --git a/doc/pipeline_process.md b/doc/pipeline_process.md new file mode 100644 index 00000000000..6324639fc7b --- /dev/null +++ b/doc/pipeline_process.md @@ -0,0 +1,125 @@ +# Pipeline process + +[Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) is a project board for developers and testers used to track the status of a pull request, get reviews and manual testing, and run autotests. + +The generally accepted requirements for its use are described below: + +## Opening a PR +- Once a PR is created, it moves to the ```REVIEW``` column where a review will be requested automatically. +- You can also request a review inside the PR from a particular person if needed. +- When creating a PR, do not forget to assign it to yourself. +- Also in case the PR adds new functionality, a description **MUST** be added. + +### What if the work is still in progress? + +- If PR work is not finished yet, please mark it as a draft or add [WIP] to the title and keep it in the `CONTRIBUTOR` column until it's ready to be reviewed/tested. +- Alternatively, you can open a `draft`. + +### When is a PR considered ready to move forward? + +Ready for testing, a PR should meet the following criteria: + +1. Reviewed and has at least 1 approval. +2. Rebased to the `develop` branch (both `status-mobile` and `status-go` if needed, depending on what part has changes). + - **NOTE:** QAs can use the `Update with rebase` button from GitHub if: + - The PR has no `status-go` changes. + - The PR has no conflict with the develop branch. +3. All possible conflicts have been resolved. +4. Has the label: `request-manual-qa` or `skip-manual-qa`. +5. PRs **MUST** identify what area is affected and should have a description. + + +### E2E tests and analyzing the results + +The PR **MUST** be moved to the E2E column when it is ready for testing (**mandatory for all PRs**). +That will also trigger e2e tests run. QAs are monitoring PRs from E2E column and take it into test. +This step cannot be skipped. So, at least one comment from the `status-im-auto` bot with results is a prerequisite for moving forward. +Information on how to analyze tests can be found [here](https://github.com/status-im/status-mobile/blob/develop/doc/tests/how-to-launch-e2e.md). +Tests might be flaky, as they depend on infrastructure - SauceLabs and Waku. + +If there are `Failed tests` and you are not sure about the reason, you can always ping the mobile QAs for help (preferably in PRs by `@status-im/mobile-qa`). + +**For now, it is the only reliable source of regression in the app because, due to time constraints, it is not possible to test thoroughly each PR. +Please, respect this rule.** + +## Testing PR + +### Adding `skip-manual-qa` + +**Do not hesitate to use a `skip-manual-qa`** if you're sure that it is a simple flow and you checked it. +- Please ask another team member before adding the `skip-manual-qa` label (PR/Status community/DMs) so that there's a second opinion. +- The PR MUST have a proper reasoning why manual QA is skipped. +- The PR MUST include the steps of testing that has been done by the developer prior to moving it forward. + +**NOTE:** Make sure that QAs are OK with that; + +Before merging PRs, please make sure that information is added about how you tested the PRs, that e2s have been passed and their results have been reviewed. + +The QA team appreciates your help! + + +### Manual testing + +#### Prerequisites for manual testing +1. PR has a description of the change and details the area of the application affected by the change. +2. PR has automation results from the previous E2E test run step. +3. PR includes a demo, test steps, and any possible regression(s) +4. If appropriate, PR details what elements of a feature are out of scope. + +**If one of the prerequisites is missing, the PR will be moved to the contributor folder with a corresponding comment.** + +- If you think a PR needs and is ready for manual testing, please add the `request-manual-qa` label. +- QA engineer picks up one of PRs with the ```request-manual-qa``` label, drags the item to the ```IN TESTING``` column and assigns it to themselves. +- During testing, QA will add comments describing the issues found, and also review automation tests results. +Usually found issues are numbered as "Issue 1, Issue 2", etc. +When the first round of testing is completed and all issues for this stage are found, the QA can add the ```Tested - Issues``` label and drag the card to the ```CONTRIBUTOR``` column. These two actions are optional. + +**IMPORTANT NOTE:** when the issues are fixed, developer **MUST** notify the QA that it is ready to be re-tested again by mention them in the PR. + +- When manual testing of the PR is fully completed and all the issues are fixed, the QA adds the ```Tested - OK``` label and drags the card to the ```Design review``` column (the cases when design review is necessary are described below). +- If design review is not required, the QA drags the PR to the ```MERGE``` column. After that the developer merges PR into develop. +- If design review has been done, the designer (```@Francesca-G```) drags the PR to the ```MERGE``` column. +After that the developer merges PR into develop. +- If manual testing/design review was not carried out, the developer drags PR to the ```MERGE``` column themselves. + +### Design review +_**How do I know if a design review is needed?**_ + +There are three cases here depending on the changes in the PR: +1. **Functional PRs with UI changes:** after the ```Tested - OK``` label is added, the QA moves the PR to the ```Design review``` column + mentions ```@Francesca-G``` in comments. +2. **Component PRs:** once the PR has received a review from developers and e2e tests results, it can be moved directly to the ```Design review``` column by the developer (manual testing step can be skipped) + the developer mentions ```@Francesca-G``` in comments. +3. **Functional PRs changes in which are not related to UI (e.g. a crash fix):** skip the ```Design review``` step (the PR should only be manually tested by QA). + +There are three possible scenarios when the design review is completed: +1. **Approved by design** > the PR is moved to the ```MERGE``` column by Francesca +2. **Some changes requested, but can be fixed as followups** > need to be negotiated with Francesca > Francesca moves PR to the ```MERGE``` column and adds the ```Follow-up required``` label > follow-ups should be added **by the dev** right after the PR is merged +3. **Some changes requested, they should be fixed before merge** > Francesca reviews the PR again after the fixes and moves PR to the ```MERGE``` column from ```Design review``` + +--- +**Notes:** +- If your PR has a long story and started from `develop` branch several days ago, please rebase it to current develop before adding label +- if PR can be tested by developer (in case of small changes) and/or developer is sure that the changes made cannot introduce a regression, then PR can be merged without manual testing. Also, currently, PRs are not manually tested if the changes relate only the design (creation of components, etc.) and do not affect the functionality (see `skip-manual-qa` label) +--- + +#### Why my PR is in `Contributor` column? +PR can be moved to this column by the ```status-github-bot``` or by QA engineer with label `Tested-issues` or if one of the requirements for manual QA was not met. +In the first case most often this happens due to conflicting files in PR. +In the second case - after fixing of all found issues, the developer should ping the QA in the PR comments for retesting. + +## Merging a PR +**Merge conditions:** +1. Required number of reviews received +2. E2E results are received and reviewed +3. All commits are squashed into one. +4. No conflicting files in PR +5. No issues from lint +6. Pay attention to automation checks (some of them are not blockers, best to check before merge anyway) +![](images/pipeline-process/automation-checks.png) + + +6. In case of manual testing - the label ```Tested - OK``` from QA +7. In case of design review - the approval from the designer + +You can merge your PR into develop - some useful clues you can find [here](https://notes.status.im/setup-e2e#3-Merging-PR) + +HAPPY DEVELOPMENT! :tada: diff --git a/doc/pixel-perfection.md b/doc/pixel-perfection.md new file mode 100644 index 00000000000..49a4bd45252 --- /dev/null +++ b/doc/pixel-perfection.md @@ -0,0 +1,23 @@ +# Pixel Perfection +The Status Mobile team aims to align the design implementation perfectly according to a given screens respective Figma design spec. + +Currently, the Figma Designs match up with both "iPhone 11 Pro" and "iPhone 13" screen size. + +The Dimension reference for iPhone 11 Pro is 375 x 812 (width x height) and for iPhone 13 is 390 x 844. + +To test your implementation is correct you can take the following steps + +- Open a new Figma file so that you have write privileges. + +- Copy in the component or screen from the Figma file. + +- Using the "iPhone 11 Pro" or the "iPhone 13" simulator (it is the default now) you take a screenshot of your component and paste it into your Figma file. + +- To get the right size, set your screenshot to width according to your simulator: + - for iPhone 13 set 390 + - for iPhone 11 Pro set 375 + + +![](images/pixel-perfection/layer-width.png) + +- Lower the opacity so you can see it sitting on top of the Figma mock ups. diff --git a/doc/post-mortem.md b/doc/post-mortem.md new file mode 100644 index 00000000000..b88e496506b --- /dev/null +++ b/doc/post-mortem.md @@ -0,0 +1,42 @@ +This document MUST be updated everytime a PR has been identified has the source of a bug in develop. The post mortem analysis MUST include: the CAUSE of the bug, the RESOLUTION PROCESS and PREVENTION MEASURES. + + +# "sql: no rows in result set" error on iOS login + +## Cause + +There were errors in the iOS native code: +- "loginWithKeycard" method was not implemented +- "createAndLoginWithKeycard" method was actually used instead of "createAndLogin** which is used for regular account creation without keycard and doesn't have the same final argument + +QA process was focused on account creation and login with keycard, and this bug would only appear specifically on iOS when creating an account without keycard and only during the next login. It was therefore a more complex path to reach than what could have been expected from this PR, and it was caused in develop by a developer working on iOS simulator because that is a common path during development. + +## Resolution process + +- the commit was reverted locally by the developer which fixed the issue locally and confirmed the faulty commit +- the bug was only reproducible on iOS which strongly hinted at a potential issue with native code +- the missing method was not the origin of the problem but was found at this point and further analysis lead to the shadowing error + +## Prevention measures + +- PRs that change native code should be checked for platform parity: + - same methods are created/modified for each platform + - test cases in the PR should take these methods in consideration + +# Missing labels for en translation + +https://github.com/status-im/status-mobile/issues/9003 + +## Cause + +Unused labels in the application have been listed by QA and an issue created for their removal. The PR was made by an external contributor and it had to be rebased many time because it touched many files and other PRs got merged before this one could be tested. After a last rebase the PR was merged with 100% e2e test but no manual testing. + +The reason some translations got deleted despite the fact that they were used is because the `message status` related labels were not explicitly mentioned in the code unlike every other labels. They were built from the actual `message status` and the prefix `status-`. + +## Resolution process + +The mistake was quickly noticed in develop and an issue created. The fix was to recover the 3 labels that were accidentally deleted. + +## Prevention measures + +The code has been changed so that the labels are no longer generated and appear in the code like other labels. diff --git a/doc/pr-review-policy.md b/doc/pr-review-policy.md new file mode 100644 index 00000000000..3769c025ba6 --- /dev/null +++ b/doc/pr-review-policy.md @@ -0,0 +1,96 @@ +## Pull Request Review Policy + +This document details the pull request policy of the Status Mobile repository / team. + +- [Terms](#terms) +- [Policy](#policy) + - [Overview](#overview) + - [Full Policy](#fully-policy) +- [Rationale](#rationale) + - [Front pressure and Demand control](#front-pressure-and-demand-control) + - [Back pressure and Supply control](#back-pressure-and-supply-control) + - [Honour System](#honour-system) +- [Review Support](#review-support) +- [Background](#background) + +### Terms: + +| Term | Definition | +|----------------------|---------------------------------------------------------------------------------------------------------------| +| **Requester** | The team member submitting a pull request. | +| **Reviewer** | A team member asked by a requester to review the requester’s pull request. | +| **Review bandwidth** | The number of reviews a team member has self-limited themselves to giving within their defined review period. | +| **Review period** | The period of time over which a reviewer’s bandwidth is consumed | + +### Policy: + +#### Overview + +- 🔀 - You are responsible for getting your PR reviewed and approved. +- ✅ - You must give a review on a PR if you are asked to do so, unless your review limit has been reached. +- ✨ - The honour system underpins this policy, without acting in good faith it will not work. + +#### Fully policy + +1) The requester has the responsibility for getting a PR reviewed and approved. + 1) The requester has the right and responsibility to pursue code reviews. + 2) The requester has the right and responsibility to make multiple requests of the same reviewer. + 3) The requester will select a limited number of reviewers to review any of the requester’s PRs. +2) Reviewers are obligated to give a review for all PRs they are requested to review, except when their review bandwidth has been exhausted: + 1) Reviewers have the right to refuse a requester a review if the reviewer’s review bandwidth has been exhausted. + 2) Reviewers are expected to manage and track their review bandwidth. + 3) Reviewers can manage their review bandwidth via any means they feel works best for them. Examples include: + 1) Using the GitHub busy feature + 2) Declining a review on the PR + 3) Declining a review when pursued by a code reviewer + 4) Proactively declining to review a PR +3) All team members will set a review bandwidth that is reasonable. +4) All team members acknowledge that giving reviews is a requirement of membership of the team. +5) All team members will manage their review bandwidth honestly. + 1) The right to refuse a PR review is only eligible if a reviewer’s review bandwidth has actually been exhausted. + 2) Breaching the team’s honour is very bad form. Do not do it (please). +6) All team members acknowledge that without acting with honesty this review process will not work and jeopardises their own future ability to receive reviews. + +### Rationale + +#### Front pressure and Demand control + +Foremost in the rationale for the above policy is that giving a PR review is a requirement. If a requester requests + a PR review of a team member, the reviewer is now obligated to review the PR within a reasonable timeframe. + +This principle enforces that there is a pressure and demand that PR reviews must be given. + +#### Back pressure and Supply control + +Front pressure alone is not enough to balance the PR review load across the team. Because of this an exception is granted +to reviewers that have exhausted their review bandwidth, the exemption permits these reviewers to refuse a PR review. + +This principle gives the reviewer pool back-pressure, relieving the exhausted reviewer and increasing pressure / demand on +the other reviewers. + +#### Honour system + +The two principles of demand and supply control are underpinned by an honour system and are useless without honest action. +If a team member does not honestly manage their review bandwidth this action seriously damages the collective balance of +PR review load. Because of this potential damage a breach of the honour system is considered a deeply shameful act. + +The honour system is the mechanism of control and enforcement, without it the policy would need to be controlled and enforced +using less dynamic and forgiving mechanisms. An example is a GitHub review counting tools with quotas and metrics. So just +be cool. + +### Review Support + +Sometimes reviewing is time-consuming or generally painful, to help make reviews as simple as possible consider the following suggestions: +- Paired reviews: Ask an experienced reviewer to review with you. +- If a PR is the product of multiple developers only ask 1 or 2 other developers for their review. + +### Background + +The contents of this policy document is the product of 2 councils of the Status Mobile team, the below documents summarise the topics and outcomes of the councils: + +- [2023-05-15 - Council of Deadwater](https://docs.google.com/document/d/1TtUZCke2OzumjdWGu6TIECHEOUPwvaLrvQ8Re2nEGCo) +- [2023-06-13 - Mauve Council of Deadwater](https://docs.google.com/document/d/19hfr8xXrShLk9ROdQfOwb9_vwbTah9nOCqKSLIrgoSI) + +The aims of the council were to allow developers that are relied on heavily for reviews to better balance their time +between reviews and other responsibilities. Equally, the council aimed to give other team members better opportunity and +understanding that giving PR reviews is a requirement and will help the team generally if more review burden is shared. diff --git a/doc/react_tree.png b/doc/react_tree.png new file mode 100644 index 00000000000..e5ade680dd4 Binary files /dev/null and b/doc/react_tree.png differ diff --git a/doc/release-checklist.md b/doc/release-checklist.md new file mode 100644 index 00000000000..a40fca996f0 --- /dev/null +++ b/doc/release-checklist.md @@ -0,0 +1,21 @@ +#### Before submission +- [ ] Feature or improvements release? (Feature release needs more lead time and assets for comms) +- [ ] Sign off by QA +- [ ] App store listing content reviewed and updated ([copy](https://docs.google.com/spreadsheets/d/1fLDr3BD1dcg0dolvLiozXoZU27IQirjBzn0h4_QS2u0/edit#gid=0), [images](https://www.dropbox.com/sh/6baklctvxy3nuoo/AACG9kYIVdt2qREW76rP8SP-a?dl=0) ) +- [ ] Play store content reviewed and updated +- [ ] Release notes written and added (500 character limit for updates (Android), no Android references for App store) +- [ ] Comms timeframe agreed on (Mon/Tue ping when both submissions are in) +- [ ] Privacy policy reviewed and updated +- [ ] App translations for key features merged and tested +- [ ] Countries to be excluded +- [ ] Changes to our FAQ made + +#### Before publishing +- [ ] Translations for comms available +- [ ] Promotional content ready +- [ ] Update Draft with release on https://github.com/status-im/status-mobile/releases +- [ ] Add release to DO store and [update site](https://notes.status.im/s/status-release-upload#) (Jakub - requires credentials to upload) + +#### At time of publishing +- [ ] validate draft release on github release page https://github.com/status-im/status-mobile/releases +- [ ] update https://github.com/status-im/status-mobile/blob/develop/RELEASES.md with release notes diff --git a/doc/release-guide.md b/doc/release-guide.md new file mode 100644 index 00000000000..44b9b2cdbf6 --- /dev/null +++ b/doc/release-guide.md @@ -0,0 +1,117 @@ +# Description + +This document explains some of the steps that are involved in releases. + +# Release process + +## Coordination + +All the coordination is done in the `#release` channel on discord. + +Release readiness can be tracked by watching an appropriate milestone at [milestones](https://github.com/status-im/status-mobile/milestones) section in github. + +When release is building you can check the progress in a testrail. Ask @churik for access if you don't have it + +## Preparing branches +Special branches should be created at the start of a release process. That can be done manually or with the script + +### Prepare branches with the script + +You can use the script to cut a release branch. No arguments needed, the new release version will be deducted automatically: + +`scripts/cut-release.sh` + +Upon script call two branches will be created: +- `release/a.b.x` +- `chore/update-release-to-$version` + +The first one is the main release branch. All bugfixes should be cherry-picked from `develop` to it. Jenkins treats that branch specially and prepares release builds from it. + +The second branch only updates the `VERSION` file and all you need to do is to merge it to `develop`. If you have the `gh` command installed, `cut-release` script will automatically create a PR for this. + +### Prepare branches manually + +#### Create a branch + +First, we need to create a release branch cut from develop. +The name of the branch should be `release/a.b.x` where `x` is actually `x`, not a variable, and `a` and `b` are the `MAJOR` and `MINOR` version of the app. + +For example, valid branch names are: + +`release/1.12.x` or `release/3.12.x` + +#### Update version + +We need to update the `VERSION` file to reflect the release we want to build. + + +## Building + +Jenkins will automatically build this branch and create release candidates. +Those will go through the QA process and the QA team will let us know when +tested successfully. + +You can see the state at https://ci.infra.status.im/ -> status-mobile -> release -> pick the right version number + +## Bugfixes before an app is released + +Because both `status-mobile` and `status-go` might have newer commits that we don't want to include, bug fixes should be applied separately to develop and the release branch. +The best workflow is to send a PR to develop, get it merged, and the cherry-pick on the +release branch. + +It is a release manager's responsibility to cherry-pick bugfix from `develop` to release branch. In order to do this, you should be a part of a `release group` on github. Contact @jakubgs to be added. + +If cherry-picking not practical for some reason (i.e develop has diverged significantly from release) +other workflows are possible. + +To change status-go, a similar workflow applies. +First checkout the tag used in `status-go-version.json` of release branch. + +`git checkout v0.62.3` + +Create a branch on status-go named: `release/vx.y.z+hotfix.w` where (make sure branch name is not the same as the tag) + +`x` is the `MAJOR` version +`y` is the `MINOR` version +`z` is the `PATCH` version +`w` is the `HOTFIX` version + +For example valid names are: + +`release/v0.62.3+hotfix.2` +`release/v1.3.4+hotfix.4` + +Once the branch is ready to use and tested successfully, tag the branch: + +`git tag v0.62.3+hotfix.2` + +Push the branch and then the tag to origin: +`git push --set-upstream origin release/v0.62.3+hotfix.2` +`git push origin v0.62.3+hotfix.2` + +Switch to status-mobile release branch, and cherry pick the commit you need. + +Once that's done, update the status-mobile release branch with the new tag: + +`make shell` + +`scripts/update-status-go.sh v0.62.3+hotfix.2` + +And commit and push the changes + +# Hotfix process + +The hotfix process is basically identical to the workflow of a bugfix: + +1) Add the changes on status-mobile +2) Make sure you use a hotfix branch for status-go (unless we are happy to release from develop) +3) Update the `VERSION` in status-mobile + +# PlayStore Metadata Updates +This section is relevant only for the marketing team, no developer participation is required. + +You can update Play Store release metadata using `fastlane android upload_metadata`. + +But that requires credentials necessary for accessing Play Store API. The simpler way is to edit files contained within [`fastlane/metadata`](metadata) and run the following CI job: + +https://ci.status.im/job/status-mobile/job/tools/job/update-playstore-metadata/ diff --git a/doc/starting-guide.md b/doc/starting-guide.md new file mode 100644 index 00000000000..959f098c9a1 --- /dev/null +++ b/doc/starting-guide.md @@ -0,0 +1,131 @@ +# Description + +This document provides information on how to start developing Status App. + +# Getting Started + +To start developing clone the status-mobile repo in the directory of your choice. +``` +git clone https://github.com/status-im/status-mobile.git +``` + +Then open a terminal and cd into this directory. + +``` +cd status-mobile +``` + +Then build the clojure terminal + +``` +make run-clojure +``` + +note: ⚠️ This might take a while if this is your first time. + +This command installs `nix` and pulls in all the dependencies. +Do answer with "Y" to all the prompts and press "Enter" when `nix` setup asks you to Acknowledge. +This command builds the `jsbundle` and then compiles `Clojure` into `JavaScript`, watches for changes on `cljs` files, and hot-reloads code in the app. + +wait till you see the following message : + +``` +[:mobile] Build completed. (1801 files, 52 compiled, 0 warnings, 9.52s) +``` + +Once the clojure terminal is running you need to run the appropriate command next for your platform in a separate terminal : + +`make run-android` or `make run-ios` + +These commands will build the app, start a metro bundler and deploy the app on your simulator OR connected device (android only). For building and deploying to connected iPhones use `make run-ios-device` instead of `make run-ios` +Also check [developing on a physical iOS Device](#Additional-requirements-for-developing-on-physical-ios-device). + +## Simulators and Devices +### Android + +You need to have an emulator like [AVD](https://developer.android.com/studio/run/emulator), or [Genymotion](#genymotion-virtualization), or a real device running and visible to [adb](https://developer.android.com/studio/command-line/adb), before you run `make run-android`. + +### iOS + +#### Running on a simulator + +We highly recommend using either the `iPhone 11 Pro` or `iPhone 13` simulator as its screen dimensions match with our design. + +If you have Xcode `v12.x` (and above) installed in your system, you need to follow the below steps to add `iPhone 13` simulator: + +1. Open Xcode +2. Menu `>` Window `>` Devices and Simulators +3. Tap `+` button on bottom left +4. Select **Device Type** as `iPhone 13` +5. Leave the **Simulator Name** empty and tap on **Create** + +##### NOTE ⚠️ + +Running `make run-ios` will target `iPhone 13` by default. + +If you need to run on any other simulator, you can specify the simulator type by adding the `SIMULATOR` flag: +```sh +make run-ios SIMULATOR="iPhone 15" +``` + +# Build release + +To build the app, you can simply run on of the following: +``` +make release-android +make release-ios +``` + +For more `make` targets run `make help`. + +# Updating Dependencies + +* `make nix-update-pods` - iOS CocoaPods dependencies (updates `ios/Podfile` and `ios/Podfile.loc`) +* `make nix-update-gradle` - Android Gradle/Maven dependencies (updates `nix/deps/gradle/deps.json`) +* `make nix-update-clojure` - Clojure Maven dependencies (updates `nix/deps/clojure/deps.json`) +* `make nix-update-gems` - Fastlane Ruby dependencies (updates `fastlane/Gemfile.lock` and `fastlane/gemset.nix`) + +# Manual Steps + +There are a few manual steps you might want to do in order to start contributing. + +## Genymotion Virtualization + +Optionally set up Genymotion if you don't want to use Android Virtual Device: + +https://www.genymotion.com + +## Android Development Environment + +You can also setup Android Development Environment + Simulator: + +https://facebook.github.io/react-native/docs/getting-started.html + +## Configure GitHub Account + +The optimal way of pushing to GitHub is using SSH instead of user/pass auth. + +It's recommended that you [add your public SSH key to your GitHub account](https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account). + +## Configure GPG Keys for signing commits + +In order to increase security we require all commits in `status-mobile` repo to be signed with a GPG key. + +Steps: +1. [Generate a new GPG key](https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key) +2. [Setup Git to use your GPG key](https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key) +3. [Setup Git to sign commits](https://help.github.com/en/github/authenticating-to-github/signing-commits) +4. [Setup GitHub to validate commits](https://help.github.com/en/github/authenticating-to-github/adding-a-new-gpg-key-to-your-github-account) + +## Additional requirements for developing on Physical iOS Device + +To use a physical iPhone your device UDID must be added to provisioning profiles and your Apple account invited as Developer to Status team. + +1. [Get your UDID of your iPhone.](https://www.extentia.com/post/finding-the-udid-of-an-ios-device) +2. Request from someone with access like @cammellos or @jakubgs to +- Add the UDID to development devices on Apple Developer Portal. +- Invite your Apple account to be Developer in Status team. +3. Open XCode using the project from `status-mobile/ios` directory. +- You might see error: `Select a development team in the Signing & Capabilities editor` +- Select `Status Research & Development GmbH` as the development team. +4. In a new terminal execute `make clean` and then `make xcode-clean` diff --git a/doc/status-go-changes.md b/doc/status-go-changes.md new file mode 100644 index 00000000000..c6e9d48ef9e --- /dev/null +++ b/doc/status-go-changes.md @@ -0,0 +1,31 @@ +# How to make changes to status-go + + +## Overview + +To make changes to status-go, the best approach is to first identify the issue/feature and the changes to be made directly in status-go. +For any bugs we want to most likely write a failing test in status-go, and make sure that it passes, before we test on mobile. + +Once you are quite confident that the status-go code is ready to be tested on mobile, you can test it locally by running the following command: + +``` +env STATUS_GO_SRC_OVERRIDE={your-status-go-directory} make run-{android/ios} +``` + +This will recompile status-go and run status-mobile on your device with that updated status-go version. + +Once you have tested the status-go changes locally and you think it's ready for a PR: + +1) Create a PR in status-go + +2) Point your local status-mobile branch to that PR by running the script: + +``` +scripts/update-status-go.sh {status-go-branch-name} +``` + +This will update `status-go-version.json` + +Commit updated status-go-version.json and create a status-mobile PR + +Once both PRs have been approved and are good to merge, you can follow the [merge guidelines](./merging-pr-process.md) diff --git a/doc/tests/component-tests-overview.md b/doc/tests/component-tests-overview.md new file mode 100644 index 00000000000..1e336729068 --- /dev/null +++ b/doc/tests/component-tests-overview.md @@ -0,0 +1,55 @@ +# Component Tests + +The component tests are using React Native Testing Library - https://callstack.github.io/react-native-testing-library/ +and Jest - https://jestjs.io/ + + +It is highly recommended to read some advice from Kent C.Dodds on how to write tests and use these tools correctly. + + +https://kentcdodds.com/blog/common-mistakes-with-react-testing-library + +https://www.youtube.com/watch?v=ahrvE062Kv4 + +Both of these links are showing it for React-Testing-Library (not Native) however the approach is for the most part considered the same. + +## Running the tests +To run these tests there are two methods. + +`make test-component` +setups and runs the test suite once. + +`make test-component-watch` +setups and runs the test suite and watches for code changes will then retrigger the test suite. + +## Writing Tests +New test files will need their namespace added to either the file "src/quo/core_spec.cljs" or "src/status_im2/core_spec.cljs. These locations may update overtime but it is dependent on the entrypoint in shadow-cljs config discussed below. + + +### Best practices +For the moment we will keep best practices for tests in our other guidelines document: + +To that point these guidelines will follow the conventions of Jest and React Native Testing Library recommendations and Status mobile will just stack their preferences on top. + +### Utilities +There is a file of utility functions defined in "src/test_helpers/component.cljs" and "src/test_helpers/component.clj". It will be great to use these utilities and to add any common testing tools to these files as it should make writing tests easier and faster. + + +## Configuration +Status Mobile has a bespoke tech stack, as such there is more complexities to configuring the tests. + +### Shadow-CLJS +the configuration for compiling our tests are defined in the "shadow-cljs.edn" file. +The three main parts of this are +`:target :npm-module` +Needed for the configuration we are using +`:entries` +a vector of entry points for the test files. +and the `ns-regexp` to specify what tests to find. Since we have multiple forms of tests we decided that "component-spec" is the least likely to detect the wrong file type. + +It's worth knowing that our tests are compiled to JS and then run in the temporary folder `component-tests`. + +### Jest +There is also further configuration for Jest in "test/jest". There is a jest config file which has some mostly standard configuration pieces, where the tests live, what environment variables are set etc. This is documented by Jest here: https://jestjs.io/docs/configuration + +There is also a setup file which is used to set some global and default values. Additionally this file is used to mock some of the react native (among other) dependencies. diff --git a/doc/tests/how-to-launch-e2e.md b/doc/tests/how-to-launch-e2e.md new file mode 100644 index 00000000000..a536042f3a2 --- /dev/null +++ b/doc/tests/how-to-launch-e2e.md @@ -0,0 +1,103 @@ +How to Launch E2E +=== + +## Overview for how automated test structured for Status app + +As a part of CI for Status mobile app and in order to ensure there are no regressions appear after the changes in code (bug fix, new/updated feature) we are using automated tests (e2e tests). + +- Automated tests written on Python 3.9 and pytest. +- Appium (server) and Selenium WebDriver (protocol) are the base of test automation framework. + +TestRail is a test case management system tool where we have test cases. + + +Each of the test case gets a priority (Critical/High/Medium) + +**SauceLabs** - is a cloud based mobile application test platform. We are using Android emulators (Android 10.0) for test script execution there. We have 16 session be running at the same time max. +For now we support e2e for Android only. + +## What's happening when any e2e job is running +Whenever we need to push set of test scripts we create 16 parallel sessions (max, but depending on amount of cases that are included in job) and each thread: 1) uploads Android .apk file to SauceLabs -> 2) runs through the test steps -> 3) receives results whether test failed on particular step or succeeded with no errors -> 3) Parse test results and push them as a Github comment (if the suite ran against respective PR) and into TestRail. + +We push **whole automation test suite (currently 155, amount is changing)** against each nightly build (if the nightly builds job succeeded). Results of the test run are saved in TestRail. +And also we push set of autotests whenever PR with successful builds got moved in to `E2E Tests` column from [Pipeline for QA dashboard ](https://github.com/status-im/status-react/projects/7). +In that case we save results in TestRail as well and push a comment with test results in a respective PR. + +For example: https://github.com/status-im/status-react/pull/9147#issuecomment-540008770 + +![](../images/how-to-launch-e2e/how-to-launch-e2e-1.png) + + +The test_send_stt_from_wallet opens link in TestRail https://ethstatus.testrail.net/index.php?/tests/view/890885 where performed steps could be found +List of all runs performed by test jobs could be found here https://ethstatus.testrail.net/index.php?/runs/overview/14 + +**For credentials for TestRail to see results ping Chu in DM**: + +Opening any test run navigates you to list of test cases with results: +![](../images/how-to-launch-e2e/how-to-launch-e2e-2.png) + + +## What about launching e2e manually + +To manage e2e there are several jobs in https://ci.status.im/job/status-mobile/job/e2e : +1) [nightly](https://ci.status.im/job/status-mobile/job/e2e/job/status-app-nightly/) - running automatically after building nightly apk e2e build. QA running it manually for results of e2e when testing release. +2) [upgrade](https://ci.status.im/job/status-mobile/job/e2e/job/status-app-upgrade/) - running manually by QA in release testing for smoke upgrade tests. +3) [prs](https://ci.status.im/job/status-mobile/job/e2e/job/status-app-prs/) - running **only automatically** when PR moves into `e2e column` +4) [prs-rerun](https://ci.status.im/job/status-mobile/job/e2e/job/status-app-prs-rerun/) - for manual run, can be run on request by anyone. **If you need to launch e2e against your build, use this job.** +Params to specify: + +- apk: [url_to_apk_build_here] +- pr_id: pull request number (e.g. 1234) +- branch: branch name from which the test are taken (in most of cases `develop`) +- keyword expression: tests by area (let's say `ens` or `chat`, they can be combined`ens or chat or send_tx`. All keywords can be found in testrail, ping Chu for details) +- test_marks: tests by priorities (by default: `critical or high or medium`, which corresponds the whole suite; to launch the same suite as in PRs, use `critical or high`) +- testrail_case_id: here is the list of test cases which you may find in test rail (4-digit value) + +For easier access you can hit `Rerun tests` in GH comment and testrail_case_id/ apk_name/ pr_id will be filled automatically. For making sure that tests are being rerun on most recent e2e build it is recommended to paste link to the last e2e build in apk_name field. The list of PR builds can be found in Jenkins Builds block on PR page. +![](../images/how-to-launch-e2e/how-to-launch-e2e-3.png) +And then hit ‘Build’. +Once the job starts it picks up specified tests, runs them against provided apk and sends results to pull request. + +Even we have 16 parallel sessions for testing it’s a time consuming operation (whole test suite we have automated at the moment takes ~140 minutes to finish). +So for PRs we pick only set of `critical or high` (you can also use this in TEST_MARKS param for job) +tests (otherwise some PRs could wait their turn of the scheduled Jenkins job till the next day). + +## Analysing test results (and why test fails to pass) + +After automated test run finished test results could be found in GH comment (if the test suite ran against PR) and TestRail. There are two states of the test: Passed and Failed. Test failure happens when certain condition of test step has not met or automated test can not proceed execution because it can not find the respective element on screen it expects should be there. + +Several examples of when test fails to succeed: + +- Test clicked on element which should load new screen (or pop-up) and awaits some element on this screen. But test did not wait enough allowing the new screen to appear and so it fails with “Could not find element XYZ” (this case is more app issue in our opinion rather then test issue, but we just can not spend our and dev time with too specific random places which happens once causing app lags in different moments) + +- Test sent transaction to address but it was not mined in time (we have a limit to wait until balance is changed on recipient side up to ~6 mins now). We classify this as False Fail, because it’s not the app issue but more network issue. + +- Test infrastructure issues, - anything related to infrastructure including SauceLabs side issues (apk failed to install - rare case, or LTE connection was set by default instead WiFi or unexpected pop-up appeared preventing test to going further) + +- Failure due to changed feature which has not been taken into account in some test after code merge (for instance: some element on screen has been removed, and we want to locate another element on this screen via XPath which is different now) + +- **Valid issue in the automated test scripts** - that's what we're looking for + +Example: here is the test results https://github.com/status-im/status-react/pull/13015#issuecomment-1016495043 where one test failed. + 1. Open the test in TestRail and open session recorded for this test in SauceLabs +![](../images/how-to-launch-e2e/how-to-launch-e2e-4.png) + + +In TestRail you may find all the steps performed by the test. +In SauceLabs testrun page you may find useful: video of the session, step logs, logcat.log of the session + 2. Analyze step where test was failed +For particular example it was failed on `Recover access(password:qwerty, keycard:False)` and unexpected error appeared. + +## Limits for e2e tests coverage +Not all features of the app could be covered by e2e at the moment: + +- Colours or place of an element on UI. +- Real ETH/token transactions. That’s the main reason we have separate .apk build for automation needs - it defaults to Sepolia network. Also it has enabled keycard test menu, ENS names and chat commands are also on Sepolia network (the same in PR builds, but not in nightlies / release) +- Autologin/Biometric related actions (autologin available when device meets certain conditions like the it has set unlock password and device is not rooted: all emulators are rooted in SauceLabs) + +## Brief flow for test to be automated + +Whenever there is a need to have a new test: +1) Create a test scenario in TestRail. +2) If certain item could be checked in scope of existing test case we update existing one (otherwise we may have thousands of test cases which is overkill to manage in TestRail as well as in automated test scripts). And also complex autotests increase probability to not catch regressions by stopping test execution (due to valid bug or changed feature) keeping the rest test steps uncovered. So here we need to balance when it makes sense to update existing test case with more checks. +3) Then we create test script based on the test case, ensure test passes for the build and pushing the changes to repo. diff --git a/doc/tests/how-to-run-local-tests.md b/doc/tests/how-to-run-local-tests.md new file mode 100644 index 00000000000..317a38b493d --- /dev/null +++ b/doc/tests/how-to-run-local-tests.md @@ -0,0 +1,94 @@ +# Local testing + +## Unit & integration tests + +To run all tests: + +``` +make test +``` + +Also test watcher can be launched. It will re-run the entire test suite when any file is modified + +``` +make test WATCH=true +``` + +Developers can also manually change the shadow-cljs option `:ns-regex` to control which namespaces the test runner should pick. + +## Testing with REPL + +The most convenient way to develop and run test locally is using REPL: + +1. Run command `make test-watch-for-repl`. +3. Once you see the message `[repl] shadow-cljs - #3 ready!` you can connect a REPL to the `:test` target from VS Code, Emacs, etc. +4. In any test namespace, run [cljs.test/run-tests](https://cljs.github.io/api/cljs.test/#run-tests) or your preferred method to run tests in the current namespace. + +You can run single test in REPL like this + +```clojure +(require 'cljs.test) +(cljs.test/test-var #'status-im.data-store.chats-test/normalize-chat-test) +``` + + + +Tests will use the bindings in `modules/react-native-status/nodejs`, if you make any changes to these you will need to restart the watcher. + + + +### Example in Emacs + +In the video below, you can see two buffers side-by-side. On the left the source implementation, on the right the REPL buffer. Whenever a keybinding is pressed, **tests in the current namespace instantly run**. You can achieve this exact flow in VS Code, IntelliJ, Vim, etc. + +[2022-12-19 12-46.webm](https://user-images.githubusercontent.com/46027/208465927-4ad9a935-5494-45e7-85b0-8134dc32d1a1.webm) + +### Example in terminal emulator + +Here I'm showing a terminal-only experience using Tmux (left pane Emacs, right pane the output coming from running the make target). + +[2022-12-19 13-17.webm](https://user-images.githubusercontent.com/46027/208471199-1909c446-c82d-42a0-9350-0c15ca562713.webm) + +## Component tests only + +To run tests: + +``` +make test-component +``` + +Also test watcher can be launched. It will re-run the entire test suite when any file is modified + +``` +make test-component-watch +``` + +Check [component tests doc](./component-tests-overview.md) for more. + +## Unit tests only + +To run unit tests: + +``` +make test-unit +``` + +Also test watcher can be launched. It will re-run the entire test suite when any file is modified + +``` +make test-unit WATCH=true +``` + +## Integration tests only + +To run integration tests: + +``` +make test-integration +``` + +Also test watcher can be launched. It will re-run the entire test suite when any file is modified + +``` +make test-integration WATCH=true +``` diff --git a/doc/tests/tests-overview.md b/doc/tests/tests-overview.md new file mode 100644 index 00000000000..6a60149affe --- /dev/null +++ b/doc/tests/tests-overview.md @@ -0,0 +1,167 @@ +# Tests + +## Introduction + +This document provides a general overview of the types of tests we use and when +to use them. It is not meant to be a tutorial or a detailed documentation about +testing in software development. + +## Types of tests + +Tests in `status-mobile` are comprised of: + +- Unit tests + - Subscription tests + - Event tests + - Tests for various utilities +- [Component tests](./component-tests-overview.md) +- Integration/contract tests +- [End-to-end tests](./how-to-launch-e2e.md) + +We apply the [test +pyramid](https://en.wikipedia.org/wiki/Test_automation#Testing_at_different_levels) +strategy, which means we want the majority of tests at the bottom of the +pyramid. Those should be fast and deterministic and support REPL-Driven +development (RDD). Slightly above them, we have component tests, then +integration/contract tests and finally end-to-end tests. The closer to the top +of the pyramid, the more valuable a test can be, but also more difficult to +pinpoint why it failed and harder to make it dependable. + +*Note*: there are literally dozens of [types of +tests](https://en.wikipedia.org/wiki/Software_testing), each with its strengths +and weaknesses. + +We tend not to stub or mock implementations in our tests, which means our tests +are [sociable](https://martinfowler.com/bliki/UnitTest.html). + +## What to test? + +The UI is driven by global & local state changes caused by events. Global state +is managed by re-frame and local state by Reagent atoms or React hooks. Except +for component and end-to-end tests, we test only non-UI code in `status-mobile`. +Given that the UI is greatly derived from global state, by guaranteeing the +state is correct we can prevent bugs and, more importantly, reduce the [cost of +change](https://www.pmi.org/disciplined-agile/agile/costofchange). + +We strive to minimize the amount of _business logic_ in views (UI code). We +achieve this by moving capabilities to status-go and also by adhering to +re-frame's architecture. + +Whenever appropriate (see section `When to test?`), we _may_ test: + +- Re-frame events. +- Re-frame subscriptions. +- Utility functions. +- User journeys through integration/contract tests. + +Interestingly, we don't test re-frame _effects_ in isolation. + +### What are status-mobile integration and contract tests? + +The mobile _integration tests_ can be used to "simulate" user interactions and +make actual calls to status-go via the RPC layer and actually receive signals. +We can also use these tests to verify the app-db and multiple subscriptions are +correct. We use the word _simulate_ because there is no UI. Basically, any flow +that can be driven by re-frame events is possible to automatically test. There +is no way to change or inspect local state managed by React. + +A _contract test_ has the same capabilities as an integration test, but we want +to draw the line that they should focus more on a particupar RPC endpoint or +signal, and not on a user journey (e.g. create a wallet account). In the future, +we may consider running them automatically in status-go. + +**Note:** integration tests and contract tests are currently overlapping in +their responsibilities and still require a clearer distinction. + +## When to test? + +(Automated) tests basically exist to support rapid software changes, but not +every piece of code should be tested. The following are general recommendations, +not rules. + +- What would be the consequences to the user of a bug in the implementation you + are working on? +- Can a QA exercise all the branches in the code you changed? Not surprisingly, + usually QAs can't test many code paths (it may be nearly impossible), and + because PRs are not often tested by reviewers, many PRs can get into `develop` + without the necessary quality assurance. +- How costly was it for you to verify a function/event/etc was correct? Now + consider that this cost will be dispersed to every developer who needs to + change the implementation if there are no tests. +- Check the number of conditionals, and if they nest as well. Every conditional + may require two different assertions, and the number of assertions can grow + exponentially. +- How complicated are the arguments to the function? If they contain nested maps + or data that went through a few transformations, it may be tricky to decipher + what they are, unless you are familiar with the code. A test would be able to + capture the data, however complex they are. + +### When to unit-test subscriptions? + +Only test [layer-3 +subscriptions](https://day8.github.io/re-frame/subscriptions/#the-four-layers), +i.e. don't bother testing extractor subscriptions (check the related +[guideline](https://github.com/status-im/status-mobile/blob/7774c4eac16fdee950a17bf5d07630c45a980f41/doc/new-guidelines.md#subscription-tests)). +Some layer-3 subscriptions can still be straightforward and may not be worth +testing. + +- Check the number of _inputs_ to the sub (from the graph). The higher this + number, the greater the chance the subscription can break if any of the + input's implementation changes. + +**Note**: if a tested subscription changes inadvertently, even if its own tests +still pass, other subscriptions that depend on it and have tests may still fail. +This is why we don't directly test the subscription handler, but instead, use +the macro `test-helpers.unit/deftest-sub`. + +### When to unit-test events? + +A good hint is to ask if you and other CCs need to rely on re-frisk, UI, REPL, +or FlowStorm to understand the event. If the answer is yes or probably, then a +test would be prudent. + +- Many events only receive arguments and pass them along without much or any + transformation to an RPC call. These are straightforward and usually don't + need tests ([example](https://github.com/status-im/status-mobile/blob/7774c4eac16fdee950a17bf5d07630c45a980f41/src/status_im/contexts/contact/blocking/events.cljs#L79-L85)). +- Overall, every event basically returns two effects at most, `:fx` and/or + `:db`. Usually, the complicated part lies in the computation to return the new + app-db. If the event doesn't perform transformations in the app-db or just + does a trivial `assoc`, for example, it may not be worth testing. + +For reference, the re-frame author particularly [suggests testing events and +subscriptions](https://github.com/day8/re-frame/blob/09e2d7132c479aa43f2a64164e54e42bf8511902/docs/Testing.md#what-to-test). + +### When to unit-test utility functions? + +Most utility functions in `status-mobile` are pure and can be readily and +cheaply tested. + +- If the utility is used in an event/subscription and if the event/subscription + has tests, you may prefer to test the event/subscription and not the utility, + or the other way around sometimes. +- If the utility is tricky to verify, such as functions manipulating time, write + tests ([example](https://github.com/status-im/status-mobile/blob/7774c4eac16fdee950a17bf5d07630c45a980f41/src/utils/datetime.cljs#L1)). +- Utilities can be particularly hard to verify by QAs because they can be lower + level and require very particular inputs. In such cases, consider writing + tests. + +### When to write integration/contract tests? + +- You want to make real calls to status-go because you think the unit tests are + not enough (test pyramid strategy). +- You constantly need to retest the same things on the UI, sometimes over + multiple screens. +- The flow is too important to rely only on manual QA, which can't always be + done due to resource limits, so an integration/contract test fills this gap. +- You want to rely less on end-to-end tests, which can be more unreliable and + slower to change. +- You want automatic verifications for some area of the mobile app whenever + status-go is upgraded. + +**Note**: the feedback cycle to write integration tests is longer than unit +tests because they are slower and harder to debug. Using the REPL with them is +difficult due to their stateful nature. + +### When to test Quo components? + +This is covered in [quo/README.md#component-tests](https://github.com/status-im/status-mobile/blob/7774c4eac16fdee950a17bf5d07630c45a980f41/src/quo/README.md#component-tests). diff --git a/doc/troubleshooting.md b/doc/troubleshooting.md new file mode 100644 index 00000000000..9e203f396a4 --- /dev/null +++ b/doc/troubleshooting.md @@ -0,0 +1,146 @@ +## `yarn add` is not working + +While running any yarn add command like `yarn add react-native-share@7.0.2`, it is showing error + +``` +error status-mobile/node_modules/better-sqlite3: Command failed. +``` + +### Cause + +Local `node` version can be different from the one needed by Status project. + +### Solution + +Before running `yarn add`, nix shell should be started: + +``` +make shell +``` + + +## [DEPRECATED] Undefined is not an object evaluating `register_handler_fx` + +### Deprecation note + +This type of error should not occur anymore now that we require the namespace in the `fx.cljs` file. + +It can however happen with other macros requiring a cljs namespace. + +The general fix for that type of issue is to have two files for the namespace where your macros are defined, let's say for `my-project.my-macro` namespace you would have: +- my_macro.cljs in which you need `(:require-macros my-project.my-macro)` and `(:require my-project.the-namespace-used-in-the-macro)` +- my_macro.clj in which you define the macro + +That way you don't need to use any magical call like `find-ns` or inline `require` with some kind of call only once switch (which was the root cause of another bug in ``defstyle`` macro because the compilation phase at which the evaluation of the switch is done was not properly considered). + +You also want to make sure users are using the macro by using a aliased namespace defined in require statement rather than require-macro and refer to the macro directly. Otherwise it won't require the cljs file and the require statement of the namespace in the macroexpension might not be there. + +### Stacktrace + +``` +13:25:22, Requiring: hi-base32 +13:25:23, Possible Unhandled Promise Rejection (id: 0): +TypeError: undefined is not an object (evaluating 'status_im.utils.handlers.register_handler_fx') +eval code +eval@[native code] +asyncImportScripts$@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:200728:21 +tryCatch@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26567:23 +invoke@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26742:32 +tryCatch@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26567:23 +invoke@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26643:30 +http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:26653:21 +tryCallOne@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:3725:16 +http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:3826:27 +_callTimer@http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false:28405:17 +_callImmediatesPass@http://localhost:8081/index.bundle?pla<…> +``` + +### Cause + +- stacktrace mentions `register_handler_fx`, +- common cause is when requires have been cleaned up and a require of `status-im.utils.handlers` namespace was removed because it looked like it was unused but was actually used through a fx/defn macro + +### Solution + +go through known faulty commit looking for deleted requires + + +## Git "unable to access" errors during `yarn install` + +### Description +Developer updates `package.json` file with a new dependency using a GitHub URL. So it looks like this: +``` + "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#feature/exportKeyWithPath", +``` +Afterwards, when running e.g. `make run-metro`, they might see the following confusing error: +``` +# macOS +fatal: unable to access 'https://github.com/siphiuel/react-native-status-keycard.git/': SSL certificate problem: unable to get local issuer certificate +# Linux +fatal: unable to access 'https://github.com/status-im/react-native-status-keycard.git/': Could not resolve host: github.com +info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command. +``` + +### Cause +`yarn.lock` is not updated to be in sync with `package.json`. + +### Solution +Update yarn.lock file. In order to do this, perform the following steps on a clean `status-mobile` repo: +``` +cd status-mobile +make shell +yarn install +``` +and don't forget to commit updated `yarn.lock` together with `package.json`. + + +## adb server/client version mismatch errors + +### Description +Running some adb commands, e.g. `adb devices` or `make android-ports` (in turn invokes `adb reverse`/`adb forward` commands) may display the following message: +``` +adb server version (40) doesn't match this client (41); killing... +``` +or the reverse +``` +adb server version (41) doesn't match this client (40); killing... +``` + +This might cause all kinds of difficult-to-debug errors, e.g.: + - not being able to find the device through `adb devices` + - `make run-android` throwing `com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: device 'device-id' not found.` + - `make run-android` throwing `- Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081 Unable to install /status-mobile/android/app/build/outputs/apk/debug/app-debug.apk com.android.ddmlib.InstallException: EOF` + - dropped CLJS repl connections (that have been enabled previously with the help of `make android-ports`) + +### Cause +System's local adb and Nix's adb differ. As adb include of server/client processes, this can cause subtle version errors that cause adb to kill mismatching server processes. + +### Solution +Always use respective `make` commands, e.g. `make android-ports`, `make android-devices`, etc. + +Alternatively, run adb commands only from `make shell TARGET=android` shell. Don't forget the `TARGET=android` env var setting - otherwise `adb` will still be selected from the system's default location. You can double-check this by running `which adb`. + +# Hot Reloading Crashes +## APP Crashes on reloading changes + +### Cause +Status-mobile uses `shadow-cljs` for hot reloading changes and uses its own [reloader](https://github.com/status-im/status-mobile/blob/develop/src/status_im/reloader.cljs) for updating them in the running app. If react-native's fast refresh is also enabled then it creates conflicts and crashes the app. + +### Solution +Open react native's [In-App Developer Menu](https://reactnative.dev/docs/debugging#accessing-the-in-app-developer-menu) and press "Disable Fast Refresh" or "Disable Hot Reloading" + +# App crashing after running `make run-ios` + +### Cause +It's possible that installing XCode from a `.xip` file might cause XCode to act funny +Since it's not installed from the App Store, Or you might be missing a Rosetta installation. + +[Reference/Similar issue](https://github.com/expo/expo-cli/issues/3197) + +You might see something like this after running `make run-ios`: +``` +Underlying error (domain=FBSOpenApplicationServiceErrorDomain, code=1): +``` +### Solution +Run `softwareupdate --install-rosetta --agree-to-license` +to accept XCode's license and install Rosetta. diff --git a/doc/ui-guidelines.md b/doc/ui-guidelines.md new file mode 100644 index 00000000000..cd659c6a061 --- /dev/null +++ b/doc/ui-guidelines.md @@ -0,0 +1,254 @@ +# UI components coding guidelines + +> [!IMPORTANT] +> React apps are made out of components. A component is a piece of the UI (user interface) that has its own logic and appearance. A component can be as small as a button, or as large as an entire screen. +> React components are JavaScript functions that return markup +> This document will provide best practices on how to write efficient React components in ClojureScript + + +At the time of creating the Status app, the Reagent library was a solid choice. Back then, hooks didn't exist, and there weren't any libraries providing effective global state management. After Reagent's emergence, another library called Re-frame built upon Reagent. Together, they offered powerful tools for developing React applications with ClojureScript. However, as React evolved, significant changes occurred. Class components, utilized in Reagent, became deprecated. Instead, functional components and hooks emerged for state management. In Status 2.0, we began incorporating more functional components and hooks, resulting in a blend of both approaches. To simplify matters and reduce confusion, we opted to transition to functional components and hooks for local state management. + +BEFORE: +```clojure +(defn- view-internal + [_ _] + (let [pressed? (reagent/atom false)] + (fn + [{:keys [theme on-press on-long-press icon]}] + [rn/pressable + {:style (style/main @pressed? theme) + :on-press on-press + :on-press-in #(reset! pressed? true) + :on-press-out #(reset! pressed? nil) + :on-long-press on-long-press} + [quo.icons/icon icon]]))) + +(def view (theme/with-theme view-internal)) +``` + +NOW: +```clojure +(defn view + [{:keys [on-press on-long-press icon]}] + (let [[pressed? set-pressed] (rn/use-state false) + theme (context/use-theme) + on-press-in (rn/use-callback #(set-pressed true)) + on-press-out (rn/use-callback #(set-pressed nil))] + [rn/pressable + {:style (style/main pressed? theme) + :on-press on-press + :on-press-in on-press-in + :on-press-out on-press-out + :on-long-press on-long-press} + [quo.icons/icon icon]])) +``` + + +- We no longer need to create an anonymous function for rendering. This removes unnecessary confusion and the need for specific knowledge on how it works and why it was needed. +- `rn/use-state` is used instead of `reagent/atom` +- State values no longer need to be dereferenced; they are accessible as regular symbols. This eliminates a common bug where the "@" symbol was inadvertently omitted. +- `theme/with-theme` wrapper is not needed anymore, `(theme/use-theme)` hook can be used directly in the components +- `:f>` not needed anymore, all components are functional by default +- `rn/use-callback` hook should be used for anon callback functions + +> [!IMPORTANT] +> DO NOT USE anon functions directly in the props + +BAD +```clojure +(defn view + [] + (let [[pressed? set-pressed] (rn/use-state false)] + [rn/pressable + {:style (style/main pressed?) + :on-press-in #(set-pressed true) + :on-press-out #(set-pressed nil)}])) +``` + +GOOD: +```clojure +(defn view + [] + (let [[pressed? set-pressed] (rn/use-state false) + on-press-in (rn/use-callback #(set-pressed true)) + on-press-out (rn/use-callback #(set-pressed nil))] + [rn/pressable + {:style (style/main pressed?) + :on-press-in on-press-in + :on-press-out on-press-out}])) +``` + +## Global state and subscriptions + +For global state management, we utilize Re-frame subscriptions. They can be likened to React state. To obtain the state, `(rf/sub [])` is employed, and to modify it, `(rf/dispatch [])` is utilized. However, they update components in a similar manner to React states. + +```clojure +(defn view + [{:keys [selected-tab]}] + (let [collectible-list (rf/sub [:wallet/all-collectibles]) + on-collectible-press (rn/use-callback + (fn [{:keys [id]}] + (rf/dispatch [:wallet/get-collectible-details id])))] + [rn/view {:style style/container} + (case selected-tab + :assets [assets/view] + :collectibles [collectibles/view {:collectibles collectible-list + :on-collectible-press on-collectible-press}]) + [activity/view]])) +``` + +## Regular atoms + +In certain instances, components utilized regular atoms; however, they should now be used with `rn/use-ref-atom` + +BEFORE: +```clojure +(defn view + [] + (let [focused? (atom false)] + (fn [] + (let [on-clear #(reset! status (if @focused? :active :default)) + on-focus #(reset! focused? true) + on-blur #(reset! focused? false)])))) +``` + +NOW: +```clojure +(defn view + [] + (let [focused? (rn/use-ref-atom false) + on-clear (rn/use-callback #(set-status (if @focused? :active :default))) + on-focus (rn/use-callback #(reset! focused? true)) + on-blur (rn/use-callback #(reset! focused? false))])) +``` + +## Effects + +LIFECYCLE: + +```clojure +(defn view + [{:keys []}] + (let [opacity (reanimated/use-shared-value 0)] + (rn/use-mount #(reanimated/animate opacity 1)) + [rn/view + {:style (style/opacity opacity)}])) +``` + +```clojure +(defn view + [{:keys []}] + (let [] + (rn/use-unmount #(rn/dispatch [:unmounted])) + [rn/view])) +``` + +> [!IMPORTANT] +> Effects should NOT be utilized as a response to state changes for modifying logic. If you're unsure how to achieve this without using effects, please consult the team in the general chat. There may be instances where using effects is appropriate, so we can explore a solution together and enhance our guidelines. + +BAD: +```clojure +(defn f-zoom-button + [{:keys [selected? current-zoom]}] + (let [size (reanimated/use-shared-value (if selected? 37 25))] + (rn/use-effect #(reanimated/animate size (if selected? 37 25)) [current-zoom]) + [rn/touchable-opacity + {:style (style/zoom-button-container size)}])) +``` + +BAD: + +```clojure +(defn view + [collectible-list (rf/sub [:wallet/all-collectibles])] + (let [] + (rn/use-effect #(rn/dispatch [:all-collectibles-changed]) [collectible-list]) + [rn/view])) +``` + +Instead `:all-collectibles-changed` should be used in the handler which changes `collectible-list` state + + + +## Performance tips + +To begin with, we need to understand that there are two distinct stages for a component: creation and update. React creates a render tree, a UI tree, composed of the rendered components. + +![react_tree.png](react_tree.png) + +### Component creation + +For component creation, the most critical factor is the number of elements involved, so we should strive to minimize them. For instance, it's advisable to avoid using unnecessary wrappers or containers. + +BAD: + +```clojure +(defn view + [] + (let [] + [rn/view {:style {:padding-top 20}} + [quo/button]])) +``` + +GOOD: +```clojure +(defn view + [] + (let [] + [quo/button {:container-style {:padding-top 20}}])) +``` + +### Component updates + +For component updates, it's crucial to recognize that React will invoke the function where state is utilized. Therefore, if you utilize state in the root component, React will execute the root function and re-render the entire root component along with all its children (unless optimizations like memoization are implemented). + +BAD: + +```clojure +(defn component + [{:keys [label]}] + (let [] + [rn/text label])) + +(defn component2 + [{:keys [label2]}] + (let [] + [rn/text label2])) + +(defn screen + [] + (let [screen-params (rf/sub [:screen-params])] + [component screen-params] + [component1] + [component2 screen-params] + [component3] + [rn/view {:padding-top 20} + [quo/button]])) +``` + +Here, we have lost control over the `screen-params` map. It can contain any data, and if any field within this map changes, the entire screen function will be executed, resulting in the re-rendering of both `component` and `component2`. + +GOOD: +```clojure +(defn component + [] + (let [label (rf/sub [:screen-params-label])] + [rn/text label])) + +(defn component2 + [] + (let [label2 (rf/sub [:screen-params-label2])] + [rn/text label2])) + +(defn screen + [] + (let [] + [component] + [component1] + [component2] + [component3] + [rn/view {:padding-top 20} + [quo/button]])) +``` + +So, now the screen component function will never be invoked, and `component` and `component2` will be re-rendered only when `label` or `label2` have changed. diff --git a/doc/use-status-backend-server.md b/doc/use-status-backend-server.md new file mode 100644 index 00000000000..db297aa9a3c --- /dev/null +++ b/doc/use-status-backend-server.md @@ -0,0 +1,61 @@ +## What is Status Backend Server +Status Backend Server is a http server that runs status-go, it exposed endpoints come from [mobile/status.go](https://github.com/status-im/status-go/blob/master/mobile/status.go) so that you can call them through http requests. It brings the following benefits: +- When verifying changes made in status-go, you only need to run these commands once (unless modifying Kotlin/Objective-C code): + - `make clean && make run-clojure` + - `make run-android` or `make run-ios` + This avoids repeatedly rebuilding and saves development time. +- Debug status-go while running status mobile app + +## Solution to use Status Backend Server for mobile development +`StatusBackendClient` is the entry point to use Status Backend Server. We need always to call `status-im.setup.status-backend-client/init` whether `STATUS_BACKEND_SERVER_ENABLED` is `1` or not. If it's not enabled, the invocation to functions in `native-module.core` will be delegated to built-in status-go library, otherwise it will be delegated to status-go running in status-backend server. Currently, all functions has usages in `native-module.core` should be supported delegated to. +NOTE: not all the native functions used `StatusBackendClient`, only the corresponding functions in `native-module.core` has usages should be supported delegated to ATM. + +related [PR](https://github.com/status-im/status-mobile/pull/21550) + +## Usage +### Add environment variables to your local machine: +```shell +# enable using status backend server or not, otherwise it will use built-in status-go library +export STATUS_BACKEND_SERVER_ENABLED=1 + +#The host should contain an IP address and a port separated by a colon. +#The port comes from your running status backend server. +#If you run it by PORT=60000 make run-status-backend , then host will likely be 127.0.0.1:60000 +export STATUS_BACKEND_SERVER_HOST="127.0.0.1:60000" + +export STATUS_BACKEND_SERVER_ROOT_DATA_DIR="/path/to/your/root/data/dir" +``` +You need to change `STATUS_BACKEND_SERVER_ROOT_DATA_DIR` to your preferred directory and ensure it exists, it should be in absolute path. +All the db files and log files(api.log/geth.log) and keystore files etc will be stored in this directory. + +### Start the status backend server: +```shell +PORT=60000 make run-status-backend +``` +MAKE SURE the status-backend is checked out to a revision that's at least compatible with the revision in status-mobile/status-go-version.json before starting the server. + +For the Android simulator, you need to reverse the port: +```shell +adb reverse tcp:60000 tcp:60000 +``` +However, there is restriction when use adb reverse, we use random port for media server. So I'd suggest use "10.0.2.2:60000" as `STATUS_BACKEND_SERVER_HOST`. + +### Debug status-go using IDEA +Assume you've already set up the development environment for status-go, open status-go project use IDEA, run `make generate` with terminal in the status-go project root directory to ensure all the generated files are up to date, then open `cmd/status-backend/main.go` file, navigate to function `main()`, click the green play button on the left of `main()`, choose `Modify Run Configuration`, in `Program arguments` section, add `--address=localhost:60000 --media-https=false`, then click `OK`, finally click the green play button on the left of `main()` again and choose `Debug ...`. +Basically, you don't have to run `make generate` again and again, just run it once at the beginning. So you can re-run and debug it faster! + +## Known Android simulator issues +- Issue#1: Android simulator may not display images due to TLS certificate validation issues with the image server + - solution: use http instead of https for media server with set env: `export STATUS_BACKEND_SERVER_MEDIA_SERVER_ENABLE_TLS=0`, you also need to set env variable `STATUS_BACKEND_SERVER_IMAGE_SERVER_URI_PREFIX` to "http://10.0.2.2:" so that `image_server.cljs` can work, and to make `/accountInitials` work, you need to copy `Inter-Medium.ttf` to your host machine from the android simulator, let's say you store it in `/Users/mac/Downloads/Inter-Medium.ttf`, then you need to update `get-font-file-ready` manually in `image_server.cljs` to return the correct path so that status backend server can access it. +- Issue#2: exportUnencryptedDatabaseV2/import-multiaccount does not work for android, probably cause of tech debt, I found it during creating the draft PR. +- Issue#3: unable to invoke `multiaccounts_storeIdentityImage` to change avatar image. + - The reason is that we path the absolute path of the image to the backend server, but the image file is stored in the android simulator. the backend server cannot access it as it runs in the host machine. + +If you're using ios simulator, you can skip above issues! + +## Details for issue#1 if you're interested +- we use `react-native-fast-image` which use okhttpclient behind +- we were using custom cert for https +- we fetch the custom cert through endpoint `ImageServerTLSCert` +- we fetched it through built-in status-go before, now we need to fetch it through status backend server +- we expect `OkHttpClientProvider.setOkHttpClientFactory(StatusOkHttpClientFactory())` to be invoked early(will trigger fetching wrong custom cert via built-in status-go since StatusBackendClient is not initialised yet!) in `MainApplication.kt` before executing clojure code, otherwise we will get black screen after `make run-android` . After deep research, I found there's no way to update the cert okhttpclient used to the correct one return from status backend server diff --git a/env/dev/env/android/main.cljs b/env/dev/env/android/main.cljs deleted file mode 100644 index db9bab1360d..00000000000 --- a/env/dev/env/android/main.cljs +++ /dev/null @@ -1,28 +0,0 @@ -(ns ^:figwheel-no-load env.android.main - (:require [reagent.core :as r] - [status-im.android.core :as core] - [figwheel.client :as figwheel] - [re-frisk-remote.core :as rr] - [env.config :as conf] - [env.utils] - [status-im.utils.handlers :as utils.handlers])) - -(enable-console-print!) - -(assert (exists? core/init) "Fatal Error - Your core.cljs file doesn't define an 'init' function!!! - Perhaps there was a compilation failure?") -(assert (exists? core/app-root) "Fatal Error - Your core.cljs file doesn't define an 'app-root' function!!! - Perhaps there was a compilation failure?") - -(def cnt (r/atom 0)) -(defn reloader [props] @cnt [core/app-root props]) - -;; Do not delete, root-el is used by the figwheel-bridge.js -(def root-el (r/reactify-component reloader)) - -(figwheel/start {:websocket-url (:android conf/figwheel-urls) - :heads-up-display false - :jsload-callback #(swap! cnt inc)}) - -(utils.handlers/add-pre-event-callback rr/pre-event-callback) - -(rr/enable-re-frisk-remote! {:host (env.utils/re-frisk-url (:android conf/figwheel-urls)) - :on-init core/init}) diff --git a/env/dev/env/desktop/main.cljs b/env/dev/env/desktop/main.cljs deleted file mode 100644 index 687e69e7763..00000000000 --- a/env/dev/env/desktop/main.cljs +++ /dev/null @@ -1,28 +0,0 @@ -(ns ^:figwheel-no-load env.desktop.main - (:require [reagent.core :as r] - [re-frisk-remote.core :as rr] - [status-im.desktop.core :as core] - [status-im.utils.handlers :as utils.handlers] - [figwheel.client :as figwheel] - [env.config :as conf] - [env.utils])) - -(enable-console-print!) - -(assert (exists? core/init) "Fatal Error - Your core.cljs file doesn't define an 'init' function!!! - Perhaps there was a compilation failure?") -(assert (exists? core/app-root) "Fatal Error - Your core.cljs file doesn't define an 'app-root' function!!! - Perhaps there was a compilation failure?") - -(def cnt (r/atom 0)) -(defn reloader [props] @cnt [core/app-root props]) - -;; Do not delete, root-el is used by the figwheel-bridge.js -(def root-el (r/reactify-component reloader)) - -(figwheel/start {:websocket-url (:desktop conf/figwheel-urls) - :heads-up-display false - :jsload-callback #(swap! cnt inc)}) - -(utils.handlers/add-pre-event-callback rr/pre-event-callback) - -(rr/enable-re-frisk-remote! {:host (env.utils/re-frisk-url (:desktop conf/figwheel-urls)) - :on-init core/init}) diff --git a/env/dev/env/ios/main.cljs b/env/dev/env/ios/main.cljs deleted file mode 100644 index fb4a045ccf0..00000000000 --- a/env/dev/env/ios/main.cljs +++ /dev/null @@ -1,28 +0,0 @@ -(ns ^:figwheel-no-load env.ios.main - (:require [reagent.core :as r] - [re-frisk-remote.core :as rr] - [status-im.ios.core :as core] - [status-im.utils.handlers :as utils.handlers] - [figwheel.client :as figwheel] - [env.config :as conf] - [env.utils])) - -(enable-console-print!) - -(assert (exists? core/init) "Fatal Error - Your core.cljs file doesn't define an 'init' function!!! - Perhaps there was a compilation failure?") -(assert (exists? core/app-root) "Fatal Error - Your core.cljs file doesn't define an 'app-root' function!!! - Perhaps there was a compilation failure?") - -(def cnt (r/atom 0)) -(defn reloader [props] @cnt [core/app-root props]) - -;; Do not delete, root-el is used by the figwheel-bridge.js -(def root-el (r/reactify-component reloader)) - -(figwheel/start {:websocket-url (:ios conf/figwheel-urls) - :heads-up-display false - :jsload-callback #(swap! cnt inc)}) - -(utils.handlers/add-pre-event-callback rr/pre-event-callback) - -(rr/enable-re-frisk-remote! {:host (env.utils/re-frisk-url (:ios conf/figwheel-urls)) - :on-init core/init}) diff --git a/env/dev/env/utils.cljs b/env/dev/env/utils.cljs deleted file mode 100644 index 25253b1a426..00000000000 --- a/env/dev/env/utils.cljs +++ /dev/null @@ -1,21 +0,0 @@ -(ns env.utils - (:require [clojure.string :as string])) - -(defn get-host - "Expects the input url to be in the form protocol://host:port - Returns host or an empty string upon failure" - [url] - (-> - url - (string/split #"/") - (get 2 "") - (string/split #":") - (get 0 ""))) - -(defn re-frisk-url - "Expects the input url to be in the form ws://host:port/figwheel-ws" - [url] - (let [host (get-host url)] - (if (string/blank? host) - (throw (js/Error. "Failed to parse figwheel url. re-frisk url cannot be blank")) - (str host ":" 4567)))) diff --git a/env/dev/figwheel.clj b/env/dev/figwheel.clj deleted file mode 100644 index ec285848d44..00000000000 --- a/env/dev/figwheel.clj +++ /dev/null @@ -1,31 +0,0 @@ -(ns figwheel - (:require [clojure.string :as s])) - -(defn system-options [builds-to-start] - {:nrepl-port 7888 - :builds [{:id :desktop - :source-paths ["react-native/src/cljsjs" "react-native/src/desktop" "src" "env/dev"] - :compiler {:output-to "target/desktop/app.js" - :main "env.desktop.main" - :output-dir "target/desktop" - :npm-deps false - :optimizations :none} - :figwheel true} - {:id :ios - :source-paths ["react-native/src/cljsjs" "react-native/src/mobile" "src" "env/dev"] - :compiler {:output-to "target/ios/app.js" - :main "env.ios.main" - :output-dir "target/ios" - :npm-deps false - :optimizations :none} - :figwheel true} - {:id :android - :source-paths ["react-native/src/cljsjs" "react-native/src/mobile" "src" "env/dev"] - :compiler {:output-to "target/android/app.js" - :main "env.android.main" - :output-dir "target/android" - :npm-deps false - :optimizations :none} - :warning-handlers '[status-im.utils.build/warning-handler] - :figwheel true}] - :builds-to-start builds-to-start}) diff --git a/env/dev/figwheel_api.clj b/env/dev/figwheel_api.clj deleted file mode 100644 index 5045ed7959f..00000000000 --- a/env/dev/figwheel_api.clj +++ /dev/null @@ -1,36 +0,0 @@ -(ns figwheel-api - (:use [figwheel-sidecar.repl-api :as ra]) - (:require [hawk.core :as hawk] - [re-frisk-sidecar.core :as rfs] - [status-im.utils.core :as utils] - [figwheel :as config])) - -(defn start-figwheel - "Start figwheel for one or more builds" - [build-ids] - (ra/start-figwheel! (config/system-options build-ids))) - -(defn stop-figwheel - "Stops figwheel" - [] - (ra/stop-figwheel!)) - -(defn start - ([] - (start (if *command-line-args* - (map keyword *command-line-args*) - [:android]))) - ([build-ids] - (hawk/watch! [{:paths ["resources"] - :handler (fn [ctx e] - (let [path "src/status_im/utils/js_resources.cljs" - js-resourced (slurp path)] - (spit path (str js-resourced " ;;")) - (spit path js-resourced)) - ctx)}]) - (start-figwheel build-ids) - (rfs/-main))) - -(def stop ra/stop-figwheel!) - -(def start-cljs-repl ra/cljs-repl) diff --git a/env/dev/run.clj b/env/dev/run.clj deleted file mode 100644 index e1b46f903da..00000000000 --- a/env/dev/run.clj +++ /dev/null @@ -1,5 +0,0 @@ -(ns ^:figwheel-no-load run - (:use [figwheel-api])) - -(start) -(start-cljs-repl) diff --git a/env/prod/env/android/main.cljs b/env/prod/env/android/main.cljs deleted file mode 100644 index b1e717e0781..00000000000 --- a/env/prod/env/android/main.cljs +++ /dev/null @@ -1,6 +0,0 @@ - (ns env.android.main - (:require [status-im.android.core :as core])) - - (core/init) - - diff --git a/env/prod/env/desktop/main.cljs b/env/prod/env/desktop/main.cljs deleted file mode 100644 index e23508305bb..00000000000 --- a/env/prod/env/desktop/main.cljs +++ /dev/null @@ -1,4 +0,0 @@ - (ns env.desktop.main - (:require [status-im.desktop.core :as core])) - - (core/init) \ No newline at end of file diff --git a/env/prod/env/ios/main.cljs b/env/prod/env/ios/main.cljs deleted file mode 100644 index 67664f36de6..00000000000 --- a/env/prod/env/ios/main.cljs +++ /dev/null @@ -1,6 +0,0 @@ - (ns env.ios.main - (:require [status-im.ios.core :as core])) - - (core/init) - - diff --git a/externs.js b/externs.js deleted file mode 100644 index d49c0b0f23f..00000000000 --- a/externs.js +++ /dev/null @@ -1,625 +0,0 @@ -var TopLevel = { - "abs" : function () {}, - "ActionSheetIOS" : function () {}, - "add" : function () {}, - "addEventListener" : function () {}, - "addListener" : function () {}, - "addPeer" : function () {}, - "addSymKey" : function () {}, - "addTier2Support" : function () {}, - "Alert" : function () {}, - "alert" : function () {}, - "all" : function () {}, - "Android" : function () {}, - "android" : function () {}, - "Animated" : function () {}, - "append" : function () {}, - "appStateChange" : function () {}, - "args" : function () {}, - "argv" : function () {}, - "Array" : function () {}, - "array" : function () {}, - "AsyncStorage" : function () {}, - "at" : function () {}, - "back" : function () {}, - "BACK" : function () {}, - "BackHandler" : function () {}, - "balanceOf" : function () {}, - "bezier" : function () {}, - "BigNumber" : function () {}, - "blur" : function () {}, - "button" : function () {}, - "bytesToHex" : function () {}, - "call" : function () {}, - "callPrivateRPC" : function () {}, - "callRPC" : function () {}, - "canImplyAuthentication" : function () {}, - "catch" : function () {}, - "Chance" : function () {}, - "changePin" : function () {}, - "Channel" : function () {}, - "chaosModeUpdate" : function () {}, - "charCodeAt" : function () {}, - "checkAddressChecksum" : function () {}, - "checkVideoAuthorizationStatus" : function () {}, - "author": function() {}, - "encryptionId": function() {}, - "chat": function() {}, - "messageId": function() {}, - "clear" : function () {}, - "clearCookies" : function () {}, - "clearInterval" : function () {}, - "clearStorageAPIs" : function () {}, - "clearTimeout" : function () {}, - "Clipboard" : function () {}, - "close" : function () {}, - "closeApplication" : function () {}, - "code" : function () {}, - "concat" : function () {}, - "confirmMessagesProcessed" : function () {}, - "chats": function() {}, - "rawMessages": function() {}, - "messages": function() {}, - "discovery": function() {}, - "dismiss": function() {}, - "negotiated": function() {}, - "chatId": function() {}, - "confirmMessagesProcessedByID" : function () {}, - "connectionChange" : function () {}, - "console" : function () {}, - "contacts": function () {}, - "ContactRequest" : function () {}, - "ContactRequestConfirmed" : function () {}, - "ContactRequestConfirmedHandler" : function () {}, - "ContactRequestHandler" : function () {}, - "ContactUpdate" : function () {}, - "ContactUpdateHandler" : function () {}, - "contentOffset" : function () {}, - "contentSize" : function () {}, - "contract" : function () {}, - "createAccount" : function () {}, - "createBatch" : function () {}, - "createChannel" : function () {}, - "cubic" : function () {}, - "CURRENCY" : function () {}, - "data" : function () {}, - "Date" : function () {}, - "DateTimeFormat" : function () {}, - "DEBUG" : function () {}, - "decay" : function () {}, - - "dedupId": function() {}, - "DECIMAL_SEP" : function () {}, - "GROUP_SEP" : function () {}, - "PERCENT" : function () {}, - "ZERO_DIGIT" : function () {}, - "PLUS_SIGN" : function () {}, - "MINUS_SIGN" : function () {}, - "EXP_SYMBOL" : function () {}, - "PERMILL" : function () {}, - "INFINITY" : function () {}, - "NAN" : function () {}, - "DECIMAL_PATTERN" : function () {}, - "SCIENTIFIC_PATTERN" : function () {}, - "PERCENT_PATTERN" : function () {}, - "CURRENCY_PATTERN" : function () {}, - "DEF_CURRENCY_CODE" : function () {}, - "decimals" : function () {}, - "decodeURI" : function () {}, - "default" : function () {}, - "defaultAccount" : function () {}, - "defaultSeparator" : function () {}, - "delay" : function () {}, - "DesktopNotification" : function () {}, - "DeviceEventEmitter" : function () {}, - "Dimensions" : function () {}, - "dispatch" : function () {}, - "disableNotifications" : function () {}, - "displayNotification" : function () {}, - "dividedBy" : function () {}, - "DocumentDirectoryPath" : function () {}, - "dx" : function () {}, - "dy" : function () {}, - "ease" : function () {}, - "Easing" : function () {}, - "enableNotifications" : function () {}, - "enableVibration" : function () {}, - "encode" : function () {}, - "encodeURIComponent" : function () {}, - "encryptionKey" : function () {}, - "end" : function () {}, - "endCoordinates" : function () {}, - "entries" : function () {}, - "eq" : function () {}, - "Error" : function () {}, - "error" : function () {}, - "ErrorUtils" : function () {}, - "estimateGas" : function () {}, - "eth" : function () {}, - "event" : function () {}, - "EventEmmiter" : function () {}, - "exec" : function () {}, - "execute" : function () {}, - "exists" : function () {}, - "exportKeyWithPath" : function () {}, - "extPost" : function () {}, - "extractGroupMembershipSignatures" : function () {}, - "identicon": function() {}, - "identiconAsync": function() {}, - "installations": function() {}, - "generateAlias": function() {}, - "generateAliasAsync": function() {}, - "generateAliasAndIdenticonAsync": function() {}, - "fallbacks" : function () {}, - "fetch" : function () {}, - "floor" : function () {}, - "focus" : function () {}, - "format" : function () {}, - "FormData" : function () {}, - "from" : function () {}, - "fromCharCode" : function () {}, - "fromWei" : function () {}, - "generateAndLoadKey" : function () {}, - "generateMnemonic" : function () {}, - "generateSymKeyFromPassword" : function () {}, - "get" : function () {}, - "getApplicationInfo" : function () {}, - "getBalance" : function () {}, - "getBlock" : function () {}, - "getBlockNumber" : function () {}, - "getConnectionInfo" : function () {}, - "getDomain" : function () {}, - "getGasPrice" : function () {}, - "getGenericPassword" : function () {}, - "getGlobalHandler" : function () {}, - "getInitialNotification" : function () {}, - "getInitialURL" : function () {}, - "getInternetCredentials" : function () {}, - "getItem" : function () {}, - "getKeys" : function () {}, - "getLayout" : function () {}, - "getNetwork" : function () {}, - "getNode" : function () {}, - "getNodesFromContract" : function () {}, - "getPublicKey" : function () {}, - "publicKey": function() {}, - "alias": function() {}, - "getSecurityLevel" : function () {}, - "getStateForAction" : function () {}, - "getString" : function () {}, - "getSymKey" : function () {}, - "getSyncing" : function () {}, - "getTimezoneOffset" : function () {}, - "getToken" : function () {}, - "getTransactionReceipt" : function () {}, - "getValue" : function () {}, - "goog" : function () {}, - "greaterThanOrEqualTo" : function () {}, - "GroupMembershipUpdate" : function () {}, - "GroupMembershipUpdateHandler" : function () {}, - "guid" : function () {}, - "hashMessage" : function () {}, - "hashTransaction" : function () {}, - "hashTypedData" : function () {}, - "headers" : function () {}, - "height" : function () {}, - "hexToNumber" : function () {}, - "hexToNumberString" : function () {}, - "hexToUtf8" : function () {}, - "utf8ToHex" : function () {}, - "hide" : function () {}, - "i18n" : function () {}, - "ignoreWarnings" : function () {}, - "in" : function () {}, - "index" : function () {}, - "indexOf" : function () {}, - "init" : function () {}, - "initKeystore" : function () {}, - "injectJavaScript" : function () {}, - "installApplet" : function () {}, - "installAppletAndInitCard" : function () {}, - "Int8Array" : function () {}, - "integer" : function () {}, - "interpolate" : function () {}, - "is24Hour" : function () {}, - "isAddress" : function () {}, - "isConnected" : function () {}, - "isConnectionExpensive" : function () {}, - "isDeviceRooted" : function () {}, - "isFocused" : function () {}, - "isLinux" : function () {}, - "isMacOs" : function () {}, - "isMatches" : function () {}, - "isNaN" : function () {}, - "isUnix" : function () {}, - "isWin" : function () {}, - "isZero" : function () {}, - "Item" : function () {}, - "item" : function () {}, - "JSON" : function () {}, - "jsonEvent" : function () {}, - "keccak512" : function () {}, - "Keyboard" : function () {}, - "language" : function () {}, - "layout" : function () {}, - "layoutMeasurement" : function () {}, - "leftPad" : function () {}, - "length" : function () {}, - "LibraryDirectoryPath" : function () {}, - "Linking" : function () {}, - "locale" : function () {}, - "log" : function () {}, - "login" : function () {}, - "loginWithKeycard" : function () {}, - "logout" : function () {}, - "loop" : function () {}, - "lt" : function () {}, - "mail" : function () {}, - "map" : function () {}, - "map->GroupMembershipUpdate" : function () {}, - "MapEntry" : function () {}, - "markTrustedPeer" : function () {}, - "MaskedData" : function () {}, - "Math" : function () {}, - "Message" : function () {}, - "message" : function () {}, - "MessageHandler" : function () {}, - "MessagesSeen" : function () {}, - "MessagesSeenHandler" : function () {}, - "messaging" : function () {}, - "method" : function () {}, - "metadata": function() {}, - "minus" : function () {}, - "plus" : function () {}, - "mkdir" : function () {}, - "module" : function () {}, - "moveFile" : function () {}, - "Multihash" : function () {}, - "name" : function () {}, - "response-to": function() {}, - "content_type": function() {}, - "message_type": function() {}, - "chat_id": function() {}, - "clock": function() {}, - "nativeEvent" : function () {}, - "NativeEventEmitter" : function () {}, - "NativeModules" : function () {}, - "navigate" : function () {}, - "navigation" : function () {}, - "NavigationActions" : function () {}, - "NavigationEvents" : function () {}, - "newKeyPair" : function () {}, - "newMessageFilter" : function () {}, - "newRawMessageFilter": function() {}, - "newSymKey" : function () {}, - "nfcIsEnabled" : function () {}, - "nfcIsSupported" : function () {}, - "Notification" : function () {}, - "notification" : function () {}, - "notifications" : function () {}, - "now" : function () {}, - "Number" : function () {}, - "NumberFormatSymbols" : function () {}, - "NumberFormatSymbols_af" : function () {}, - "NumberFormatSymbols_am" : function () {}, - "NumberFormatSymbols_ar" : function () {}, - "NumberFormatSymbols_ar_DZ" : function () {}, - "NumberFormatSymbols_az" : function () {}, - "NumberFormatSymbols_be" : function () {}, - "NumberFormatSymbols_bg" : function () {}, - "NumberFormatSymbols_bn" : function () {}, - "NumberFormatSymbols_br" : function () {}, - "NumberFormatSymbols_bs" : function () {}, - "NumberFormatSymbols_cs" : function () {}, - "NumberFormatSymbols_cy" : function () {}, - "NumberFormatSymbols_da" : function () {}, - "NumberFormatSymbols_de_CH" : function () {}, - "NumberFormatSymbols_en" : function () {}, - "NumberFormatSymbols_en_AU" : function () {}, - "NumberFormatSymbols_en_CA" : function () {}, - "NumberFormatSymbols_en_IN" : function () {}, - "NumberFormatSymbols_en_SG" : function () {}, - "NumberFormatSymbols_es_419" : function () {}, - "NumberFormatSymbols_fa" : function () {}, - "NumberFormatSymbols_fil" : function () {}, - "NumberFormatSymbols_he" : function () {}, - "NumberFormatSymbols_hr" : function () {}, - "NumberFormatSymbols_hu" : function () {}, - "NumberFormatSymbols_hy" : function () {}, - "NumberFormatSymbols_id" : function () {}, - "NumberFormatSymbols_is" : function () {}, - "NumberFormatSymbols_ja" : function () {}, - "NumberFormatSymbols_ka" : function () {}, - "NumberFormatSymbols_kk" : function () {}, - "NumberFormatSymbols_km" : function () {}, - "NumberFormatSymbols_ko" : function () {}, - "NumberFormatSymbols_ky" : function () {}, - "NumberFormatSymbols_ln" : function () {}, - "NumberFormatSymbols_lo" : function () {}, - "NumberFormatSymbols_mk" : function () {}, - "NumberFormatSymbols_mn" : function () {}, - "NumberFormatSymbols_mo" : function () {}, - "NumberFormatSymbols_ms" : function () {}, - "NumberFormatSymbols_my" : function () {}, - "NumberFormatSymbols_nb" : function () {}, - "NumberFormatSymbols_ne" : function () {}, - "NumberFormatSymbols_pl" : function () {}, - "NumberFormatSymbols_pt" : function () {}, - "NumberFormatSymbols_ro" : function () {}, - "NumberFormatSymbols_ru" : function () {}, - "NumberFormatSymbols_sh" : function () {}, - "NumberFormatSymbols_si" : function () {}, - "NumberFormatSymbols_sq" : function () {}, - "NumberFormatSymbols_sv" : function () {}, - "NumberFormatSymbols_sw" : function () {}, - "NumberFormatSymbols_th" : function () {}, - "NumberFormatSymbols_tr" : function () {}, - "NumberFormatSymbols_uk" : function () {}, - "NumberFormatSymbols_ur" : function () {}, - "NumberFormatSymbols_uz" : function () {}, - "NumberFormatSymbols_vi" : function () {}, - "NumberFormatSymbols_zh" : function () {}, - "NumberFormatSymbols_zh_HK" : function () {}, - "NumberFormatSymbols_zh_TW" : function () {}, - "numberToHex" : function () {}, - "ok" : function () {}, - "onMessage" : function () {}, - "onNotification" : function () {}, - "onNotificationOpened" : function () {}, - "onTokenRefresh" : function () {}, - "openAccounts" : function () {}, - "openNfcSettings" : function () {}, - "openPicker" : function () {}, - "openURL" : function () {}, - "OS" : function () {}, - "out" : function () {}, - "p" : function () {}, - "pageY" : function () {}, - "pair" : function () {}, - "PairInstallation" : function () {}, - "PairInstallationHandler" : function () {}, - "panHandlers" : function () {}, - "PanResponder" : function () {}, - "parallel" : function () {}, - "parse" : function () {}, - "parseFloat" : function () {}, - "parseInt" : function () {}, - "password" : function () {}, - "path" : function () {}, - "payload" : function () {}, - "PermissionsAndroid" : function () {}, - "PersistentPriorityMap" : function () {}, - "PersonalRequestCommand" : function () {}, - "PersonalSendCommand" : function () {}, - "Platform" : function () {}, - "pow" : function () {}, - "Priority" : function () {}, - "Category" : function () {}, - "High" : function () {}, - "Importance" : function () {}, - "prepareDirAndUpdateConfig" : function () {}, - "Promise" : function () {}, - "props" : function () {}, - "prototype" : function () {}, - "push" : function () {}, - "quad" : function () {}, - "ReactNative" : function () {}, - "readDir" : function () {}, - "readFile" : function () {}, - "recoverAccount" : function () {}, - "reduce" : function () {}, - "register" : function () {}, - "registerComponent" : function () {}, - "registerHeadlessTask" : function () {}, - "reject" : function () {}, - "reload" : function () {}, - "remove" : function () {}, - "removeAllListeners" : function () {}, - "removeEventListener" : function () {}, - "removeKey" : function () {}, - "removeKeyWithUnpair" : function () {}, - "removeListener" : function () {}, - "repeat" : function () {}, - "request" : function () {}, - "requestMessages" : function () {}, - "requestMultiple" : function () {}, - "requestPermission" : function () {}, - "require" : function () {}, - "reset" : function () {}, - "resetGenericPassword" : function () {}, - "resetInternetCredentials" : function () {}, - "resolve" : function () {}, - "respond" : function () {}, - "rightPad" : function () {}, - "round" : function () {}, - "routeName" : function () {}, - "router" : function () {}, - "routes" : function () {}, - "saveAccountAndLogin" : function () {}, - "saveAccountAndLoginWithKeycard" : function () {}, - "schemaVersion" : function () {}, - "scrollTo" : function () {}, - "scrollToEnd" : function () {}, - "scrollToIndex" : function () {}, - "scrollToLocation" : function () {}, - "section" : function () {}, - "selection" : function () {}, - "sendDirectMessage" : function () {}, - "sendLogs" : function () {}, - "sendPairingMessage" : function () {}, - "sendPublicMessage" : function () {}, - "sendToBridge" : function () {}, - "sendTransaction" : function () {}, - "sendTransactionWithSignature" : function () {}, - "separators" : function () {}, - "sequence" : function () {}, - "set" : function () {}, - "setAutoCancel" : function () {}, - "setBackgroundColor" : function () {}, - "setBarStyle" : function () {}, - "setBlankPreviewFlag" : function () {}, - "setCategory" : function () {}, - "setChannelId" : function () {}, - "setCurrentDapp" : function () {}, - "setDockBadgeLabel" : function () {}, - "setGenericPassword" : function () {}, - "setGlobalHandler" : function () {}, - "setGroup" : function () {}, - "setHidden" : function () {}, - "setInternetCredentials" : function () {}, - "setInterval" : function () {}, - "setItem" : function () {}, - "setNativeProps" : function () {}, - "setNetworkActivityIndicatorVisible" : function () {}, - "setPriority" : function () {}, - "setShowBadge" : function () {}, - "setSmallIcon" : function () {}, - "setSoftInputMode" : function () {}, - "setSound" : function () {}, - "setString" : function () {}, - "setTimeout" : function () {}, - "setTranslucent" : function () {}, - "setUsername" : function () {}, - "setValue" : function () {}, - "sha3" : function () {}, - "Share" : function () {}, - "share" : function () {}, - "shh" : function () {}, - "show" : function () {}, - "showActionSheetWithOptions" : function () {}, - "showPicker" : function () {}, - "sign" : function () {}, - "signGroupMembership" : function () {}, - "signMessage" : function () {}, - "signTypedData" : function () {}, - "slice" : function () {}, - "SplashScreen" : function () {}, - "spring" : function () {}, - "stack" : function () {}, - "StackActions" : function () {}, - "start" : function () {}, - "startNode" : function () {}, - "state" : function () {}, - "Status" : function () {}, - "status" : function () {}, - "statusText" : function () {}, - "stop" : function () {}, - "stopAnimation" : function () {}, - "stopNode" : function () {}, - "stopWatching" : function () {}, - "stream" : function () {}, - "String" : function () {}, - "stringify" : function () {}, - "subscribe" : function () {}, - "substr" : function () {}, - "symbol" : function () {}, - "SyncInstallation" : function () {}, - "SyncInstallationHandler" : function () {}, - "t" : function () {}, - "takePictureAsync" : function () {}, - "Text" : function () {}, - "text" : function () {}, - "parsedText": function() {}, - "parsedMessage": function() {}, - "content": function() {}, - "TextEncoder" : function () {}, - "then" : function () {}, - "times" : function () {}, - "timestamp" : function () {}, - "timing" : function () {}, - "title" : function () {}, - "toAscii" : function () {}, - "toChecksumAddress" : function () {}, - "toFixed" : function () {}, - "toHex" : function () {}, - "toLocaleString" : function () {}, - "toNumber" : function () {}, - "torchMode" : function () {}, - "toString" : function () {}, - "totalSupply" : function () {}, - "toTwosComplement" : function () {}, - "toUtf8" : function () {}, - "toWei" : function () {}, - "translations" : function () {}, - "type": function() {}, - "Uint8Array" : function () {}, - "unblockPin" : function () {}, - "unlink" : function () {}, - "unpair" : function () {}, - "unpairAndDelete" : function () {}, - "updateMailservers" : function () {}, - "Uri" : function () {}, - "url" : function () {}, - "Value" : function () {}, - "ValueXY": function() {}, - "value" : function () {}, - "verify" : function () {}, - "verifyPin" : function () {}, - "Version" : function () {}, - "version" : function () {}, - "vibrate" : function () {}, - "View" : function () {}, - "viewableItems": function() {}, - "FlatList" : function () {}, - "warn" : function () {}, - "WebView" : function () {}, - "WebViewBridgeModule" : function () {}, - "width" : function () {}, - "window" : function () {}, - "writeCopyTo" : function () {}, - "x" : function () {}, - "y" : function () {}, - "YellowBox" : function () {}, - "UtcDateTime": function () {}, - "fromTimestamp": function () {}, - "ERAS": function () {}, - "ERANAMES": function () {}, - "NARROWMONTHS": function () {}, - "STANDALONENARROWMONTHS": function () {}, - "MONTHS": function () {}, - "STANDALONEMONTHS": function () {}, - "SHORTMONTHS": function () {}, - "STANDALONESHORTMONTHS": function () {}, - "WEEKDAYS": function () {}, - "STANDALONEWEEKDAYS": function () {}, - "SHORTWEEKDAYS": function () {}, - "STANDALONESHORTWEEKDAYS": function () {}, - "NARROWWEEKDAYS": function () {}, - "STANDALONENARROWWEEKDAYS": function () {}, - "SHORTQUARTERS": function () {}, - "QUARTERS": function () {}, - "AMPMS": function () {}, - "DATEFORMATS": function () {}, - "TIMEFORMATS": function () {}, - "DATETIMEFORMATS": function () {}, - "FIRSTDAYOFWEEK": function () {}, - "WEEKENDRANGE": function () {}, - "FIRSTWEEKCUTOFFDAY": function () {}, - "decimalPlaces": function () {}, - "_android": function () {}, - "next": function() {}, - "prev": function() {}, - "hasNext": function() {}, - "hasPrev": function() {}, - "rtl": function() {}, - "lineCount": function() {}, - "key": function() {}, - "keys": function() {}, - "values": function() {}, - "find": function() {}, - "insert": function() {}, - "update": function() {}, - "isSupported" : function () {}, - "authenticate" : function () {}, - "createAppContainer" : function () {}, - "useScreens" : function () {}, - "multiAccountGenerateAndDeriveAddresses" : function () {}, - "multiAccountStoreDerived" : function () {}, - "multiAccountDeriveAddresses" : function () {}, - "multiAccountReset" : function () {}, - "multiAccountLoadAccount" : function () {}, - "multiAccountStoreAccount" : function () {}, - "multiAccountImportMnemonic" : function () {}, - "multiAccountImportPrivateKey" : function () {}, - "validateMnemonic" : function () {} -} diff --git a/fastlane/Appfile b/fastlane/Appfile index bf1d034801e..f01e56d20d5 100644 --- a/fastlane/Appfile +++ b/fastlane/Appfile @@ -4,6 +4,12 @@ app_identifier('im.status.ethereum') # The bundle identifier of your app apple_id(ENV['FASTLANE_APPLE_ID']) # Your Apple email address itc_team_id('118430139') # iTunes Connect Team ID +for_platform :ios do + for_lane :pr do + app_identifier('im.status.ethereum.pr') + end +end + # Android # json_key_file('') # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 09adc0ed26c..a9b039fd824 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,4 +1,5 @@ # This file contains the fastlane.tools configuration + # You can find the documentation at https://docs.fastlane.tools # # For a list of all available actions, check out @@ -11,18 +12,6 @@ # There are a few env variables defined in the .env file in # this directory (fastlane/.env) -# unlocks keychain if KEYCHAIN_PASSWORD variable is present -# (to be used on CI machines) -def unlock_keychain_if_needed - return unless ENV['KEYCHAIN_PASSWORD'] - - unlock_keychain( - path: 'login.keychain', - password: ENV['KEYCHAIN_PASSWORD'], - set_default: true - ) -end - def curl_upload(url, file, auth, conn_timeout = 5, timeout = 60, retries = 3) rval = sh( 'curl', @@ -62,60 +51,106 @@ def retry_curl_upload(url, file, auth, conn_timeout = 5, timeout = 60, retries = end end -# uploads `file` to sauce labs (overwrites if there is anoter file from the -# same commit) -def upload_to_saucelabs(file) - key = ENV['SAUCE_ACCESS_KEY'] - username = ENV['SAUCE_USERNAME'] - unique_name = ENV['SAUCE_LABS_NAME'] - - url = "https://saucelabs.com/rest/v1/storage/#{username}/#{unique_name}?overwrite=true" - - upload_result = retry_curl_upload(url, file, "#{username}:#{key}") - - # fail the lane if upload fails - unless upload_result.include? 'filename' - UI.user_error!( - "failed to upload file to saucelabs despite retries: #{upload_result}" +# Creates and unlocks a keychain into which Fastlane match imports signing keys and certs. +class Keychain + attr_accessor :name, :pass + + def initialize(name) + # Local devs will not have KEYCHAIN_PASSWORD set, and will be prompted for password. + return "login.keychain-db" unless ENV['KEYCHAIN_PASSWORD'] + # We user the same keychain every time because we need to set a default. + @name = "#{name}.keychain-db" + @pass = ENV['KEYCHAIN_PASSWORD'] + Fastlane::Actions::CreateKeychainAction.run( + name: @name, + password: @pass, + unlock: true, + # Fastlane can't find the signing cert without setting a default. + default_keychain: true, + # Deleting the keychain would cause race condition for parallel jobs. + require_create: false, + # Lock it up after 25 minutes just in case we don't delete it. + lock_when_sleeps: true, + lock_after_timeout: true, + timeout: 1500 ) end end +# App Store Connect API is an official public API used to manage Apps. +# This includes metadata, pricing and availability, provisioning, and more. +# It provides a JSON API and auth using API Keys to generate a JSON Web Token (JWT). +def asc_api_key() + app_store_connect_api_key( + key_id: ENV['FASTLANE_ASC_API_KEY_ID'], + issuer_id: ENV['FASTLANE_ASC_API_ISSUER_ID'], + key_filepath: ENV['FASTLANE_ASC_API_KEY_FILE_PATH'], + duration: 1200, # seconds, session length + in_house: false, + ) +end + # builds an ios app with ad-hoc configuration and put it -# to "status-adhoc" output folder +# to "status-ios" output folder # `readonly`: # if true - only fetch existing certificates and profiles, don't upgrade from AppStoreConnect # if false - read list of devices from AppStoreConnect, and upgrade the provisioning profiles from it -def build_ios_adhoc(readonly) +# `pr_build`: +# if true - uses StatusImPR scheme and postfixed app id with `.pr` to build an app, which can be used in parallel with release +# if false - uses StatusIm scheme to build the release app + +def build_ios_adhoc(readonly: false, pr_build: false) + # PR builds should appear as a separate App on iOS + scheme = pr_build ? 'StatusImPR' : 'StatusIm' + app_id = pr_build ? 'im.status.ethereum.pr' : 'im.status.ethereum' + + kc = Keychain.new('fastlane') + match( type: 'adhoc', - force_for_new_devices: true, readonly: readonly, - keychain_name: 'login.keychain' + api_key: asc_api_key(), + app_identifier: app_id, + force_for_new_devices: true, + keychain_name: kc.name, + keychain_password: kc.pass ) build_ios_app( - scheme: 'StatusIm', + scheme: scheme, workspace: 'ios/StatusIm.xcworkspace', configuration: 'Release', clean: true, export_method: 'ad-hoc', - output_directory: 'status-adhoc' + output_name: 'StatusIm', + output_directory: 'status-ios', + buildlog_path: 'logs', + export_options: { + signingStyle: 'manual', + provisioningProfiles: { + "im.status.ethereum": "match AdHoc im.status.ethereum", + "im.status.ethereum.pr": "match AdHoc im.status.ethereum.pr" + } + } ) end # builds an ios app with e2e configuration and put it -# to "status-e2e" output folder +# to "status-ios" output folder def build_ios_e2e # determine a simulator SDK installed showsdks_output = sh('xcodebuild', '-showsdks') simulator_sdk = showsdks_output.scan(/iphonesimulator\d\d?\.\d\d?/).first + kc = Keychain.new('fastlane') + match( type: 'adhoc', - force_for_new_devices: true, readonly: true, - keychain_name: 'login.keychain' + api_key: asc_api_key(), + force_for_new_devices: true, + keychain_name: kc.name, + keychain_password: kc.pass ) build_ios_app( @@ -127,8 +162,9 @@ def build_ios_e2e # it looks like i386 isn't supported by React Native xcargs: 'ARCHS="x86_64" ONLY_ACTIVE_ARCH=NO', # 3. directory where to up StatusIm.app - derived_data_path: 'status-e2e', + derived_data_path: 'status-ios', output_name: 'StatusIm.app', + buildlog_path: 'logs', # ------------------------------------- # Normal stuff scheme: 'StatusIm', @@ -141,70 +177,74 @@ def build_ios_e2e ) zip( - path: 'status-e2e/Build/Products/Release-iphonesimulator/StatusIm.app', - output_path: 'status-e2e/StatusIm.app.zip', + path: 'status-ios/Build/Products/Release-iphonesimulator/StatusIm.app', + output_path: 'status-ios/StatusIm.app.zip', verbose: false ) end -def upload_to_diawi(source) - diawi( - file: source, - last_hope_attempts_count: 5, - last_hope_attempts_backoff: 5, - token: ENV['DIAWI_TOKEN'] - ) - # save the URL to a file for use in CI - File.write('diawi.out', lane_context[SharedValues::UPLOADED_FILE_LINK_TO_DIAWI]) -end - platform :ios do desc '`fastlane ios adhoc` - ad-hoc lane for iOS.' desc 'This lane is used for PRs, Releases, etc.' desc 'It creates an .ipa that can be used by a list of devices, registeded in the App Store Connect.' desc 'This .ipa is ready to be distibuted through diawi.com' lane :adhoc do - unlock_keychain_if_needed - build_ios_adhoc(true) + build_ios_adhoc(readonly: true) end desc '`fastlane ios e2e` - e2e lane for iOS.' desc 'This lane is used for SauceLabs end-to-end testing.' desc 'It creates an .app that can be used inside of a iPhone simulator.' lane :e2e do - unlock_keychain_if_needed build_ios_e2e end desc '`fastlane ios pr` - makes a new pr build' desc 'This lane builds a new adhoc build and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)' lane :pr do - unlock_keychain_if_needed - build_ios_adhoc(false) + build_ios_adhoc(pr_build: true) end desc '`fastlane ios nightly` - makes a new nightly' desc 'This lane builds a new nightly and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)' lane :nightly do - unlock_keychain_if_needed - build_ios_adhoc(false) + build_ios_adhoc() end desc '`fastlane ios release` builds a release & uploads it to TestFlight' lane :release do + kc = Keychain.new('fastlane') + + # recreate keychain + sh("security delete-keychain #{kc.name}", error_callback: ->(result) { }) + sh("security create-keychain -p #{kc.pass} #{kc.name}") + sh("security set-keychain-settings -t 3600 -l #{kc.name}") + sh("security unlock-keychain -p #{kc.pass} #{kc.name}") + sh("security list-keychains -d user -s login.keychain #{kc.name}") + match( type: 'appstore', readonly: true, - keychain_name: 'login.keychain' + api_key: asc_api_key(), + app_identifier: 'im.status.ethereum', + keychain_name: kc.name, + keychain_password: kc.pass ) + # Fix certificate access permissions + sh("security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k #{kc.pass} #{kc.name}") + + # Debug + sh("security find-identity -v -p codesigning #{kc.name}") + build_ios_app( scheme: 'StatusIm', workspace: 'ios/StatusIm.xcworkspace', configuration: 'Release', clean: true, export_method: 'app-store', - output_directory: 'status_appstore', + output_directory: 'status-ios', + buildlog_path: 'logs', include_symbols: false, export_options: { "combileBitcode": true, @@ -212,33 +252,13 @@ platform :ios do "ITSAppUsesNonExemptEncryption": false } ) + upload_to_testflight( - ipa: 'status_appstore/StatusIm.ipa', + ipa: 'status-ios/StatusIm.ipa', skip_waiting_for_build_processing: true ) end - desc '`fastlane ios clean` - remove inactive TestFlight users' - lane :clean do - clean_testflight_testers( - username: ENV['FASTLANE_APPLE_ID'], - days_of_inactivity: 30 - ) - # In the future we can try using 'oldest_build_allowed' - end - - desc '`fastlane ios upload-diawi` - upload .ipa to diawi' - desc 'expects to have an .ipa prepared: `status-adhoc/StatusIm.ipa`' - desc 'expects to have a diawi token as DIAWI_TOKEN env variable' - desc 'expects to have a github token as GITHUB_TOKEN env variable' - desc "will fails if file isn't there" - desc '---' - desc 'Output: writes `fastlane/diawi.out` file url of the uploded file' - lane :upload_diawi do - ipa = ENV['DIAWI_IPA'] || 'status-adhoc/StatusIm.ipa' - upload_to_diawi(ipa) - end - desc '`fastlane ios saucelabs` - upload .app to sauce labs' desc 'also notifies in a GitHub comments' desc 'expects to have an .apk prepared: `result/app.apk`' @@ -248,7 +268,7 @@ platform :ios do desc "will fails if file isn't there" lane :saucelabs do upload_to_saucelabs( - 'status-e2e/StatusIm.app.zip' + 'status-ios/StatusIm.app.zip' ) end @@ -289,30 +309,14 @@ platform :android do lane :upload_metadata do upload_to_play_store( skip_upload_apk: true, - json_key_data: ENV['GOOGLE_PLAY_JSON_KEY'] + skip_upload_changelogs: true, + json_key_data: ENV['GOOGLE_PLAY_JSON_KEY'], + # These don't matter much as we're not uploading any new builds + # and indeed, we're skipping changelogs. This is just so that + # the library can find what it thinks it needs and continue with + # the work we actually want it to do. + track: 'production', + version_code: '2020042307' ) end - - desc '`fastlane android upload_diawi` - upload .apk to diawi' - desc 'expects to have an .apk prepared: `result/app.apk`' - desc 'expects to have a diawi token as DIAWI_TOKEN env variable' - desc 'expects to have a github token as GITHUB_TOKEN env variable' - desc "will fails if file isn't there" - desc '---' - desc 'Output: writes `fastlane/diawi.out` file url of the uploded file' - lane :upload_diawi do - uniApk = APK_PATHS.detect { |a| a.include? 'universal' } - upload_to_diawi(uniApk) - end - - desc '`fastlane android saucelabs` - upload .apk to sauce labs' - desc 'expects to have an .apk prepared: `result/app.apk`' - desc 'expects to have a saucelabs access key as SAUCE_ACCESS_KEY env variable' - desc 'expects to have a saucelabs username token as SAUCE_USERNAME env variable' - desc 'expects to have a saucelabs destination name as SAUCE_LABS_NAME env variable' - desc "will fails if file isn't there" - lane :saucelabs do - e2eApk = APK_PATHS.detect { |a| a.include? 'x86' } - upload_to_saucelabs(e2eApk) - end end diff --git a/fastlane/Gemfile b/fastlane/Gemfile index 73c57f2c466..a0be0a1ee5f 100644 --- a/fastlane/Gemfile +++ b/fastlane/Gemfile @@ -1,7 +1,4 @@ source 'https://rubygems.org' +gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' gem 'fastlane', '>= 2.131.0' - -plugins_path = ENV['FASTLANE_PLUGINFILE_PATH'] || - File.join(__dir__, 'Pluginfile') -eval_gemfile(plugins_path) if plugins_path diff --git a/fastlane/Gemfile.lock b/fastlane/Gemfile.lock index ab9eff5a374..4e4e1e8e3f3 100644 --- a/fastlane/Gemfile.lock +++ b/fastlane/Gemfile.lock @@ -1,176 +1,228 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.2) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) + CFPropertyList (3.0.6) + rexml + activesupport (7.0.8) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) atomos (0.1.3) - babosa (1.0.3) - claide (1.0.3) + aws-eventstream (1.3.0) + aws-partitions (1.872.0) + aws-sdk-core (3.190.1) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.8) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.75.0) + aws-sdk-core (~> 3, >= 3.188.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.141.0) + aws-sdk-core (~> 3, >= 3.189.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) colored (1.2) colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - declarative (0.0.10) - declarative-option (0.1.0) - digest-crc (0.4.1) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.5) - emoji_regex (1.0.1) - excon (0.71.1) - faraday (0.17.3) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) + commander (4.6.0) + highline (~> 2.0.0) + concurrent-ruby (1.2.2) + declarative (0.0.20) + digest-crc (0.6.5) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.6.20231109) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.108.0) + faraday (1.10.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) http-cookie (~> 1.0.0) - faraday_middleware (0.13.1) - faraday (>= 0.7.4, < 1.0) - fastimage (2.1.7) - fastlane (2.140.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.7) + fastlane (2.217.0) CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) - babosa (>= 1.0.2, < 2.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) colored - commander-fastlane (>= 4.4.6, < 5.0.0) + commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 2.0) + emoji_regex (>= 0.1, < 4.0) excon (>= 0.71.0, < 1.0.0) - faraday (~> 0.17) + faraday (~> 1.0) faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.13.1) + faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.29.2, < 0.37.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) - jwt (~> 2.1.0) + jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multi_xml (~> 0.5) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) - public_suffix (~> 2.0.0) - rubyzip (>= 1.3.0, < 2.0.0) + rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-clean_testflight_testers (0.3.0) - fastlane-plugin-diawi (1.4.0) - rest-client (>= 2.0.0) gh_inspector (1.1.3) - google-api-client (0.36.4) + google-apis-androidpublisher_v3 (0.54.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.2) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) mini_mime (~> 1.0) representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.5.0) - google-cloud-env (~> 1.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.6.1) + google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.0) - faraday (~> 0.11) - google-cloud-errors (1.0.0) - google-cloud-storage (1.25.1) - addressable (~> 2.5) + google-cloud-env (2.1.0) + faraday (>= 1.0, < 3.a) + google-cloud-errors (1.3.1) + google-cloud-storage (1.45.0) + addressable (~> 2.8) digest-crc (~> 0.4) - google-api-client (~> 0.33) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.29.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.10.0) - faraday (~> 0.12) + googleauth (1.9.1) + faraday (>= 1.0, < 3.a) + google-cloud-env (~> 2.1) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.12) - highline (1.7.10) - http-accept (1.7.0) - http-cookie (1.0.3) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - json (2.3.0) - jwt (2.1.0) - memoist (0.16.2) - mime-types (3.3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2019.1009) - mini_magick (4.10.1) - mini_mime (1.0.2) - multi_json (1.14.1) - multi_xml (0.6.0) - multipart-post (2.0.0) - nanaimo (0.2.6) - naturally (2.2.0) - netrc (0.11.0) - os (1.0.1) - plist (3.5.0) - public_suffix (2.0.5) - representable (3.0.4) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jmespath (1.6.2) + json (2.7.1) + jwt (2.7.1) + mini_magick (4.12.0) + mini_mime (1.1.5) + minitest (5.20.0) + multi_json (1.15.0) + multipart-post (2.3.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.7.0) + public_suffix (5.0.4) + rake (13.1.0) + representable (3.2.0) declarative (< 0.1.0) - declarative-option (< 0.2.0) + trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - rest-client (2.1.0) - http-accept (>= 1.7.0, < 2.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 4.0) - netrc (~> 0.8) retriable (3.1.2) + rexml (3.2.6) rouge (2.0.7) - rubyzip (1.3.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) security (0.1.3) - signet (0.12.0) - addressable (~> 2.3) - faraday (~> 0.9) + signet (0.18.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.7) + simctl (1.6.10) CFPropertyList naturally - slack-notifier (2.3.2) terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - tty-cursor (0.7.0) - tty-screen (0.7.0) - tty-spinner (0.9.2) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.2) + tty-spinner (0.9.3) tty-cursor (~> 0.7) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.6) - unicode-display_width (1.6.1) + unicode-display_width (2.5.0) + webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.14.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.2.6) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) + xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) PLATFORMS - ruby + arm64-darwin-22 + arm64-darwin-23 + x86_64-darwin-22 DEPENDENCIES + activesupport (>= 6.1.7.3, < 7.1.0) fastlane (>= 2.131.0) - fastlane-plugin-clean_testflight_testers - fastlane-plugin-diawi BUNDLED WITH - 1.17.3 + 2.4.13 diff --git a/fastlane/Matchfile b/fastlane/Matchfile index 0b2d73ba35c..0d17f94ad31 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -2,7 +2,7 @@ git_url('git@github.com:status-im/ios-certificates.git') type('development') # The default type, can be: appstore, adhoc, enterprise or development -# app_identifier(['tools.fastlane.app', 'tools.fastlane.app2']) +app_identifier(['im.status.ethereum', 'im.status.ethereum.pr']) username(ENV['FASTLANE_APPLE_ID']) # Your Apple Developer Portal username # For all available options run `fastlane match --help` diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile deleted file mode 100644 index 9bbffe01eaa..00000000000 --- a/fastlane/Pluginfile +++ /dev/null @@ -1,6 +0,0 @@ -# Autogenerated by fastlane -# -# Ensure this file is checked in to source control! - -gem 'fastlane-plugin-clean_testflight_testers' -gem 'fastlane-plugin-diawi' diff --git a/fastlane/default.nix b/fastlane/default.nix index 533108e6bb9..745831b388a 100644 --- a/fastlane/default.nix +++ b/fastlane/default.nix @@ -1,4 +1,4 @@ -{ stdenv, bundlerEnv, ruby, makeWrapper }: +{ stdenv, lib, bundlerEnv, ruby, makeWrapper }: let fastlane = stdenv.mkDerivation rec { @@ -23,12 +23,10 @@ let ''; shellHook = '' - [ -z "$STATUS_REACT_HOME" ] && echo "STATUS_REACT_HOME is empty!" && exit 1 - - export FASTLANE_PLUGINFILE_PATH=$STATUS_REACT_HOME/fastlane/Pluginfile + [ -z "$STATUS_MOBILE_HOME" ] && echo "STATUS_MOBILE_HOME is empty!" && exit 1 ''; - meta = with stdenv.lib; { + meta = with lib; { description = "A tool to automate building and releasing iOS and Android apps"; longDescription = "fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application."; homepage = https://github.com/fastlane/fastlane; diff --git a/fastlane/gemset.nix b/fastlane/gemset.nix index c87abe8ba58..4f96bbf178c 100644 --- a/fastlane/gemset.nix +++ b/fastlane/gemset.nix @@ -1,14 +1,35 @@ { + activesupport = { + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "188kbwkn1lbhz40ala8ykp20jzqphgc68g3d8flin8cqa2xid0s5"; + type = "gem"; + }; + version = "7.0.8"; + }; addressable = { dependencies = ["public_suffix"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy"; + sha256 = "0irbdwkkjwzajq1ip6ba46q49sxnrl2cw7ddkdhsfhb6aprnm3vr"; type = "gem"; }; - version = "2.7.0"; + version = "2.8.6"; + }; + artifactory = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wify8rhjwr5bw5y6ary61vba290vk766cxw9a9mg05yswmaisls"; + type = "gem"; + }; + version = "3.0.15"; }; atomos = { groups = ["default"]; @@ -20,35 +41,100 @@ }; version = "0.1.3"; }; + aws-eventstream = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gvdg4yx4p9av2glmp7vsxhs0n8fj1ga9kq2xdb8f95j7b04qhzi"; + type = "gem"; + }; + version = "1.3.0"; + }; + aws-partitions = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ddbcz8p3abbw8d8pn796z1ry1mbapl6ayhh37ziwal6bd047kvm"; + type = "gem"; + }; + version = "1.872.0"; + }; + aws-sdk-core = { + dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ansagfl5irx1y6b9xf4xpi9j6q6k5pbd2aw80hn0p4m3ycafamh"; + type = "gem"; + }; + version = "3.190.1"; + }; + aws-sdk-kms = { + dependencies = ["aws-sdk-core" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qzxqfgrhnl5rdc39a1gl2pgrdxgnsj12zycpxnsx8lg6arfmnr1"; + type = "gem"; + }; + version = "1.75.0"; + }; + aws-sdk-s3 = { + dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bnhpmi0iiaj88rqc5lhhnp2gyrk4fs8xz51lj36wwzng94qinya"; + type = "gem"; + }; + version = "1.141.0"; + }; + aws-sigv4 = { + dependencies = ["aws-eventstream"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g3w27wzjy4si6kp49w10as6ml6g6zl3xrfqs5ikpfciidv9kpc4"; + type = "gem"; + }; + version = "1.8.0"; + }; babosa = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "10nn9bw63i4awpzn5vrx6kmpx1sg7z8r3fhw9r8bvg9pz2wh489g"; + sha256 = "16dwqn33kmxkqkv51cwiikdkbrdjfsymlnc0rgbjwilmym8a9phq"; type = "gem"; }; - version = "1.0.3"; + version = "1.0.4"; }; CFPropertyList = { + dependencies = ["rexml"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1825ll26p28swjiw8n3x2pnh5ygsmg83spf82fnzcjn2p87vc5lf"; + sha256 = "1a36zn77yyibqsfpka0i8vgf3yv98ic2b9wwlbc29566y8wpa2bq"; type = "gem"; }; - version = "3.0.2"; + version = "3.0.6"; }; claide = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0kasxsms24fgcdsq680nz99d5lazl9rmz1qkil2y5gbbssx89g0z"; + sha256 = "0bpqhc0kqjp1bh9b7ffc395l9gfls0337rrhmab4v46ykl45qg3d"; type = "gem"; }; - version = "1.0.3"; + version = "1.1.0"; }; colored = { groups = ["default"]; @@ -70,98 +156,98 @@ }; version = "3.1.2"; }; - commander-fastlane = { + commander = { dependencies = ["highline"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0y8d3ac9qwm1cg6rnpf8rcdsy1yxacrd2g2kl809xsp2vi973g65"; + sha256 = "1n8k547hqq9hvbyqbx2qi08g0bky20bbjca1df8cqq5frhzxq7bx"; type = "gem"; }; - version = "4.4.6"; + version = "4.6.0"; }; - declarative = { + concurrent-ruby = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0642xvwzzbgi3kp1bg467wma4g3xqrrn0sk369hjam7w579gnv5j"; + sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q"; type = "gem"; }; - version = "0.0.10"; + version = "1.2.2"; }; - declarative-option = { + declarative = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1g4ibxq566f1frnhdymzi9hxxcm4g2gw4n21mpjk2mhwym4q6l0p"; + sha256 = "1yczgnqrbls7shrg63y88g7wand2yp9h6sf56c9bdcksn5nds8c0"; type = "gem"; }; - version = "0.1.0"; + version = "0.0.20"; }; digest-crc = { + dependencies = ["rake"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "08q8p0fk51aa6dwhy2xmjaj76arcq9nn22gyia162jmqpccfx50l"; + sha256 = "09114ndpnnyamc2q07bmpzw7kp3rbbfv7plmxcbzzi9d6prmd92w"; type = "gem"; }; - version = "0.4.1"; + version = "0.6.5"; }; domain_name = { - dependencies = ["unf"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0"; + sha256 = "1gpciaifmxql8h01ci12qq08dnqrdlzkkz6fmia9v9yc3r9a29si"; type = "gem"; }; - version = "0.5.20190701"; + version = "0.6.20231109"; }; dotenv = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "17hkd62ig9b0czv192kqdfq7gw0a8hgq07yclri6myc8y5lmfin5"; + sha256 = "1n0pi8x8ql5h1mijvm8lgn6bhq4xjb5a500p5r1krq4s6j9lg565"; type = "gem"; }; - version = "2.7.5"; + version = "2.8.1"; }; emoji_regex = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1jfsv8ik2h1msqf3if1f121pnx3lccp8fqnka9na309mnw3bq532"; + sha256 = "0jsnrkfy345v66jlm2xrz8znivfnamg3mfzkddn414bndf2vxn7c"; type = "gem"; }; - version = "1.0.1"; + version = "3.2.3"; }; excon = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0nn8wk7j22ly4lzdp5pnm7qsrjxbgspiyxkw70g1qf9bn6pslmxr"; + sha256 = "1q9yz7x36mpzpz04bg6hdyrzzk4bri9jg3h2ygw26bf6v3axq53q"; type = "gem"; }; - version = "0.71.1"; + version = "0.108.0"; }; faraday = { - dependencies = ["multipart-post"]; + dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "13aghksmni2sl15y7wfpx6k5l3lfd8j9gdyqi6cbw6jgc7bqyyn2"; + sha256 = "1c760q0ks4vj4wmaa7nh1dgvgqiwaw0mjr7v8cymy7i3ffgjxx90"; type = "gem"; }; - version = "0.17.3"; + version = "1.10.3"; }; faraday-cookie_jar = { dependencies = ["faraday" "http-cookie"]; @@ -169,10 +255,111 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6"; + sha256 = "00hligx26w9wdnpgsrf0qdnqld4rdccy8ym6027h5m735mpvxjzk"; + type = "gem"; + }; + version = "0.0.7"; + }; + faraday-em_http = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12cnqpbak4vhikrh2cdn94assh3yxza8rq2p9w2j34bqg5q4qgbs"; + type = "gem"; + }; + version = "1.0.0"; + }; + faraday-em_synchrony = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vgrbhkp83sngv6k4mii9f2s9v5lmp693hylfxp2ssfc60fas3a6"; + type = "gem"; + }; + version = "1.0.0"; + }; + faraday-excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh"; + type = "gem"; + }; + version = "1.1.0"; + }; + faraday-httpclient = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fyk0jd3ks7fdn8nv3spnwjpzx2lmxmg2gh4inz3by1zjzqg33sc"; + type = "gem"; + }; + version = "1.0.1"; + }; + faraday-multipart = { + dependencies = ["multipart-post"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09871c4hd7s5ws1wl4gs7js1k2wlby6v947m2bbzg43pnld044lh"; + type = "gem"; + }; + version = "1.0.4"; + }; + faraday-net_http = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j"; + type = "gem"; + }; + version = "1.0.1"; + }; + faraday-net_http_persistent = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dc36ih95qw3rlccffcb0vgxjhmipsvxhn6cw71l7ffs0f7vq30b"; type = "gem"; }; - version = "0.0.6"; + version = "1.2.0"; + }; + faraday-patron = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19wgsgfq0xkski1g7m96snv39la3zxz6x7nbdgiwhg5v82rxfb6w"; + type = "gem"; + }; + version = "1.0.0"; + }; + faraday-rack = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1h184g4vqql5jv9s9im6igy00jp6mrah2h14py6mpf9bkabfqq7g"; + type = "gem"; + }; + version = "1.0.0"; + }; + faraday-retry = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "153i967yrwnswqgvnnajgwp981k9p50ys1h80yz3q94rygs59ldd"; + type = "gem"; + }; + version = "1.0.3"; }; faraday_middleware = { dependencies = ["faraday"]; @@ -180,351 +367,353 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1a93rs58bakqck7bcihasz66a1riy22h2zpwrpmb13gp8mw3wkmr"; + sha256 = "1bw8mfh4yin2xk7138rg3fhb2p5g2dlmdma88k82psah9mbmvlfy"; type = "gem"; }; - version = "0.13.1"; + version = "1.2.0"; }; fastimage = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "06lgsy1zdkhhgd9w1c0nb7v9d38mljwz13n6gi3acbzkhz1sf642"; + sha256 = "1pd7pamzhdz2w0fbcvsfn2nyslznvphnwj16zw35g2b28zd2xyzx"; type = "gem"; }; - version = "2.1.7"; + version = "2.2.7"; }; fastlane = { - dependencies = ["CFPropertyList" "addressable" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multi_xml" "multipart-post" "plist" "public_suffix" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"]; + dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-apis-androidpublisher_v3" "google-apis-playcustomapp_v1" "google-cloud-storage" "highline" "http-cookie" "json" "jwt" "mini_magick" "multipart-post" "naturally" "optparse" "plist" "rubyzip" "security" "simctl" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1lz3kq21zy2pcrmq5r65x5im21f51nxyh9zmkcyafvsaqib8y775"; + sha256 = "0p2b92csayzlj60v15fz3mq4h23kvvr7swhaavi6fpaqzf70iafi"; type = "gem"; }; - version = "2.140.0"; + version = "2.217.0"; }; - fastlane-plugin-clean_testflight_testers = { + gh_inspector = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0qkcjf7xrnki4v94mcgcm3v2f89vq8clwxx1d5ipv0wwm5ri26c9"; + sha256 = "0f8r9byajj3bi2c7c5sqrc7m0zrv3nblfcd4782lw5l73cbsgk04"; type = "gem"; }; - version = "0.3.0"; + version = "1.1.3"; }; - fastlane-plugin-diawi = { - dependencies = ["rest-client"]; + google-apis-androidpublisher_v3 = { + dependencies = ["google-apis-core"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "11ldnpwqzs2acwnb86dnmf7wvs6356bqg0wa3fmfxpm4389iwz6g"; + sha256 = "046j100lrh5dhb8p3gr38fyqrw8vcif97pqb55ysipy874lafw49"; type = "gem"; }; - version = "1.4.0"; + version = "0.54.0"; }; - gh_inspector = { + google-apis-core = { + dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "webrick"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0f8r9byajj3bi2c7c5sqrc7m0zrv3nblfcd4782lw5l73cbsgk04"; + sha256 = "1cly6ycryjhk15d60v3nqvhqpjk9f0nznnslbdnin90f5r54sbpd"; type = "gem"; }; - version = "1.1.3"; + version = "0.11.2"; }; - google-api-client = { - dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "signet"]; + google-apis-iamcredentials_v1 = { + dependencies = ["google-apis-core"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1icj86gwmk368wqq643gsli56jwyxznrpxmflcc71j36w0xc36wp"; + sha256 = "0ysil0bkh755kmf9xvw5szhk1yyh3gqzwfsrbwsrl77gsv7jarcs"; type = "gem"; }; - version = "0.36.4"; + version = "0.17.0"; }; - google-cloud-core = { - dependencies = ["google-cloud-env" "google-cloud-errors"]; + google-apis-playcustomapp_v1 = { + dependencies = ["google-apis-core"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1qjn7vs8f85vxi1nkikbjfja6bv9snrj26vzscjii0cm8n4dy0i1"; + sha256 = "1mlgwiid5lgg41y7qk8ca9lzhwx5njs25hz5fbf1mdal0kwm37lm"; type = "gem"; }; - version = "1.5.0"; + version = "0.13.0"; }; - google-cloud-env = { - dependencies = ["faraday"]; + google-apis-storage_v1 = { + dependencies = ["google-apis-core"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0qdfs53hi1v9ib4x38k2gnrms5fhw2c7zdk7yg424mrnb8x6nalb"; + sha256 = "1k432qgxf41c4m6d68rascm0gyj18r7ypmrnyzmxh7k7nh543awx"; type = "gem"; }; - version = "1.3.0"; + version = "0.29.0"; }; - google-cloud-errors = { + google-cloud-core = { + dependencies = ["google-cloud-env" "google-cloud-errors"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0nl08lhgjvz3g7nsarn9nnsck0k3dg8mwg4awcnklnzpvs62b4ih"; + sha256 = "00wfvdvdv9m4l5ydn6xp65n68mgmpqr3n09hzvxs7gp8fly3j17v"; type = "gem"; }; - version = "1.0.0"; + version = "1.6.1"; }; - google-cloud-storage = { - dependencies = ["addressable" "digest-crc" "google-api-client" "google-cloud-core" "googleauth" "mini_mime"]; + google-cloud-env = { + dependencies = ["faraday"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "136zp2b7nbs32sirmk00vgcq0g249xwg7j2551wmqnpskz1gi3py"; + sha256 = "056r1p8vhjswnx2cy3mzhwc5gj03whmpz8m4p2ph37gag5bpnxmf"; type = "gem"; }; - version = "1.25.1"; + version = "2.1.0"; }; - googleauth = { - dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"]; + google-cloud-errors = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1dnkh017ln5g7x3y0w743g61bxb2cdcyr1vax9ic3gx7vkrfj3iw"; + sha256 = "0flpj7v196c3xsqx4yjb7rjcj8p0by4rhj6qf5zanw4p1i41ssf0"; type = "gem"; }; - version = "0.10.0"; + version = "1.3.1"; }; - highline = { + google-cloud-storage = { + dependencies = ["addressable" "digest-crc" "google-apis-iamcredentials_v1" "google-apis-storage_v1" "google-cloud-core" "googleauth" "mini_mime"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "01ib7jp85xjc4gh4jg0wyzllm46hwv8p0w1m4c75pbgi41fps50y"; + sha256 = "0033bi8qwm0ksxsv5zhz4nzwsiaapq3xk79z8f8rx3v09vdap07j"; type = "gem"; }; - version = "1.7.10"; + version = "1.45.0"; }; - http-accept = { + googleauth = { + dependencies = ["faraday" "google-cloud-env" "jwt" "multi_json" "os" "signet"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "09m1facypsdjynfwrcv19xcb1mqg8z6kk31g8r33pfxzh838c9n6"; + sha256 = "0spv89di017rg25psiv4w3pn6f67y2w6vv8w910i83b5yii84rl1"; type = "gem"; }; - version = "1.7.0"; + version = "1.9.1"; }; - http-cookie = { - dependencies = ["domain_name"]; + highline = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g"; + sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d"; type = "gem"; }; - version = "1.0.3"; + version = "2.0.3"; }; - httpclient = { + http-cookie = { + dependencies = ["domain_name"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99"; + sha256 = "13rilvlv8kwbzqfb644qp6hrbsj82cbqmnzcvqip1p6vqx36sxbk"; type = "gem"; }; - version = "2.8.3"; + version = "1.0.5"; }; - json = { + httpclient = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0nrmw2r4nfxlfgprfgki3hjifgrcrs3l5zvm3ca3gb4743yr25mn"; + sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99"; type = "gem"; }; - version = "2.3.0"; + version = "2.8.3"; }; - jwt = { + i18n = { + dependencies = ["concurrent-ruby"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1w0kaqrbl71cq9sbnixc20x5lqah3hs2i93xmhlfdg2y3by7yzky"; + sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx"; type = "gem"; }; - version = "2.1.0"; + version = "1.14.1"; }; - memoist = { + jmespath = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0i9wpzix3sjhf6d9zw60dm4371iq8kyz7ckh2qapan2vyaim6b55"; + sha256 = "1cdw9vw2qly7q7r41s7phnac264rbsdqgj4l0h4nqgbjb157g393"; type = "gem"; }; - version = "0.16.2"; + version = "1.6.2"; }; - mime-types = { - dependencies = ["mime-types-data"]; + json = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh"; + sha256 = "0r9jmjhg2ly3l736flk7r2al47b5c8cayh0gqkq0yhjqzc9a6zhq"; type = "gem"; }; - version = "3.3.1"; + version = "2.7.1"; }; - mime-types-data = { + jwt = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "18x61fc36951vw7f74gq8cyybdpxvyg5d0azvqhrs82ddw3v16xh"; + sha256 = "16z11alz13vfc4zs5l3fk6n51n2jw9lskvc4h4prnww0y797qd87"; type = "gem"; }; - version = "3.2019.1009"; + version = "2.7.1"; }; mini_magick = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0lpq12z70n10c1qshcddd5nib2pkcbkwzvmiqqzj60l01k3x4fg9"; + sha256 = "0slh78f9z6n0l1i2km7m48yz7l4fjrk88sj1f4mh1wb39sl2yc37"; type = "gem"; }; - version = "4.10.1"; + version = "4.12.0"; }; mini_mime = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha"; + sha256 = "1vycif7pjzkr29mfk4dlqv3disc5dn0va04lkwajlpr1wkibg0c6"; type = "gem"; }; - version = "1.0.2"; + version = "1.1.5"; }; - multi_json = { + minitest = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0xy54mjf7xg41l8qrg1bqri75agdqmxap9z466fjismc1rn2jwfr"; + sha256 = "0bkmfi9mb49m0fkdhl2g38i3xxa02d411gg0m8x0gvbwfmmg5ym3"; type = "gem"; }; - version = "1.14.1"; + version = "5.20.0"; }; - multi_xml = { + multi_json = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj"; + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; type = "gem"; }; - version = "0.6.0"; + version = "1.15.0"; }; multipart-post = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x"; + sha256 = "0lgyysrpl50wgcb9ahg29i4p01z0irb3p9lirygma0kkfr5dgk9x"; type = "gem"; }; - version = "2.0.0"; + version = "2.3.0"; }; nanaimo = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0ajfyaqjw3dzykk612yw8sm21savfqy292hgps8h8l4lvxww1lz6"; + sha256 = "0xi36h3f7nm8bc2k0b6svpda1lyank2gf872lxjbhw3h95hdrbma"; type = "gem"; }; - version = "0.2.6"; + version = "0.3.0"; }; naturally = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0dzqdawqr4agx7zr1fr5zxdwl8vb5rhpz57l1lk7d2y46ha6l4l7"; + sha256 = "04x1nkx6gkqzlc4phdvq05v3vjds6mgqhjqzqpcs6vdh5xyqrf59"; type = "gem"; }; - version = "2.2.0"; + version = "2.2.1"; }; - netrc = { + optparse = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0gzfmcywp1da8nzfqsql2zqi648mfnx6qwkig3cv36n9m0yy676y"; + sha256 = "0j9l5a1zszvrlggp1ldx82i4kkqx34g4g3amwp488s499w5l1cvj"; type = "gem"; }; - version = "0.11.0"; + version = "0.1.1"; }; os = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "06r55k01g32lvz4wf2s6hpjlxbbag113jsvff3w64jllfr315a73"; + sha256 = "0gwd20smyhxbm687vdikfh1gpi96h8qb1x28s2pdcysf6dm6v0ap"; type = "gem"; }; - version = "1.0.1"; + version = "1.1.4"; }; plist = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0ra0910xxbhfsmdi0ig36pr3q0khdqzwb5da3wg7y3n8d1sh9ffp"; + sha256 = "0wzhnbzraz60paxhm48c50fp9xi7cqka4gfhxmiq43mhgh5ajg3h"; type = "gem"; }; - version = "3.5.0"; + version = "3.7.0"; }; public_suffix = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "040jf98jpp6w140ghkhw2hvc1qx41zvywx5gj7r2ylr1148qnj7q"; + sha256 = "1bni4qjrsh2q49pnmmd6if4iv3ak36bd2cckrs6npl111n769k9m"; type = "gem"; }; - version = "2.0.5"; + version = "5.0.4"; }; - representable = { - dependencies = ["declarative" "declarative-option" "uber"]; + rake = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0qm9rgi1j5a6nv726ka4mmixivlxfsg91h8rpp72wwd4vqbkkm07"; + sha256 = "1ilr853hawi09626axx0mps4rkkmxcs54mapz9jnqvpnlwd3wsmy"; type = "gem"; }; - version = "3.0.4"; + version = "13.1.0"; }; - rest-client = { - dependencies = ["http-accept" "http-cookie" "mime-types" "netrc"]; + representable = { + dependencies = ["declarative" "trailblazer-option" "uber"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1qs74yzl58agzx9dgjhcpgmzfn61fqkk33k1js2y5yhlvc5l19im"; + sha256 = "1kms3r6w6pnryysnaqqa9fsn0v73zx1ilds9d1c565n3xdzbyafc"; type = "gem"; }; - version = "2.1.0"; + version = "3.2.0"; }; retriable = { groups = ["default"]; @@ -536,6 +725,16 @@ }; version = "3.1.2"; }; + rexml = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0"; + type = "gem"; + }; + version = "3.2.6"; + }; rouge = { groups = ["default"]; platforms = []; @@ -546,15 +745,25 @@ }; version = "2.0.7"; }; + ruby2_keywords = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz"; + type = "gem"; + }; + version = "0.0.5"; + }; rubyzip = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1qxc2zxwwipm6kviiar4gfhcakpx1jdcs89v6lvzivn5hq1xk78l"; + sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; type = "gem"; }; - version = "1.3.0"; + version = "2.3.2"; }; security = { groups = ["default"]; @@ -572,10 +781,10 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1m8brljfgrxpr5j7kggv3dphqj9in3rkbf5dryx8f7nprkk85wdd"; + sha256 = "0fzakk5y7zzii76zlkynpp1c764mzkkfg4mpj18f5pf2xp1aikb6"; type = "gem"; }; - version = "0.12.0"; + version = "0.18.0"; }; simctl = { dependencies = ["CFPropertyList" "naturally"]; @@ -583,61 +792,61 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0svn8fakync45zbkx7fb3j1m9jqqvxdsq3gbscns57mfhysaa3rx"; + sha256 = "0sr3z4kmp6ym7synicyilj9vic7i9nxgaszqx6n1xn1ss7s7g45r"; type = "gem"; }; - version = "1.6.7"; + version = "1.6.10"; }; - slack-notifier = { + terminal-notifier = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1pkfn99dhy5s526r6k8d87fwwb6j287ga9s7lxqmh60z28xqh3bv"; + sha256 = "1slc0y8pjpw30hy21v8ypafi8r7z9jlj4bjbgz03b65b28i2n3bs"; type = "gem"; }; - version = "2.3.2"; + version = "2.0.0"; }; - terminal-notifier = { + terminal-table = { + dependencies = ["unicode-display_width"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1slc0y8pjpw30hy21v8ypafi8r7z9jlj4bjbgz03b65b28i2n3bs"; + sha256 = "14dfmfjppmng5hwj7c5ka6qdapawm3h6k9lhn8zj001ybypvclgr"; type = "gem"; }; - version = "2.0.0"; + version = "3.0.2"; }; - terminal-table = { - dependencies = ["unicode-display_width"]; + trailblazer-option = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk"; + sha256 = "18s48fndi2kfvrfzmq6rxvjfwad347548yby0341ixz1lhpg3r10"; type = "gem"; }; - version = "1.8.0"; + version = "0.1.2"; }; tty-cursor = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0prcxdy6qhqba4cv7hsy503b3bjciqk3j3hhzvcbij1kj2gh31c9"; + sha256 = "0j5zw041jgkmn605ya1zc151bxgxl6v192v2i26qhxx7ws2l2lvr"; type = "gem"; }; - version = "0.7.0"; + version = "0.7.1"; }; tty-screen = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1143g05fs28ssgimaph6sdnsndd1wrpax9kjypvd2ripa1adm4kx"; + sha256 = "0l4vh6g333jxm9lakilkva2gn17j6gb052626r1pdbmy2lhnb460"; type = "gem"; }; - version = "0.7.0"; + version = "0.8.2"; }; tty-spinner = { dependencies = ["tty-cursor"]; @@ -645,51 +854,51 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1w290prcmalwk54b453aq4qif8k9cddsfffxgn4pdmlas7g9lags"; + sha256 = "0hh5awmijnzw9flmh5ak610x1d00xiqagxa5mbr63ysggc26y0qf"; type = "gem"; }; - version = "0.9.2"; + version = "0.9.3"; }; - uber = { + tzinfo = { + dependencies = ["concurrent-ruby"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1p1mm7mngg40x05z52md3mbamkng0zpajbzqjjwmsyw0zw3v9vjv"; + sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd"; type = "gem"; }; - version = "0.1.0"; + version = "2.0.6"; }; - unf = { - dependencies = ["unf_ext"]; + uber = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"; + sha256 = "1p1mm7mngg40x05z52md3mbamkng0zpajbzqjjwmsyw0zw3v9vjv"; type = "gem"; }; - version = "0.1.4"; + version = "0.1.0"; }; - unf_ext = { + unicode-display_width = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1ll6w64ibh81qwvjx19h8nj7mngxgffg7aigjx11klvf5k2g4nxf"; + sha256 = "1d0azx233nags5jx3fqyr23qa2rhgzbhv8pxp46dgbg1mpf82xky"; type = "gem"; }; - version = "0.0.7.6"; + version = "2.5.0"; }; - unicode-display_width = { + webrick = { groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1pppclzq4qb26g321553nm9xqca3zgllvpwb2kqxsdadwj51s09x"; + sha256 = "13qm7s0gr2pmfcl7dxrmq38asaza4w0i2n9my4yzs499j731wh8r"; type = "gem"; }; - version = "1.6.1"; + version = "1.8.1"; }; word_wrap = { groups = ["default"]; @@ -702,15 +911,15 @@ version = "1.0.0"; }; xcodeproj = { - dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo"]; + dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo" "rexml"]; groups = ["default"]; platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "1h9iba53mrb663qdqzpfbdwkwzqv7hndd0df71yr2kj2hzwjmkvb"; + sha256 = "176ndahc5fssyx04q176vy6wngs1av4vrsdrkdpjij700hqll8hn"; type = "gem"; }; - version = "1.14.0"; + version = "1.23.0"; }; xcpretty = { dependencies = ["rouge"]; @@ -729,9 +938,9 @@ platforms = []; source = { remotes = ["https://rubygems.org"]; - sha256 = "15b5c0lxz2blmichfdlabzlbyw5nlh1ci898pxwb661m9bahz3ml"; + sha256 = "14rg4f70klrs910n7rsgfa4dn8s2qyny55194ax2qyyb2wpk7k5a"; type = "gem"; }; - version = "1.0.0"; + version = "1.0.1"; }; -} \ No newline at end of file +} diff --git a/fastlane/metadata/android/ar-SA/full_description.txt b/fastlane/metadata/android/ar-SA/full_description.txt new file mode 100644 index 00000000000..71c07d40163 --- /dev/null +++ b/fastlane/metadata/android/ar-SA/full_description.txt @@ -0,0 +1,21 @@ +يجمع Status بين برنامج مراسلة مجهول الهوية يركز على الخصوصية ومحفظة العملات المشفرة الآمنة في أداة اتصال قوية واحدة. يمكنك الدردشة مع الأصدقاء والمجتمعات المتنامية. وشراء وتخزين وتبادل الأصول الرقمية. + +Status هو نظام تشغيل Ethereum الخاص بك. + +محفظة Ethereum آمنة +تتيح لك محفظة العملات المشفرة Status إرسال وتخزين وتبادل أصول Ethereum بأمان مثل ETH وSNT والعملات المستقرة مثل DAI، بالإضافة إلى المقتنيات. تحكم بثقة في عملاتك المشفرة والأصول الرقمية من خلال تطبيق محفظة Ethereum متعددة السلاسل، والذي يدعم الشبكة الرئيسية و Base Arbitrum وOptimism. تدعم محفظة blockchain Status حاليًا أصول ETH وERC-20 وERC-721 وERC-1155 فقط؛ ولا تدعم Bitcoin. + +PRIVATE MESSENGER +أرسل محادثات فردية وجماعية خاصة دون أن يتجسس أحد على اتصالاتك. Status هو تطبيق مراسلة يلغي عمليات نقل الرسائل المركزية لمزيد من الخصوصية والمراسلة الآمنة. يتم تشفير جميع الرسائل باستخدام تشفير من البداية إلى النهاية. بالإضافة إلى ذلك، لا تكشف أي رسالة عن هوية المؤلف أو المستلم المقصود، لذلك لا أحد، ولا حتى Status، يعرف من يتحدث إلى من أو ما قيل. + +اربح مع DEFI + +استخدم عملتك المشفرة مع أحدث تطبيقات التمويل اللامركزية والبورصات اللامركزية (DEX) مثل Maker وAave وUniswap وSynthetix وPoolTogether وZerion وKyber والمزيد. + +تواصل مع مجتمعك + +استكشف مجتمعاتك وأصدقائك المفضلين وتواصل معهم ودردش معهم. سواء كانت مجموعة صغيرة من الأصدقاء أو مجموعة فنانين أو تجار عملات مشفرة أو منظمة كبيرة قادمة - أرسل رسائل نصية وتواصل مع مجتمعات Status. + +إنشاء حساب خاص + +ابق خاصًا من خلال إنشاء حساب مجهول الهوية. عند إنشاء حسابك المجاني، لن تضطر أبدًا إلى إدخال رقم هاتف أو عنوان بريد إلكتروني أو حساب مصرفي. يتم إنشاء مفاتيح المحفظة الخاصة بك محليًا وتخزينها بشكل آمن لضمان حصولك أنت فقط على حق الوصول إلى أموالك ومعاملاتك المالية. diff --git a/fastlane/metadata/android/ar-SA/short_description.txt b/fastlane/metadata/android/ar-SA/short_description.txt new file mode 100644 index 00000000000..282c5de3145 --- /dev/null +++ b/fastlane/metadata/android/ar-SA/short_description.txt @@ -0,0 +1 @@ +ربط Private Finance وWeb3 diff --git a/fastlane/metadata/android/ar-SA/title.txt b/fastlane/metadata/android/ar-SA/title.txt new file mode 100644 index 00000000000..27f0018a91d --- /dev/null +++ b/fastlane/metadata/android/ar-SA/title.txt @@ -0,0 +1 @@ +Status: محفظة إيثريوم كريبتو diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt deleted file mode 100644 index 42afcacf00c..00000000000 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ /dev/null @@ -1,22 +0,0 @@ -Status ist eine Open Source, Ethereum-basierte App, die Ihnen die Möglichkeit gibt, zu chatten, Transaktionen zu tätigen und die Ihnen von Ihrem Android-Gerät aus Zugriff auf eine revolutionäre Welt an DApps bietet. - -Wichtig: Status befindet sich derzeit in der Beta-Testphase. Es sind Risiken damit verbunden, ein Beta-Produkt zu testen; daher werden Sie dazu aufgefordert, die Informationen über die entsprechenden Risiken zu lesen und diese Risiken zu akzeptieren. - -Obwohl noch unfertig, hoffen wir, diese Beta-Version zeigt die Anfänge eines nutzerfreundlichen, intuitiven Erlebnisses für Ethereum und – hoffentlich – den Beginn eines fantastischen Clients für das Ethereum-Netzwerk. - -Was ist Status? -Es ist eine neue Art von Tool für eine neue Art von Internet. Browsen, Chatten und Transaktionen, alles inerhalb einer App. - -Wir wünschen uns eine Welt, in der die Menschen mehr Kontrolle über den Wert haben, den sie als Teil eines größeren Netzwerks generieren und zu dem sie beitragen. Um das zu erreichen, erstellen wir Werkzeuge, die es leichter machen, sich an einer neuen Art menschlicher Interaktion und wirtschaftlicher Aktivität zu beteiligen und davon zu profitieren. - -Beta-Funktionen: - -■ Encrypted Messaging –– Über dem Whisper-Protokoll errichtet, ermöglicht dezentrale One-on-One, Gruppen-Chats und Social Payments. - -■ Browse DApps –– Intergagiert mithilfe von Status Web 3.0 Browser nahtlos mit dem aufstrebenden Ökosystem von DApps. - -■ Ether Wallel –– eine "Standard"-Geldbörse zur ETH-Aufbewahrung, zum Senden/Empfangen von Transaktion, mit QR-Reader und Transaktionsprotokollen. - - -Machen Sie mit -Als Open-Source-Projekt sind das Downloaden und Testen von Status die beste Möglichkeit, an der Entwicklung beteiligt zu sein. Mithilfe des neuen Vertreters des Ethereum-Paradigmas wollen wir den Übergang zu einem offeneren Internet- und Finanzsystem erleichtern. Mit den hochgesteckten Zielen, unser kollektives Menschenrecht auf Privatsphäre zu bewahren, das Zensur-Risiko zu entschärfen und wirtschaftlichen Handel auf transparente, offene Art und Weise zu fördern, bildet Status eine Gemeinschaft, in der jeder willkommen ist, der beitreten und seinen Beitrag leisten möchte. Wir würden uns sehr freuen, von Ihnen zu hören. Besuchen Sie uns auf https://join.status.im/chat/public/status diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt deleted file mode 100644 index 538b664705a..00000000000 --- a/fastlane/metadata/android/de-DE/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Status ist eine mobile Open Source OS, erstellt für Ethereum. \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt deleted file mode 100644 index bbbe0019469..00000000000 --- a/fastlane/metadata/android/de-DE/title.txt +++ /dev/null @@ -1 +0,0 @@ -Status - Ethereum. Anywhere. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/6027.txt b/fastlane/metadata/android/en-US/changelogs/6027.txt deleted file mode 100644 index 42792fde9c9..00000000000 --- a/fastlane/metadata/android/en-US/changelogs/6027.txt +++ /dev/null @@ -1 +0,0 @@ -Dozens of updates and bug fixes, including updates to our chat performance and reliability, improvements to our DApp browsing experience and increased wallet functionality. Also, Mainnet has been enabled as an opt-in so you can help us test prior to a full Beta release! \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/6070.txt b/fastlane/metadata/android/en-US/changelogs/6070.txt deleted file mode 100644 index b17095e0b00..00000000000 --- a/fastlane/metadata/android/en-US/changelogs/6070.txt +++ /dev/null @@ -1,3 +0,0 @@ -On the heels of our latest main-net opt-in release our beta version is rapidly approaching closer day by day. This release contains a whole lot of improvements to chatting stability with custom bootnodes, custom mail servers for an eventual distributed messaging experience, and some overall bug fixes and UI improvements. - -NOTE: ***To continue to use the chat feature, updating to 0.9.20 is required*** \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/6129.txt b/fastlane/metadata/android/en-US/changelogs/6129.txt deleted file mode 100644 index a959493979e..00000000000 --- a/fastlane/metadata/android/en-US/changelogs/6129.txt +++ /dev/null @@ -1,10 +0,0 @@ -New and Improved: - -Mainnet is enabled by default on new installations. Upgrades will need to manually switch. -Chat now supports sending SNT and other tokens in 1-1 chats -New chat UI for /send and /receive commands -Updated chat message styling -Updated DApp list -New help links on the Profile tab -Performance improvements when fetching old messages -Added 5 new default public chats for our friends speaking Korean, Chinese, Japanese, Russian and Spanish. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/6182.txt b/fastlane/metadata/android/en-US/changelogs/6182.txt deleted file mode 100644 index 111f3643f51..00000000000 --- a/fastlane/metadata/android/en-US/changelogs/6182.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Added - -Added Farsi public #status channel -Spam moderation -Collectibles support (CryptoKitties, CryptoStrikers and Etheremon) -Added more dapps - -# Fixed - -Fixed mailservers connectivity issue - -#Changed - -Downgraded React Native to 0.53.3 for improved performance and decreased battery consumption -When joining a chat only download one day of history \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 2021cc5dee7..1a6a7a4c839 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,22 +1,18 @@ -Status is an open source, Ethereum-based app that gives you the power to chat, transact, and access a revolutionary world of DApps from your Android device. +Status combines pseudonymous privacy-focused messenger and secure crypto wallet into one powerful communication tool. Chat with friends and growing communities. Buy, store, and exchange digital assets. -Important: Status is currently in beta testing. There are risks associated with testing a beta product, so when opting in you will be prompted to read and acknowledge you understand and accept these risks. +Status is your Ethereum operating system. -Though still a work in progress, we hope this beta shows the beginnings of a friendly, intuitive experience for Ethereum, and what will be hopefully the start of a fantastic client for the Ethereum network. +SECURE ETHEREUM WALLET +The Status crypto wallet allows you to securely send, store, and exchange Ethereum assets such as ETH, SNT, stable coins such as DAI, as well as collectibles. Confidently take control of your cryptocurrency and digital assets with our multichain Ethereum wallet app, supporting Ethereum Mainnet, Base, Arbitrum, and Optimism. The Status blockchain wallet currently only supports ETH, ERC-20, ERC-721, and ERC-1155 assets; it does not support Bitcoin. -What is Status? -It’s a new kind of tool, for a new kind of Internet. Browse, chat and transact, all within one app. +PRIVATE MESSENGER +Send private 1:1 and private group chats without anyone snooping on your communications. Status is a messenger app that eliminates centralised message relays for greater privacy and secure messaging. All messages are encrypted with end-to-end encryption. Additionally, no message exposes who the author or the intended recipient is, so nobody, not even Status, knows who is talking to who or what was said. -We want to see a world in which people have more control over the value they create, curate and contribute to as part of larger networks. To achieve this, we build tools that make it easier to participate in, and benefit from, new kinds of human interactions and economic activity. +EARN WITH DEFI +Put your crypto to work with the latest decentralised finance apps and decentralised exchanges (DEX) such as Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber, and more. -Beta Features: +CONNECT WITH YOUR COMMUNITY +Explore, connect, and chat with your favourite communities and friends. Whether it is a small group of friends, an artist collective, crypto traders, or the next big organization - text and communicate with Status communities. -■ Encrypted Messaging — built on top of the Whisper protocol, enabling decentralized one-on-one, group chats, and social payments. - -■ Browse DApps — seamlessly interact with the emerging ecosystem of DApps using Status' Web 3.0 browser. - -■ Ether Wallet — a 'default' wallet, to provide ETH storage, send/receive transaction, a QR reader, and transaction logs. - - -Get Involved -As an open source project, the single best way to get involved with development is to download and test Status. Our mission is to facilitate the transition to a more open internet and financial system through the new paradigm Ethereum represent. With the high level goals of preserving our collective right as humans to privacy, mitigating the risk of censorship, and promoting economic trade in a transparent, open manner, Status is building a community where anyone is welcome to join and contribute to the cause. We’d love to hear from you. Join us at: https://join.status.im/chat/public/status \ No newline at end of file +PRIVATE ACCOUNT CREATION +Stay private with pseudo-anonymous account creation. When creating your free account, you will NEVER have to enter a phone number, email address, or bank account. Your wallet private keys are locally generated and securely stored to ensure only you have access to your funds and financial transactions. diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.jpg b/fastlane/metadata/android/en-US/images/featureGraphic.jpg new file mode 100644 index 00000000000..d7d889b8337 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.jpg differ diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png deleted file mode 100644 index 5c92d91e74c..00000000000 Binary files a/fastlane/metadata/android/en-US/images/featureGraphic.png and /dev/null differ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png index baa2a2caaef..1e95f046ba6 100644 Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png index 6f6aacf8315..42493df3008 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png index 875ee015649..a720dc24d1d 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png index b6afcfedbae..edccd39c120 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png index 41b1401742a..eb8611516ad 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png index 5bfbcbfd303..2ea43e57c96 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png index 1a9829b0711..12125b30646 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png index 991148b507d..e573b05cdf2 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png differ diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png new file mode 100644 index 00000000000..aa112f3f5f5 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png differ diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt index ebf9a1a2edb..873fc4371ea 100644 --- a/fastlane/metadata/android/en-US/short_description.txt +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -1 +1 @@ -Status is a open source mobile OS, built for Ethereum. \ No newline at end of file +Connect Private Finance & Web3 diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt index 2a83029a884..fef6ccbb055 100644 --- a/fastlane/metadata/android/en-US/title.txt +++ b/fastlane/metadata/android/en-US/title.txt @@ -1 +1 @@ -Status — Ethereum. Anywhere. \ No newline at end of file +Status: Ethereum Crypto Wallet diff --git a/fastlane/metadata/android/en-US/video.txt b/fastlane/metadata/android/en-US/video.txt deleted file mode 100644 index a35b47acfb1..00000000000 --- a/fastlane/metadata/android/en-US/video.txt +++ /dev/null @@ -1 +0,0 @@ -https://www.youtube.com/watch?v=oDCSEmS9c3o \ No newline at end of file diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt new file mode 100644 index 00000000000..b7bcbe00c50 --- /dev/null +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -0,0 +1,18 @@ +Status combina una mensajería seudónima centrada en la privacidad y una Billetera de criptomonedas segura en una poderosa herramienta de comunicación. Chatea con amigos y comunidades en crecimiento. Compra, almacena e intercambia activos digitales. + +Status es tu sistema operativo Ethereum. + +BILLETERA ETHEREUM SEGURA +La Billetera de criptomonedas Status te permite enviar, almacenar e intercambiar de forma segura activos Ethereum como ETH, SNT, stablecoins como DAI, así como coleccionables. Toma el control de tu criptomoneda y activos digitales con confianza con nuestra Billetera multicadena, compatible con Ethereum Mainnet, Base, Arbitrum y Optimism. La Billetera Status actualmente solo admite activos ETH, ERC-20, ERC-721 y ERC-1155; no admite Bitcoin. + +MENSAJERÍA PRIVADA +Envía chats privados 1:1 y grupales sin que nadie espíe tus comunicaciones. Status es una aplicación de mensajería que elimina los servidores de mensajes centralizados para una mayor privacidad y una mensajería segura. Todos los mensajes están encriptados de extremo a extremo. Además, ningún mensaje expone quién es el autor o el destinatario previsto, por lo que nadie, ni siquiera Status, sabe quién está hablando con quién o qué se dijo. + +GANA CON DEFI +Pon tus criptomonedas a trabajar con las últimas aplicaciones financieras descentralizadas y plataformas de intercambio descentralizadas (DEX) como Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber y más. + +CONECTA CON TU COMUNIDAD +Explora, conéctate y chatea con tus comunidades y amigos. Ya sea un pequeño grupo de amigos, un colectivo de artistas, traders de criptomonedas o la próxima gran organización, envía mensajes de texto y comunícate con las comunidades de Status. + +CREACIÓN DE CUENTAS PRIVADAS +Mantén la privacidad con la creación de cuentas seudónimas. Al crear tu cuenta gratuita, NUNCA tendrás que compartir tu número de teléfono, tu dirección de correo electrónico o una cuenta bancaria. Las claves privadas de tu billetera se generan localmente y se almacenan de forma segura para garantizar que solo tú tienes acceso a tus fondos y transacciones financieras. diff --git a/fastlane/metadata/android/es-ES/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt new file mode 100644 index 00000000000..55a7c3b1545 --- /dev/null +++ b/fastlane/metadata/android/es-ES/short_description.txt @@ -0,0 +1 @@ +Conecta tus finanzas y la web3 diff --git a/fastlane/metadata/android/es-ES/title.txt b/fastlane/metadata/android/es-ES/title.txt new file mode 100644 index 00000000000..941e46c1de1 --- /dev/null +++ b/fastlane/metadata/android/es-ES/title.txt @@ -0,0 +1 @@ +Status: Billetera Ethereum diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt deleted file mode 100644 index d116285e31c..00000000000 --- a/fastlane/metadata/android/fa/full_description.txt +++ /dev/null @@ -1,32 +0,0 @@ -استاتوس (Status) یک سیستم‌عامل موبایل کدباز است که بر روی اتریوم عمومی بلاک‌چین ساخته شده است، و شامل مرورگر، چت، و کیف پول مجازی در داخل یک اپلیکیشن واحد است. با اپلیکیشن استاتوس، شما می‌توانید از دستگاه اندروید خود از توان وب۳ بهره‌مند شوید. - - -مهم: استاتوس در حال حاضر در مرحله‌ی تست بتا قرار دارد. تست یک محصول بتا ریسک‌هایی به همراه دارد، بنابراین برای استفاده از آن از شما خواسته می‌شود که توصیف این ریسک‌ها را بخوانید و تصدیق کنید که این ریسک‌ها را متوجه می‌شوید و قبول دارید. - - - -با اینکه این محصول بتا هنوز در حال کامل شدن است، ما امیدواریم که بتواند قسمتی از یک تجربه‌ی آشنا و آسان برای اتریوم را نشان بدهد، و آغازی برای یک کلاینت فوق‌العاده برای شبکه‌ی اتریوم باشد. - -استاتوس چیست؟ - -استاتوس یک نوع ابزار جدید برای یک نوع اینترنت جدید است. از داخل یک اپلیکیشن واحد، مرور کنید، چت کنید، و تراکنش مالی انجام دهید. - - -ما می‌خواهیم جهانی را ببینیم که در آن مردم روی ارزش افزوده‌ای که در یک شبکه‌ی بزرگتر ایجاد و پخش می‌کنند کنترل داشته باشند. برای به دست آوردن این مقصود، ما ابزارهایی درست می‌کنیم که شرکت و استفاده کردن از روش‌های جدید تعامل انسانی و فعالیت‌های اقتصادی را آسان‌تر کند. - -ویژگی‌های نسخه‌ی بتا: - -پیام‌رسانی رمزگذاری شده - استاتوس بر روی پروتکل Whisper ساخته شده، که باعث می‌شود چت یک‌به‌یک، گروهی، و پرداخت‌های اجتماعی قابل انجام باشند. - - -مرور اپلیکیشن‌های غیرمتمرکز - با استفاده از مرورگر وب۳ استاتوس، به راحتی با اکوسیستم رو به توسعه‌ی اپلیکیشن‌های غیرمتمرکز تعامل داشته باشید. - - -کیف پول - یک کیف پول مجازی پیش‌فرض، برای ذخیره‌سازی و مدیریت ETH، SNT و سایر دارایی‌های ERC20 و ERC721. به علاوه‌، شما -می‌توانید به وسیله‌ی ادغام با چت، به راحتی تراکنش‌های مالی بفرستید و دریافت کنید. - -وارد همکاری شوید - - -به عنوان یک پروژه‌ی کدباز، بهترین راه مشارکت در توسعه‌ی اپلیکیشن این است که آن را دانلود و تست کنید. هدف ما تسهیل عبور به یک اینترنت و سیستم مالی بازتر به وسیله‌ی پارادایمی که اتریوم فراهم می‌کند است. با هدف‌های سطح بالای حفظ حق عمومی انسانی برای حریم خصوصی، کم کردن ریسک سانسور، و گسترش تبادل اقتصادی به شیوه‌ی باز و شفاف، استاتوس در حال ساخت جامعه‌ای است که در آن همه به ورود و مشارکت دعوت می‌شوند. -https://join.status.im/chat/public/status \ No newline at end of file diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt deleted file mode 100644 index e8071a383a1..00000000000 --- a/fastlane/metadata/android/fa/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Status is an open source mobile OS, built on top of Ethereum \ No newline at end of file diff --git a/fastlane/metadata/android/fa/title.txt b/fastlane/metadata/android/fa/title.txt deleted file mode 100644 index bbbe0019469..00000000000 --- a/fastlane/metadata/android/fa/title.txt +++ /dev/null @@ -1 +0,0 @@ -Status - Ethereum. Anywhere. \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 8b5dbb1804e..74162b0f257 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -1,22 +1,18 @@ -Status est une appli open source basée sur Ethereum qui vous donne le pouvoir de discuter, de réaliser des transactions et d'accéder à un monde révolutionnaire de dApps à partir de votre appareil Android. +Status combine une messagerie pseudonyme axée sur la confidentialité et un portefeuille cryptographique sécurisé en un seul outil de communication puissant. Discutez avec des amis et des communautés en pleine croissance. Achetez, stockez et échangez des actifs numériques. -Important : Status est actuellement en test bêta. Il y a des risques associés à l'essai d'un produit bêta, donc en vous engageant vous serez invité à lire et à reconnaître que vous comprenez et acceptez ces risques. +Status est votre système d'exploitation Ethereum. -Bien que ce soit encore un travail en cours, nous espérons que cette version bêta présente les débuts d’une expérience amicale et intuitive pour Ethereum, et qu'elle sera le début d’un excellent client pour le réseau Ethereum. +PORTEFEUILLE ETHEREUM SÉCURISÉ +Le portefeuille cryptographique Status vous permet d'envoyer, de stocker et d'échanger en toute sécurité des actifs Ethereum tels que ETH, SNT, des pièces stables telles que DAI, ainsi que des objets de collection. Prenez le contrôle en toute confiance de votre cryptomonnaie et de vos actifs numériques avec notre application de portefeuille Ethereum multichaîne, prenant en charge le réseau principal, Base, Arbitrum et Optimism. Le portefeuille blockchain Status ne prend actuellement en charge que les actifs ETH, ERC-20, ERC-721 et ERC-1155 ; il ne prend pas en charge Bitcoin. -Status, qu'est-ce que c'est ? -C'est un nouveau type d'outil pour un nouveau type d'Internet. Parcourez, discutez et effectuez des opérations, le tout sur une seule appli. +MESSAGERIE PRIVÉE +Envoyez des conversations privées en tête-à-tête et en groupe sans que personne ne surveille vos communications. Status est une application de messagerie qui élimine les relais de messages centralisés pour une plus grande confidentialité et une messagerie sécurisée. Tous les messages sont cryptés avec un cryptage de bout en bout. De plus, aucun message n'expose l'identité de l'auteur ou du destinataire prévu, de sorte que personne, pas même Status, ne sait qui parle à qui ou ce qui a été dit. -Nous voulons voir un monde dans lequel les gens ont plus de contrôle sur la valeur qu'ils créent, qu'ils organisent et à laquelle ils contribuent dans le cadre des grands réseaux. Pour ce faire, nous développons des outils qui facilitent la participation à de nouveaux types d'interactions humaines et d'activités économiques, et qui permettent d'en tirer plus facilement profit. +GAGNEZ DE L'ARGENT AVEC DEFI +Mettez votre crypto au travail avec les dernières applications financières décentralisées et les échanges décentralisés (DEX) tels que Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber, et plus encore. -Fonctionnalités bêta : +CONNECTEZ-VOUS AVEC VOTRE COMMUNAUTÉ +Explorez, connectez-vous et discutez avec vos communautés et amis préférés. Qu'il s'agisse d'un petit groupe d'amis, d'un collectif d'artistes, de traders de crypto-monnaies ou de la prochaine grande organisation, envoyez des SMS et communiquez avec les communautés Status. -■ Messagerie chiffrée — construite sur le protocole Whisper, ce qui permet une décentralisation des conversations de groupe un-à-un, et des paiements sociaux. - -■ Parcourir dApps — Interaction transparente avec l'écosystème émergeant de dApps en utilisant le navigateur Web 3.0 de Status. - -■ Portefeuille Ether — un portefeuille « par défaut », pour fournir un stockage ETH, envoyer/ recevoir des transactions, un lecteur QR et des journaux de transactions. - - -Impliquez-vous -En tant que projet open source, la meilleure façon de participer au développement est de télécharger et de tester Status. Notre mission est de faciliter la transition vers un Internet et un système financier plus ouverts à travers le nouveau paradigme que représente Ethereum. Avec les objectifs de haut niveau de la préservation de notre droit collectif en tant qu'êtres humains à la vie privée, atténuant le risque de censure et encourageant le commerce économique de manière transparente et ouverte, Status construit une communauté que tout le monde est invité à rejoindre et où chacun peut contribuer à la cause. Nous aimerions recevoir de vos nouvelles. Rejoignez-nous sur : https://join.status.im/chat/public/status \ No newline at end of file +CRÉATION DE COMPTE PRIVÉ +Restez privé grâce à la création de compte pseudo-anonyme. Lors de la création de votre compte gratuit, vous n'aurez JAMAIS besoin de saisir un numéro de téléphone, une adresse e-mail ou un compte bancaire. Les clés privées de votre portefeuille sont générées localement et stockées en toute sécurité pour garantir que vous seul avez accès à vos fonds et à vos transactions financières. diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt index f23fe7e521b..209638df37a 100644 --- a/fastlane/metadata/android/fr-FR/short_description.txt +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -1 +1 @@ -Status est un système d'exploitation mobile open source pour Ethereum. \ No newline at end of file +Finance privée + Web3 diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt index 3d8a8c233d3..d5ae8d762f7 100644 --- a/fastlane/metadata/android/fr-FR/title.txt +++ b/fastlane/metadata/android/fr-FR/title.txt @@ -1 +1 @@ -Status — Ethereum. Partout. +Status: Portefeuille Ethereum diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt index 7ad71cd507b..a9efa0992f8 100644 --- a/fastlane/metadata/android/ja-JP/full_description.txt +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -1,22 +1,21 @@ -オープンソースのStatusは、イーサリアムをベースとしたアプリで、お手持ちのAndroidデバイスでチャット、取引、そして DAPPS(分散型アプリケーション)の革新的世界へのアクセスを可能にします。 +Statusは、匿名のプライバシー重視のメッセンジャーと安全な暗号通貨ウォレットを1つの強力なコミュニケーションツールに組み合わせています。友達や成長中のコミュニティとチャットしましょう。デジタル資産を購入、保管、交換しましょう。 -重要:Statusは現在、ベータテスト中です。ベータ製品のテストの場合、リスクが発生しますので、オプトインする際にはこれらのリスクを一読、理解し、受け入れるようメッセージが表示されます。 +StatusはあなたのEthereumオペレーティングシステムです。 -本製品の開発はまだ完了していませんが、このベータ版がイーサリアム利用者にとって直感的で使いやすく、また利用者の皆様がイーサリアムネットワークをご愛用されることを期待しております。 +安全なEthereumウォレット +Status暗号通貨ウォレットを使用すると、ETH、SNT、DAIなどのステーブルコイン、収集品などのEthereum資産を安全に送信、保管、交換できます。メインネット、Base、 Arbitrum、OptimismをサポートするマルチチェーンEthereumウォレットアプリを使用して、暗号通貨とデジタル資産を自信を持って管理できます。 Status ブロックチェーン ウォレットは現在、ETH、ERC-20、ERC-721、ERC-1155 アセットのみをサポートしており、ビットコインはサポートしていません。 -Statusとは? -今までにないインターネット世界のツールです。サイト閲覧、チャット、取引の新たな世界を一つのアプリで体験することができます。 +プライベート メッセンジャー +誰にも通信を覗かれることなく、プライベートな 1:1 チャットやプライベート グループ チャットを送信できます。Status は、集中型のメッセージ リレーを排除してプライバシーと安全なメッセージングを実現するメッセンジャー アプリです。すべてのメッセージはエンドツーエンドの暗号化で暗号化されます。さらに、メッセージの作成者や宛先の受信者が誰であるかは明らかにされないため、Status でさえ、誰が誰と話しているのか、何が話されたのかを知ることはできません。 -当社は、より大きなネットワークの世界で利用者が作成、管理し、そして提供するコンテンツをより確実なコントロールできるアプリを目指しています。このため、利用者間における新しいタイプのやりとり、商業活動に利用者が参加しやすく、恩恵を受けられるようなツールを開発しています。 +DEFI で稼ぐ -ベータ版の特長: +Maker、Aave、Uniswap、Synthetix、PoolTogether、Zerion、Kyber などの最新の分散型金融アプリや分散型取引所 (DEX) で暗号通貨を活用しましょう。 -■暗号化メッセージング - Whisper プロトコル上に構築され、分散型の一対一、グループでのチャット、各種支払いをじ実現。 +コミュニティとつながる -■ ブラウズDAPPS — Statusの Web 3.0ブラウザを用いたDAPPSの最新システムによるシームレスなやりとり。 +お気に入りのコミュニティや友達を探索、接続、チャットしましょう。少人数の友人グループ、アーティスト集団、暗号通貨トレーダー、または次の大きな組織であっても、Status コミュニティとテキストでやり取りできます。 -■ イーサウォレット — 「初期設定」のウォレットでETHストレージ、取引の送受信、QRリーダー、取引ログを包有します。 +プライベート アカウントの作成 - -参加しよう -オープンソースプロジェクトの開発に関わる最良の方法は、Statusをダウンロードしてテストをすることです。当社は、イーサリアムがもたらす新たな可能性をもとに、よりオープンなインターネット世界と金融システムへの移行を推し進めています。個人情報の保護、検閲リスクの軽減、より透明性のあるオープンな方法に基づく取引の推進など高次元の目標の下、Statusでは誰でも参加でき、目的に沿った活動がとれるコミュニティの構築を進めています。皆様のご意見をぜひお聞かせください。ご連絡はこちら: https://join.status.im/chat/public/status \ No newline at end of file +疑似匿名アカウントの作成でプライバシーを確保します。無料アカウントを作成するときに、電話番号、メール アドレス、銀行口座を入力する必要はありません。ウォレットの秘密鍵はローカルで生成され、安全に保管されるため、資金と金融取引にアクセスできるのはあなただけです。 diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt index de2437f4a27..825f8aadeeb 100644 --- a/fastlane/metadata/android/ja-JP/short_description.txt +++ b/fastlane/metadata/android/ja-JP/short_description.txt @@ -1 +1 @@ -Statusは、イーサリアム向けに構築されたオープンソースのモバイルOSです。 \ No newline at end of file +プライベート ファイナンスと Web3 を接続 diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt index 6bb269c0707..efd647343d6 100644 --- a/fastlane/metadata/android/ja-JP/title.txt +++ b/fastlane/metadata/android/ja-JP/title.txt @@ -1 +1 @@ -Status — イーサリアム。いつでもどこでも。 \ No newline at end of file +Status: イーサリアム クリプト ウォレット diff --git a/fastlane/metadata/android/ja-JP/video.txt b/fastlane/metadata/android/ja-JP/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fastlane/metadata/android/ko-KR/full_description.txt b/fastlane/metadata/android/ko-KR/full_description.txt index 85057528774..02529c62b34 100644 --- a/fastlane/metadata/android/ko-KR/full_description.txt +++ b/fastlane/metadata/android/ko-KR/full_description.txt @@ -1,23 +1,21 @@ -스테이터스(Status)는 이더리움에 기반한 오픈소스 어플리케이션으로서, 안드로이드 기기로 이더리움 네트워크를 통해 다른 사람들과 채팅하거나, 암호화폐를 주고 받고, 혁신적인 분산앱(DApps)들을 브라우징 할 수 있도록 돕습니다. +Status는 익명의 개인 정보 보호 중심 메신저와 안전한 암호화폐 지갑을 하나의 강력한 커뮤니케이션 도구로 결합합니다. 친구 및 성장하는 커뮤니티와 채팅하세요. 디지털 자산을 구매, 저장 및 교환하세요. +Status는 귀하의 Ethereum 운영 체제입니다. -중요: 스테이터스는 현재 베타 테스팅 중입니다. 베타 버전 테스터로 참여하실 경우, 서비스 이용 중에 프로그램 상의 오류나 위험요소가 있을 수 있습니다. 따라서 베타 테스팅에 참여하시는 경우, 이러한 내용을 이해하고 동의한다는 내용을 숙지했으며 인정하는 것으로 간주됩니다. +안전한 이더리움 지갑 +Status 암호화폐 지갑을 사용하면 ETH, SNT, DAI와 같은 스테이블 코인, 수집품과 같은 이더리움 자산을 안전하게 보내고, 저장하고, 교환할 수 있습니다. 메인넷, Base Arbitrum 및 Optimism을 지원하는 멀티체인 이더리움 지갑 앱으로 암호화폐와 디지털 자산을 자신 있게 제어하세요. Status 블록체인 지갑은 현재 ETH, ERC-20, ERC-721 및 ERC-1155 자산만 지원하며 비트코인은 지원하지 않습니다. -스테이터스는 베타 서비스를 통해 사람들이 이더리움과 조금 더 친숙해지고 직관적으로 이해할 수 있도록 도우며, 이더리움 네트워크 최고의 클라이언트로 도약 할 것입니다. +개인 메신저 +아무도 귀하의 커뮤니케이션을 엿보지 않고 개인 1:1 및 개인 그룹 채팅을 보내세요. Status는 중앙 집중식 메시지 릴레이를 제거하여 더 큰 프라이버시와 안전한 메시징을 제공하는 메신저 앱입니다. 모든 메시지는 종단 간 암호화로 암호화됩니다. 또한, 메시지에는 작성자 또는 의도된 수신자가 노출되지 않으므로 Status를 포함하여 아무도 누가 누구와 대화하고 있는지 또는 무슨 말을 했는지 알 수 없습니다. -스테이터스는 무엇인가요? -스테이터스는 차세대 인터넷을 위한 새로운 도구입니다. 브라우징, 채팅, 거래, 모든 것을 하나의 앱에서 체험하실 수 있습니다. +DEFI로 수익 창출 -우리는 사람들이 네트워크를 확장하는 데 적극적으로 참여하며 가치를 창조하고, 창조한 가치를 스스로 관리할 수 있는 세계를 지향합니다. 이것을 실현하기 위해, 스테이터스는 유용한 도구를 개발하여 사람들이 새로운 커뮤니케이션 방식을 통해 디지털 경제 활동에 참여하고, 이로 인한 혜택을 누리는 것을 돕습니다. +Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber 등과 같은 최신 분산 금융 앱 및 분산 거래소(DEX)에서 암호화폐를 활용하세요. -베타 서비스 기능 +커뮤니티와 연결 -■ 메시지 암호화 — 위스퍼 프로토콜을 기반으로 구축되어 완벽히 암호화되고 분산화된 1:1 채팅, 그룹 채팅, 소셜 결제 기능을 사용해 보세요. +좋아하는 커뮤니티와 친구를 탐색하고, 연결하고, 채팅하세요. 소규모 친구 그룹, 아티스트 집단, 암호화폐 거래자 또는 차세대 대기업이든 Status 커뮤니티에 문자를 보내고 소통하세요. -■ 분산앱(DApps) 브라우징 — 스테이터스의 Web 3.0 브라우저를 활용하여 다양한 분산앱을 매끄럽게 브라우징 할 수 있습니다. +개인 계정 생성 -■ 이더 지갑 (Ether Wallet) — 디폴트로 설정된 이더 지갑을 통해 ETH 스토리지, 암호화폐 입출금, QR 리더기, 거래 기록을 체험해보세요. - - -참여하기 -어플리케이션을 다운로드 받아 테스트하며, 스테이터스 오픈소스 프로젝트에 참여하실 수 있습니다. 우리의 비전은 이더리움이 제시하는 새로운 인터넷 패러다임을 통해 인터넷과 금융 시스템이 조금 더 개방적으로 변모할 수 있도록 하는 것입니다. 스테이터스의 궁극적 목표는 사람들의 소중한 프라이버시를 지키고 검열로부터 보호하며, 더욱 투명하고 개방된 방식의 거래를 촉진하는 것입니다. 이를 위해 스테이터스는 누구든지 참여해 혁신적인 변화를 이끌어가는 커뮤니티를 구축하고 있습니다. 여러분의 연락을 기다리고 있습니다. https://join.status.im/chat/public/status 에 참여하세요! +익명 계정을 생성하여 개인 정보를 보호하세요. 무료 계정을 만들 때 전화번호, 이메일 주소 또는 은행 계좌를 입력할 필요가 없습니다. 지갑 개인 키는 로컬에서 생성되고 안전하게 저장되어 본인만 자금과 금융 거래에 액세스할 수 있습니다. diff --git a/fastlane/metadata/android/ko-KR/short_description.txt b/fastlane/metadata/android/ko-KR/short_description.txt index 6e1cd020b22..197b6757827 100644 --- a/fastlane/metadata/android/ko-KR/short_description.txt +++ b/fastlane/metadata/android/ko-KR/short_description.txt @@ -1 +1 @@ -스테이터스(Status)는 이더리움을 위한 오픈소스 모바일 OS입니다. +개인 금융 및 Web3 연결 diff --git a/fastlane/metadata/android/ko-KR/title.txt b/fastlane/metadata/android/ko-KR/title.txt index 3ed746c5afb..053cc6ca04f 100644 --- a/fastlane/metadata/android/ko-KR/title.txt +++ b/fastlane/metadata/android/ko-KR/title.txt @@ -1 +1 @@ -Status — 어디서든 함께하는 이더리움 +Status: 이더리움 크립토 지갑 diff --git a/fastlane/metadata/android/ko-KR/video.txt b/fastlane/metadata/android/ko-KR/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index 3f7a108a9b4..13921edcec1 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -1,22 +1,18 @@ -O Status é um app de código aberto e baseado em Ethereum que proporciona a possibilidade de conversar, realizar transações e acessar o mundo revolucionário dos DApps em seu dispositivo Android. +Status é um app de mensagem e uma carteira de criptomoedas focado em privacidade e anonimato. Você pode conversar com seus amigos e interagir com comunidades. Compre, armazene e troque ativos digitais. -Importante: O Status está atualmente em teste beta. Existem riscos associados com esse estágio de testes de um produto, portanto ao participar você deverá ler e confirmar que compreende e aceita esses riscos. +Status é o seu sistema operacional para Ethereum. -Embora seja um trabalho em progresso, esperamos que essa versão beta demonstre o início de uma experiência intuitiva e simples no Ethereum, e que ela seja o início de um fantástico cliente da rede Ethereum. +CARTEIRA ETHEREUM SEGURA +A carteira de criptomoedas Status permite que você envie, armazene e troque ativos Ethereum, como ETH, SNT, stablecoins como DAI, além de colecionáveis, de forma segura. Controle com confiança suas criptomoedas e ativos digitais com nosso aplicativo de carteira Ethereum multichain, que suporta Ethereum Mainnet, Base, Arbitrum e Optimism. A carteira blockchain da Status atualmente suporta apenas ativos ETH, ERC-20, ERC-721 e ERC-1155; não suporta Bitcoin. -O que é o Status? -É um novo tipo de ferramenta, para um novo tipo de internet. Navegue, converse e faça transações, tudo no mesmo app. +APP DE MENSAGEM PRIVADO +Envie mensagens privadas em chats 1:1 ou em grupos. Status é um aplicativo de mensagem descentralizado que foca em privacidade e anonimato. Todas as mensagens são protegidas com criptografia de ponta a ponta. Além disso, nenhuma mensagem revela quem é o(a) autor(a) ou o(a) destinatário(a) pretendido(a), então ninguém, nem mesmo a Status, sabe quem está conversando com quem ou o que foi dito. -Quer conhecer um mundo no qual as pessoas têm mais controle sobre o valor que criam, organizam e contribuem como parte de uma rede maior. Para atingir esse patamar, criamos ferramentas que tornam mais fácil participar e se beneficiar de novos tipos de interações humanas e atividades econômicas. +MONETIZE COM DEFI E STAKING +Coloque suas criptomoedas para trabalhar (staking) com os mais recentes aplicativos de finanças descentralizadas e exchanges descentralizadas (DEX), como Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber e mais. -Recursos da versão Beta: +CONECTE-SE COM SUA COMUNIDADE +Explore, conecte-se e converse com seus amigos e comunidades favoritas. Seja um grupo de amigos, de artistas, de traders de criptomoedas ou a próxima grande empresa - envie textos e comunique-se através das comunidades da Status. -■ Mensagens criptografadas — criado utilizando o protocolo Whisper, permitindo conversas descentralizadas privativas e em grupo e pagamentos por meio de redes sociais. - -■ Navegação por DApps — Interação ininterrupta com o ecossistema emergente de DApps utilizando o navegador Web 3.0 do Status. - -■ Carteira Ether — uma carteira 'padrão', para permitir armazenamento em ETH, envio e recebimento de transações, um leitor de código QR e registros de transações. - - -Envolva-se -Como um projeto de código aberto, a melhor maneira de se envolver com o desenvolvimento é baixar e testar o Status. Nossa missão é facilitar a transição para uma internet e um sistema financeiro mais abertos, por meio do novo paradigma que o Ethereum representa. Com os objetivos de alto nível de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente o Status está construindo uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem com a causa. Adoraríamos falar com você. Junte-se a nós em: https://join.status.im/chat/public/status \ No newline at end of file +CRIAÇÃO DE CONTA PRIVADA +Mantenha sua privacidade com a criação de conta anônima. Ao criar sua conta gratuita, você NUNCA precisará inserir um número de telefone, endereço de e-mail ou conta bancária. Suas chaves privadas da carteira são geradas localmente e armazenadas com segurança para garantir que apenas você tenha acesso aos seus fundos e transações financeiras. diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt index 36a969781cd..634d8b43559 100644 --- a/fastlane/metadata/android/pt-BR/short_description.txt +++ b/fastlane/metadata/android/pt-BR/short_description.txt @@ -1 +1 @@ -O Status é um SO de código aberto para dispositivos móveis, criado para Ethereum \ No newline at end of file +Privacidade Financeira e Web3 diff --git a/fastlane/metadata/android/pt-BR/title.txt b/fastlane/metadata/android/pt-BR/title.txt index 188fdbc46fc..47e98e79eb2 100644 --- a/fastlane/metadata/android/pt-BR/title.txt +++ b/fastlane/metadata/android/pt-BR/title.txt @@ -1 +1 @@ -Status — Ethereum. Em qualquer lugar. \ No newline at end of file +Status: Carteira Ethereum diff --git a/fastlane/metadata/android/pt-BR/video.txt b/fastlane/metadata/android/pt-BR/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt deleted file mode 100644 index 3eb8ffc9c42..00000000000 --- a/fastlane/metadata/android/pt-PT/full_description.txt +++ /dev/null @@ -1,22 +0,0 @@ -Status é uma aplicação Open Source baseada em Ethereum que proporciona a possibilidade de conversar, transacionar e aceder ao mundo revolucionário das DApps a partir do seu dispositivo Android. - -Importante: A Status está atualmente em fase de testes beta. Existem riscos associados com a fase de testes de um produto, pelo que ao participar você deverá ler e confirmar que compreende e aceita esses mesmos riscos. - -Embora seja um trabalho em progresso, esperamos que esta versão beta demonstre o início de uma experiência intuitiva e simples no Ethereum, e que ela seja o início de um fantástico cliente da rede Ethereum. - -O que é a Status? -É um novo tipo de ferramenta, para um novo tipo de Internet. Navega, conversa e transaciona, tudo a partir da mesma aplicação. - -Queres conhecer um mundo no qual as pessoas têm mais controle sobre o valor que criam, organizam e contribuem como parte de uma rede maior? Para atingir esse patamar, criamos ferramentas que tornam mais fácil participar e beneficiar de novos tipos de interações humanas e atividades económicas. - -Funcionalidades da versão Beta: - -■ Mensagens encriptadas — Baseada no protocolo Whisper, permitindo conversas descentralizadas privadas ou em grupo, e pagamentos por meio de redes sociais. - -■ Navegação por DApps — Interação ininterrupta com o ecossistema emergente de DApps utilizando o navegador Web 3.0 da Status. - -■ Carteira Ether — uma carteira 'padrão', permitindo armazenamento de ETH, envio e receção de transações, um leitor de código QR e registos de transações. - - -Envolve-te -Sendo um projeto Open Source, a melhor maneira de se envolver com o desenvolvimento é fazer download e testar o cliente Status. A nossa missão é facilitar a transição para uma Internet e um sistema financeiro mais abertos, através do novo paradigma que o Ethereum representa. Partindo de uma a filosofia de preservar nossos direitos coletivos como seres humanos à privacidade, mitigar o risco de censura e promover comercialização economicamente viável de maneira aberta e transparente, a Status está a construir uma comunidade na qual todos são bem-vindos para se juntarem e contribuírem para a causa. Adoraríamos falar contigo. Junta-te a nós em: https://join.status.im/chat/public/status \ No newline at end of file diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt deleted file mode 100644 index 97ba889c0ac..00000000000 --- a/fastlane/metadata/android/pt-PT/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Status é um SO Open Source para dispositivos móveis, criado para Ethereum diff --git a/fastlane/metadata/android/pt-PT/title.txt b/fastlane/metadata/android/pt-PT/title.txt deleted file mode 100644 index 4c4a82b9b40..00000000000 --- a/fastlane/metadata/android/pt-PT/title.txt +++ /dev/null @@ -1 +0,0 @@ -Status — Ethereum. Onde quer que esteja. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-PT/video.txt b/fastlane/metadata/android/pt-PT/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt index 6ce37629206..5c21acb08b1 100644 --- a/fastlane/metadata/android/ru-RU/full_description.txt +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -1,22 +1,18 @@ -Status - программа с открытым исходным кодом на основе Ethereum, которая дает вам возможность общаться, обмениваться средствами и получить доступ к революционному миру DApps с вашего Android-устройства. +Status объединяет анонимный мессенджер, ориентированный на конфиденциальность, и защищенный криптокошелек в один мощный инструмент для финансов и общения. Общайтесь с друзьями, находите новые сообщества, а также покупайте, храните и обменивайте цифровые активы. -Внимание: программа в настоящее время находится в стадии бета-тестирования. С тестированием бета-продукта связаны определенные риски, поэтому перед началом работы вам будет предложено прочитать и принять эти риски. +Status — это ваша операционная система для Ethereum. -Хотя работа еще продолжается, мы надеемся, что эта бета-версия даст вам дружественный, интуитивно понятный опыт работы с Ethereum, и что он послужит хорошим началом фантастического клиента для сети Ethereum. +БЕЗОПАСНЫЙ КОШЕЛЕК ETHEREUM +Крипто-кошелек Status позволяет вам безопасно отправлять, хранить и обменивать активы Ethereum, такие как ETH, SNT, стейблкоины, такие как DAI, а также невзаимозаменяемые токены. Контролируйте свою криптовалюту с помощью нашего криптокошелека для Ethereum, поддерживающего Ethereum, Base, Arbitrum и Optimism. В настоящее время криптокошелек Status поддерживает такие активы ETH, ERC-20, ERC-721 и ERC-1155. -Что такое Status? -Это новый инструмент для нового типа интернета. Просматривайте, общайтесь и совершайте транзакции, все в одном приложении. +ПРИВАТНИЙ МЕСЕНДЖЕР +Отправляйте приватные сообщения друзьям или группам. Status — это приложение для обмена сообщениями, которое поддерживает децентрализованную систему для повышения конфиденциальности и безопасного обмена сообщениями. Все сообщения зашифрованы с помощью сквозного шифрования. Более того, ни одно сообщение не содержит информации об авторе или получателе, поэтому никто, даже Status, не знает, кто с кем общается или что было отправлено. -Мы хотим видеть мир, в котором люди имеют больше контроля над ценностями, которые они создают. Для достижения этой цели мы создаем инструменты, которые облегчают участие и получение пользы от новых видов взаимодействия людей и их экономической деятельности. +ЗАРАБАТЫВАЙТЕ С DEFI +Используйте свою криптовалюту для работы с новейшими приложениями для децентрализованных финансов и децентрализованными криптобиржами (DEX), такими как Maker, Aave, Uniswap, Synthetix, PoolTogether, Kyber и другие. -Особенности бета-версии: +НАЙДИТЕ ВАШЕ СООБЩЕСТВО +Находите, исследуйте и общайтесь с любимыми сообществами и друзьями. Независимо от того, является ли это небольшой группой друзей, коллективом художников, криптотрейдеров или следующим большим сообществом единомышленников — отправляйте текстовые сообщения и общайтесь с сообществами в Status. -■ Шифрование сообщений на основе протокола Whisper, что позволяет создавать децентрализованные индивидуальные и групповые чаты, и ​​социальные выплаты. - -■ Обзор DApps - Удобное взаимодействие с формирующейся экосистемой DApps с использованием Web 3.0 браузера. - -■ Кошелек Ethereum, обеспечивающий хранение, отправку и получение ETH, QR-ридер и журналы транзакций. - - -Присоединяйтесь к нам -Самый лучший способ принять участие в разработке нашей платформы — это загрузить и протестировать Status. Наша миссия состоит в том, чтобы облегчить переход к более открытому интернету и финансовой системе на основе новой парадигмы, которую представляет Ethereum. Ставя перед собой высокую цель сохранения права людей на частную жизнь, снижения риска цензуры, а также содействия экономической торговле в прозрачной, открытой манере, Status строит сообщество, где любой желающий может присоединиться и внести свой вклад в общее дело. Мы хотели бы услышать ваш голос. Присоединяйтесь к нам: https://join.status.im/chat/public/status \ No newline at end of file +СОЗДАНИЕ ПРИВАТНОГО АККАУНТА +Оставайтесь конфиденциальными с помощью создания анонимного аккаунта. При создании аккаунта вам НИКОГДА не нужно будет вводить номер телефона, адрес электронной почты или банковский счет. Приватные ключи вашего криптокошелька генерируются локально на вашем устройстве и надежно хранятся, чтобы только вы имели доступ к своим средствам и финансовым транзакциям. diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt index 017a951fac1..5811246908c 100644 --- a/fastlane/metadata/android/ru-RU/short_description.txt +++ b/fastlane/metadata/android/ru-RU/short_description.txt @@ -1 +1 @@ -Status — это мобильная ОС с открытым исходным кодом, созданная для Ethereum. \ No newline at end of file +Web3 финансы и приват чат diff --git a/fastlane/metadata/android/ru-RU/title.txt b/fastlane/metadata/android/ru-RU/title.txt index 2a83029a884..1f01ef2483d 100644 --- a/fastlane/metadata/android/ru-RU/title.txt +++ b/fastlane/metadata/android/ru-RU/title.txt @@ -1 +1 @@ -Status — Ethereum. Anywhere. \ No newline at end of file +Status: Ethereum Криптокошелек diff --git a/fastlane/metadata/android/ru-RU/video.txt b/fastlane/metadata/android/ru-RU/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt new file mode 100644 index 00000000000..1869c0f50f3 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/full_description.txt @@ -0,0 +1,18 @@ +Status, takma adlı gizlilik odaklı mesajlaşmayı ve güvenli kripto cüzdanını tek bir güçlü iletişim aracında birleştiriyor. Arkadaşlarınızla ve büyüyen topluluklarla sohbet edin. Dijital varlıkları satın alın, saklayın ve değiştirin. + +Status, Ethereum işletim sisteminizdir. + +GÜVENLİ ETHEREUM CÜZDANI +Status kripto cüzdanı, ETH, SNT, DAI gibi sabit paralar ve koleksiyonluk eşyalar gibi Ethereum varlıklarını güvenli bir şekilde göndermenize, saklamanıza ve değiştirmenize olanak tanır. Ana ağ, Base, Arbitrum ve Optimism'i destekleyen çok zincirli Ethereum cüzdan uygulamamızla kripto paranızın ve dijital varlıklarınızın kontrolünü güvenle ele alın. Status blok zinciri cüzdanı şu anda yalnızca ETH, ERC-20, ERC-721 ve ERC-1155 varlıklarını destekliyor; Bitcoin'i desteklemiyor. + +ÖZEL MESAJLAŞMACI +İletişimlerinizi kimse gözetlemeden özel 1:1 ve özel grup sohbetleri gönderin. Status, daha fazla gizlilik ve güvenli mesajlaşma için merkezi mesaj iletimlerini ortadan kaldıran bir mesajlaşma uygulamasıdır. Tüm mesajlar uçtan uca şifrelemeyle şifrelenir. Ayrıca, hiçbir mesaj yazarının veya hedeflenen alıcının kim olduğunu ifşa etmez, bu nedenle hiç kimse, Status bile kimin kiminle konuştuğunu veya ne söylendiğini bilmez. + +DEFI İLE KAZANIN +Kripto paranızı Maker, Aave, Uniswap, Synthetix, PoolTogether, Zerion, Kyber ve daha fazlası gibi en son merkezi olmayan finans uygulamaları ve merkezi olmayan borsalarla (DEX) çalıştırın. + +TOPLULUĞUNUZLA BAĞLANTI KURUN +En sevdiğiniz toplulukları ve arkadaşlarınızla keşfedin, bağlantı kurun ve sohbet edin. İster küçük bir arkadaş grubu, ister bir sanatçı kolektifi, kripto tüccarları veya bir sonraki büyük organizasyon olsun - Status topluluklarıyla mesajlaşın ve iletişim kurun. + +ÖZEL HESAP OLUŞTURMA +Sahte anonim hesap oluşturma ile gizli kalın. Ücretsiz hesabınızı oluştururken ASLA bir telefon numarası, e-posta adresi veya banka hesabı girmeniz gerekmeyecek. Cüzdan özel anahtarlarınız yerel olarak oluşturulur ve yalnızca sizin fonlarınıza ve finansal işlemlerinize erişebilmenizi sağlamak için güvenli bir şekilde saklanır. diff --git a/fastlane/metadata/android/tr-TR/short_description.txt b/fastlane/metadata/android/tr-TR/short_description.txt new file mode 100644 index 00000000000..62d38cb14af --- /dev/null +++ b/fastlane/metadata/android/tr-TR/short_description.txt @@ -0,0 +1 @@ +Özel Finans ve Web3'ü Bağlayın diff --git a/fastlane/metadata/android/tr-TR/title.txt b/fastlane/metadata/android/tr-TR/title.txt new file mode 100644 index 00000000000..b40a6bf0f13 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/title.txt @@ -0,0 +1 @@ +Status Ethereum Kripto Cüzdanı diff --git a/fastlane/metadata/android/uk-UA/full_description.txt b/fastlane/metadata/android/uk-UA/full_description.txt new file mode 100644 index 00000000000..098f9976041 --- /dev/null +++ b/fastlane/metadata/android/uk-UA/full_description.txt @@ -0,0 +1,18 @@ +Status поєднує анонімний месенджер, орієнтований на конфіденційність та захищений криптогаманець в один потужний інструмент для фінансів та спілкування. Спілкуйтеся з друзями та спільнотами. Купуйте, зберігайте та обмінюйте крипто активи. + +Status — це ваша операційна система для Ethereum. + +БЕЗПЕЧНИЙ КРИПТОГАМАНЕЦЬ ДЛЯ ETHEREUM +Криптогаманець Status дозволяє безпечно надсилати, зберігати та обмінювати крипто активи на Ethereum, такі як ETH, SNT, стейблкоїни та DAI, а також невзаємозамінні токени. Впевнено контролюйте свої крипто активи за допомогою нашого блокчейн гаманця для Ethereum, який підтримує Ethereum, Base, Arbitrum та Optimism. Криптогаманець Status наразі підтримує такі кприпто активи як ETH, ERC-20, ERC-721 та ERC-1155. + +ПРИВАТНИЙ МЕСЕНДЖЕР +Надсилайте приватні повідомлення друзям або групам. Status — це програма для обміну повідомленнями, яка підтримує децентралізовану систему повідомлень для більшої конфіденційності та безпечного обміну повідомленнями. Усі повідомлення зашифровано за допомогою наскрізного шифрування. Крім того, жодне повідомлення не містить інформації про автора чи одержувача, тому ніхто, навіть Status, не знає, хто з ким спілкувється або що було надіслано. + +ЗАРОБЛЯЙТЕ З DEFI +Налаштуйте свою криптовалюту на роботу з найновішими програмами для децентралізованих фінансів і децентралізованими крипто біржами (DEX), такими як Maker, Aave, Uniswap, Synthetix, PoolTogether, Kyber тощо. + +ЗНАЙДІТЬ ВАШУ СПІЛЬНОТУ +Знаходьте, досліджуйте та спілкуйтеся з улюбленими спільнотами та друзями. Незалежно від того, чи це невелика група друзів, колектив художників, криптотрейдерів чи наступна велика спільнота однодумців – надсилайте текстові повідомлення та спілкуйтеся зі спільнотами у Status. + +СТВОРЕННЯ ПРИВАТНОГО ОБЛІКОВОГО ЗАПИСУ +Залишайтеся конфіденційними за допомогою створення анонімного облікового запису. Під час створення облікового запису вам НІКОЛИ не доведеться вводити номер телефону, адресу електронної пошти чи банківський рахунок. Приватні ключі вашого крипто гаманця генеруються локально на вашому пристрої та надійно зберігаються, щоб лише Ви мали доступ до своїх коштів і фінансових транзакцій. diff --git a/fastlane/metadata/android/uk-UA/short_description.txt b/fastlane/metadata/android/uk-UA/short_description.txt new file mode 100644 index 00000000000..34bd9af60d8 --- /dev/null +++ b/fastlane/metadata/android/uk-UA/short_description.txt @@ -0,0 +1 @@ +Web3 фінанси та приват чат diff --git a/fastlane/metadata/android/uk-UA/title.txt b/fastlane/metadata/android/uk-UA/title.txt new file mode 100644 index 00000000000..3741b63365c --- /dev/null +++ b/fastlane/metadata/android/uk-UA/title.txt @@ -0,0 +1 @@ +Status Ethereum Криптогаманець diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt index 8f5a4f8151f..28d310190b3 100644 --- a/fastlane/metadata/android/zh-CN/full_description.txt +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -1,22 +1,18 @@ -Status 是一个开源的、基于以太坊的应用程序,能够让您聊天、交易并且通过您的Android设备进入革新性的DApps的世界。 +Status 将保护匿名私密的消息应用,与安全的加密货币钱包结合成一个强大的通信工具。您可以与朋友或在社群中聊天,也可以购买、存储和交换数字资产。 -重要:Status目前正处于开放测试中。测试测试版产品往往会有风险,因此在加入时您会被要求阅读并认可您理解并接受这些风险。 +Status 是你的以太坊操作系统。 -尽管Status仍在开发进程中,我们还是希望这个测试版能够为您带来以太坊友好、直观的体验,也希望就此您能够成为以太网的一个绝佳的客户。 +安全的以太坊钱包 +Status 加密货币钱包支持安全地发送、存储和交换以太坊资产(例如 ETH、SNT)、稳定币(例如 DAI)以及数字藏品。Status 多链以太坊钱包支持主网、Base Arbitrum 和 Optimism,让您安心掌控加密货币和数字资产。Status 区块链钱包目前仅支持 ETH、ERC-20、ERC-721 和 ERC-1155 资产;不支持 Bitcoin。 -Status是什么? -它是一种用于新型互联网的新型工具,使用一个应用程序就能够浏览、聊天和交易。 +私密通信 +一对一或同多人发送私密消息,没有人能窥探你的通信内容。Status 不使用中心化消息中继,提升消息的隐私和安全。所有消息都经过端到端加密。此外,消息不含发送或接收者的身份信息,包括 Status 在内的任何人都无法获知消息内容或交流者身份。 -对于这个世界我们希望看到的是,人们作为一个较大网络的一分子能够更多地控制他们所创造、管理及贡献的价值。为了达到这个目标,我们创造了工具以让人们能够更轻松地参与并从新型的人类互动和经济活动中获益。 +赚取 DeFi 收益 +使用最新的去中心化金融应用和去中心化交易所 (DEX),如 Maker、Aave、Uniswap、Synthetix、PoolTogether、Zerion、Kyber 等,充分发挥加密货币的作用。 -测试版特性: +连接社群 +探索、连接并与你最喜欢的社群和朋友聊天。无论是朋友群聊、艺术家团体、加密货币交易者,还是潜在大型组织,都可以通过在 Status 社群中发送信息,进行交流。 -■ 加密消息—基于Whisper协议建立,启用了去中心化的一对一聊天、群聊及社交支付。 - -■浏览DApps—使用Status的3.0网络浏览器,和新兴的DApps生态系统实现无缝互动。 - -■ 以太钱包—默认的钱包,可以提供以太存储,发送/接收交易,还可提供二维码阅读器和交易日志。 - - -参与其中 -作为一个开源项目,最好的参与开发的途径就是下载并测试Status。我们的使命是通过以太坊所代表的新范式,实现向更加开放的网络和金融系统的转变。我们的最高目标就是将隐私作为人类的集体权利,降低审查的风险,并以一种透明的、开放的态度来推进经济贸易。Status 正在建设的社区欢迎任何人加入并为此事业做出贡献。我们非常愿意得到你们的反馈。请通过https://join.status.im/chat/public/status 加入我们。 \ No newline at end of file +创建私密账号 +免费创建匿名账号,保护隐私。Status 不会向您索要电话号码、电子邮件地址或银行账户。钱包私钥在本地生成并安全存储,只有您自己可以获取资金和金融交易记录。 diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt index ea08db12e5d..1f735456a30 100644 --- a/fastlane/metadata/android/zh-CN/short_description.txt +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -1 +1 @@ -Status是一个为以太坊所建造的开源的移动操作系统。 \ No newline at end of file +连接个人金融和Web3 diff --git a/fastlane/metadata/android/zh-CN/title.txt b/fastlane/metadata/android/zh-CN/title.txt index 371077bb41d..d1152f6c389 100644 --- a/fastlane/metadata/android/zh-CN/title.txt +++ b/fastlane/metadata/android/zh-CN/title.txt @@ -1 +1 @@ -Status—以太坊无处不在。 \ No newline at end of file +Status: 以太坊加密钱包 diff --git a/fastlane/metadata/android/zh-CN/video.txt b/fastlane/metadata/android/zh-CN/video.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/fiddle/README.md b/fiddle/README.md deleted file mode 100644 index c54f4742c68..00000000000 --- a/fiddle/README.md +++ /dev/null @@ -1,7 +0,0 @@ -`cd fiddle` - -`yarn install` - -`clj prepare.clj` - -`clj -A:dev` \ No newline at end of file diff --git a/fiddle/deps.edn b/fiddle/deps.edn deleted file mode 100644 index f680101be06..00000000000 --- a/fiddle/deps.edn +++ /dev/null @@ -1,17 +0,0 @@ -{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} - com.bhauman/figwheel-main {:mvn/version "0.2.0"} - org.clojure/core.async {:mvn/version "0.4.474"} - reagent {:mvn/version "0.8.1" :exclusions [cljsjs/react cljsjs/react-dom]} - re-frame {:git/url "https://github.com/status-im/re-frame" - :sha "b0d3b0f016f217c6a397a54e5eba9486471fb172" - :deps/manifest :deps} - com.andrewmcveigh/cljs-time {:mvn/version "0.5.2"} - status-im/timbre {:mvn/version "4.10.0-2-status"} - com.taoensso/encore {:mvn/version "2.94.0"} - hickory {:mvn/version "0.7.1"} - cljs-bean {:mvn/version "1.3.0"}} - - :paths ["src" "../src" "resources" "target" "../resources"] - - :aliases {:dev {:extra-deps {re-frisk {:mvn/version "0.5.4.1"}} - :main-opts ["-m" "figwheel.main" "-b" "dev" "-r"]}}} diff --git a/fiddle/dev.cljs.edn b/fiddle/dev.cljs.edn deleted file mode 100644 index 132bd87a7f8..00000000000 --- a/fiddle/dev.cljs.edn +++ /dev/null @@ -1,10 +0,0 @@ -{:main fiddle.core - :output-to "resources/public/js/main.js" - :preloads [re-frisk.preload] - :infer-externs true - :npm-deps false - :foreign-libs [{:file "dist/index_bundle.js" - :provides ["react" "react-dom" "react-native-web"] - :global-exports {react React - react-dom ReactDOM - react-native-web ReactNativeWeb}}]} \ No newline at end of file diff --git a/fiddle/dist/index_bundle.js b/fiddle/dist/index_bundle.js deleted file mode 100644 index 2f2c0c0c4c1..00000000000 --- a/fiddle/dist/index_bundle.js +++ /dev/null @@ -1,38 +0,0 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=56)}([function(e,t,n){e.exports=n(67)()},function(e,t,n){"use strict";e.exports=n(57)},function(e,t,n){"use strict";var r=function(e){if(void 0===e)throw new Error("invariant(...): Second argument must be a string.")};e.exports=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),i=2;i=e.length)break;r=e[n++]}else{if((n=e.next()).done)break;r=n.value}var i=r;i.__makeNative(),o.a.API.connectAnimatedNodes(this.__getNativeTag(),i.__getNativeTag())}}},i.__addChild=function(e){0===this._children.length&&this.__attach(),this._children.push(e),this.__isNative&&(e.__makeNative(),o.a.API.connectAnimatedNodes(this.__getNativeTag(),e.__getNativeTag()))},i.__removeChild=function(e){var t=this._children.indexOf(e);-1!==t?(this.__isNative&&e.__isNative&&o.a.API.disconnectAnimatedNodes(this.__getNativeTag(),e.__getNativeTag()),this._children.splice(t,1),0===this._children.length&&this.__detach()):console.warn("Trying to remove a child that doesn't exist")},i.__getChildren=function(){return this._children},r}(r.a);t.a=i},function(e,t,n){"use strict";var r=n(14);e.exports=r},function(e,t,n){"use strict";var r=n(8),o=n(2),i=n.n(o),a=n(22),s=n.n(a);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var u=function(e){return e};function c(e){if(e.outputRange&&"string"==typeof e.outputRange[0])return function(e){var t=e.outputRange;i()(t.length>=2,"Bad output range"),function(e){for(var t=e[0].replace(f,""),n=1;n=2,"inputRange must have at least 2 elements");for(var t=1;t=e[t-1],"inputRange must be monotonically increasing "+e)}(n),i()(n.length===t.length,"inputRange ("+n.length+") and outputRange ("+t.length+") must have the same length");var r=e.easing||u,o="extend";void 0!==e.extrapolateLeft?o=e.extrapolateLeft:void 0!==e.extrapolate&&(o=e.extrapolate);var a="extend";return void 0!==e.extrapolateRight?a=e.extrapolateRight:void 0!==e.extrapolate&&(a=e.extrapolate),function(e){i()("number"==typeof e,"Cannot interpolation an input which is not a number");var s=function(e,t){var n;for(n=1;n=e);++n);return n-1}(e,n);return function(e,t,n,r,o,i,a,s){var l=e;if(ln){if("identity"===s)return l;"clamp"===s&&(l=n)}if(r===o)return r;if(t===n)return e<=t?r:o;t===-1/0?l=-l:n===1/0?l-=t:l=(l-t)/(n-t);l=i(l),r===-1/0?l=-l:o===1/0?l+=r:l=l*(o-r)+r;return l}(e,n[s],n[s+1],t[s],t[s+1],r,o,a)}}function d(e){var t=s()(e);return null===t?e:"rgba("+((4278190080&(t=t||0))>>>24)+", "+((16711680&t)>>>16)+", "+((65280&t)>>>8)+", "+(255&t)/255+")"}var f=/[0-9\.-]+/g;function p(e,t){i()(t.length>=2,e+" must have at least 2 elements"),i()(2!==t.length||t[0]!==-1/0||t[1]!==1/0,e+"cannot be ]-infinity;+infinity[ "+t)}var h=function(e){var t,n;function r(t,n){var r;return(r=e.call(this)||this)._parent=t,r._config=n,r._interpolation=c(n),r}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.__makeNative=function(){this._parent.__makeNative(),e.prototype.__makeNative.call(this)},o.__getValue=function(){var e=this._parent.__getValue();return i()("number"==typeof e,"Cannot interpolate an input which is not a number."),this._interpolation(e)},o.interpolate=function(e){return new r(this,e)},o.__attach=function(){this._parent.__addChild(this)},o.__detach=function(){this._parent.__removeChild(this),e.prototype.__detach.call(this)},o.__transformDataType=function(e){return e.map(function(e){return"string"!=typeof e?e:/deg$/.test(e)?(parseFloat(e)||0)*Math.PI/180:parseFloat(e)||0})},o.__getNativeConfig=function(){return{inputRange:this._config.inputRange,outputRange:this.__transformDataType(this._config.outputRange),extrapolateLeft:this._config.extrapolateLeft||this._config.extrapolate||"extend",extrapolateRight:this._config.extrapolateRight||this._config.extrapolate||"extend",type:"interpolation"}},r}(r.a);h.__createInterpolation=c,t.a=h},function(e,t,n){"use strict";var r=n(1),o=n(69);if(void 0===r)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var i=(new r.Component).updater;e.exports=o(r.Component,r.isValidElement,i)},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(58)},function(e,t,n){"use strict";var r=n(2),o=n.n(r),i=n(3).canUseDOM&&void 0!==window.requestIdleCallback,a=i?window.requestIdleCallback:function(e,t){return setTimeout(function(){var t=Date.now();e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)},s=i?window.cancelIdleCallback:function(e){clearTimeout(e)},l=a,u={Events:{interactionStart:"interactionStart",interactionComplete:"interactionComplete"},runAfterInteractions:function(e){var t,n=new Promise(function(n){t=l(function(){e?n(e()):n()})});return{then:n.then.bind(n),done:n.then.bind(n),cancel:function(){s(t)}}},createInteractionHandle:function(){return 1},clearInteractionHandle:function(e){o()(!!e,"Must provide a handle to clear.")},addListener:function(){}};t.a=u},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";(function(t){var n="undefined"==typeof window?t:window,r=function(e,t,n){return function(r,o){var i=e(function(){t.call(this,i),r.apply(this,arguments)}.bind(this),o);return this[n]?this[n].push(i):this[n]=[i],i}},o=function(e,t){return function(n){if(this[t]){var r=this[t].indexOf(n);-1!==r&&this[t].splice(r,1)}e(n)}},i="TimerMixin_timeouts",a=o(n.clearTimeout,i),s=r(n.setTimeout,a,i),l="TimerMixin_intervals",u=o(n.clearInterval,l),c=r(n.setInterval,function(){},l),d="TimerMixin_immediates",f=o(n.clearImmediate,d),p=r(n.setImmediate,f,d),h="TimerMixin_rafs",m=o(n.cancelAnimationFrame,h),v={componentWillUnmount:function(){this[i]&&this[i].forEach(function(e){n.clearTimeout(e)}),this[i]=null,this[l]&&this[l].forEach(function(e){n.clearInterval(e)}),this[l]=null,this[d]&&this[d].forEach(function(e){n.clearImmediate(e)}),this[d]=null,this[h]&&this[h].forEach(function(e){n.cancelAnimationFrame(e)}),this[h]=null},setTimeout:s,clearTimeout:a,setInterval:c,clearInterval:u,setImmediate:p,clearImmediate:f,requestAnimationFrame:r(n.requestAnimationFrame,m,h),cancelAnimationFrame:m};e.exports=v}).call(this,n(29))},function(e,t,n){"use strict";t.a=function(e){if(e&&(1===e.nodeType&&"function"==typeof e.getBoundingClientRect))return e.getBoundingClientRect()}},function(e,t,n){"use strict";var r={UIManager:n(6).a};t.a=r},function(e,t,n){"use strict";var r=n(4),o=function(){function e(){}var t=e.prototype;return t.start=function(e,t,n,r,o){},t.stop=function(){this.__nativeId&&r.a.API.stopAnimation(this.__nativeId)},t.__getNativeAnimationConfig=function(){throw new Error("This animation type cannot be offloaded to native")},t.__debouncedOnEnd=function(e){var t=this.__onEnd;this.__onEnd=null,t&&t(e)},t.__startNativeAnimation=function(e){e.__makeNative(),this.__nativeId=r.a.generateNewAnimationId(),r.a.API.startAnimatingNode(this.__nativeId,e.__getNativeTag(),this.__getNativeAnimationConfig(),this.__debouncedOnEnd.bind(this))},e}();t.a=o},function(e,t){function n(e,t,n){var r,o,i,a,s;function l(){var u=Date.now()-a;u=0?r=setTimeout(l,t-u):(r=null,n||(s=e.apply(i,o),i=o=null))}null==t&&(t=100);var u=function(){i=this,o=arguments,a=Date.now();var u=n&&!r;return r||(r=setTimeout(l,t)),u&&(s=e.apply(i,o),i=o=null),s};return u.clear=function(){r&&(clearTimeout(r),r=null)},u.flush=function(){r&&(s=e.apply(i,o),i=o=null,clearTimeout(r),r=null)},u}n.debounce=n,e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"string"==typeof e&&r.test(e)};var r=/-webkit-|-moz-|-ms-/;e.exports=t.default},function(e,t,n){"use strict";n.r(t);var r=/[A-Z]/g,o=/^ms-/,i={};function a(e){return"-"+e.toLowerCase()}t.default=function(e){if(i.hasOwnProperty(e))return i[e];var t=e.replace(r,a);return i[e]=o.test(t)?"-"+t:t}},function(e,t){function n(e){var t;return"number"==typeof e?e>>>0===e&&e>=0&&e<=4294967295?e:null:(t=l.hex6.exec(e))?parseInt(t[1]+"ff",16)>>>0:p.hasOwnProperty(e)?p[e]:(t=l.rgb.exec(e))?(u(t[1])<<24|u(t[2])<<16|u(t[3])<<8|255)>>>0:(t=l.rgba.exec(e))?(u(t[1])<<24|u(t[2])<<16|u(t[3])<<8|d(t[4]))>>>0:(t=l.hex3.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+"ff",16)>>>0:(t=l.hex8.exec(e))?parseInt(t[1],16)>>>0:(t=l.hex4.exec(e))?parseInt(t[1]+t[1]+t[2]+t[2]+t[3]+t[3]+t[4]+t[4],16)>>>0:(t=l.hsl.exec(e))?(255|o(c(t[1]),f(t[2]),f(t[3])))>>>0:(t=l.hsla.exec(e))?(o(c(t[1]),f(t[2]),f(t[3]))|d(t[4]))>>>0:null}function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function o(e,t,n){var o=n<.5?n*(1+t):n+t-n*t,i=2*n-o,a=r(i,o,e+1/3),s=r(i,o,e),l=r(i,o,e-1/3);return Math.round(255*a)<<24|Math.round(255*s)<<16|Math.round(255*l)<<8}var i="[-+]?\\d*\\.?\\d+",a=i+"%";function s(){return"\\(\\s*("+(e=arguments,Array.prototype.slice.call(e,0)).join(")\\s*,\\s*(")+")\\s*\\)";var e}var l={rgb:new RegExp("rgb"+s(i,i,i)),rgba:new RegExp("rgba"+s(i,i,i,i)),hsl:new RegExp("hsl"+s(i,a,a)),hsla:new RegExp("hsla"+s(i,a,a,i)),hex3:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex4:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#([0-9a-fA-F]{6})$/,hex8:/^#([0-9a-fA-F]{8})$/};function u(e){var t=parseInt(e,10);return t<0?0:t>255?255:t}function c(e){return(parseFloat(e)%360+360)%360/360}function d(e){var t=parseFloat(e);return t<0?0:t>1?255:Math.round(255*t)}function f(e){var t=parseFloat(e,10);return t<0?0:t>100?1:t/100}var p={transparent:0,aliceblue:4042850303,antiquewhite:4209760255,aqua:16777215,aquamarine:2147472639,azure:4043309055,beige:4126530815,bisque:4293182719,black:255,blanchedalmond:4293643775,blue:65535,blueviolet:2318131967,brown:2771004159,burlywood:3736635391,burntsienna:3934150143,cadetblue:1604231423,chartreuse:2147418367,chocolate:3530104575,coral:4286533887,cornflowerblue:1687547391,cornsilk:4294499583,crimson:3692313855,cyan:16777215,darkblue:35839,darkcyan:9145343,darkgoldenrod:3095792639,darkgray:2846468607,darkgreen:6553855,darkgrey:2846468607,darkkhaki:3182914559,darkmagenta:2332068863,darkolivegreen:1433087999,darkorange:4287365375,darkorchid:2570243327,darkred:2332033279,darksalmon:3918953215,darkseagreen:2411499519,darkslateblue:1211993087,darkslategray:793726975,darkslategrey:793726975,darkturquoise:13554175,darkviolet:2483082239,deeppink:4279538687,deepskyblue:12582911,dimgray:1768516095,dimgrey:1768516095,dodgerblue:512819199,firebrick:2988581631,floralwhite:4294635775,forestgreen:579543807,fuchsia:4278255615,gainsboro:3705462015,ghostwhite:4177068031,gold:4292280575,goldenrod:3668254975,gray:2155905279,green:8388863,greenyellow:2919182335,grey:2155905279,honeydew:4043305215,hotpink:4285117695,indianred:3445382399,indigo:1258324735,ivory:4294963455,khaki:4041641215,lavender:3873897215,lavenderblush:4293981695,lawngreen:2096890111,lemonchiffon:4294626815,lightblue:2916673279,lightcoral:4034953471,lightcyan:3774873599,lightgoldenrodyellow:4210742015,lightgray:3553874943,lightgreen:2431553791,lightgrey:3553874943,lightpink:4290167295,lightsalmon:4288707327,lightseagreen:548580095,lightskyblue:2278488831,lightslategray:2005441023,lightslategrey:2005441023,lightsteelblue:2965692159,lightyellow:4294959359,lime:16711935,limegreen:852308735,linen:4210091775,magenta:4278255615,maroon:2147483903,mediumaquamarine:1724754687,mediumblue:52735,mediumorchid:3126187007,mediumpurple:2473647103,mediumseagreen:1018393087,mediumslateblue:2070474495,mediumspringgreen:16423679,mediumturquoise:1221709055,mediumvioletred:3340076543,midnightblue:421097727,mintcream:4127193855,mistyrose:4293190143,moccasin:4293178879,navajowhite:4292783615,navy:33023,oldlace:4260751103,olive:2155872511,olivedrab:1804477439,orange:4289003775,orangered:4282712319,orchid:3664828159,palegoldenrod:4008225535,palegreen:2566625535,paleturquoise:2951671551,palevioletred:3681588223,papayawhip:4293907967,peachpuff:4292524543,peru:3448061951,pink:4290825215,plum:3718307327,powderblue:2967529215,purple:2147516671,rebeccapurple:1714657791,red:4278190335,rosybrown:3163525119,royalblue:1097458175,saddlebrown:2336560127,salmon:4202722047,sandybrown:4104413439,seagreen:780883967,seashell:4294307583,sienna:2689740287,silver:3233857791,skyblue:2278484991,slateblue:1784335871,slategray:1887473919,slategrey:1887473919,snow:4294638335,springgreen:16744447,steelblue:1182971135,tan:3535047935,teal:8421631,thistle:3636451583,tomato:4284696575,turquoise:1088475391,violet:4001558271,wheat:4125012991,white:4294967295,whitesmoke:4126537215,yellow:4294902015,yellowgreen:2597139199};n.rgba=function(e){return{r:Math.round((4278190080&e)>>>24),g:Math.round((16711680&e)>>>16),b:Math.round((65280&e)>>>8),a:((255&e)>>>0)/255}},e.exports=n},function(e,t,n){"use strict";var r=n(7),o=n(8),i=n(2),a=n.n(i);var s=1,l=function(e){var t,n;function o(t){var n;n=e.call(this)||this;var o=t||{x:0,y:0};return"number"==typeof o.x&&"number"==typeof o.y?(n.x=new r.a(o.x),n.y=new r.a(o.y)):(a()(o.x instanceof r.a&&o.y instanceof r.a,"AnimatedValueXY must be initialized with an object of numbers or AnimatedValues."),n.x=o.x,n.y=o.y),n._listeners={},n}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=o.prototype;return i.setValue=function(e){this.x.setValue(e.x),this.y.setValue(e.y)},i.setOffset=function(e){this.x.setOffset(e.x),this.y.setOffset(e.y)},i.flattenOffset=function(){this.x.flattenOffset(),this.y.flattenOffset()},i.extractOffset=function(){this.x.extractOffset(),this.y.extractOffset()},i.__getValue=function(){return{x:this.x.__getValue(),y:this.y.__getValue()}},i.resetAnimation=function(e){this.x.resetAnimation(),this.y.resetAnimation(),e&&e(this.__getValue())},i.stopAnimation=function(e){this.x.stopAnimation(),this.y.stopAnimation(),e&&e(this.__getValue())},i.addListener=function(e){var t=this,n=String(s++),r=function(n){n.value;e(t.__getValue())};return this._listeners[n]={x:this.x.addListener(r),y:this.y.addListener(r)},n},i.removeListener=function(e){this.x.removeListener(this._listeners[e].x),this.y.removeListener(this._listeners[e].y),delete this._listeners[e]},i.removeAllListeners=function(){this.x.removeAllListeners(),this.y.removeAllListeners(),this._listeners={}},i.getLayout=function(){return{left:this.x,top:this.y}},i.getTranslateTransform=function(){return[{translateX:this.x},{translateY:this.y}]},o}(o.a);t.a=l},function(e,t,n){"use strict";e.exports=n(61)},function(e,t,n){"use strict";var r={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexOrder:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,gridRow:!0,gridColumn:!0,lineClamp:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0,scale:!0,scaleX:!0,scaleY:!0,scaleZ:!0,shadowOpacity:!0},o=["ms","Moz","O","Webkit"];Object.keys(r).forEach(function(e){o.forEach(function(t){r[function(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}(t,e)]=r[e]})}),t.a=r},function(e,t,n){"use strict";var r,o=n(53),i=n.n(o),a=function(){function e(){}return e.step0=function(e){return e>0?1:0},e.step1=function(e){return e>=1?1:0},e.linear=function(e){return e},e.ease=function(t){return r||(r=e.bezier(.42,0,1,1)),r(t)},e.quad=function(e){return e*e},e.cubic=function(e){return e*e*e},e.poly=function(e){return function(t){return Math.pow(t,e)}},e.sin=function(e){return 1-Math.cos(e*Math.PI/2)},e.circle=function(e){return 1-Math.sqrt(1-e*e)},e.exp=function(e){return Math.pow(2,10*(e-1))},e.elastic=function(e){void 0===e&&(e=1);var t=e*Math.PI;return function(e){return 1-Math.pow(Math.cos(e*Math.PI/2),3)*Math.cos(e*t)}},e.back=function(e){return void 0===e&&(e=1.70158),function(t){return t*t*((e+1)*t-e)}},e.bounce=function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},e.bezier=function(e,t,n,r){return i()(e,t,n,r)},e.in=function(e){return e},e.out=function(e){return function(t){return 1-e(1-t)}},e.inOut=function(e){return function(t){return t<.5?e(2*t)/2:1-e(2*(1-t))/2}},e}();t.a=a},function(e,t,n){"use strict";e.exports=function(e,t,n){if("function"==typeof Array.prototype.findIndex)return e.findIndex(t,n);if("function"!=typeof t)throw new TypeError("predicate must be a function");var r=Object(e),o=r.length;if(0===o)return-1;for(var i=0;i0,"Stiffness value must be greater than 0"),a()(n._damping>0,"Damping value must be greater than 0"),a()(n._mass>0,"Mass value must be greater than 0"),n}r=t,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,n.__proto__=r;var u=i.prototype;return u.__getNativeAnimationConfig=function(){return{type:"spring",overshootClamping:this._overshootClamping,restDisplacementThreshold:this._restDisplacementThreshold,restSpeedThreshold:this._restSpeedThreshold,stiffness:this._stiffness,damping:this._damping,mass:this._mass,initialVelocity:l(this._initialVelocity,this._lastVelocity),toValue:this._toValue,iterations:this.__iterations}},u.start=function(e,t,n,r,o){var a=this;if(this.__active=!0,this._startPosition=e,this._lastPosition=this._startPosition,this._onUpdate=t,this.__onEnd=n,this._lastTime=Date.now(),this._frameTime=0,r instanceof i){var s=r.getInternalState();this._lastPosition=s.lastPosition,this._lastVelocity=s.lastVelocity,this._initialVelocity=this._lastVelocity,this._lastTime=s.lastTime}var l=function(){a._useNativeDriver?a.__startNativeAnimation(o):a.onUpdate()};this._delay?this._timeout=setTimeout(l,this._delay):l()},u.getInternalState=function(){return{lastPosition:this._lastPosition,lastVelocity:this._lastVelocity,lastTime:this._lastTime}},u.onUpdate=function(){var e=Date.now();e>this._lastTime+64&&(e=this._lastTime+64);var t=(e-this._lastTime)/1e3;this._frameTime+=t;var n=this._damping,r=this._mass,o=this._stiffness,i=-this._initialVelocity,a=n/(2*Math.sqrt(o*r)),s=Math.sqrt(o/r),l=s*Math.sqrt(1-a*a),u=this._toValue-this._startPosition,c=0,d=0,f=this._frameTime;if(a<1){var p=Math.exp(-a*s*f);c=this._toValue-p*((i+a*s*u)/l*Math.sin(l*f)+u*Math.cos(l*f)),d=a*s*p*(Math.sin(l*f)*(i+a*s*u)/l+u*Math.cos(l*f))-p*(Math.cos(l*f)*(i+a*s*u)-l*u*Math.sin(l*f))}else{var h=Math.exp(-s*f);c=this._toValue-h*(u+(i+s*u)*f),d=h*(i*(f*s-1)+f*u*(s*s))}if(this._lastTime=e,this._lastPosition=c,this._lastVelocity=d,this._onUpdate(c),this.__active){var m=!1;this._overshootClamping&&0!==this._stiffness&&(m=this._startPositionthis._toValue:c18&&u<=44?function(e){return 44e-6*Math.pow(e,3)-.006*Math.pow(e,2)+.36*e+2}(u):function(e){return 45e-8*Math.pow(e,3)-332e-6*Math.pow(e,2)+.1078*e+5.84}(u),function(e,t,n){return e*n+(1-e)*t}(2*s-s*s,l,.01));return{stiffness:r(d),damping:o(f)}}}},function(e,t,n){"use strict";(function(e){var r,o=n(18),i=n(26),a=n(4);var s=function(t){var n,o;function s(e){var n;return(n=t.call(this)||this)._toValue=e.toValue,n._easing=void 0!==e.easing?e.easing:(r||(r=i.a.inOut(i.a.ease)),r),n._duration=void 0!==e.duration?e.duration:500,n._delay=void 0!==e.delay?e.delay:0,n.__iterations=void 0!==e.iterations?e.iterations:1,n.__isInteraction=void 0===e.isInteraction||e.isInteraction,n._useNativeDriver=Object(a.c)(e),n}o=t,(n=s).prototype=Object.create(o.prototype),n.prototype.constructor=n,n.__proto__=o;var l=s.prototype;return l.__getNativeAnimationConfig=function(){for(var e=[],t=0;t=this._startTime+this._duration)return 0===this._duration?this._onUpdate(this._toValue):this._onUpdate(this._fromValue+this._easing(1)*(this._toValue-this._fromValue)),void this.__debouncedOnEnd({finished:!0});this._onUpdate(this._fromValue+this._easing((e-this._startTime)/this._duration)*(this._toValue-this._fromValue)),this.__active&&(this._animationFrame=requestAnimationFrame(this.onUpdate.bind(this)))},l.stop=function(){t.prototype.stop.call(this),this.__active=!1,clearTimeout(this._timeout),e.cancelAnimationFrame(this._animationFrame),this.__debouncedOnEnd({finished:!1})},s}(o.a);t.a=s}).call(this,n(29))},function(e,t,n){"use strict";e.exports={extractSingleTouch:function(e){var t=e.touches,n=e.changedTouches,r=t&&t.length>0,o=n&&n.length>0;return!r&&o?n[0]:r?t[0]:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.charAt(0).toUpperCase()+e.slice(1)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.prefixMap,n=e.plugins;return function e(s){for(var l in s){var u=s[l];if((0,a.default)(u))s[l]=e(u);else if(Array.isArray(u)){for(var c=[],d=0,f=u.length;d0&&(s[l]=c)}else{var h=(0,o.default)(n,l,u,s,t);h&&(s[l]=h),s=(0,r.default)(t,l,s)}}return s}};var r=s(n(62)),o=s(n(63)),i=s(n(64)),a=s(n(65));function s(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&"text"===t)return["-webkit-text","text"]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,i.default)(t)&&t.indexOf("cross-fade(")>-1)return a.map(function(e){return t.replace(/cross-fade\(/g,e+"cross-fade(")})};var r,o=n(20),i=(r=o)&&r.__esModule?r:{default:r};var a=["-webkit-",""]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("cursor"===e&&o.hasOwnProperty(t))return r.map(function(e){return e+t})};var r=["-webkit-","-moz-",""],o={"zoom-in":!0,"zoom-out":!0,grab:!0,grabbing:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,i.default)(t)&&t.indexOf("filter(")>-1)return a.map(function(e){return t.replace(/filter\(/g,e+"filter(")})};var r,o=n(20),i=(r=o)&&r.__esModule?r:{default:r};var a=["-webkit-",""]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("display"===e&&r.hasOwnProperty(t))return r[t]};var r={flex:["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex","flex"],"inline-flex":["-webkit-inline-box","-moz-inline-box","-ms-inline-flexbox","-webkit-inline-flex","inline-flex"]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){Object.prototype.hasOwnProperty.call(o,e)&&(n[o[e]]=r[t]||t);if("flex"===e){if(Object.prototype.hasOwnProperty.call(i,t))return void(n.msFlex=i[t]);if(a.test(t))return void(n.msFlex=t+" 1 0%");var s=t.split(/\s/);switch(s.length){case 1:return void(n.msFlex="1 1 "+t);case 2:return void(a.test(s[1])?n.msFlex=s[0]+" "+s[1]+" 0%":n.msFlex=s[0]+" 1 "+s[1]);default:n.msFlex=t}}};var r={"space-around":"distribute","space-between":"justify","flex-start":"start","flex-end":"end"},o={alignContent:"msFlexLinePack",alignSelf:"msFlexItemAlign",alignItems:"msFlexAlign",justifyContent:"msFlexPack",order:"msFlexOrder",flexGrow:"msFlexPositive",flexShrink:"msFlexNegative",flexBasis:"msFlexPreferredSize"},i={auto:"1 1 auto",inherit:"inherit",initial:"0 1 auto",none:"0 0 auto",unset:"unset"},a=/^\d+(\.\d+)?$/},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){"flexDirection"===e&&"string"==typeof t&&(t.indexOf("column")>-1?n.WebkitBoxOrient="vertical":n.WebkitBoxOrient="horizontal",t.indexOf("reverse")>-1?n.WebkitBoxDirection="reverse":n.WebkitBoxDirection="normal");o.hasOwnProperty(e)&&(n[o[e]]=r[t]||t)};var r={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple"},o={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines",flexGrow:"WebkitBoxFlex"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,i.default)(t)&&s.test(t))return a.map(function(e){return t.replace(s,function(t){return e+t})})};var r,o=n(20),i=(r=o)&&r.__esModule?r:{default:r};var a=["-webkit-","-moz-",""],s=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/gi},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("string"==typeof t&&!(0,i.default)(t)&&t.indexOf("image-set(")>-1)return a.map(function(e){return t.replace(/image-set\(/g,e+"image-set(")})};var r,o=n(20),i=(r=o)&&r.__esModule?r:{default:r};var a=["-webkit-",""]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("position"===e&&"sticky"===t)return["-webkit-sticky","sticky"]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(o.hasOwnProperty(e)&&i.hasOwnProperty(t))return r.map(function(e){return e+t})};var r=["-webkit-","-moz-",""],o={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},i={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n,a){if("string"==typeof t&&s.hasOwnProperty(e)){var u=function(e,t){if((0,o.default)(e))return e;for(var n=e.split(/,(?![^()]*(?:\([^()]*\))?\))/g),i=0,a=n.length;i-1&&"order"!==d)for(var f=t[c],p=0,h=f.length;p-1)return c;var d=u.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function(e){return!/-webkit-|-ms-/.test(e)}).join(",");return e.indexOf("Moz")>-1?d:(n["Webkit"+(0,i.default)(e)]=c,n["Moz"+(0,i.default)(e)]=d,u)}};var r=a(n(66)),o=a(n(20)),i=a(n(39));function a(e){return e&&e.__esModule?e:{default:e}}var s={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0,MozTransition:!0,MozTransitionProperty:!0},l={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-"}},function(e,t,n){"use strict";var r=4,o=.001,i=1e-7,a=10,s=11,l=1/(s-1),u="function"==typeof Float32Array;function c(e,t){return 1-3*t+3*e}function d(e,t){return 3*t-6*e}function f(e){return 3*e}function p(e,t,n){return((c(t,n)*e+d(t,n))*e+f(t))*e}function h(e,t,n){return 3*c(t,n)*e*e+2*d(t,n)*e+f(t)}e.exports=function(e,t,n,c){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");var d=u?new Float32Array(s):new Array(s);if(e!==t||n!==c)for(var f=0;f=o?function(e,t,n,o){for(var i=0;i0?n=l:t=l}while(Math.abs(s)>i&&++uL.length&&L.push(e)}function M(e,t,n){return null==e?0:function e(t,n,r,o){var s=typeof t;"undefined"!==s&&"boolean"!==s||(t=null);var l=!1;if(null===t)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+j(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var u=0;uthis.eventPool.length&&this.eventPool.push(e)}function de(e){e.eventPool=[],e.getPooled=ue,e.release=ce}o(le.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=ae)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=ae)},persist:function(){this.isPersistent=ae},isPersistent:se,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=se,this._dispatchInstances=this._dispatchListeners=null}}),le.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},le.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return o(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=o({},r.Interface,e),n.extend=r.extend,de(n),n},de(le);var fe=le.extend({data:null}),pe=le.extend({data:null}),he=[9,13,27,32],me=K&&"CompositionEvent"in window,ve=null;K&&"documentMode"in document&&(ve=document.documentMode);var ge=K&&"TextEvent"in window&&!ve,ye=K&&(!me||ve&&8=ve),be=String.fromCharCode(32),_e={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},we=!1;function Se(e,t){switch(e){case"keyup":return-1!==he.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Ee(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Ce=!1;var Te={eventTypes:_e,extractEvents:function(e,t,n,r){var o=void 0,i=void 0;if(me)e:{switch(e){case"compositionstart":o=_e.compositionStart;break e;case"compositionend":o=_e.compositionEnd;break e;case"compositionupdate":o=_e.compositionUpdate;break e}o=void 0}else Ce?Se(e,n)&&(o=_e.compositionEnd):"keydown"===e&&229===n.keyCode&&(o=_e.compositionStart);return o?(ye&&"ko"!==n.locale&&(Ce||o!==_e.compositionStart?o===_e.compositionEnd&&Ce&&(i=ie()):(re="value"in(ne=r)?ne.value:ne.textContent,Ce=!0)),o=fe.getPooled(o,t,n,r),i?o.data=i:null!==(i=Ee(n))&&(o.data=i),W(o),i=o):i=null,(e=ge?function(e,t){switch(e){case"compositionend":return Ee(t);case"keypress":return 32!==t.which?null:(we=!0,be);case"textInput":return(e=t.data)===be&&we?null:e;default:return null}}(e,n):function(e,t){if(Ce)return"compositionend"===e||!me&&Se(e,t)?(e=ie(),oe=re=ne=null,Ce=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1