From 8f539fa6c184c58d0c98327677c0cc52f1ee3a27 Mon Sep 17 00:00:00 2001 From: Drazen Urch Date: Mon, 27 Sep 2021 12:22:47 +0200 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit b1fb032f43a3e4faaf7e46a6cd82eb461a4ad5aa Author: Jędrzej Stuczyński Date: Mon Sep 27 11:06:13 2021 +0100 Removed SQLx offline mode artifact (#790) commit 23ea82952ef64eb4e184024c04f0afc085ae316c Author: Jędrzej Stuczyński Date: Mon Sep 27 11:05:53 2021 +0100 Bugfix/validator api windows build (#791) * Use https://github.com/nymtech/nym/pull/784/commits/3eceb349c695372cbb7a3bee9aa5e090da7c9c4d trick to make build.rs work with windows * Re-enabled validator-api windows CI build commit 9a65e441667d30236b5c25e0c4fa7c6bde9c35b6 Author: Drazen Urch Date: Mon Sep 27 12:03:54 2021 +0200 Add Tauri wallet -- Squashed commit of the following: commit 3f4f9073b77735528a565435be99f0877b715c28 Author: Drazen Urch Date: Mon Sep 27 11:38:12 2021 +0200 Delete .lock for merge commit bf502f6338df51a4f67ff4be6bdca2f3dd10bd28 Author: Drazen Urch Date: Mon Sep 27 11:36:51 2021 +0200 Squashed commit of the following: commit 020cad897d208cb21d3cd5c73294f02ea2881d05 Author: Jędrzej Stuczyński Date: Fri Sep 24 15:49:21 2021 +0100 Feature/rust rewarding (#750) * Calculating gas fees * Ability to set custom fees * Added extra test * Removed commented code * Moved all msg types to common contract crate * Temporarily disabling get_tx method * Finishing up nymd client API * Comment fix * Remaining fee values * Some cleanup * Removed needless borrow * Fixed imports in contract tests * Moved error types around * New ValidatorClient * Experiment with new type of defaults * Removed dead module * Dealt with unwrap * Migrated mixnode to use new validator client * Migrated gateway to use new validator client * Mixnode and gateway adjustments * More exported defaults * Clients using new validator client * Fixed mixnode upgrade * Moved default values to a new crate * Changed behaviour of validator client features * Migrated basic functions of validator api * Updated config + fixed startup * Fixed wasm client build * Integration with the explorer api * Removed tokio dev dependency * Needless borrow * Fixex wasm client build * Fixed tauri client build * Needless borrows * New tables for rewarding * Updated cosmos-sdk version * Removed reward-specific node status routes * New rewarding-specific config entries * Additional network defaults * Initial periodic rewards from validator api * Replaced print with log * Filtering nodes with uptime > 0 * Additional failure logging statements * Fixed operation ordering * Adjusted next rewarding epoch determination * Modified rewarding behaviour to keep track of rewarding in progress * Improved error message on config load failure * Additional log statement * Adjusted rewarding gas limit calculation * Made naming slightly more consistent * Fixed incorrect parentheses placement * Fixed fee calculation * Cargo fmt * Removed failed merge artifacts * Introduced comment for any future reward modification * typos * Helper functions for the future * Making @mfahampshire 's life easier * Redesigned epoch + rewarding skipped epochs (if possible) * Removed old merge artifacts * Naming consistency * Constraining arguments * Removed unnecessary if branch * Ignore monitor check for current epoch * Additional checks for current epoch data * Monitor threshold check * cargo fmt * Fixed post-merge issues in transactions.rs commit 5dfaff6296b2f714d28903553c1afdeb97df833c Author: Drazen Urch Date: Tue Sep 21 10:59:17 2021 +0200 Update hmac and blake3 (#673) * Update hmac and blake3 * Remain paranoid for `0.*` crates * Most paranoid versions :) * Updated aes and using published version of blake3 Co-authored-by: Jędrzej Stuczyński commit 5b03982043b43a0fca82814ae347069e5a8aafc8 Author: Jędrzej Stuczyński Date: Mon Sep 20 10:40:03 2021 +0100 Replaced unwrap_or_else with unwrap_or_default (#780) commit 8f6856d6fb9dc7c1cc0333dc824911ba19627f67 Author: Drazen Urch Date: Mon Sep 20 11:15:06 2021 +0200 Make fee helpers public (#777) Co-authored-by: Drazen Urch commit 80664b911fe59c912475eaa89557cec93e982428 Merge: f66ea059 46149012 Author: Fouad Date: Thu Sep 23 20:59:27 2021 +0100 Merge pull request #783 from nymtech/tauri-wallet-frontend tauri wallet front-end commit 46149012bd3d00125548c7af657329cc540f656a Author: fmtabbara Date: Thu Sep 23 17:42:34 2021 +0100 PR updates commit de601c319a7a9cfc9dbed5982d53e222ab3ac5cb Author: fmtabbara Date: Thu Sep 23 17:06:47 2021 +0100 PR updates commit 7318de23f2fe9ebba5a92c8b74f4aa0845b21f3b Author: max Date: Wed Sep 22 18:07:29 2021 +0200 added info on nym-wallet (tauri) in readme commit 56e07753eace256de9a72736d4480e909c4bde1d Author: max Date: Wed Sep 22 14:44:22 2021 +0200 added minimal readme for wallet commit 21b008fae989477c728abdc62cc19e8c76db45cc Author: fmtabbara Date: Mon Sep 13 13:30:05 2021 +0100 use wrapper functions for send and delegate form updates update working finish bonding and unbonding setup funds allocation check when bonding/sending/delegating update title commit 27a202cbe827724f55d8b875ee5f2d6e2c5f2e47 Author: fmtabbara Date: Fri Sep 17 11:32:41 2021 +0100 integrate admin functions updates integrate admin form update function commit 085538582bbe930226708403dffb3004d5897e04 Author: Drazen Urch Date: Fri Sep 17 10:43:26 2021 +0200 Admin functions, reorganize code commit f66ea05929f6298c0d90479733037f435d1faf75 Author: Drazen Urch Date: Fri Sep 17 10:43:26 2021 +0200 Admin functions, reorganize code commit 052c7188ec139d99595f7f1dd9d7d14f61ef9784 Merge: f6c316ee 976dd7aa Author: fmtabbara Date: Fri Sep 17 09:38:19 2021 +0100 merge develop commit f6c316eea9f980d6c6bb0ca62fd2e12aa9b57441 Author: Drazen Urch Date: Thu Sep 16 18:02:15 2021 +0200 fix typo commit f33defc645f6f4e576029263a2aaadc25152fad0 Author: Drazen Urch Date: Thu Sep 16 17:36:24 2021 +0200 Squashed commit of the following: commit 976dd7aae2e7ee6c8a0fdbe368f393b1c26ad704 Author: Drazen Urch Date: Wed Sep 15 17:28:49 2021 +0200 Add block_height method to Delegation (#778) Co-authored-by: Drazen Urch commit 0d21f4e937b1222820260a426c02b10d420963aa Merge: e84af4f6 1403449a Author: Fouad Date: Wed Sep 15 12:41:29 2021 +0100 Merge pull request #776 from nymtech/update/re-enable-bonding re-enable bonding commit 1403449ad51ec2cba19997af88e60f1435512171 Author: fmtabbara Date: Tue Sep 14 16:00:21 2021 +0100 enable bonding commit e84af4f6018772feb4896b31702f2d33ee4c1fb1 Author: Drazen Urch Date: Tue Sep 14 15:15:26 2021 +0200 Migrate legacy delegation data (#771) * Skip ReadOnlyBucket deserialization errors * empty migration * clippy * cargo schema * Drop invalid delegation data * Dont drop old data * Add todo * Unify on type param * gateways are different * cargo fmt Co-authored-by: Drazen Urch commit 26b032c15c7c8ec8f1442f23d2416bafce65323a Merge: e1ddaff0 cba36253 Author: Mark Sinclair Date: Tue Sep 14 10:09:14 2021 +0100 Merge pull request #774 from nymtech/feature/explorer-api-delegations Explorer-api: add API resource to show the delegations for each mix node commit cba3625394dae3f736dab23018df5fcc3c9a4f5d Author: Mark Sinclair Date: Mon Sep 13 10:33:41 2021 +0100 explorer-api: add API resource to show the delegations for each mix node commit e1ddaff04d5077969dd0dbb1e645653035aa8e23 Merge: 0b9c03ca 66ab5de4 Author: Fouad Date: Fri Sep 10 17:17:14 2021 +0100 Merge pull request #772 from nymtech/update/disable-bonding add app alert commit 66ab5de442de91a50556117b62ef028b6b249f6f Author: fmtabbara Date: Fri Sep 10 16:16:58 2021 +0100 add app alert commit 0b9c03ca900a834856efa37706dafac7685b5f79 Author: Dave Hrycyszyn Date: Fri Sep 10 11:23:21 2021 +0300 Adding deps for building the Tauri wallet under Ubuntu (#770) commit c9dce0c1da29a99b1c483009a0658b2236c3a4e8 Author: Bogdan-Ștefan Neacşu Date: Thu Sep 9 11:21:45 2021 +0200 Feature/consumable bandwidth (#766) * Set actual value for bandwidth Also put it as a public attribute, such that it can be actively used by the credential consumer * Switch from sending Attribute structs to sending the actual attribute bytes over the wire * Add atomic bandwidth value to gateway * Consume bandwidth based on the mix packet size * Use Bandwidth struct for specific functionality * Move bandwidth code outside the dependency path of wasm client * Use u64 instead of AtomicU64, as the handling is not parallel commit e00e77db15c2c18699c58bf771940c16f63a610f Author: Bogdan-Ștefan Neacşu Date: Wed Sep 8 15:07:24 2021 +0200 Feature/bond blockstamp (#760) * Add block_height to MixNode/GatewayBond * Reward based on blockstamp of bonded node or of delegation * Add specific tests * Add migration code * Apply doc nit commit 1074449f91a1978e2d03f190c5854ae162bae907 Merge: 08276e6e 9a3d824a Author: Fouad Date: Tue Sep 7 23:45:10 2021 +0100 Merge pull request #767 from nymtech/update/remove-app-alert remove alert commit 08276e6e427679f1b437e370a66dd1140631b429 Author: Bogdan-Ștefan Neacşu Date: Tue Sep 7 16:33:30 2021 +0200 Remove migration code (#759) commit 9a3d824a4a451d4906219607f4a7bcd27dbbeba4 Author: fmtabbara Date: Mon Sep 6 20:39:24 2021 +0100 remove alert commit 2789ee8f18768bf7fd9b26a63ee928b286996049 Author: Bogdan-Ștefan Neacşu Date: Fri Sep 3 15:30:45 2021 +0300 Update coconut-rs and use hash_to_scalar from there (#765) Failed tests are due to some nightly issue, not related to this PR commit a7ba643c354da7ec40ecfb1b0fcae46b9f57f0e2 Merge: 28be53ee c42f3c68 Author: Fouad Date: Fri Sep 3 09:14:50 2021 +0100 Merge pull request #762 from nymtech/feature/app-alert add app alert banner commit 28be53eefb9a1a6950b0b84e8117c6829df93c37 Author: Bogdan-Ștefan Neacşu Date: Thu Sep 2 18:26:40 2021 +0300 Add block_height in the Delegation structure as well (#757) commit 219c45a352584ab7f9efb957107a671a4e19d13e Author: Jędrzej Stuczyński Date: Thu Sep 2 15:48:29 2021 +0100 Updated cosmos-sdk (#761) * Updated cosmos-sdk * Re-exposing more things commit 1a3b83752e0f5e4eed5515ba0b90f3551c1f0a81 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Sep 2 15:45:56 2021 +0100 Bump next from 11.1.0 to 11.1.1 in /wallet-web (#758) Bumps [next](https://github.com/vercel/next.js) from 11.1.0 to 11.1.1. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v11.1.0...v11.1.1) --- updated-dependencies: - dependency-name: next dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit c42f3c684425d0e718ca55adacbe5afa99502603 Author: fmtabbara Date: Thu Sep 2 12:29:47 2021 +0100 add app alert banner commit a5d3ba390029818fcaa7c640a0c6eb6ec7916a96 Merge: 92e13a5d cdf0d443 Author: Mark Sinclair Date: Tue Aug 31 15:59:11 2021 +0100 Merge pull request #755 from nymtech/bugfix/explorer-api-ping Explorer API: port test now split out address resolution and add units tests commit cdf0d443411618e0952c35bfb5972fc82023cdfa Author: Mark Sinclair Date: Tue Aug 31 14:37:28 2021 +0100 explorer-api: turned down logging from `error` to `warn` commit 92f976a45d2d05c1250d6351392a3acc4eb1c01f Author: Mark Sinclair Date: Fri Aug 27 11:34:21 2021 +0100 explorer-api: sanitize hostname before running checks to avoid leading or trailing spaces that are known to exist in the current test net commit 2bc858cde351cb299c8986fd1045da6d832acbdb Author: Mark Sinclair Date: Fri Aug 27 09:32:26 2021 +0100 explorer-api: port test: split out address resolution and add units tests commit 92e13a5d005d3093717c77332cb5837cec4cfd34 Author: Bogdan-Ștefan Neacşu Date: Tue Aug 31 14:51:15 2021 +0300 Feature/add blockstamp (#756) * Add RawDelegationData * Fix current tests for the new stored data * Added migration commit. Will be reverted after doing the migration * New tests for block height * Use current blockstamp instead of 24h old one * Put _alot_ of migration stuff in the migrate function scope commit 122f5d9f2e5c1ced96e3b9ba0c74ef8b7dbde2c7 Author: Bogdan-Ștefan Neacşu Date: Mon Aug 30 10:27:20 2021 +0300 Feature/cred after handshake (#745) * Call perform_initial_authentication instead of register in clients * Refactor the register/authenticate functions a bit * Introduce Bandwidth request type * Add encryption layer to cred * Remove cred pass and check from handshake * Replaced unreachable! with error * Changed decrypt_tagged signature to not take mutable ownership of data * Put handle_bandwidth work inside a function * Add check before unwrap * Remove unnecessary async * Decouple bandwidth credential from authentication * Use new_error for ServerResponse:Error * Send a fresh IV each time the BandwidthCredential request is sent * Remove unwrap of bincode::serialize * Add comment regarding Bandwidth response * Remove _mut from naming * Leave Debug trait alone, as the initial error doesn't reproduce anymore * Pass iv as Vec instead of base58 string * Renamed AuthenticationIV to IV, as it is now used for more the just authentication * Did some IV refactorization commit 982ee0266c92628909ea0b5691b2abd31950f084 Author: Bogdan-Ștefan Neacşu Date: Fri Aug 27 16:02:34 2021 +0300 Feature/get own delegations (#748) * Introduce reverse delegation bucket * Add client command * Fix clippy error * Added tests in queries * Add tests in transactions * Migration code. Will be reverted after it's called on testnet * Replace unwrap with expect * Move some test code in the right file... ... to remove unnecessary auxiliary function. * Reduce the scope to migration auxiliary functions * Rename everything from [node]reverse to reverse[node] * Fix fmt commit 5f42a9bd052aebc496d639be4cb2aeadc4a575cb Author: Jędrzej Stuczyński Date: Fri Aug 27 13:52:18 2021 +0100 NetworkMonitorBuilder - starting the monitor after rocket has launched (#754) * NetworkMonitorBuilder - starting the monitor after rocket has launched * Removed unused import commit 1811df9ddb696279e2fc4cb58eeb9df55f2b1843 Author: Jędrzej Stuczyński Date: Fri Aug 27 13:52:10 2021 +0100 Enabled validators api argument (#753) commit 6bdfe7f8954177240894945dee86926eb3df08ab Author: Jędrzej Stuczyński Date: Thu Aug 26 11:21:01 2021 +0100 Correctly bounding nominator of uptime calculation (#752) commit c6b286a1dba0dd1a1a1df021cc4e8e45873eed15 Author: Jędrzej Stuczyński Date: Wed Aug 25 14:50:57 2021 +0100 Fixed argument parsing for ipv6 'good' topology (#751) commit b3568a26f57faaffe7b8d20ab90cb4cb456eae5e Author: Bogdan-Ștefan Neacşu Date: Tue Aug 24 11:25:05 2021 +0300 Revert "Migration commit, will be reverted after the testnet contract is updated" (#749) This reverts commit 38d868bcce3738c00d0f60bbc40373efd3cf7c6e. commit 15ae0f521e46336c0e8518e9b749dde9d702077a Author: Jędrzej Stuczyński Date: Mon Aug 23 10:26:51 2021 +0100 Feature/more reliable uptime calculation (#747) * New database table holding monitor run info * SQL interface for new table * Updated uptime calculation to instead rely on number of monitor test runs commit 2923d4b8725f04a0097461852862cf348b0998da Author: Bogdan-Ștefan Neacşu Date: Thu Aug 19 22:03:07 2021 +0300 Update template toml key (#746) commit 424230c3bb09bd86db8e57f48271a5b79e2453b5 Author: Drazen Urch Date: Thu Sep 16 17:33:20 2021 +0200 Squashed commit of the following: commit cddd9e8e4ca95f82ee7d4abf8317d15bafd0c971 Merge: 40fbdff0 976dd7aa Author: Drazen Urch Date: Thu Sep 16 17:27:27 2021 +0200 Merge branch 'develop' into tauri-wallet commit 976dd7aae2e7ee6c8a0fdbe368f393b1c26ad704 Author: Drazen Urch Date: Wed Sep 15 17:28:49 2021 +0200 Add block_height method to Delegation (#778) Co-authored-by: Drazen Urch commit 0d21f4e937b1222820260a426c02b10d420963aa Merge: e84af4f6 1403449a Author: Fouad Date: Wed Sep 15 12:41:29 2021 +0100 Merge pull request #776 from nymtech/update/re-enable-bonding re-enable bonding commit 1403449ad51ec2cba19997af88e60f1435512171 Author: fmtabbara Date: Tue Sep 14 16:00:21 2021 +0100 enable bonding commit e84af4f6018772feb4896b31702f2d33ee4c1fb1 Author: Drazen Urch Date: Tue Sep 14 15:15:26 2021 +0200 Migrate legacy delegation data (#771) * Skip ReadOnlyBucket deserialization errors * empty migration * clippy * cargo schema * Drop invalid delegation data * Dont drop old data * Add todo * Unify on type param * gateways are different * cargo fmt Co-authored-by: Drazen Urch commit 26b032c15c7c8ec8f1442f23d2416bafce65323a Merge: e1ddaff0 cba36253 Author: Mark Sinclair Date: Tue Sep 14 10:09:14 2021 +0100 Merge pull request #774 from nymtech/feature/explorer-api-delegations Explorer-api: add API resource to show the delegations for each mix node commit cba3625394dae3f736dab23018df5fcc3c9a4f5d Author: Mark Sinclair Date: Mon Sep 13 10:33:41 2021 +0100 explorer-api: add API resource to show the delegations for each mix node commit e1ddaff04d5077969dd0dbb1e645653035aa8e23 Merge: 0b9c03ca 66ab5de4 Author: Fouad Date: Fri Sep 10 17:17:14 2021 +0100 Merge pull request #772 from nymtech/update/disable-bonding add app alert commit 66ab5de442de91a50556117b62ef028b6b249f6f Author: fmtabbara Date: Fri Sep 10 16:16:58 2021 +0100 add app alert commit 0b9c03ca900a834856efa37706dafac7685b5f79 Author: Dave Hrycyszyn Date: Fri Sep 10 11:23:21 2021 +0300 Adding deps for building the Tauri wallet under Ubuntu (#770) commit c9dce0c1da29a99b1c483009a0658b2236c3a4e8 Author: Bogdan-Ștefan Neacşu Date: Thu Sep 9 11:21:45 2021 +0200 Feature/consumable bandwidth (#766) * Set actual value for bandwidth Also put it as a public attribute, such that it can be actively used by the credential consumer * Switch from sending Attribute structs to sending the actual attribute bytes over the wire * Add atomic bandwidth value to gateway * Consume bandwidth based on the mix packet size * Use Bandwidth struct for specific functionality * Move bandwidth code outside the dependency path of wasm client * Use u64 instead of AtomicU64, as the handling is not parallel commit e00e77db15c2c18699c58bf771940c16f63a610f Author: Bogdan-Ștefan Neacşu Date: Wed Sep 8 15:07:24 2021 +0200 Feature/bond blockstamp (#760) * Add block_height to MixNode/GatewayBond * Reward based on blockstamp of bonded node or of delegation * Add specific tests * Add migration code * Apply doc nit commit 1074449f91a1978e2d03f190c5854ae162bae907 Merge: 08276e6e 9a3d824a Author: Fouad Date: Tue Sep 7 23:45:10 2021 +0100 Merge pull request #767 from nymtech/update/remove-app-alert remove alert commit 08276e6e427679f1b437e370a66dd1140631b429 Author: Bogdan-Ștefan Neacşu Date: Tue Sep 7 16:33:30 2021 +0200 Remove migration code (#759) commit 9a3d824a4a451d4906219607f4a7bcd27dbbeba4 Author: fmtabbara Date: Mon Sep 6 20:39:24 2021 +0100 remove alert commit 2789ee8f18768bf7fd9b26a63ee928b286996049 Author: Bogdan-Ștefan Neacşu Date: Fri Sep 3 15:30:45 2021 +0300 Update coconut-rs and use hash_to_scalar from there (#765) Failed tests are due to some nightly issue, not related to this PR commit a7ba643c354da7ec40ecfb1b0fcae46b9f57f0e2 Merge: 28be53ee c42f3c68 Author: Fouad Date: Fri Sep 3 09:14:50 2021 +0100 Merge pull request #762 from nymtech/feature/app-alert add app alert banner commit 28be53eefb9a1a6950b0b84e8117c6829df93c37 Author: Bogdan-Ștefan Neacşu Date: Thu Sep 2 18:26:40 2021 +0300 Add block_height in the Delegation structure as well (#757) commit 219c45a352584ab7f9efb957107a671a4e19d13e Author: Jędrzej Stuczyński Date: Thu Sep 2 15:48:29 2021 +0100 Updated cosmos-sdk (#761) * Updated cosmos-sdk * Re-exposing more things commit 1a3b83752e0f5e4eed5515ba0b90f3551c1f0a81 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Sep 2 15:45:56 2021 +0100 Bump next from 11.1.0 to 11.1.1 in /wallet-web (#758) Bumps [next](https://github.com/vercel/next.js) from 11.1.0 to 11.1.1. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v11.1.0...v11.1.1) --- updated-dependencies: - dependency-name: next dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit c42f3c684425d0e718ca55adacbe5afa99502603 Author: fmtabbara Date: Thu Sep 2 12:29:47 2021 +0100 add app alert banner commit a5d3ba390029818fcaa7c640a0c6eb6ec7916a96 Merge: 92e13a5d cdf0d443 Author: Mark Sinclair Date: Tue Aug 31 15:59:11 2021 +0100 Merge pull request #755 from nymtech/bugfix/explorer-api-ping Explorer API: port test now split out address resolution and add units tests commit cdf0d443411618e0952c35bfb5972fc82023cdfa Author: Mark Sinclair Date: Tue Aug 31 14:37:28 2021 +0100 explorer-api: turned down logging from `error` to `warn` commit 92f976a45d2d05c1250d6351392a3acc4eb1c01f Author: Mark Sinclair Date: Fri Aug 27 11:34:21 2021 +0100 explorer-api: sanitize hostname before running checks to avoid leading or trailing spaces that are known to exist in the current test net commit 2bc858cde351cb299c8986fd1045da6d832acbdb Author: Mark Sinclair Date: Fri Aug 27 09:32:26 2021 +0100 explorer-api: port test: split out address resolution and add units tests commit 92e13a5d005d3093717c77332cb5837cec4cfd34 Author: Bogdan-Ștefan Neacşu Date: Tue Aug 31 14:51:15 2021 +0300 Feature/add blockstamp (#756) * Add RawDelegationData * Fix current tests for the new stored data * Added migration commit. Will be reverted after doing the migration * New tests for block height * Use current blockstamp instead of 24h old one * Put _alot_ of migration stuff in the migrate function scope commit 122f5d9f2e5c1ced96e3b9ba0c74ef8b7dbde2c7 Author: Bogdan-Ștefan Neacşu Date: Mon Aug 30 10:27:20 2021 +0300 Feature/cred after handshake (#745) * Call perform_initial_authentication instead of register in clients * Refactor the register/authenticate functions a bit * Introduce Bandwidth request type * Add encryption layer to cred * Remove cred pass and check from handshake * Replaced unreachable! with error * Changed decrypt_tagged signature to not take mutable ownership of data * Put handle_bandwidth work inside a function * Add check before unwrap * Remove unnecessary async * Decouple bandwidth credential from authentication * Use new_error for ServerResponse:Error * Send a fresh IV each time the BandwidthCredential request is sent * Remove unwrap of bincode::serialize * Add comment regarding Bandwidth response * Remove _mut from naming * Leave Debug trait alone, as the initial error doesn't reproduce anymore * Pass iv as Vec instead of base58 string * Renamed AuthenticationIV to IV, as it is now used for more the just authentication * Did some IV refactorization commit 982ee0266c92628909ea0b5691b2abd31950f084 Author: Bogdan-Ștefan Neacşu Date: Fri Aug 27 16:02:34 2021 +0300 Feature/get own delegations (#748) * Introduce reverse delegation bucket * Add client command * Fix clippy error * Added tests in queries * Add tests in transactions * Migration code. Will be reverted after it's called on testnet * Replace unwrap with expect * Move some test code in the right file... ... to remove unnecessary auxiliary function. * Reduce the scope to migration auxiliary functions * Rename everything from [node]reverse to reverse[node] * Fix fmt commit 5f42a9bd052aebc496d639be4cb2aeadc4a575cb Author: Jędrzej Stuczyński Date: Fri Aug 27 13:52:18 2021 +0100 NetworkMonitorBuilder - starting the monitor after rocket has launched (#754) * NetworkMonitorBuilder - starting the monitor after rocket has launched * Removed unused import commit 1811df9ddb696279e2fc4cb58eeb9df55f2b1843 Author: Jędrzej Stuczyński Date: Fri Aug 27 13:52:10 2021 +0100 Enabled validators api argument (#753) commit 6bdfe7f8954177240894945dee86926eb3df08ab Author: Jędrzej Stuczyński Date: Thu Aug 26 11:21:01 2021 +0100 Correctly bounding nominator of uptime calculation (#752) commit c6b286a1dba0dd1a1a1df021cc4e8e45873eed15 Author: Jędrzej Stuczyński Date: Wed Aug 25 14:50:57 2021 +0100 Fixed argument parsing for ipv6 'good' topology (#751) commit b3568a26f57faaffe7b8d20ab90cb4cb456eae5e Author: Bogdan-Ștefan Neacşu Date: Tue Aug 24 11:25:05 2021 +0300 Revert "Migration commit, will be reverted after the testnet contract is updated" (#749) This reverts commit 38d868bcce3738c00d0f60bbc40373efd3cf7c6e. commit 15ae0f521e46336c0e8518e9b749dde9d702077a Author: Jędrzej Stuczyński Date: Mon Aug 23 10:26:51 2021 +0100 Feature/more reliable uptime calculation (#747) * New database table holding monitor run info * SQL interface for new table * Updated uptime calculation to instead rely on number of monitor test runs commit 2923d4b8725f04a0097461852862cf348b0998da Author: Bogdan-Ștefan Neacşu Date: Thu Aug 19 22:03:07 2021 +0300 Update template toml key (#746) commit cddd9e8e4ca95f82ee7d4abf8317d15bafd0c971 Merge: 40fbdff0 976dd7aa Author: Drazen Urch Date: Thu Sep 16 17:27:27 2021 +0200 Merge branch 'develop' into tauri-wallet commit 63bc42cd5f040e7bcb71501333246bcdfc4e8821 Author: fmtabbara Date: Thu Sep 16 10:01:53 2021 +0100 update title commit 9dc8ba7b77f860c3439719e906c8a94b3a7b00c4 Author: fmtabbara Date: Wed Sep 15 21:39:18 2021 +0100 funds allocation check when bonding/sending/delegating commit e130131f16c0b1fd34ebd10b0a44235481ded9fe Author: fmtabbara Date: Wed Sep 15 20:37:24 2021 +0100 finish bonding and unbonding setup commit 64a5b4b593c6f827631f0411ce652e6cc4e7c0fa Merge: 9934b9bc 40fbdff0 Author: fmtabbara Date: Tue Sep 14 12:08:38 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit 40fbdff05a665b427b424b9d7432f7f5c37da8d2 Author: Drazen Urch Date: Tue Sep 14 10:29:31 2021 +0200 Coin and denom tests commit 9934b9bc8aee9751b500d3ab9564e772712fe8df Author: fmtabbara Date: Mon Sep 13 15:20:56 2021 +0100 update working commit 6954b383a79386864323abc0b577c91706b90fa9 Author: fmtabbara Date: Mon Sep 13 14:26:21 2021 +0100 form updates commit 4b5276e816c7bd55170046ae9e36e4d6977e4eef Merge: 56a95274 0278bd2c Author: fmtabbara Date: Mon Sep 13 13:32:24 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit 0278bd2c26e40b2ddf00c7641e57ee5082c8e20f Author: Drazen Urch Date: Mon Sep 13 14:31:33 2021 +0200 Fix coin to cosmwasm coin commit 56a952749768dc984d5f4358a8f71cc4162de965 Author: fmtabbara Date: Mon Sep 13 13:30:05 2021 +0100 use wrapper functions for send and delegate commit a601c28a201c06503263f486dbf158af9a43bad3 Author: Drazen Urch Date: Mon Sep 13 13:07:57 2021 +0200 Return useful info from bond/unbond commit 005dd7513b9ee59b2a2059887f8d6aa7fc9a0908 Merge: 3ebdc558 aaf5d186 Author: Drazen Urch Date: Mon Sep 13 12:58:01 2021 +0200 Merge branch 'tauri-wallet-frontend' into tauri-wallet commit 3ebdc55847eb6ab04b6ec9c83f883d986898b3db Author: Drazen Urch Date: Mon Sep 13 12:50:26 2021 +0200 extract Coin and Denom commit aaf5d18692bd320f9172e9ea89ef29944ec23958 Author: fmtabbara Date: Mon Sep 13 11:19:28 2021 +0100 update admin component commit bcbec1f3e6d6ba5a2d215dc2131778ff8d7243c5 Author: fmtabbara Date: Sun Sep 12 21:49:39 2021 +0100 admin form style updates commit c95005265dbae9846b8ed0f9f14a43369c13946e Author: fmtabbara Date: Sun Sep 12 01:26:57 2021 +0100 button updates commit b299c9e4b5d0c9163b6219006e1027cbca8272f2 Author: fmtabbara Date: Sun Sep 12 01:03:21 2021 +0100 add qrcode to receive page commit bacbd3dfcee411374aa66ff6e4ae74d392bc6204 Author: fmtabbara Date: Sun Sep 12 00:40:53 2021 +0100 fix bug commit 55561fe1f77c318e49fed639017ce2ebfe8e0e96 Author: fmtabbara Date: Sun Sep 12 00:26:15 2021 +0100 add admin page commit 0d01500b87044929bd75d7c89c4c01c175327d92 Author: fmtabbara Date: Sat Sep 11 00:35:14 2021 +0100 remove login deets commit 74e34567b426cef1e6abe849ff61a67c5cdfb2ff Author: fmtabbara Date: Sat Sep 11 00:32:54 2021 +0100 form updates commit b77025bfd50099019c5a9155f34231dfe69c4380 Author: fmtabbara Date: Sat Sep 11 00:10:03 2021 +0100 form updates commit 4d831efcd6f8729161d11700819985bc12fc3fcd Author: fmtabbara Date: Fri Sep 10 22:33:00 2021 +0100 more fees work commit d227d20385ab85d69fa4b7100559a412b34f1e0d Author: fmtabbara Date: Fri Sep 10 17:31:04 2021 +0100 add gas fees to bond form commit fb2d3bae3cc61da1c5015b0e1ff9dd3db84873eb Author: fmtabbara Date: Fri Sep 10 14:17:24 2021 +0100 use new getFee api commit 967d74eb19563a431ca8ee25cc335487ab1948b6 Author: fmtabbara Date: Fri Sep 10 11:15:52 2021 +0100 add nvmrc file commit 228df278d955157cd4f19ea1c8d83af87a3377e6 Author: fmtabbara Date: Fri Sep 10 11:13:18 2021 +0100 update tsconfig commit 37da23ab1cbdd6b6cc571f2066429a0fda3bb895 Author: fmtabbara Date: Fri Sep 10 09:56:04 2021 +0100 set up global error handling commit 0c9cf7b5d99751fdaa3d931c0a98196fe35fd5aa Author: fmtabbara Date: Fri Sep 10 09:16:45 2021 +0100 finish create account commit 262149078c4ac389c060d65edbcc37e1652ab52f Merge: 08fd1c1b 3bcbb901 Author: fmtabbara Date: Thu Sep 9 19:21:38 2021 +0100 rust updates commit 08fd1c1b47a701dcc987d52f632d3b76ff71898e Author: fmtabbara Date: Thu Sep 9 19:00:30 2021 +0100 make getBalance global commit 3bcbb90127cca5e981d6e2b315ae523219e12d91 Author: Drazen Urch Date: Thu Sep 9 17:47:11 2021 +0200 fix docs commit 8156ed0029b3bc4b2368d5d06e6ba06953989574 Author: Drazen Urch Date: Thu Sep 9 17:43:56 2021 +0200 get_fee, create_new_account commit 265f7a7c2e2ccce75457744573bd807b3ca75b26 Author: Drazen Urch Date: Thu Sep 9 13:21:27 2021 +0200 Dedicated workspace, random_mnemonic, gas_limits commit 5de8c9d1edeac6dfb9e42a16b6ce872894e7206d Author: fmtabbara Date: Thu Sep 9 11:35:49 2021 +0100 style updates commit 7658eec9b95ad0fbc055b2391021784c471e06b6 Author: fmtabbara Date: Thu Sep 9 09:16:38 2021 +0100 create account page commit 99c49581df497498ff3422c1f144c58d953b24e9 Merge: 7a8ad138 926689da Author: fmtabbara Date: Wed Sep 8 20:49:27 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit 926689da1dc9238fe1500ca97371203f841b19d7 Merge: 714171f4 b40be179 Author: Drazen Urch Date: Wed Sep 8 11:54:49 2021 +0200 Merge branch 'tauri-wallet' of https://github.com/nymtech/nym into tauri-wallet commit 714171f4e5b16b24ee42c999dc1190bfdf51ad47 Author: Drazen Urch Date: Wed Sep 8 11:54:36 2021 +0200 redundant into commit 7a8ad1387d31fc8980a163cd71be7f187a8872c2 Author: fmtabbara Date: Wed Sep 8 10:30:51 2021 +0100 add eslint file commit bd72426280976b8d806282059fad0a78f0729966 Author: fmtabbara Date: Tue Sep 7 23:44:02 2021 +0100 start adding gas fees commit 48d0f31d7ea3c13dfecc37891525eaf496d6d82a Author: fmtabbara Date: Tue Sep 7 23:13:54 2021 +0100 send updates commit 4522c18a556452ebf4b2b9fc225be4fe4d82099b Merge: b9389f12 b40be179 Author: fmtabbara Date: Tue Sep 7 21:53:38 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit b9389f1235af8b5a545d143fe9e25cd57ba14604 Author: fmtabbara Date: Tue Sep 7 21:53:05 2021 +0100 send updates commit b40be179aebe55229eca9cd7c92f33e5d7b1dd3e Author: durch Date: Tue Sep 7 12:37:24 2021 +0000 [ci skip] Generate TS types commit 32ef9e019e7de1a79ab1954ceabdf7395803ddd3 Author: Drazen Urch Date: Tue Sep 7 14:26:48 2021 +0200 More verbose send response commit 45a56a7088692f83b35d14cc69ffae4ae55eca8a Author: fmtabbara Date: Mon Sep 6 20:27:15 2021 +0100 update logo commit d50afd61135eeb1170707241001aa486c54edfe8 Author: Drazen Urch Date: Mon Sep 6 20:00:47 2021 +0200 Add coconut creds commit 3205b1e0e68d115d0ad5c6a0199a6ba43b623740 Author: fmtabbara Date: Mon Sep 6 16:42:56 2021 +0100 start work on send form commit 53ea8486f8ee7e646287b010710096bf9f19e36d Author: Drazen Urch Date: Mon Sep 6 17:36:46 2021 +0200 get_gas_price, get_gas_limits commit 43ababf8d47bf7b31a7e3cbcb1a744b01500531c Author: Drazen Urch Date: Mon Sep 6 17:31:08 2021 +0200 Rework client errors commit 5461574023408ff617fc620341c02d147ee6f1ef Author: fmtabbara Date: Mon Sep 6 13:23:20 2021 +0100 small refactors commit 01d2df7bb7b56d8c798c180dec2c8b3ab3650eb6 Author: fmtabbara Date: Mon Sep 6 11:12:39 2021 +0100 set up form validation for undelegation commit 7cff72757b749b9abbc2e66c455ba0d0a9802e16 Author: fmtabbara Date: Sun Sep 5 00:07:46 2021 +0100 set up delgate request commit 5bcbf45d164acee5f05e7e332e51e72bfaa5be72 Author: fmtabbara Date: Sat Sep 4 22:52:02 2021 +0100 onerror onsuccess added to bond form commit 4295d75e0fdb58bcc472ed123c0901ce83d08680 Author: fmtabbara Date: Fri Sep 3 16:53:32 2021 +0100 format bonding data pre request commit 018666a6142d2f4346fa3a66481f5f460e0b7d47 Author: fmtabbara Date: Fri Sep 3 16:37:51 2021 +0100 layout updates commit 15048524a766cd0450524d4d9aed3ec310bb680b Author: fmtabbara Date: Fri Sep 3 16:25:15 2021 +0100 layout updates commit 2b792945cce5cadfa175a5351b02a486522b664e Author: fmtabbara Date: Fri Sep 3 15:07:38 2021 +0100 update type roots commit b6193270a6cd1806731de77abc5c1aabdc26649b Merge: 0b4a8fe6 29973379 Author: fmtabbara Date: Fri Sep 3 15:02:56 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit 0b4a8fe657ef43c598ea9e02b6ea4204435e5591 Author: fmtabbara Date: Fri Sep 3 15:02:09 2021 +0100 update type roots commit 29973379484503cd2bd78edfc4cb463225ce92ca Author: Drazen Urch Date: Fri Sep 3 15:29:20 2021 +0200 printable balance should be major commit e1bea43ff4f7102c254e6654e4ad974050c181c5 Author: Drazen Urch Date: Fri Sep 3 15:22:48 2021 +0200 Autogenerate types (#763) * Generate TS types on push * run shell * fix typo * pango * libpango-dev * hopefully all deps are in now :) Co-authored-by: Drazen Urch commit 27ef28da8dbf6924c02fd2eb4bcf63b588102dc1 Merge: 42bf139e 87a0b05d Author: fmtabbara Date: Fri Sep 3 12:13:28 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend rust updates commit 42bf139ebbc49b33c2861226b3d843bd5a0b8c07 Author: fmtabbara Date: Fri Sep 3 12:12:52 2021 +0100 update args collection function commit 352862e4d0f00473353959ac97745d63e78014ee Author: fmtabbara Date: Fri Sep 3 11:42:31 2021 +0100 delegation form validation commit 9f9ab010d8f8516c24bea6ee99a6a9e0ecb4e317 Author: fmtabbara Date: Fri Sep 3 11:39:17 2021 +0100 integrate rust generated types commit 87a0b05d1adc8ed59dbaf41b7a8e5c64327c5a6f Author: Drazen Urch Date: Fri Sep 3 07:43:29 2021 +0200 Send commit dbf82da9b60a4633797ba56b35f7aaf442945e3b Author: Drazen Urch Date: Fri Sep 3 07:36:02 2021 +0200 Delegation docs commit 01a430588340e12b4e8371a803294fddea97dd29 Author: Drazen Urch Date: Fri Sep 3 07:33:11 2021 +0200 Delegation commit 704b3241ee80c4290f6f70cca59fd39cdf3d4014 Author: Drazen Urch Date: Fri Sep 3 06:58:57 2021 +0200 Gateway bonding commit 4513edae464d61ed2ea8b2e6612cba1cba23e342 Merge: 5d3f1b86 f020b211 Author: fmtabbara Date: Thu Sep 2 21:38:19 2021 +0100 rust updates commit f020b21106c8b8ffdcfe3a823dc67d3fe0883ca3 Author: Drazen Urch Date: Thu Sep 2 21:08:19 2021 +0200 node unbond commit 25879064735229563b2085fdba2f40460f5a0df1 Author: Drazen Urch Date: Thu Sep 2 20:57:10 2021 +0200 TS exports, rework internals commit 5d3f1b86e8bb2efb2173b6452060e37de603740d Author: fmtabbara Date: Thu Sep 2 17:29:03 2021 +0100 delegate form validation commit 5a17e485813939141db783cfbd681864e579bdd7 Author: fmtabbara Date: Thu Sep 2 16:11:54 2021 +0100 finish bond form validation commit 41356f2181995fec8799de99a09baa508de6294b Merge: bd7d7887 63107c2b Author: fmtabbara Date: Thu Sep 2 10:10:55 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend merge rust updates commit bd7d788741816e43d6ecb59c7e3dbd652b6e9588 Author: fmtabbara Date: Thu Sep 2 10:10:18 2021 +0100 more validation work commit 63107c2bca2871613c33ebd64c1e1dc707b1977d Author: Drazen Urch Date: Thu Sep 2 10:27:49 2021 +0200 WIP node bonding commit f043639ad2f73ac88a7f0d8e5c3689a365c359f1 Merge: 1d2a1b26 6fb15fff Author: fmtabbara Date: Wed Sep 1 19:48:22 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend merge rust update commit 1d2a1b2635de8d11cd222ea3af89a35cb8d7c09d Author: fmtabbara Date: Wed Sep 1 19:47:41 2021 +0100 start form validation commit 6fb15fff8bafc6759541756c58ac6fc0eecebbac Author: Drazen Urch Date: Wed Sep 1 16:33:29 2021 +0200 printable_balance commit c69d7fa46f89876ca056e316d057d15467d2480e Author: fmtabbara Date: Wed Sep 1 15:12:50 2021 +0100 remove unused imports commit c2ee02a2cff2df68d6c20081e1415916bbf95b33 Author: fmtabbara Date: Wed Sep 1 15:12:25 2021 +0100 use printable balance commit 6f5f0c00b5675c0a28e1f0109f516631d5dc852e Author: fmtabbara Date: Wed Sep 1 15:11:24 2021 +0100 use printable balance commit 12707c5f1eb7115e23e18e94f4f64b0715a93471 Merge: 2aa7fa04 0daf89ee Author: fmtabbara Date: Wed Sep 1 14:59:27 2021 +0100 merge rust updates commit 0daf89eeb46284cce02046d87aeeaa5a79e55003 Author: Drazen Urch Date: Wed Sep 1 15:14:50 2021 +0200 Utility native <> printable functions commit 2aa7fa042679e2cd01c46c97590620854cf084b7 Author: fmtabbara Date: Wed Sep 1 13:41:42 2021 +0100 move balance function call to global state commit f5aa6e2db22878fd7cf86be3b52c624d5e32e1e8 Author: fmtabbara Date: Wed Sep 1 09:39:22 2021 +0100 style updates commit ee5d1c3419241404f4d5450f830822f2203aa965 Author: fmtabbara Date: Tue Aug 31 20:57:21 2021 +0100 fix nav styling commit e68c2611628f29d2f6596d57a537bea46280875d Author: fmtabbara Date: Tue Aug 31 20:48:30 2021 +0100 fix ts error commit c7fe4cd24e57849cea25243dc1668d29cf16d920 Author: fmtabbara Date: Tue Aug 31 15:28:46 2021 +0100 update imports commit 1c690fc3d007ad2f6ade7b3592b2c441aad46393 Merge: d8e6a5fb f56edb82 Author: fmtabbara Date: Tue Aug 31 15:24:35 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend merge rust updates commit f56edb825a9a771aaa72b16b04682b81b7deafdf Author: Drazen Urch Date: Tue Aug 31 15:22:10 2021 +0200 Fix client address commit d8e6a5fb2ecc6d46912e27ec83c4f364dc60becb Author: fmtabbara Date: Tue Aug 31 12:55:13 2021 +0100 make typescript happy commit b95893bb02005e0031961aa4de76a57f80a0b45d Author: fmtabbara Date: Tue Aug 31 11:20:12 2021 +0100 update balance page commit 6bdff701b458192b7867730e3f65aad0c3aa5e90 Merge: ccdb5911 eff38c84 Author: fmtabbara Date: Tue Aug 31 11:05:51 2021 +0100 merge backend updates commit ccdb5911c6592e08bff8308fc5c36658ce12ba9f Author: fmtabbara Date: Tue Aug 31 09:35:24 2021 +0100 update routing and use new sign in function commit eff38c84662e6a5b3b062d0df33f1439b83f8e49 Author: Drazen Urch Date: Tue Aug 31 07:38:25 2021 +0200 some cleanup, get blockchain stuff working commit 5f4fabc0b8448021a62d76b7636b9c6a7bedd154 Author: Drazen Urch Date: Fri Aug 27 15:17:15 2021 +0200 Add internal documentation scaffolding commit e2dd1cc9ae3ece0694a8113f76140ec941c25b0f Merge: c7e622f2 42f75028 Author: fmtabbara Date: Wed Aug 25 14:51:29 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend connect with mnemonic update commit 42f75028bcb8ad06645f3faad9a6e5466cecc086 Author: Drazen Urch Date: Wed Aug 25 15:44:08 2021 +0200 Resolve state deadlock commit c7e622f2844bead7f5d57361cd3146436088cfb1 Author: fmtabbara Date: Wed Aug 25 14:06:37 2021 +0100 begin sign in rust integration commit 248da351c6d20d11afb0f4ead44b0311122e34d1 Author: fmtabbara Date: Wed Aug 25 14:05:00 2021 +0100 use color palette object commit fe1c8a3b0821f77fdc10e2d07c9da4283dbdc7c5 Merge: 84af9233 1bc17abb Author: fmtabbara Date: Wed Aug 25 10:36:11 2021 +0100 Merge branch 'tauri-wallet' into tauri-wallet-frontend merge rust api updates commit 84af923389783410754d71c8b7bf1356d51280b7 Author: fmtabbara Date: Wed Aug 25 10:35:42 2021 +0100 update receive to use state value commit 1bc17abbaad98e1aee3ebf2bfd944e1c47506a1e Author: Drazen Urch Date: Wed Aug 25 11:18:16 2021 +0200 Add connect_with_mnemonic and get_balance tauri functions commit b8c2735520a4eb4cc775f9e8a541e8a76eeb69ef Author: fmtabbara Date: Tue Aug 24 16:12:08 2021 +0100 cargo lock update commit 67fd4367efdb5059cc3aed39dc91a55cca60c78f Author: fmtabbara Date: Tue Aug 24 16:08:55 2021 +0100 global theme update commit 4540d2c4477a1adb65fc7a42c693c8152bc90f56 Merge: ce757697 4ad25114 Author: fmtabbara Date: Tue Aug 24 12:56:59 2021 +0100 Merge branch 'feature/tauri-wallet-ui' into tauri-wallet merge with rust updates commit 4ad25114c3b97f3b35f32997f67a6c940267066f Author: fmtabbara Date: Tue Aug 24 12:46:34 2021 +0100 update nav cards commit 3ce7888c073a74bbac7f07541e585c9c4d42bc97 Author: fmtabbara Date: Tue Aug 24 11:59:10 2021 +0100 address and balance cards commit ce75769703bebd6d5a44b43b88014741a0e7c6eb Author: Drazen Urch Date: Tue Aug 24 12:54:49 2021 +0200 Bootstrap nymd client with config commit 66210658cb68c8383c30b2d1ecb84e5e5c37a07a Author: fmtabbara Date: Tue Aug 24 10:35:54 2021 +0100 add favicon commit 728da763b3fe849e53bcd296791aa3a6787d553c Author: fmtabbara Date: Mon Aug 23 22:54:30 2021 +0100 fix padding issue commit 3da08ee33c4ce1995919d4940238e2fe83f3527d Author: fmtabbara Date: Mon Aug 23 22:49:39 2021 +0100 style updates commit 55977185fd205e4459ed0f305c99f89e7e7b8a31 Author: fmtabbara Date: Mon Aug 23 22:04:26 2021 +0100 add unbond and undelegte pages commit 1c8c0a47bcec3f2fa4b5f20261f4060911e22d38 Author: fmtabbara Date: Mon Aug 23 21:34:14 2021 +0100 receive page adjust margin commit c161b2fe71956c217ead88801b61a162ddcf7ab2 Author: fmtabbara Date: Mon Aug 23 21:32:29 2021 +0100 send wizard updates commit eb91c1180d639af6e9179680aa8700b31a3fa05d Author: fmtabbara Date: Mon Aug 23 17:23:25 2021 +0100 update balance page commit 13e357637b817cb671b95d0cfdb1240e1e790063 Author: fmtabbara Date: Mon Aug 23 17:18:07 2021 +0100 style updates commit 54c4bdb7d2f99986b877d991d11b1daa451a1b3b Author: fmtabbara Date: Mon Aug 23 17:12:40 2021 +0100 send wizard update commit 9b5f50913f30025d5e6743c84f213fc85bdbe26f Author: fmtabbara Date: Mon Aug 23 14:56:52 2021 +0100 add send wizard commit 7cfa35b542a7cc47e03897b3d407a1da331d1f64 Author: fmtabbara Date: Mon Aug 23 11:18:13 2021 +0100 style updates commit 581a6b0a6f66037c29b6cbafc68eb63f1c654998 Author: fmtabbara Date: Mon Aug 23 10:38:56 2021 +0100 update nav bar commit 85f23eb3d1db51f8158cc6a4f29003a1eb7a6cfe Author: fmtabbara Date: Mon Aug 23 10:38:42 2021 +0100 create delegation page commit 17100fa7daaf65d9e9ee4ba3ae2b676beba0416e Author: fmtabbara Date: Mon Aug 23 10:38:17 2021 +0100 create node type selector component commit 24af0c94bf3ef287b8fc52060e29aebdfbf75a15 Author: fmtabbara Date: Fri Aug 20 22:26:14 2021 +0100 add bond form commit 8ec9e3121f3130f83de58d868051a8cfd2bd531a Author: fmtabbara Date: Fri Aug 20 17:35:59 2021 +0100 side bar updates commit 498dbb8ba3e7b104f8adc7101561deaecb3ae68d Author: fmtabbara Date: Fri Aug 20 12:24:04 2021 +0100 add balance page commit 7345bd81483a20e19dba464a11e6148e2e75c69c Author: fmtabbara Date: Fri Aug 20 11:51:27 2021 +0100 update navigation style commit b405d2e4af118b86f90cd9d98a67529c464126bb Author: fmtabbara Date: Fri Aug 20 09:03:21 2021 +0100 set up tauri app with React frontend commit 020cad897d208cb21d3cd5c73294f02ea2881d05 Author: Jędrzej Stuczyński Date: Fri Sep 24 15:49:21 2021 +0100 Feature/rust rewarding (#750) * Calculating gas fees * Ability to set custom fees * Added extra test * Removed commented code * Moved all msg types to common contract crate * Temporarily disabling get_tx method * Finishing up nymd client API * Comment fix * Remaining fee values * Some cleanup * Removed needless borrow * Fixed imports in contract tests * Moved error types around * New ValidatorClient * Experiment with new type of defaults * Removed dead module * Dealt with unwrap * Migrated mixnode to use new validator client * Migrated gateway to use new validator client * Mixnode and gateway adjustments * More exported defaults * Clients using new validator client * Fixed mixnode upgrade * Moved default values to a new crate * Changed behaviour of validator client features * Migrated basic functions of validator api * Updated config + fixed startup * Fixed wasm client build * Integration with the explorer api * Removed tokio dev dependency * Needless borrow * Fixex wasm client build * Fixed tauri client build * Needless borrows * New tables for rewarding * Updated cosmos-sdk version * Removed reward-specific node status routes * New rewarding-specific config entries * Additional network defaults * Initial periodic rewards from validator api * Replaced print with log * Filtering nodes with uptime > 0 * Additional failure logging statements * Fixed operation ordering * Adjusted next rewarding epoch determination * Modified rewarding behaviour to keep track of rewarding in progress * Improved error message on config load failure * Additional log statement * Adjusted rewarding gas limit calculation * Made naming slightly more consistent * Fixed incorrect parentheses placement * Fixed fee calculation * Cargo fmt * Removed failed merge artifacts * Introduced comment for any future reward modification * typos * Helper functions for the future * Making @mfahampshire 's life easier * Redesigned epoch + rewarding skipped epochs (if possible) * Removed old merge artifacts * Naming consistency * Constraining arguments * Removed unnecessary if branch * Ignore monitor check for current epoch * Additional checks for current epoch data * Monitor threshold check * cargo fmt * Fixed post-merge issues in transactions.rs commit 5dfaff6296b2f714d28903553c1afdeb97df833c Author: Drazen Urch Date: Tue Sep 21 10:59:17 2021 +0200 Update hmac and blake3 (#673) * Update hmac and blake3 * Remain paranoid for `0.*` crates * Most paranoid versions :) * Updated aes and using published version of blake3 Co-authored-by: Jędrzej Stuczyński commit 5b03982043b43a0fca82814ae347069e5a8aafc8 Author: Jędrzej Stuczyński Date: Mon Sep 20 10:40:03 2021 +0100 Replaced unwrap_or_else with unwrap_or_default (#780) commit 8f6856d6fb9dc7c1cc0333dc824911ba19627f67 Author: Drazen Urch Date: Mon Sep 20 11:15:06 2021 +0200 Make fee helpers public (#777) Co-authored-by: Drazen Urch commit 976dd7aae2e7ee6c8a0fdbe368f393b1c26ad704 Author: Drazen Urch Date: Wed Sep 15 17:28:49 2021 +0200 Add block_height method to Delegation (#778) Co-authored-by: Drazen Urch commit 0d21f4e937b1222820260a426c02b10d420963aa Merge: e84af4f6 1403449a Author: Fouad Date: Wed Sep 15 12:41:29 2021 +0100 Merge pull request #776 from nymtech/update/re-enable-bonding re-enable bonding commit 1403449ad51ec2cba19997af88e60f1435512171 Author: fmtabbara Date: Tue Sep 14 16:00:21 2021 +0100 enable bonding commit e84af4f6018772feb4896b31702f2d33ee4c1fb1 Author: Drazen Urch Date: Tue Sep 14 15:15:26 2021 +0200 Migrate legacy delegation data (#771) * Skip ReadOnlyBucket deserialization errors * empty migration * clippy * cargo schema * Drop invalid delegation data * Dont drop old data * Add todo * Unify on type param * gateways are different * cargo fmt Co-authored-by: Drazen Urch commit 26b032c15c7c8ec8f1442f23d2416bafce65323a Merge: e1ddaff0 cba36253 Author: Mark Sinclair Date: Tue Sep 14 10:09:14 2021 +0100 Merge pull request #774 from nymtech/feature/explorer-api-delegations Explorer-api: add API resource to show the delegations for each mix node commit cba3625394dae3f736dab23018df5fcc3c9a4f5d Author: Mark Sinclair Date: Mon Sep 13 10:33:41 2021 +0100 explorer-api: add API resource to show the delegations for each mix node commit e1ddaff04d5077969dd0dbb1e645653035aa8e23 Merge: 0b9c03ca 66ab5de4 Author: Fouad Date: Fri Sep 10 17:17:14 2021 +0100 Merge pull request #772 from nymtech/update/disable-bonding add app alert commit 66ab5de442de91a50556117b62ef028b6b249f6f Author: fmtabbara Date: Fri Sep 10 16:16:58 2021 +0100 add app alert commit 0b9c03ca900a834856efa37706dafac7685b5f79 Author: Dave Hrycyszyn Date: Fri Sep 10 11:23:21 2021 +0300 Adding deps for building the Tauri wallet under Ubuntu (#770) commit c9dce0c1da29a99b1c483009a0658b2236c3a4e8 Author: Bogdan-Ștefan Neacşu Date: Thu Sep 9 11:21:45 2021 +0200 Feature/consumable bandwidth (#766) * Set actual value for bandwidth Also put it as a public attribute, such that it can be actively used by the credential consumer * Switch from sending Attribute structs to sending the actual attribute bytes over the wire * Add atomic bandwidth value to gateway * Consume bandwidth based on the mix packet size * Use Bandwidth struct for specific functionality * Move bandwidth code outside the dependency path of wasm client * Use u64 instead of AtomicU64, as the handling is not parallel --- .github/workflows/build.yml | 26 +- .github/workflows/mixnet_contract.yml | 2 +- .github/workflows/tauri-wallet-types.yml | 22 + .github/workflows/wasm_client_build.yml | 2 +- Cargo.lock | 1540 ++-- README.md | 1 + .../src/client/reply_key_storage.rs | 2 +- clients/tauri-client/README.md | 16 + clients/tauri-client/src-tauri/src/main.rs | 22 +- .../client-libs/validator-client/Cargo.toml | 1 + .../validator-client/src/client.rs | 4 + .../nymd/cosmwasm_client/signing_client.rs | 44 + .../validator-client/src/nymd/fee_helpers.rs | 43 +- .../validator-client/src/nymd/gas_price.rs | 47 +- .../validator-client/src/nymd/mod.rs | 84 +- .../validator-client/src/nymd/wallet/mod.rs | 2 + common/coconut-interface/src/lib.rs | 28 +- common/credentials/src/bandwidth.rs | 17 +- common/credentials/src/error.rs | 12 + common/credentials/src/utils.rs | 16 +- common/crypto/Cargo.toml | 15 +- common/crypto/src/hmac.rs | 4 +- common/crypto/src/lib.rs | 2 +- common/crypto/src/shared_key.rs | 14 +- common/crypto/src/symmetric/stream_cipher.rs | 41 +- common/mixnet-contract/Cargo.toml | 1 + common/mixnet-contract/src/delegation.rs | 4 + common/mixnet-contract/src/gateway.rs | 3 +- common/mixnet-contract/src/mixnode.rs | 3 +- common/network-defaults/Cargo.toml | 2 + common/network-defaults/src/lib.rs | 46 +- .../acknowledgements/src/identifier.rs | 4 +- common/nymsphinx/acknowledgements/src/key.rs | 8 +- .../anonymous-replies/src/encryption_key.rs | 8 +- .../anonymous-replies/src/reply_surb.rs | 2 +- common/nymsphinx/params/src/lib.rs | 2 +- contracts/mixnet/Cargo.lock | 25 +- contracts/mixnet/schema/execute_msg.json | 349 + contracts/mixnet/schema/handle_msg.json | 134 - .../{init_msg.json => instantiate_msg.json} | 2 +- contracts/mixnet/schema/mix_node_bond.json | 64 +- contracts/mixnet/schema/query_msg.json | 265 +- contracts/mixnet/schema/state.json | 82 +- contracts/mixnet/src/contract.rs | 71 +- contracts/mixnet/src/storage.rs | 20 + contracts/mixnet/src/transactions.rs | 68 +- explorer-api/Cargo.toml | 2 +- explorer-api/src/mix_node/http.rs | 10 +- explorer-api/src/mix_nodes/mod.rs | 33 +- gateway/gateway-requests/Cargo.toml | 1 + gateway/gateway-requests/src/iv.rs | 4 +- .../src/registration/handshake/shared_key.rs | 8 +- gateway/src/node/client_handling/bandwidth.rs | 85 + gateway/src/node/client_handling/mod.rs | 1 + .../websocket/connection_handler.rs | 55 +- .../client_handling/websocket/listener.rs | 4 + .../src/node/client_handling/websocket/mod.rs | 4 +- tauri-wallet/.babelrc | 15 + tauri-wallet/.eslintrc | 109 + tauri-wallet/.nvmrc | 1 + tauri-wallet/Cargo.lock | 5213 ++++++++++++ tauri-wallet/Cargo.toml | 2 + tauri-wallet/README.md | 19 + tauri-wallet/dist/.gitkeep | 0 tauri-wallet/package.json | 52 + tauri-wallet/public/favicon.ico | Bin 0 -> 5430 bytes tauri-wallet/public/index.html | 9 + tauri-wallet/src-tauri/.gitignore | 4 + tauri-wallet/src-tauri/Cargo.toml | 44 + tauri-wallet/src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes tauri-wallet/src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes tauri-wallet/src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes tauri-wallet/src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes tauri-wallet/src-tauri/icons/icon.icns | Bin 0 -> 512919 bytes tauri-wallet/src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes tauri-wallet/src-tauri/icons/icon.png | Bin 0 -> 14183 bytes tauri-wallet/src-tauri/rustfmt.toml | 13 + tauri-wallet/src-tauri/src/build.rs | 3 + tauri-wallet/src-tauri/src/coin.rs | 349 + tauri-wallet/src-tauri/src/config/mod.rs | 90 + tauri-wallet/src-tauri/src/config/template.rs | 17 + tauri-wallet/src-tauri/src/error.rs | 21 + tauri-wallet/src-tauri/src/main.rs | 78 + .../src-tauri/src/operations/account.rs | 113 + .../src-tauri/src/operations/admin.rs | 84 + tauri-wallet/src-tauri/src/operations/bond.rs | 64 + .../src-tauri/src/operations/delegate.rs | 94 + tauri-wallet/src-tauri/src/operations/mod.rs | 5 + tauri-wallet/src-tauri/src/operations/send.rs | 69 + tauri-wallet/src-tauri/src/state.rs | 24 + tauri-wallet/src-tauri/src/utils.rs | 54 + tauri-wallet/src-tauri/tauri.conf.json | 65 + tauri-wallet/src/components/AdminForm.tsx | 223 + tauri-wallet/src/components/Confirmation.tsx | 43 + .../src/components/CopyToClipboard.tsx | 50 + tauri-wallet/src/components/Error.tsx | 20 + tauri-wallet/src/components/Nav.tsx | 145 + .../src/components/NavigationCards.tsx | 118 + tauri-wallet/src/components/NoClientError.tsx | 13 + .../src/components/NodeTypeSelector.tsx | 48 + tauri-wallet/src/components/NymCard.tsx | 34 + tauri-wallet/src/components/RequestStatus.tsx | 33 + tauri-wallet/src/components/index.ts | 10 + tauri-wallet/src/context/main.tsx | 55 + tauri-wallet/src/hooks/useCheckOwnership.ts | 39 + tauri-wallet/src/hooks/useGetBalance.tsx | 36 + tauri-wallet/src/images/logo-background.svg | 43 + tauri-wallet/src/images/logo.png | Bin 0 -> 356966 bytes tauri-wallet/src/index.d.ts | 3 + tauri-wallet/src/index.tsx | 46 + tauri-wallet/src/layouts/AppLayout.tsx | 71 + tauri-wallet/src/layouts/ContentLayout.tsx | 26 + tauri-wallet/src/layouts/index.tsx | 2 + tauri-wallet/src/requests/index.ts | 85 + tauri-wallet/src/routes/404.tsx | 12 + tauri-wallet/src/routes/balance.tsx | 60 + tauri-wallet/src/routes/bond/BondForm.tsx | 381 + tauri-wallet/src/routes/bond/index.tsx | 128 + .../src/routes/bond/validationSchema.ts | 85 + tauri-wallet/src/routes/check-delegation.tsx | 0 .../src/routes/delegate/DelegateForm.tsx | 167 + tauri-wallet/src/routes/delegate/index.tsx | 110 + .../src/routes/delegate/validationSchema.ts | 17 + tauri-wallet/src/routes/index.tsx | 47 + .../src/routes/internal-docs/ApiList.tsx | 165 + .../src/routes/internal-docs/DocEntry.tsx | 97 + .../src/routes/internal-docs/index.tsx | 18 + tauri-wallet/src/routes/receive.tsx | 75 + .../src/routes/send/SendConfirmation.tsx | 81 + tauri-wallet/src/routes/send/SendError.tsx | 47 + tauri-wallet/src/routes/send/SendForm.tsx | 58 + tauri-wallet/src/routes/send/SendReview.tsx | 92 + tauri-wallet/src/routes/send/SendWizard.tsx | 180 + tauri-wallet/src/routes/send/index.tsx | 14 + .../src/routes/send/validationSchema.ts | 11 + tauri-wallet/src/routes/sign-in.tsx | 316 + tauri-wallet/src/routes/unbond/index.tsx | 69 + .../src/routes/undelegate/UndelegateForm.tsx | 134 + tauri-wallet/src/routes/undelegate/index.tsx | 92 + .../src/routes/undelegate/validationSchema.ts | 10 + tauri-wallet/src/theme.tsx | 66 + tauri-wallet/src/types/global.ts | 26 + tauri-wallet/src/types/index.ts | 2 + tauri-wallet/src/types/rust/account.ts | 8 + tauri-wallet/src/types/rust/balance.ts | 6 + tauri-wallet/src/types/rust/coin.ts | 6 + .../src/types/rust/delegationresult.ts | 7 + tauri-wallet/src/types/rust/denom.ts | 1 + tauri-wallet/src/types/rust/gateway.ts | 9 + tauri-wallet/src/types/rust/index.ts | 11 + tauri-wallet/src/types/rust/mixnode.ts | 9 + tauri-wallet/src/types/rust/operation.ts | 15 + tauri-wallet/src/types/rust/stateparams.ts | 10 + tauri-wallet/src/types/rust/tauritxresult.ts | 9 + .../src/types/rust/transactiondetails.ts | 7 + tauri-wallet/src/utils/index.ts | 98 + tauri-wallet/tsconfig.json | 75 + tauri-wallet/webpack.config.js | 45 + tauri-wallet/yarn.lock | 6964 +++++++++++++++++ validator-api/Cargo.toml | 23 +- validator-api/build.rs | 12 +- .../20210824120000_rewarding_data.sql | 74 + validator-api/sqlx-data.json | 505 -- validator-api/src/cache/mod.rs | 12 + validator-api/src/config/mod.rs | 101 +- validator-api/src/config/template.rs | 22 + validator-api/src/main.rs | 162 +- .../src/network_monitor/monitor/preparer.rs | 21 +- .../src/network_monitor/monitor/sender.rs | 2 + .../src/network_monitor/tested_network/mod.rs | 37 + validator-api/src/node_status_api/mod.rs | 3 - validator-api/src/node_status_api/models.rs | 36 +- validator-api/src/node_status_api/routes.rs | 39 - validator-api/src/node_status_api/utils.rs | 4 +- validator-api/src/nymd_client.rs | 170 +- validator-api/src/rewarding/epoch.rs | 219 + validator-api/src/rewarding/error.rs | 47 + validator-api/src/rewarding/mod.rs | 871 +++ validator-api/src/storage/manager.rs | 443 +- validator-api/src/storage/mod.rs | 375 +- validator-api/src/storage/models.rs | 49 +- wallet-web/pages/_app.tsx | 2 - 191 files changed, 22407 insertions(+), 1793 deletions(-) create mode 100644 .github/workflows/tauri-wallet-types.yml create mode 100644 contracts/mixnet/schema/execute_msg.json delete mode 100644 contracts/mixnet/schema/handle_msg.json rename contracts/mixnet/schema/{init_msg.json => instantiate_msg.json} (73%) create mode 100644 gateway/src/node/client_handling/bandwidth.rs create mode 100644 tauri-wallet/.babelrc create mode 100644 tauri-wallet/.eslintrc create mode 100644 tauri-wallet/.nvmrc create mode 100644 tauri-wallet/Cargo.lock create mode 100644 tauri-wallet/Cargo.toml create mode 100644 tauri-wallet/README.md create mode 100644 tauri-wallet/dist/.gitkeep create mode 100644 tauri-wallet/package.json create mode 100644 tauri-wallet/public/favicon.ico create mode 100644 tauri-wallet/public/index.html create mode 100644 tauri-wallet/src-tauri/.gitignore create mode 100644 tauri-wallet/src-tauri/Cargo.toml create mode 100644 tauri-wallet/src-tauri/icons/128x128.png create mode 100644 tauri-wallet/src-tauri/icons/128x128@2x.png create mode 100644 tauri-wallet/src-tauri/icons/32x32.png create mode 100644 tauri-wallet/src-tauri/icons/Square107x107Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square142x142Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square150x150Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square284x284Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square30x30Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square310x310Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square44x44Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square71x71Logo.png create mode 100644 tauri-wallet/src-tauri/icons/Square89x89Logo.png create mode 100644 tauri-wallet/src-tauri/icons/StoreLogo.png create mode 100644 tauri-wallet/src-tauri/icons/icon.icns create mode 100644 tauri-wallet/src-tauri/icons/icon.ico create mode 100644 tauri-wallet/src-tauri/icons/icon.png create mode 100644 tauri-wallet/src-tauri/rustfmt.toml create mode 100644 tauri-wallet/src-tauri/src/build.rs create mode 100644 tauri-wallet/src-tauri/src/coin.rs create mode 100644 tauri-wallet/src-tauri/src/config/mod.rs create mode 100644 tauri-wallet/src-tauri/src/config/template.rs create mode 100644 tauri-wallet/src-tauri/src/error.rs create mode 100644 tauri-wallet/src-tauri/src/main.rs create mode 100644 tauri-wallet/src-tauri/src/operations/account.rs create mode 100644 tauri-wallet/src-tauri/src/operations/admin.rs create mode 100644 tauri-wallet/src-tauri/src/operations/bond.rs create mode 100644 tauri-wallet/src-tauri/src/operations/delegate.rs create mode 100644 tauri-wallet/src-tauri/src/operations/mod.rs create mode 100644 tauri-wallet/src-tauri/src/operations/send.rs create mode 100644 tauri-wallet/src-tauri/src/state.rs create mode 100644 tauri-wallet/src-tauri/src/utils.rs create mode 100644 tauri-wallet/src-tauri/tauri.conf.json create mode 100644 tauri-wallet/src/components/AdminForm.tsx create mode 100644 tauri-wallet/src/components/Confirmation.tsx create mode 100644 tauri-wallet/src/components/CopyToClipboard.tsx create mode 100644 tauri-wallet/src/components/Error.tsx create mode 100644 tauri-wallet/src/components/Nav.tsx create mode 100644 tauri-wallet/src/components/NavigationCards.tsx create mode 100644 tauri-wallet/src/components/NoClientError.tsx create mode 100644 tauri-wallet/src/components/NodeTypeSelector.tsx create mode 100644 tauri-wallet/src/components/NymCard.tsx create mode 100644 tauri-wallet/src/components/RequestStatus.tsx create mode 100644 tauri-wallet/src/components/index.ts create mode 100644 tauri-wallet/src/context/main.tsx create mode 100644 tauri-wallet/src/hooks/useCheckOwnership.ts create mode 100644 tauri-wallet/src/hooks/useGetBalance.tsx create mode 100644 tauri-wallet/src/images/logo-background.svg create mode 100644 tauri-wallet/src/images/logo.png create mode 100644 tauri-wallet/src/index.d.ts create mode 100644 tauri-wallet/src/index.tsx create mode 100644 tauri-wallet/src/layouts/AppLayout.tsx create mode 100644 tauri-wallet/src/layouts/ContentLayout.tsx create mode 100644 tauri-wallet/src/layouts/index.tsx create mode 100644 tauri-wallet/src/requests/index.ts create mode 100644 tauri-wallet/src/routes/404.tsx create mode 100644 tauri-wallet/src/routes/balance.tsx create mode 100644 tauri-wallet/src/routes/bond/BondForm.tsx create mode 100644 tauri-wallet/src/routes/bond/index.tsx create mode 100644 tauri-wallet/src/routes/bond/validationSchema.ts create mode 100644 tauri-wallet/src/routes/check-delegation.tsx create mode 100644 tauri-wallet/src/routes/delegate/DelegateForm.tsx create mode 100644 tauri-wallet/src/routes/delegate/index.tsx create mode 100644 tauri-wallet/src/routes/delegate/validationSchema.ts create mode 100644 tauri-wallet/src/routes/index.tsx create mode 100644 tauri-wallet/src/routes/internal-docs/ApiList.tsx create mode 100644 tauri-wallet/src/routes/internal-docs/DocEntry.tsx create mode 100644 tauri-wallet/src/routes/internal-docs/index.tsx create mode 100644 tauri-wallet/src/routes/receive.tsx create mode 100644 tauri-wallet/src/routes/send/SendConfirmation.tsx create mode 100644 tauri-wallet/src/routes/send/SendError.tsx create mode 100644 tauri-wallet/src/routes/send/SendForm.tsx create mode 100644 tauri-wallet/src/routes/send/SendReview.tsx create mode 100644 tauri-wallet/src/routes/send/SendWizard.tsx create mode 100644 tauri-wallet/src/routes/send/index.tsx create mode 100644 tauri-wallet/src/routes/send/validationSchema.ts create mode 100644 tauri-wallet/src/routes/sign-in.tsx create mode 100644 tauri-wallet/src/routes/unbond/index.tsx create mode 100644 tauri-wallet/src/routes/undelegate/UndelegateForm.tsx create mode 100644 tauri-wallet/src/routes/undelegate/index.tsx create mode 100644 tauri-wallet/src/routes/undelegate/validationSchema.ts create mode 100644 tauri-wallet/src/theme.tsx create mode 100644 tauri-wallet/src/types/global.ts create mode 100644 tauri-wallet/src/types/index.ts create mode 100644 tauri-wallet/src/types/rust/account.ts create mode 100644 tauri-wallet/src/types/rust/balance.ts create mode 100644 tauri-wallet/src/types/rust/coin.ts create mode 100644 tauri-wallet/src/types/rust/delegationresult.ts create mode 100644 tauri-wallet/src/types/rust/denom.ts create mode 100644 tauri-wallet/src/types/rust/gateway.ts create mode 100644 tauri-wallet/src/types/rust/index.ts create mode 100644 tauri-wallet/src/types/rust/mixnode.ts create mode 100644 tauri-wallet/src/types/rust/operation.ts create mode 100644 tauri-wallet/src/types/rust/stateparams.ts create mode 100644 tauri-wallet/src/types/rust/tauritxresult.ts create mode 100644 tauri-wallet/src/types/rust/transactiondetails.ts create mode 100644 tauri-wallet/src/utils/index.ts create mode 100644 tauri-wallet/tsconfig.json create mode 100644 tauri-wallet/webpack.config.js create mode 100644 tauri-wallet/yarn.lock create mode 100644 validator-api/migrations/20210824120000_rewarding_data.sql delete mode 100644 validator-api/sqlx-data.json create mode 100644 validator-api/src/rewarding/epoch.rs create mode 100644 validator-api/src/rewarding/error.rs create mode 100644 validator-api/src/rewarding/mod.rs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 632fe49434..0e0c81403e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Continuous integration on: [push, pull_request] jobs: - ci: + build: runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.rust == 'nightly' || matrix.rust == 'beta' }} strategy: @@ -25,28 +25,13 @@ jobs: override: true components: rustfmt, clippy - # Exclude validator API on Windows - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: build - args: --all --exclude nym-validator-api - - - uses: actions-rs/cargo@v1 - if: ${{ matrix.os != 'windows-latest' }} with: command: build args: --all - # Exclude validator API on Windows - - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: test - args: --all --exclude nym-validator-api - uses: actions-rs/cargo@v1 - if: ${{ matrix.os != 'windows-latest' }} with: command: test args: --all @@ -56,15 +41,8 @@ jobs: command: fmt args: --all -- --check - # Exclude validator API on Windows - - uses: actions-rs/cargo@v1 - if: ${{ matrix.rust != 'nightly' && matrix.os == 'windows-latest' }} - with: - command: clippy - args: --all --exclude nym-validator-api -- -D warnings - - uses: actions-rs/cargo@v1 - if: ${{ matrix.rust != 'nightly' && matrix.os != 'windows-latest' }} + if: ${{ matrix.rust != 'nightly' }} with: command: clippy args: -- -D warnings diff --git a/.github/workflows/mixnet_contract.yml b/.github/workflows/mixnet_contract.yml index fa69e2adb6..22636139eb 100644 --- a/.github/workflows/mixnet_contract.yml +++ b/.github/workflows/mixnet_contract.yml @@ -3,7 +3,7 @@ name: Mixnet Contract on: [push, pull_request] jobs: - ci: + mixnet-contract: # since it's going to be compiled into wasm, there's absolutely # no point in running CI on different OS-es runs-on: ubuntu-latest diff --git a/.github/workflows/tauri-wallet-types.yml b/.github/workflows/tauri-wallet-types.yml new file mode 100644 index 0000000000..f0239fddad --- /dev/null +++ b/.github/workflows/tauri-wallet-types.yml @@ -0,0 +1,22 @@ +name: Generate TS types + +on: push + +jobs: + tauri-wallet-types: + runs-on: ubuntu-latest + steps: + - name: Prepare + run: sudo apt-get update && sudo apt-get install -y libpango1.0-dev libatk1.0-dev libgdk-pixbuf2.0-dev libsoup2.4-dev librust-gdk-dev libwebkit2gtk-4.0-dev + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - name: Generate TS + run: cd tauri-wallet/src-tauri && cargo test + - uses: EndBug/add-and-commit@v7.2.1 # https://github.com/marketplace/actions/add-commit + with: + add: '["tauri-wallet"]' + message: '[ci skip] Generate TS types' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/wasm_client_build.yml b/.github/workflows/wasm_client_build.yml index 6c80c9308f..a57b76f306 100644 --- a/.github/workflows/wasm_client_build.yml +++ b/.github/workflows/wasm_client_build.yml @@ -3,7 +3,7 @@ name: Wasm Client on: [push, pull_request] jobs: - ci: + wasm: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff --git a/Cargo.lock b/Cargo.lock index 50d7be17ca..0f1964602c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,9 +1,17 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -# Copyright 2020 - Nym Technologies SA -# SPDX-License-Identifier: Apache-2.0 version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "addr2line" version = "0.16.0" @@ -27,46 +35,14 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "aes" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495ee669413bfbe9e8cace80f4d3d78e6d8c8d99579f97fb93bde351b185f2d4" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if 1.0.0", - "cipher 0.3.0", + "cipher", "cpufeatures", - "ctr 0.7.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aes-ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7729c3cde54d67063be556aeac75a81330d802f0259500ca40cb52967f975763" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", - "ctr 0.6.0", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", + "ctr", "opaque-debug 0.3.0", ] @@ -110,9 +86,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.42" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595d3cfa7a60d4555cb5067b99f07142a08ea778de5cf993f7b75c7d8fabc486" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" [[package]] name = "app" @@ -137,9 +113,23 @@ checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" -version = "0.5.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + +[[package]] +name = "ast_node" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93f52ce8fac3d0e6720a92b0576d737c01b1b5db4dd786e962e5925f00bf755" +dependencies = [ + "darling 0.10.2", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] [[package]] name = "async-stream" @@ -175,28 +165,26 @@ dependencies = [ [[package]] name = "atk" -version = "0.9.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812b4911e210bd51b24596244523c856ca749e6223c50a7fbbba3f89ee37c426" +checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" dependencies = [ "atk-sys", "bitflags", "glib", - "glib-sys", - "gobject-sys", "libc", ] [[package]] name = "atk-sys" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f530e4af131d94cc4fa15c5c9d0348f0ef28bac64ba660b6b2a1cf2605dedfce" +checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", - "system-deps", + "system-deps 3.2.0", ] [[package]] @@ -302,17 +290,17 @@ dependencies = [ [[package]] name = "bip32" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b48054b307f98bf2ddb17ffd4e9d029bfaf3e7cd5fe807e412768e4370015e3d" +checksum = "c2d0f0fc59c7ba0333eed9dcc1b6980baa7b7a4dc7c6c5885994d0674f7adf34" dependencies = [ "bs58", "hkd32", - "hmac 0.11.0", + "hmac", "k256", "ripemd160", "sha2", - "subtle 2.4.0", + "subtle 2.4.1", "zeroize", ] @@ -337,21 +325,9 @@ checksum = "7ce18265ec2324ad075345d5814fbeed4f41f0a660055dc78840b74d19b874b1" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "bitvec" -version = "0.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "blake2" @@ -367,16 +343,16 @@ dependencies = [ [[package]] name = "blake3" -version = "0.3.8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "constant_time_eq", - "crypto-mac 0.8.0", + "crypto-mac 0.11.1", "digest 0.9.0", "rayon", ] @@ -435,7 +411,7 @@ dependencies = [ "group", "pairing", "rand_core 0.6.3", - "subtle 2.4.0", + "subtle 2.4.1", ] [[package]] @@ -449,24 +425,18 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "memchr", ] -[[package]] -name = "build_const" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" - [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" [[package]] name = "byte-tools" @@ -482,9 +452,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "bzip2" @@ -509,35 +479,33 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.9.1" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c0f2e047e8ca53d0ff249c54ae047931d7a6ebe05d00af73e0ffeb6e34bdb8" +checksum = "9164355c892b026d6257e696dde5f3cb39beb3718297f0f161b562fe2ee3ab86" dependencies = [ "bitflags", "cairo-sys-rs", "glib", - "glib-sys", - "gobject-sys", "libc", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed2639b9ad5f1d6efa76de95558e11339e7318426d84ac4890b86c03e828ca7" +checksum = "d7c9c3928781e8a017ece15eace05230f04b647457d170d2d9641c94a444ff80" dependencies = [ - "glib-sys", + "glib-sys 0.14.0", "libc", - "system-deps", + "system-deps 3.2.0", ] [[package]] name = "cc" -version = "1.0.68" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" dependencies = [ "jobserver", ] @@ -552,6 +520,15 @@ dependencies = [ "uuid", ] +[[package]] +name = "cfg-expr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +dependencies = [ + "smallvec 1.6.1", +] + [[package]] name = "cfg-if" version = "0.1.10" @@ -590,19 +567,10 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.43", + "time 0.1.44", "winapi", ] -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.4", -] - [[package]] name = "cipher" version = "0.3.0" @@ -786,9 +754,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22" +checksum = "fdab415d6744056100f40250a66bc430c1a46f7a02e20bc11c94c79a0f0464df" [[package]] name = "const_fn" @@ -810,9 +778,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cookie" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf8865bac3d9a3bde5bde9088ca431b11f5d37c7a578b8086af77248b76627" +checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" dependencies = [ "percent-encoding", "time 0.2.27", @@ -970,22 +938,28 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" dependencies = [ "libc", ] [[package]] name = "crc" -version = "1.8.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f" dependencies = [ - "build_const", + "crc-catalog", ] +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" version = "1.2.1" @@ -1069,15 +1043,15 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" name = "crypto" version = "0.1.0" dependencies = [ - "aes-ctr", + "aes", "blake3", "bs58", - "cipher 0.2.5", + "cipher", "digest 0.9.0", "ed25519-dalek", "generic-array 0.14.4", - "hkdf 0.10.0", - "hmac 0.8.1", + "hkdf", + "hmac", "log", "nymsphinx-types", "pemstore", @@ -1087,13 +1061,13 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.2.2" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32a398eb1ccfbe7e4f452bc749c44d38dd732e9a253f19da224c416f00ee7f4" +checksum = "d12477e115c0d570c12a2dfd859f80b55b60ddb5075df210d3af06d133a69f45" dependencies = [ "generic-array 0.14.4", "rand_core 0.6.3", - "subtle 2.4.0", + "subtle 2.4.1", "zeroize", ] @@ -1109,32 +1083,12 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.4", - "subtle 2.4.0", -] - -[[package]] -name = "crypto-mac" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" -dependencies = [ - "generic-array 0.14.4", - "subtle 2.4.0", -] - -[[package]] -name = "crypto-mac" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ "generic-array 0.14.4", - "subtle 2.4.0", + "subtle 2.4.1", ] [[package]] @@ -1175,32 +1129,23 @@ dependencies = [ [[package]] name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher 0.2.5", -] - -[[package]] -name = "ctr" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "cipher 0.3.0", + "cipher", ] [[package]] name = "curve25519-dalek" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle 2.4.0", + "subtle 2.4.1", "zeroize", ] @@ -1306,9 +1251,9 @@ dependencies = [ [[package]] name = "der" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d" +checksum = "2adca118c71ecd9ae094d4b68257b3fdfcb711a612b9eec7b5a0d27a5a70a5b4" dependencies = [ "const-oid", ] @@ -1326,21 +1271,22 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.14" +version = "0.99.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7b9cef1e351660e5443924e4f43ab25fbbed3e9a5f052df3677deb4d6b320" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" dependencies = [ "convert_case", "proc-macro2", "quote", + "rustc_version 0.3.3", "syn", ] [[package]] name = "devise" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411cf45ac38f00df3679689616649dc12607b846db171780bb790b514a042832" +checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" dependencies = [ "devise_codegen", "devise_core", @@ -1348,9 +1294,9 @@ dependencies = [ [[package]] name = "devise_codegen" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf7081f06822f1787e29359354426132cf832cc977d7a8ff747848631462ad1" +checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" dependencies = [ "devise_core", "quote", @@ -1358,9 +1304,9 @@ dependencies = [ [[package]] name = "devise_core" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c23631758736875d7ce08f847f296b4001b72cf90878e85b47df7ac5442147" +checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" dependencies = [ "bitflags", "proc-macro2", @@ -1452,6 +1398,45 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dprint-core" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93bd44f40b1881477837edc7112695d4b174f058c36c1cbc4c50f8d0482e2ac8" +dependencies = [ + "bumpalo", + "fnv", + "serde", +] + +[[package]] +name = "dprint-plugin-typescript" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba0077bd2ab9235848e793fbbfb563e6a04b4c8e4149827802a84063c15805" +dependencies = [ + "dprint-core", + "dprint-swc-ecma-ast-view", + "fnv", + "serde", + "swc_common", + "swc_ecmascript", +] + +[[package]] +name = "dprint-swc-ecma-ast-view" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecf692a2ee5c5f699ed0e95f21686cf6367f3a591e5d8e7bd3041bbf184651f9" +dependencies = [ + "bumpalo", + "fnv", + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecmascript", +] + [[package]] name = "dtoa" version = "0.4.8" @@ -1475,21 +1460,21 @@ checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" [[package]] name = "ecdsa" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cb0ed2d2ce37766ac86c05f66973ace8c51f7f1533bedce8fb79e2b54b3f14" +checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" dependencies = [ "der", "elliptic-curve", - "hmac 0.11.0", + "hmac", "signature", ] [[package]] name = "ed25519" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d0860415b12243916284c67a9be413e044ee6668247b99ba26d94b2bc06c8f6" +checksum = "4620d40f6d2601794401d6dd95a5cf69b6c157852539470eeda433a99b3c0efc" dependencies = [ "serde", "signature", @@ -1532,9 +1517,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "elliptic-curve" -version = "0.10.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e5c176479da93a0983f0a6fdc3c1b8e7d5be0d7fe3fe05a99f15b96582b9a8" +checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" dependencies = [ "crypto-bigint", "ff", @@ -1542,10 +1527,16 @@ dependencies = [ "group", "pkcs8", "rand_core 0.6.3", - "subtle 2.4.0", + "subtle 2.4.1", "zeroize", ] +[[package]] +name = "embed_plist" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99" + [[package]] name = "encoding_rs" version = "0.8.28" @@ -1555,6 +1546,18 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "enum_kind" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b940da354ae81ef0926c5eaa428207b8f4f091d3956c891dfbd124162bed99" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -1616,14 +1619,33 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "fastrand" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +dependencies = [ + "instant", +] + [[package]] name = "ff" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63eec06c61e487eecf0f7e6e6372e596a81922c28d33e645d6983ca6493a1af0" +checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" dependencies = [ "rand_core 0.6.3", - "subtle 2.4.0", + "subtle 2.4.1", +] + +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset", + "rustc_version 0.3.3", ] [[package]] @@ -1642,9 +1664,9 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1654,9 +1676,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ "cfg-if 1.0.0", "crc32fast", @@ -1710,6 +1732,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "from_variant" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0951635027ca477be98f8774abd6f0345233439d63f307e47101acb40c7cc63d" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + [[package]] name = "fs2" version = "0.4.3" @@ -1726,12 +1760,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "futf" version = "0.1.4" @@ -1744,9 +1772,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -1759,9 +1787,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -1769,32 +1797,58 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] [[package]] name = "futures-macro" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ "autocfg 1.0.1", "proc-macro-hack", @@ -1805,21 +1859,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-util" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ "autocfg 1.0.1", "futures-channel", @@ -1873,6 +1927,7 @@ dependencies = [ "bincode", "bs58", "coconut-interface", + "credentials", "crypto", "futures", "log", @@ -1887,67 +1942,60 @@ dependencies = [ [[package]] name = "gdk" -version = "0.13.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db00839b2a68a7a10af3fa28dfb3febaba3a20c3a9ac2425a33b7df1f84a6b7d" +checksum = "a453eae5ec10345b3a96ca1b547328bfc94edd40aa95b08f14bb4c35863db140" dependencies = [ "bitflags", "cairo-rs", - "cairo-sys-rs", "gdk-pixbuf", "gdk-sys", "gio", - "gio-sys", "glib", - "glib-sys", - "gobject-sys", "libc", "pango", ] [[package]] name = "gdk-pixbuf" -version = "0.9.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6dae3cb99dd49b758b88f0132f8d401108e63ae8edd45f432d42cdff99998a" +checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f" dependencies = [ "gdk-pixbuf-sys", "gio", - "gio-sys", "glib", - "glib-sys", - "gobject-sys", "libc", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfe468a7f43e97b8d193a762b6c5cf67a7d36cacbc0b9291dbcae24bfea1e8f" +checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", - "system-deps", + "system-deps 3.2.0", ] [[package]] name = "gdk-sys" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9653cfc500fd268015b1ac055ddbc3df7a5c9ea3f4ccef147b3957bd140d69" +checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", "pango-sys", "pkg-config", - "system-deps", + "system-deps 3.2.0", ] [[package]] @@ -2028,20 +2076,16 @@ checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" [[package]] name = "gio" -version = "0.9.1" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb60242bfff700772dae5d9e3a1f7aa2e4ebccf18b89662a16acb2822568561" +checksum = "f3a29d8062af72045518271a2cd98b4e1617ce43f5b4223ad0fb9a0eff8f718c" dependencies = [ "bitflags", - "futures", "futures-channel", "futures-core", "futures-io", - "futures-util", - "gio-sys", + "gio-sys 0.14.0", "glib", - "glib-sys", - "gobject-sys", "libc", "once_cell", "thiserror", @@ -2053,42 +2097,54 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.10.1", + "gobject-sys 0.10.0", "libc", - "system-deps", + "system-deps 1.3.2", + "winapi", +] + +[[package]] +name = "gio-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", "winapi", ] [[package]] name = "glib" -version = "0.10.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c685013b7515e668f1b57a165b009d4d28cb139a8a989bbd699c10dad29d0c5" +checksum = "d4a930b7208e6e0ab839eea5f65ac2b82109f729621430d47fe905e2e09d33f4" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", - "futures-util", "glib-macros", - "glib-sys", - "gobject-sys", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", "once_cell", + "smallvec 1.6.1", ] [[package]] name = "glib-macros" -version = "0.10.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" dependencies = [ "anyhow", "heck", - "itertools 0.9.0", - "proc-macro-crate 0.1.5", + "proc-macro-crate 1.1.0", "proc-macro-error", "proc-macro2", "quote", @@ -2102,7 +2158,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1" dependencies = [ "libc", - "system-deps", + "system-deps 1.3.2", +] + +[[package]] +name = "glib-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" +dependencies = [ + "libc", + "system-deps 3.2.0", ] [[package]] @@ -2130,9 +2196,20 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" dependencies = [ - "glib-sys", + "glib-sys 0.10.1", "libc", - "system-deps", + "system-deps 1.3.2", +] + +[[package]] +name = "gobject-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", ] [[package]] @@ -2144,60 +2221,70 @@ dependencies = [ "byteorder", "ff", "rand_core 0.6.3", - "subtle 2.4.0", + "subtle 2.4.1", ] [[package]] name = "gtk" -version = "0.9.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f022f2054072b3af07666341984562c8e626a79daa8be27b955d12d06a5ad6a" +checksum = "6603bb79ded6ac6f3bac203794383afa8b1d6a8656d34a93a88f0b22826cd46c" dependencies = [ "atk", "bitflags", "cairo-rs", - "cairo-sys-rs", - "cc", + "field-offset", + "futures-channel", "gdk", "gdk-pixbuf", - "gdk-pixbuf-sys", - "gdk-sys", "gio", - "gio-sys", "glib", - "glib-sys", - "gobject-sys", "gtk-sys", + "gtk3-macros", "libc", "once_cell", "pango", - "pango-sys", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89acda6f084863307d948ba64a4b1ef674e8527dddab147ee4cdcc194c880457" +checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e" dependencies = [ "atk-sys", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", "pango-sys", - "system-deps", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk3-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "h2" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" +checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" dependencies = [ "bytes", "fnv", @@ -2256,8 +2343,8 @@ dependencies = [ "headers-core", "http", "mime", - "sha-1 0.9.6", - "time 0.1.43", + "sha-1 0.9.8", + "time 0.1.44", ] [[package]] @@ -2299,7 +2386,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84f2a5541afe0725f0b95619d6af614f48c1b176385b8aa30918cfb8c4bfafc8" dependencies = [ - "hmac 0.11.0", + "hmac", "once_cell", "pbkdf2", "rand_core 0.6.3", @@ -2307,16 +2394,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest 0.9.0", - "hmac 0.10.1", -] - [[package]] name = "hkdf" version = "0.11.0" @@ -2324,27 +2401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" dependencies = [ "digest 0.9.0", - "hmac 0.11.0", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac 0.10.0", - "digest 0.9.0", + "hmac", ] [[package]] @@ -2353,7 +2410,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac 0.11.1", "digest 0.9.0", ] @@ -2373,9 +2430,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" +checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" dependencies = [ "bytes", "fnv", @@ -2384,20 +2441,26 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ "bytes", "http", "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" + [[package]] name = "httparse" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" [[package]] name = "httpdate" @@ -2432,9 +2495,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.9" +version = "0.14.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d6baa1b441335f3ce5098ac421fb6547c46dda735ca1bc6d0153c838f9dd83" +checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593" dependencies = [ "bytes", "futures-channel", @@ -2599,9 +2662,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -2624,6 +2687,19 @@ dependencies = [ "serde", ] +[[package]] +name = "is-macro" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a322dd16d960e322c3d92f541b4c1a4f0a2e81e1fdeee430d8cecc8b72e8015f" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "isocountry" version = "0.3.2" @@ -2654,15 +2730,15 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "javascriptcore-rs" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecc697657edc9cd3d85d5ec6941f74cc9bb2ae84bec320f55c9397c5a8d8722" +checksum = "5ca9c7d1445bba2889672fbadc16c3d5007bfdcf0a15a18a3a50fe9fab2c7427" dependencies = [ "glib", "javascriptcore-rs-sys", @@ -2685,27 +2761,27 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ca711fd837261e14ec9e674f092cbb931d3fa1482b017ae59328ddc6f3212b" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a26a4a8e8b0ab315c687767b543c923c9667a1f2bf42a42818d1453891c7c1" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" dependencies = [ "cfg-if 1.0.0", "ecdsa", @@ -2744,24 +2820,11 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if 1.0.0", - "ryu", - "static_assertions", -] - [[package]] name = "libc" -version = "0.2.97" +version = "0.2.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" [[package]] name = "libm" @@ -2794,9 +2857,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -2860,9 +2923,9 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "maybe-uninit" @@ -2872,9 +2935,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memoffset" @@ -2897,6 +2960,12 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "minimal-lexical" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c835948974f68e0bd58636fc6c5b1fbff7b297e3046f11b3b3c18bbac012c6d" + [[package]] name = "miniz_oxide" version = "0.3.7" @@ -2957,6 +3026,7 @@ dependencies = [ "schemars", "serde", "serde_repr", + "ts-rs", ] [[package]] @@ -2987,19 +3057,18 @@ dependencies = [ [[package]] name = "multer" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdd568fea4758b30d6423f013f7171e193c34aa97828d1bd9f924fb3af30a8c" +checksum = "408327e2999b839cd1af003fc01b2019a6c10a1361769542203f6fedc5179680" dependencies = [ "bytes", - "derive_more", "encoding_rs", "futures-util", "http", "httparse", "log", "mime", - "spin 0.9.1", + "spin 0.9.2", "tokio", "tokio-util", "twoway", @@ -3008,9 +3077,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -3026,10 +3095,11 @@ dependencies = [ [[package]] name = "ndk" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab" +checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" dependencies = [ + "bitflags", "jni-sys", "ndk-sys", "num_enum", @@ -3038,9 +3108,9 @@ dependencies = [ [[package]] name = "ndk-glue" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf0c24d51ac1c905c27d4eda4fa0635bbe0de596b8f79235e0b17a4d29385" +checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" dependencies = [ "lazy_static", "libc", @@ -3073,6 +3143,8 @@ checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" name = "network-defaults" version = "0.1.0" dependencies = [ + "serde", + "time 0.3.3", "url", ] @@ -3090,14 +3162,12 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nom" -version = "6.1.2" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" +checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" dependencies = [ - "bitvec", - "funty", - "lexical-core", "memchr", + "minimal-lexical", "version_check", ] @@ -3119,6 +3189,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg 1.0.1", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -3173,9 +3255,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2c8fd66061a707503d515639b8af10fd3807a5b5ee6959f7ff1bd303634bd5" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" dependencies = [ "derivative", "num_enum_derive", @@ -3183,11 +3265,11 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474fd1d096da3ad17084694eebed40ba09c4a36c5255cd772bd8b98859cc562e" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote", "syn", @@ -3398,6 +3480,8 @@ dependencies = [ "serde", "serde_json", "sqlx", + "thiserror", + "time 0.3.3", "tokio", "topology", "url", @@ -3554,9 +3638,9 @@ dependencies = [ [[package]] name = "object" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55827317fb4c08822499848a14237d2874d6f139828893017237e7ab93eb386" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" dependencies = [ "memchr", ] @@ -3592,9 +3676,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.35" +version = "0.10.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -3612,9 +3696,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.65" +version = "0.9.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" +checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" dependencies = [ "autocfg 1.0.1", "cc", @@ -3630,6 +3714,15 @@ dependencies = [ "log", ] +[[package]] +name = "owning_ref" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "pairing" version = "0.20.0" @@ -3641,14 +3734,12 @@ dependencies = [ [[package]] name = "pango" -version = "0.9.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9937068580bebd8ced19975938573803273ccbcbd598c58d4906efd4ac87c438" +checksum = "e1fc88307d9797976ea62722ff2ec5de3fae279c6e20100ed3f49ca1a4bf3f96" dependencies = [ "bitflags", "glib", - "glib-sys", - "gobject-sys", "libc", "once_cell", "pango-sys", @@ -3656,21 +3747,27 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d2650c8b62d116c020abd0cea26a4ed96526afda89b1c4ea567131fdefc890" +checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "libc", - "system-deps", + "system-deps 3.2.0", ] +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -3679,9 +3776,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if 1.0.0", "instant", @@ -3697,7 +3794,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac 0.11.1", ] [[package]] @@ -3803,12 +3900,12 @@ dependencies = [ [[package]] name = "phf" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b21b531851d1d86a90bd62dd79be87ce2d90b7bcb6afbae07813921d6156696a" +checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f" dependencies = [ - "phf_macros 0.9.1", - "phf_shared 0.9.0", + "phf_macros 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", ] @@ -3834,11 +3931,11 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ - "phf_shared 0.9.0", + "phf_shared 0.10.0", "rand 0.8.4", ] @@ -3858,12 +3955,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef44ec4684c899a8ab0c2330beb2b6852842e60458cc83721c333b5dbc04ece6" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.9.1", - "phf_shared 0.9.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -3881,27 +3978,27 @@ dependencies = [ [[package]] name = "phf_shared" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68318426de33640f02be62b4ae8eb1261be2efbc337b60c54d845bf4484e0d9" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", @@ -3922,9 +4019,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkcs8" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69" +checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" dependencies = [ "der", "spki", @@ -3932,9 +4029,20 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" + +[[package]] +name = "pmutil" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "png" @@ -3993,9 +4101,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" dependencies = [ "thiserror", "toml", @@ -4039,9 +4147,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid", ] @@ -4152,12 +4260,6 @@ dependencies = [ "scheduled-thread-pool", ] -[[package]] -name = "radium" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" - [[package]] name = "rand" version = "0.6.5" @@ -4410,9 +4512,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] @@ -4510,14 +4612,14 @@ dependencies = [ [[package]] name = "rfd" -version = "0.4.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1084e570d9ce1890734b33edd8c1a7b7276076f9610fa23a48aa955587da141" +checksum = "609ed912e110af7d7084b6b17d2a68b25e766208e015a37beba1be3c2d7cbb3b" dependencies = [ "block", "dispatch", - "glib-sys", - "gobject-sys", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "gtk-sys", "js-sys", "lazy_static", @@ -4707,9 +4809,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" @@ -4720,6 +4822,15 @@ dependencies = [ "semver 0.9.0", ] +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustls" version = "0.19.1" @@ -4787,9 +4898,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" +checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" dependencies = [ "dyn-clone", "indexmap", @@ -4800,9 +4911,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" +checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" dependencies = [ "proc-macro2", "quote", @@ -4834,9 +4945,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.3.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ "bitflags", "core-foundation 0.9.1", @@ -4847,9 +4958,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.3.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ "core-foundation-sys 0.8.2", "libc", @@ -4916,9 +5027,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.126" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] @@ -4943,9 +5054,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", @@ -4965,9 +5076,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -5055,9 +5166,9 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", @@ -5074,9 +5185,9 @@ checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", @@ -5118,21 +5229,21 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" [[package]] name = "slab" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "sled" -version = "0.34.6" +version = "0.34.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0132f3e393bcb7390c60bb45769498cf4550bcb7a21d7f95c02b69f6362cdc" +checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" dependencies = [ "crc32fast", "crossbeam-epoch", @@ -5182,9 +5293,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" dependencies = [ "libc", "winapi", @@ -5205,12 +5316,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e" dependencies = [ "bitflags", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.10.1", + "glib-sys 0.10.1", + "gobject-sys 0.10.0", "libc", "pkg-config", - "system-deps", + "system-deps 1.3.2", ] [[package]] @@ -5226,14 +5337,14 @@ dependencies = [ "chacha", "curve25519-dalek", "digest 0.9.0", - "hkdf 0.11.0", - "hmac 0.11.0", + "hkdf", + "hmac", "lioness", "log", "rand 0.7.3", "rand_distr", "sha2", - "subtle 2.4.0", + "subtle 2.4.1", ] [[package]] @@ -5244,37 +5355,35 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fdd7196b4ae35a111c6dc97f9cc152ca3ea8ad744f7cb46a9f27b3ef8f2f54" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" [[package]] name = "spki" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521" +checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" dependencies = [ "der", ] [[package]] name = "sqlformat" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d86e3c77ff882a828346ba401a7ef4b8e440df804491c6064fe8295765de71c" +checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" dependencies = [ - "lazy_static", - "maplit", + "itertools 0.10.1", "nom", - "regex", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba82f79b31f30acebf19905bcd8b978f46891b9d0723f578447361a8910b6584" +checksum = "0e4b94ab0f8c21ee4899b93b06451ef5d965f1a355982ee73684338228498440" dependencies = [ "sqlx-core", "sqlx-macros", @@ -5282,9 +5391,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f23af36748ec8ea8d49ef8499839907be41b0b1178a4e82b8cb45d29f531dc9" +checksum = "ec28b91a01e1fe286d6ba66f68289a2286df023fc97444e1fd86c2fd6d5dc026" dependencies = [ "ahash", "atoi", @@ -5298,6 +5407,7 @@ dependencies = [ "either", "futures-channel", "futures-core", + "futures-intrusive", "futures-util", "hashlink", "hex", @@ -5316,7 +5426,6 @@ dependencies = [ "sqlx-rt", "stringprep", "thiserror", - "time 0.2.27", "tokio-stream", "url", "webpki", @@ -5326,9 +5435,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4a2349d1ffd60a03ca0de3f116ba55d7f406e55a0d84c64a5590866d94c06" +checksum = "4dc33c35d54774eed73d54568d47a6ac099aed8af5e1556a017c131be88217d5" dependencies = [ "dotenv", "either", @@ -5346,9 +5455,9 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8199b421ecf3493ee9ef3e7bc90c904844cfb2ea7ea2f57347a93f52bfd3e057" +checksum = "14302b678d9c76b28f2e60115211e25e0aabc938269991745a169753dc00e35c" dependencies = [ "once_cell", "tokio", @@ -5401,7 +5510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" dependencies = [ "discard", - "rustc_version", + "rustc_version 0.2.3", "stdweb-derive", "stdweb-internal-macros", "stdweb-internal-runtime", @@ -5468,6 +5577,19 @@ dependencies = [ "quote", ] +[[package]] +name = "string_enum" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f584cc881e9e5f1fd6bf827b0444aa94c30d8fe6378cf241071b5f5700b2871f" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "stringprep" version = "0.1.2" @@ -5502,6 +5624,12 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" + [[package]] name = "strum_macros" version = "0.18.0" @@ -5514,6 +5642,18 @@ dependencies = [ "syn", ] +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "1.0.0" @@ -5522,9 +5662,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "subtle-encoding" @@ -5535,11 +5675,149 @@ dependencies = [ "zeroize", ] +[[package]] +name = "swc_atoms" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "837a3ef86c2817228e733b6f173c821fd76f9eb21a0bc9001a826be48b00b4e7" +dependencies = [ + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "swc_common" +version = "0.10.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c93df65683ec1a001e15ce1de438c7c2c226c0c2462d1cb93fa1bd2a7664170b" +dependencies = [ + "ast_node", + "cfg-if 0.1.10", + "either", + "from_variant", + "fxhash", + "log", + "num-bigint", + "once_cell", + "owning_ref", + "scoped-tls", + "serde", + "string_cache", + "swc_eq_ignore_macros", + "swc_visit", + "unicode-width", +] + +[[package]] +name = "swc_ecma_ast" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83eb6a73820660a5af3c24ae1d436e84e4d4c13822021140011361e678df247b" +dependencies = [ + "is-macro", + "num-bigint", + "serde", + "string_enum", + "swc_atoms", + "swc_common", +] + +[[package]] +name = "swc_ecma_parser" +version = "0.52.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03250697857164f16fa98f8e1726f566652d13e52ea3f0c3ecea9deb63ee327" +dependencies = [ + "either", + "enum_kind", + "fxhash", + "log", + "num-bigint", + "serde", + "smallvec 1.6.1", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_visit", + "unicode-xid", +] + +[[package]] +name = "swc_ecma_visit" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3d60b9dc97ae4f181d4d60f43142d8ac9669953db410bcedefb29a14627e19" +dependencies = [ + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_visit", +] + +[[package]] +name = "swc_ecmascript" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffb53afe008c15d4dc4957e80148c4b457659f93e4d4e8736eaeae352e48ec8" +dependencies = [ + "swc_ecma_ast", + "swc_ecma_parser", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c8f200a2eaed938e7c1a685faaa66e6d42fa9e17da5f62572d3cbc335898f5e" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_macros_common" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7c68e78ffbcba3d38abe6d0b76a0e1a37888b5c9301db3426537207090ada3" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_visit" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a423caa0b4585118164dbad8f1ad52b592a9a9370b25decc4d84c6b4309132c0" +dependencies = [ + "either", + "swc_visit_macros", +] + +[[package]] +name = "swc_visit_macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b2825fee79f10d0166e8e650e79c7a862fb991db275743083f07555d7641f0" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "syn" -version = "1.0.73" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" dependencies = [ "proc-macro2", "quote", @@ -5548,9 +5826,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" dependencies = [ "proc-macro2", "quote", @@ -5566,18 +5844,36 @@ checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" dependencies = [ "heck", "pkg-config", - "strum", - "strum_macros", + "strum 0.18.0", + "strum_macros 0.18.0", "thiserror", "toml", - "version-compare", + "version-compare 0.0.10", +] + +[[package]] +name = "system-deps" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" +dependencies = [ + "anyhow", + "cfg-expr", + "heck", + "itertools 0.10.1", + "pkg-config", + "strum 0.21.0", + "strum_macros 0.21.1", + "thiserror", + "toml", + "version-compare 0.0.11", ] [[package]] name = "tao" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478cdfef38dfd24a9362031450f22a7d4ffb260bf67df53ea694b5e2567b48a7" +checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b" dependencies = [ "bitflags", "cairo-rs", @@ -5586,13 +5882,14 @@ dependencies = [ "core-foundation 0.9.1", "core-graphics 0.22.2", "core-video-sys", + "crossbeam-channel", "dispatch", "gdk", "gdk-pixbuf", "gdk-sys", "gio", "glib", - "glib-sys", + "glib-sys 0.14.0", "gtk", "instant", "lazy_static", @@ -5611,17 +5908,11 @@ dependencies = [ "x11-dl", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tar" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d779dc6aeff029314570f666ec83f19df7280bb36ef338442cfa8c604021b80" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" dependencies = [ "filetime", "libc", @@ -5630,17 +5921,19 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-beta.5" +version = "1.0.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64150bb36424744bd05b68c4f4a6e133a9e6fbb24d01fc3aa64fe0f3b6c2c151" +checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09" dependencies = [ "attohttpc", "bincode", "cfg_aliases", "dirs-next", "either", + "embed_plist", "flate2", "futures", + "futures-lite", "glib", "gtk", "http", @@ -5648,6 +5941,7 @@ dependencies = [ "once_cell", "percent-encoding", "rand 0.8.4", + "raw-window-handle", "rfd", "semver 1.0.4", "serde", @@ -5662,15 +5956,16 @@ dependencies = [ "tempfile", "thiserror", "tokio", + "url", "uuid", "zip", ] [[package]] name = "tauri-build" -version = "1.0.0-beta.3" +version = "1.0.0-beta.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fbf1de4ceafab0706c586a4abbb920051899d13aeb67a1d6953a79aced5d99" +checksum = "3c9c9a9bea25b9d6f5845b8662e18447e17218f99860cab37e39e2b57a9fcd49" dependencies = [ "anyhow", "proc-macro2", @@ -5682,9 +5977,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0-beta.3" +version = "1.0.0-beta.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25daa8d7cbb24e5432cf54eaaa88d0efd539eef1bdda340233caea2872bca416" +checksum = "1663739ab53e281919676f216fb56a031104d0d2cd1a2dd5b012d279bcdb0ea4" dependencies = [ "blake3", "kuchiki", @@ -5701,9 +5996,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.0.0-beta.4" +version = "1.0.0-beta.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e4c78916b832b1623a15b4f6a9e91538363ed7fd90834b8524f71b384ea99c" +checksum = "bddf9f5868402323f35ef94fa6ab1d5d10b29aea9de598d829723aa1db5693b4" dependencies = [ "proc-macro2", "quote", @@ -5713,11 +6008,14 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9da2bf17eed04ccf580773dba506e3b84dc57a77e9e90c1bb4e8a9cc79d0bbf" +checksum = "e9c52eccfb7f2ce5a09262bdc3671f0f07f637e27f8aa25e5f38145cddcd4e01" dependencies = [ "gtk", + "http", + "http-range", + "infer", "serde", "serde_json", "tauri-utils", @@ -5728,9 +6026,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1922bca95ef9e1473c38d25856f92aeec88a9853701abff36a32055b1f79b5" +checksum = "1fed8dd0a448c303fa764859d6dfa1c746c4f2c6c30a83c162f8bebb12e4af4e" dependencies = [ "gtk", "ico", @@ -5745,14 +6043,13 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.0.0-beta.2" +version = "1.0.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9870bff4bcd4b795d8ce2efaba31a19012634fee211e7c86694c8d045b8edb73" +checksum = "fcb9b79594f22b6ed0cc8362e0dfde5b7969962de3cd8ca683de702e59e8221b" dependencies = [ - "heck", "html5ever", "kuchiki", - "phf 0.9.1", + "phf 0.10.0", "proc-macro2", "quote", "serde", @@ -5801,7 +6098,7 @@ dependencies = [ "serde_repr", "sha2", "signature", - "subtle 2.4.0", + "subtle 2.4.1", "subtle-encoding", "tendermint-proto", "thiserror", @@ -5896,18 +6193,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", @@ -5925,11 +6222,12 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] @@ -5943,11 +6241,23 @@ dependencies = [ "libc", "standback", "stdweb", - "time-macros", + "time-macros 0.1.1", "version_check", "winapi", ] +[[package]] +name = "time" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde1cf55178e0293453ba2cca0d5f8392a922e52aa958aee9c28ed02becc6d03" +dependencies = [ + "itoa", + "libc", + "serde", + "time-macros 0.2.3", +] + [[package]] name = "time-macros" version = "0.1.1" @@ -5958,6 +6268,12 @@ dependencies = [ "time-macros-impl", ] +[[package]] +name = "time-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25eb0ca3468fc0acc11828786797f6ef9aa1555e4a211a60d64cc8e4d1be47d6" + [[package]] name = "time-macros-impl" version = "0.1.2" @@ -5973,9 +6289,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" dependencies = [ "autocfg 1.0.1", "bytes", @@ -5993,9 +6309,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c49e3df43841dafb86046472506755d8501c5615673955f6aa17181125d13c37" +checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" dependencies = [ "proc-macro2", "quote", @@ -6025,9 +6341,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8864d706fdb3cc0843a49647ac892720dac98a6eeb818b77190592cf4994066" +checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" dependencies = [ "futures-core", "pin-project-lite", @@ -6062,9 +6378,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ "bytes", "futures-core", @@ -6106,9 +6422,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -6118,9 +6434,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "98863d0dd09fa59a1b79c6750ad80dbda6b75f4e71c437a6a1a8cb91a8bcbd77" dependencies = [ "proc-macro2", "quote", @@ -6129,9 +6445,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf" dependencies = [ "lazy_static", ] @@ -6142,6 +6458,28 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "ts-rs" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "369e48de67506679b3a576b0faf666fa9f9acf2fd00b4c61e28bdb6c8e08ec06" +dependencies = [ + "dprint-plugin-typescript", + "ts-rs-macros", +] + +[[package]] +name = "ts-rs-macros" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f269e8fd28e26b4cdbd01f81f345aaf666131511e54a735a76a614b5062d0a5a" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tungstenite" version = "0.13.0" @@ -6156,7 +6494,7 @@ dependencies = [ "input_buffer", "log", "rand 0.8.4", - "sha-1 0.9.6", + "sha-1 0.9.8", "thiserror", "url", "utf-8", @@ -6174,9 +6512,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "ubyte" @@ -6242,12 +6580,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" [[package]] name = "unicode-normalization" @@ -6266,9 +6601,9 @@ checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" @@ -6338,6 +6673,7 @@ dependencies = [ "serde_json", "sha2", "thiserror", + "ts-rs", "url", ] @@ -6366,12 +6702,24 @@ version = "0.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + [[package]] name = "version_check" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "walkdir" version = "2.3.2" @@ -6407,9 +6755,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if 1.0.0", "serde", @@ -6419,9 +6767,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", @@ -6434,9 +6782,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.24" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -6446,9 +6794,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6456,9 +6804,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", @@ -6469,15 +6817,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "wasm-bindgen-test" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cab416a9b970464c2882ed92d55b0c33046b08e0bdc9d59b3b718acd4e1bae8" +checksum = "96f1aa7971fdf61ef0f353602102dbea75a56e225ed036c1e3740564b91e6b7e" dependencies = [ "console_error_panic_hook", "js-sys", @@ -6489,9 +6837,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4543fc6cf3541ef0d98bf720104cc6bd856d7eba449fd2aa365ef4fed0e782" +checksum = "6006f79628dfeb96a86d4db51fbf1344cd7fd8408f06fc9aa3c84913a4789688" dependencies = [ "proc-macro2", "quote", @@ -6511,9 +6859,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", @@ -6521,46 +6869,48 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b7e9eb04d30f8423e9c8435f686f42bc497cfcac2cfe4b43ce4139fb1a7cb6" +checksum = "e3e47b7f870883fc21612d2a51b74262f7f2cc5371f1621370817292a35300a9" dependencies = [ "bitflags", "cairo-rs", "gdk", "gdk-sys", "gio", - "gio-sys", + "gio-sys 0.14.0", "glib", - "glib-sys", - "gobject-sys", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "gtk", "gtk-sys", "javascriptcore-rs", "libc", + "once_cell", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d10cf73685359cd8611740db241a231f4d74d7e353348dc5332a1a132d6f24" +checksum = "b66ccc9f0cb4de7c3b92376a5bf64e7ddffb33852f092721731a039ec38dda98" dependencies = [ "atk-sys", "bitflags", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", "gtk-sys", "javascriptcore-rs-sys", "libc", "pango-sys", "pkg-config", "soup-sys", + "system-deps 3.2.0", ] [[package]] @@ -6593,9 +6943,9 @@ dependencies = [ [[package]] name = "webview2" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fab1ccfdabb098b047293c8d496c1914d1c654b68fdaa3bb77cfa47c4bca2c7" +checksum = "1b132bb76313456e93b17037262a030d54c9fe0f11838ef1593f845e3807ef8a" dependencies = [ "com", "once_cell", @@ -6606,9 +6956,9 @@ dependencies = [ [[package]] name = "webview2-sys" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5288cef1e0cbcf7a0b961e6271e33589b8989c80b2e11078504e989b5346ff" +checksum = "24b7889e893ac4c50d7346356be3ce13a85e56512c38b8fde0526559b8012a4c" dependencies = [ "com", "winapi", @@ -6628,9 +6978,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abacf325c958dfeaf1046931d37f2a901b6dfe0968ee965a29e94c6766b2af6" +checksum = "cabfe22aa4936611957e0b5ad9ed0472ac52b2bfb9aedac4a3f3a91a03bd1ff0" dependencies = [ "wasm-bindgen", "web-sys", @@ -6699,9 +7049,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.11.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272387911b8612688d1e6a90f191ab394561a88634e81b064f98880b4874245" +checksum = "0f9549393a3917b5303277abb0267f8eecf9fd629b25f1c04e5284aa58b61915" dependencies = [ "cocoa", "core-graphics 0.22.2", @@ -6709,6 +7059,7 @@ dependencies = [ "gio", "glib", "gtk", + "http", "libc", "log", "objc", @@ -6726,29 +7077,22 @@ dependencies = [ "winapi", ] -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "x11-dl" -version = "2.18.5" +version = "2.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" dependencies = [ "lazy_static", "libc", - "maybe-uninit", "pkg-config", ] [[package]] name = "x25519-dalek" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077" dependencies = [ "curve25519-dalek", "rand_core 0.5.1", @@ -6781,9 +7125,9 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" +checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7" dependencies = [ "proc-macro2", "quote", @@ -6802,7 +7146,7 @@ dependencies = [ "crc32fast", "flate2", "thiserror", - "time 0.1.43", + "time 0.1.44", ] [[package]] diff --git a/README.md b/README.md index f1e797ac9c..b5e263d4aa 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ The platform is composed of multiple Rust crates. Top-level executable binary cr * nym-gateway - acts sort of like a mailbox for mixnet messages, removing the need for directly delivery to potentially offline or firewalled devices. * nym-network-monitor - sends packets through the full system to check that they are working as expected, and stores node uptime histories as the basis of a rewards system ("mixmining" or "proof-of-mixing"). * nym-explorer - a (projected) block explorer and (existing) mixnet viewer. +* nym-wallet (currently in development)- a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework. [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=for-the-badge)](https://opensource.org/licenses/Apache-2.0) [![Build Status](https://img.shields.io/github/workflow/status/nymtech/nym/Continuous%20integration/develop?style=for-the-badge&logo=github-actions)](https://github.com/nymtech/nym/actions?query=branch%3Adevelop) diff --git a/clients/client-core/src/client/reply_key_storage.rs b/clients/client-core/src/client/reply_key_storage.rs index e8c01e9526..e934e4c5b3 100644 --- a/clients/client-core/src/client/reply_key_storage.rs +++ b/clients/client-core/src/client/reply_key_storage.rs @@ -18,7 +18,7 @@ pub enum ReplyKeyStorageError { /// Permanent storage for keys in all sent [`ReplySURB`] /// /// Each sent out [`ReplySURB`] has a new key associated with it that is going to be used for -/// payload encryption. In order to decrypt whatever reply we receive, we need to know which +/// payload encryption. In order to -decrypt whatever reply we receive, we need to know which /// key to use for that purpose. We do it based on received `H(t)` which has to be included /// with each reply. /// Moreover, there is no restriction when the [`ReplySURB`] might get used so we need to diff --git a/clients/tauri-client/README.md b/clients/tauri-client/README.md index 865d0c6426..849b049db4 100644 --- a/clients/tauri-client/README.md +++ b/clients/tauri-client/README.md @@ -1,3 +1,19 @@ +## Prerequisites + +On Ubuntu-ish systems (not tested on Debian but may work): + +``` +sudo apt update && sudo apt install libwebkit2gtk-4.0-dev \ + build-essential \ + curl \ + wget \ + libssl-dev \ + libgtk-3-dev \ + libappindicator3-dev \ + patchelf \ + librsvg2-dev``` + + ## Getting started diff --git a/clients/tauri-client/src-tauri/src/main.rs b/clients/tauri-client/src-tauri/src/main.rs index bef090400f..9e065821fa 100644 --- a/clients/tauri-client/src-tauri/src/main.rs +++ b/clients/tauri-client/src-tauri/src/main.rs @@ -4,7 +4,7 @@ )] use coconut_interface::{ - self, Attribute, Credential, Parameters, Signature, Theta, VerificationKey, + self, hash_to_scalar, Attribute, Credential, Parameters, Signature, Theta, VerificationKey, }; use credentials::{obtain_aggregate_signature, obtain_aggregate_verification_key}; use std::sync::Arc; @@ -15,19 +15,29 @@ struct State { signatures: Vec, n_attributes: u32, params: Parameters, + public_attributes_bytes: Vec>, public_attributes: Vec, private_attributes: Vec, aggregated_verification_key: Option, } impl State { - fn init(public_attributes: Vec, private_attributes: Vec) -> State { - let n_attributes = (public_attributes.len() + private_attributes.len()) as u32; + fn init(public_attributes_bytes: Vec>, private_attributes_bytes: Vec>) -> State { + let n_attributes = (public_attributes_bytes.len() + private_attributes_bytes.len()) as u32; let params = Parameters::new(n_attributes).unwrap(); + let public_attributes = public_attributes_bytes + .iter() + .map(hash_to_scalar) + .collect::>(); + let private_attributes = private_attributes_bytes + .iter() + .map(hash_to_scalar) + .collect::>(); State { signatures: Vec::new(), n_attributes, params, + public_attributes_bytes, public_attributes, private_attributes, aggregated_verification_key: None, @@ -137,7 +147,7 @@ async fn verify_credential( let credential = Credential::new( state.n_attributes, theta, - &state.public_attributes, + state.public_attributes_bytes.clone(), state .signatures .get(idx) @@ -170,8 +180,8 @@ async fn get_credential( } fn main() { - let public_attributes = vec![coconut_interface::hash_to_scalar("public_key")]; - let private_attributes = vec![coconut_interface::hash_to_scalar("private_key")]; + let public_attributes = vec![b"public_key".to_vec()]; + let private_attributes = vec![b"private_key".to_vec()]; tauri::Builder::default() .manage(Arc::new(RwLock::new(State::init( public_attributes, diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index cf2e9ea306..78c7519e4f 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -31,6 +31,7 @@ flate2 = { version = "1.0.20", optional = true } sha2 = { version = "0.9.5", optional = true } itertools = { version = "0.10", optional = true } cosmwasm-std = { git = "https://github.com/jstuczyn/cosmwasm", branch="0.14.1-updatedk256", optional = true } +ts-rs = "3.0" [features] nymd-client = ["async-trait", "bip39", "config", "cosmrs", "prost", "flate2", "sha2", "itertools", "cosmwasm-std"] diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index c093b08d9d..b418b5604a 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -158,6 +158,10 @@ impl Client { self.mixnet_contract_address = Some(mixnet_contract_address) } + pub fn get_mixnet_contract_address(&self) -> Option { + self.mixnet_contract_address.clone() + } + pub async fn get_cached_mixnodes(&self) -> Result, ValidatorClientError> { Ok(self.validator_api.get_mixnodes().await?) } diff --git a/common/client-libs/validator-client/src/nymd/cosmwasm_client/signing_client.rs b/common/client-libs/validator-client/src/nymd/cosmwasm_client/signing_client.rs index e3352bb683..eebdbdf7fd 100644 --- a/common/client-libs/validator-client/src/nymd/cosmwasm_client/signing_client.rs +++ b/common/client-libs/validator-client/src/nymd/cosmwasm_client/signing_client.rs @@ -15,6 +15,7 @@ use cosmrs::rpc::{Error as TendermintRpcError, HttpClient, HttpClientUrl, Simple use cosmrs::staking::{MsgDelegate, MsgUndelegate}; use cosmrs::tx::{Fee, Msg, MsgType, SignDoc, SignerInfo}; use cosmrs::{cosmwasm, rpc, tx, AccountId, Coin}; +use log::debug; use serde::Serialize; use sha2::Digest; use sha2::Sha256; @@ -256,6 +257,48 @@ pub trait SigningCosmWasmClient: CosmWasmClient { }) } + async fn execute_multiple( + &self, + sender_address: &AccountId, + contract_address: &AccountId, + msgs: I, + fee: Fee, + memo: impl Into + Send + 'static, + ) -> Result + where + I: IntoIterator)> + Send, + M: Serialize, + { + let messages = msgs + .into_iter() + .map(|(msg, funds)| { + cosmwasm::MsgExecuteContract { + sender: sender_address.clone(), + contract: contract_address.clone(), + msg: serde_json::to_vec(&msg)?, + funds, + } + .to_msg() + .map_err(|_| NymdError::SerializationError("MsgExecuteContract".to_owned())) + }) + .collect::>()?; + + let tx_res = self + .sign_and_broadcast_commit(sender_address, messages, fee, memo) + .await? + .check_response()?; + + debug!( + "gas wanted: {:?}, gas used: {:?}", + tx_res.deliver_tx.gas_wanted, tx_res.deliver_tx.gas_used + ); + + Ok(ExecuteResult { + logs: parse_raw_logs(tx_res.deliver_tx.log)?, + transaction_hash: tx_res.hash, + }) + } + async fn send_tokens( &self, sender_address: &AccountId, @@ -442,6 +485,7 @@ pub trait SigningCosmWasmClient: CosmWasmClient { } } +#[derive(Debug)] pub struct Client { rpc_client: HttpClient, signer: DirectSecp256k1HdWallet, diff --git a/common/client-libs/validator-client/src/nymd/fee_helpers.rs b/common/client-libs/validator-client/src/nymd/fee_helpers.rs index b8b8b0669e..f63daf83b4 100644 --- a/common/client-libs/validator-client/src/nymd/fee_helpers.rs +++ b/common/client-libs/validator-client/src/nymd/fee_helpers.rs @@ -4,9 +4,11 @@ use crate::nymd::GasPrice; use cosmrs::tx::{Fee, Gas}; use cosmrs::Coin; -use cosmwasm_std::Uint128; +use serde::{Deserialize, Serialize}; +use std::fmt; +use ts_rs::TS; -#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] +#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize, TS)] pub enum Operation { Upload, Init, @@ -28,18 +30,33 @@ pub enum Operation { } pub(crate) fn calculate_fee(gas_price: &GasPrice, gas_limit: Gas) -> Coin { - let limit_uint128 = Uint128::from(gas_limit.value()); - let amount = gas_price.amount * limit_uint128; - assert!(amount.u128() <= u64::MAX as u128); - Coin { - denom: gas_price.denom.clone(), - amount: (amount.u128() as u64).into(), + gas_price * gas_limit +} + +impl fmt::Display for Operation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + Operation::Upload => f.write_str("Upload"), + Operation::Init => f.write_str("Init"), + Operation::Migrate => f.write_str("Migrate"), + Operation::ChangeAdmin => f.write_str("ChangeAdmin"), + Operation::Send => f.write_str("Send"), + Operation::BondMixnode => f.write_str("BondMixnode"), + Operation::UnbondMixnode => f.write_str("UnbondMixnode"), + Operation::DelegateToMixnode => f.write_str("DelegateToMixnode"), + Operation::UndelegateFromMixnode => f.write_str("UndelegateFromMixnode"), + Operation::BondGateway => f.write_str("BondGateway"), + Operation::UnbondGateway => f.write_str("UnbondGateway"), + Operation::DelegateToGateway => f.write_str("DelegateToGateway"), + Operation::UndelegateFromGateway => f.write_str("UndelegateFromGateway"), + Operation::UpdateStateParams => f.write_str("UpdateStateParams"), + } } } impl Operation { // TODO: some value tweaking - pub(crate) fn default_gas_limit(&self) -> Gas { + pub fn default_gas_limit(&self) -> Gas { match self { Operation::Upload => 2_500_000u64.into(), Operation::Init => 500_000u64.into(), @@ -61,16 +78,20 @@ impl Operation { } } - pub(crate) fn determine_fee(&self, gas_price: &GasPrice, gas_limit: Option) -> Fee { + pub(crate) fn determine_custom_fee(gas_price: &GasPrice, gas_limit: Gas) -> Fee { // we need to know 2 of the following 3 parameters (the third one is being implicit) in order to construct Fee: // (source: https://docs.cosmos.network/v0.42/basics/gas-fees.html) // - gas price // - gas limit // - fees - let gas_limit = gas_limit.unwrap_or_else(|| self.default_gas_limit()); let fee = calculate_fee(gas_price, gas_limit); Fee::from_amount_and_gas(fee, gas_limit) } + + pub(crate) fn determine_fee(&self, gas_price: &GasPrice, gas_limit: Option) -> Fee { + let gas_limit = gas_limit.unwrap_or_else(|| self.default_gas_limit()); + Self::determine_custom_fee(gas_price, gas_limit) + } } #[cfg(test)] diff --git a/common/client-libs/validator-client/src/nymd/gas_price.rs b/common/client-libs/validator-client/src/nymd/gas_price.rs index 6a76d6b5a5..7e412b08b7 100644 --- a/common/client-libs/validator-client/src/nymd/gas_price.rs +++ b/common/client-libs/validator-client/src/nymd/gas_price.rs @@ -3,8 +3,10 @@ use crate::nymd::error::NymdError; use config::defaults; -use cosmrs::Denom; -use cosmwasm_std::Decimal; +use cosmrs::tx::Gas; +use cosmrs::{Coin, Denom}; +use cosmwasm_std::{Decimal, Fraction, Uint128}; +use std::ops::Mul; use std::str::FromStr; /// A gas price, i.e. the price of a single unit of gas. This is typically a fraction of @@ -18,6 +20,36 @@ pub struct GasPrice { pub denom: Denom, } +impl<'a> Mul for &'a GasPrice { + type Output = Coin; + + fn mul(self, gas_limit: Gas) -> Self::Output { + let limit_uint128 = Uint128::from(gas_limit.value()); + let mut amount = self.amount * limit_uint128; + + let gas_price_numerator = self.amount.numerator(); + let gas_price_denominator = self.amount.denominator(); + + // gas price is a fraction of the smallest fee token unit, so we must ensure that + // for any multiplication, we have rounded up + // + // I don't really like the this solution as it has a theoretical chance of + // overflowing (internally cosmwasm uses U256 to avoid that) + // however, realistically that is impossible to happen as the resultant value + // would have to be way higher than our token limit of 10^15 (1 billion of tokens * 1 million for denomination) + // and max value of u128 is approximately 10^38 + if limit_uint128.u128() * gas_price_numerator > amount.u128() * gas_price_denominator { + amount += Uint128::new(1); + } + + assert!(amount.u128() <= u64::MAX as u128); + Coin { + denom: self.denom.clone(), + amount: (amount.u128() as u64).into(), + } + } +} + impl FromStr for GasPrice { type Err = NymdError; @@ -78,4 +110,15 @@ mod tests { assert!("0.025 upunk".parse::().is_err()); assert!("0.025UPUNK".parse::().is_err()); } + + #[test] + fn gas_limit_multiplication() { + // real world example that caused an issue when the result was rounded down + let gas_price: GasPrice = "0.025upunk".parse().unwrap(); + let gas_limit: Gas = 157500u64.into(); + + let fee = &gas_price * gas_limit; + // the failing behaviour was result value of 3937 + assert_eq!(fee.amount, 3938u64.into()); + } } diff --git a/common/client-libs/validator-client/src/nymd/mod.rs b/common/client-libs/validator-client/src/nymd/mod.rs index a99cfc91eb..821ac8ee12 100644 --- a/common/client-libs/validator-client/src/nymd/mod.rs +++ b/common/client-libs/validator-client/src/nymd/mod.rs @@ -11,7 +11,6 @@ use crate::nymd::fee_helpers::Operation; use crate::nymd::wallet::DirectSecp256k1HdWallet; use cosmrs::rpc::endpoint::broadcast; use cosmrs::rpc::{Error as TendermintRpcError, HttpClientUrl}; -use cosmrs::tx::{Fee, Gas}; use cosmwasm_std::Coin; use mixnet_contract::{ @@ -29,16 +28,19 @@ pub use crate::nymd::cosmwasm_client::client::CosmWasmClient; pub use crate::nymd::cosmwasm_client::signing_client::SigningCosmWasmClient; pub use crate::nymd::gas_price::GasPrice; pub use cosmrs::rpc::HttpClient as QueryNymdClient; +pub use cosmrs::tendermint::Time as TendermintTime; +pub use cosmrs::tx::{Fee, Gas}; pub use cosmrs::Coin as CosmosCoin; pub use cosmrs::{AccountId, Denom}; pub use signing_client::Client as SigningNymdClient; pub mod cosmwasm_client; pub mod error; -pub(crate) mod fee_helpers; +pub mod fee_helpers; pub mod gas_price; pub mod wallet; +#[derive(Debug)] pub struct NymdClient { client: C, contract_address: Option, @@ -124,6 +126,14 @@ impl NymdClient { self.custom_gas_limits.insert(operation, limit); } + pub fn get_gas_price(&self) -> GasPrice { + self.gas_price.clone() + } + + pub fn get_custom_gas_limits(&self) -> HashMap { + self.custom_gas_limits.clone() + } + pub fn contract_address(&self) -> Result<&AccountId, NymdError> { self.contract_address .as_ref() @@ -145,11 +155,22 @@ impl NymdClient { &self.client_address.as_ref().unwrap()[0] } - fn get_fee(&self, operation: Operation) -> Fee { + pub fn get_fee(&self, operation: Operation) -> Fee { let gas_limit = self.custom_gas_limits.get(&operation).cloned(); operation.determine_fee(&self.gas_price, gas_limit) } + pub fn calculate_custom_fee(&self, gas_limit: impl Into) -> Fee { + Operation::determine_custom_fee(&self.gas_price, gas_limit.into()) + } + + pub async fn get_current_block_timestamp(&self) -> Result + where + C: CosmWasmClient + Sync, + { + Ok(self.client.get_block(None).await?.block.header.time) + } + pub async fn get_balance(&self, address: &AccountId) -> Result, NymdError> where C: CosmWasmClient + Sync, @@ -391,6 +412,23 @@ impl NymdClient { .await } + pub async fn execute_multiple( + &self, + contract_address: &AccountId, + msgs: I, + fee: Fee, + memo: impl Into + Send + 'static, + ) -> Result + where + C: SigningCosmWasmClient + Sync, + I: IntoIterator)> + Send, + M: Serialize, + { + self.client + .execute_multiple(self.address(), contract_address, msgs, fee, memo) + .await + } + pub async fn upload( &self, wasm_code: Vec, @@ -517,15 +555,17 @@ impl NymdClient { /// Delegates specified amount of stake to particular mixnode. pub async fn delegate_to_mixnode( &self, - mix_identity: IdentityKey, - amount: Coin, + mix_identity: &str, + amount: &Coin, ) -> Result where C: SigningCosmWasmClient + Sync, { let fee = self.get_fee(Operation::DelegateToMixnode); - let req = ExecuteMsg::DelegateToMixnode { mix_identity }; + let req = ExecuteMsg::DelegateToMixnode { + mix_identity: mix_identity.to_string(), + }; self.client .execute( self.address(), @@ -533,7 +573,7 @@ impl NymdClient { &req, fee, "Delegating to mixnode from rust!", - vec![cosmwasm_coin_to_cosmos_coin(amount)], + vec![cosmwasm_coin_ptr_to_cosmos_coin(amount)], ) .await } @@ -541,14 +581,16 @@ impl NymdClient { /// Removes stake delegation from a particular mixnode. pub async fn remove_mixnode_delegation( &self, - mix_identity: IdentityKey, + mix_identity: &str, ) -> Result where C: SigningCosmWasmClient + Sync, { let fee = self.get_fee(Operation::UndelegateFromMixnode); - let req = ExecuteMsg::UndelegateFromMixnode { mix_identity }; + let req = ExecuteMsg::UndelegateFromMixnode { + mix_identity: mix_identity.to_string(), + }; self.client .execute( self.address(), @@ -608,15 +650,17 @@ impl NymdClient { /// Delegates specified amount of stake to particular gateway. pub async fn delegate_to_gateway( &self, - gateway_identity: IdentityKey, - amount: Coin, + gateway_identity: &str, + amount: &Coin, ) -> Result where C: SigningCosmWasmClient + Sync, { let fee = self.get_fee(Operation::DelegateToGateway); - let req = ExecuteMsg::DelegateToGateway { gateway_identity }; + let req = ExecuteMsg::DelegateToGateway { + gateway_identity: gateway_identity.to_string(), + }; self.client .execute( self.address(), @@ -624,7 +668,7 @@ impl NymdClient { &req, fee, "Delegating to gateway from rust!", - vec![cosmwasm_coin_to_cosmos_coin(amount)], + vec![cosmwasm_coin_ptr_to_cosmos_coin(amount)], ) .await } @@ -632,14 +676,16 @@ impl NymdClient { /// Removes stake delegation from a particular gateway. pub async fn remove_gateway_delegation( &self, - gateway_identity: IdentityKey, + gateway_identity: &str, ) -> Result where C: SigningCosmWasmClient + Sync, { let fee = self.get_fee(Operation::UndelegateFromGateway); - let req = ExecuteMsg::UndelegateFromGateway { gateway_identity }; + let req = ExecuteMsg::UndelegateFromGateway { + gateway_identity: gateway_identity.to_string(), + }; self.client .execute( self.address(), @@ -682,3 +728,11 @@ fn cosmwasm_coin_to_cosmos_coin(coin: Coin) -> CosmosCoin { amount: (coin.amount.u128() as u64).into(), } } + +fn cosmwasm_coin_ptr_to_cosmos_coin(coin: &Coin) -> CosmosCoin { + CosmosCoin { + denom: coin.denom.parse().unwrap(), + // this might be a bit iffy, cosmwasm coin stores value as u128, while cosmos does it as u64 + amount: (coin.amount.u128() as u64).into(), + } +} diff --git a/common/client-libs/validator-client/src/nymd/wallet/mod.rs b/common/client-libs/validator-client/src/nymd/wallet/mod.rs index 5ead527212..2a1c1d64c7 100644 --- a/common/client-libs/validator-client/src/nymd/wallet/mod.rs +++ b/common/client-libs/validator-client/src/nymd/wallet/mod.rs @@ -10,6 +10,7 @@ use cosmrs::tx::SignDoc; use cosmrs::{tx, AccountId}; /// Derivation information required to derive a keypair and an address from a mnemonic. +#[derive(Debug)] struct Secp256k1Derivation { hd_path: DerivationPath, prefix: String, @@ -25,6 +26,7 @@ pub struct AccountData { type Secp256k1Keypair = (SigningKey, PublicKey); +#[derive(Debug)] pub struct DirectSecp256k1HdWallet { /// Base secret secret: bip39::Mnemonic, diff --git a/common/coconut-interface/src/lib.rs b/common/coconut-interface/src/lib.rs index 8e1d4f8969..3d0a09881d 100644 --- a/common/coconut-interface/src/lib.rs +++ b/common/coconut-interface/src/lib.rs @@ -12,7 +12,7 @@ pub struct Credential { n_params: u32, #[getset(get = "pub")] theta: Theta, - public_attributes: Vec, + public_attributes: Vec>, #[getset(get = "pub")] signature: Signature, } @@ -20,35 +20,29 @@ impl Credential { pub fn new( n_params: u32, theta: Theta, - public_attributes: &[Attribute], + public_attributes: Vec>, signature: &Signature, ) -> Credential { Credential { n_params, theta, - public_attributes: public_attributes - .iter() - .map(|attr| attr.to_bs58()) - .collect(), + public_attributes, signature: *signature, } } - pub fn public_attributes(&self) -> Vec { - self.public_attributes - .iter() - .map(|x| Attribute::try_from_bs58(x).unwrap()) - .collect() + pub fn public_attributes(&self) -> Vec> { + self.public_attributes.clone() } pub fn verify(&self, verification_key: &VerificationKey) -> bool { let params = Parameters::new(self.n_params).unwrap(); - coconut_rs::verify_credential( - ¶ms, - verification_key, - &self.theta, - &self.public_attributes(), - ) + let public_attributes = self + .public_attributes + .iter() + .map(hash_to_scalar) + .collect::>(); + coconut_rs::verify_credential(¶ms, verification_key, &self.theta, &public_attributes) } } diff --git a/common/credentials/src/bandwidth.rs b/common/credentials/src/bandwidth.rs index 66096f732b..0dff055a30 100644 --- a/common/credentials/src/bandwidth.rs +++ b/common/credentials/src/bandwidth.rs @@ -6,12 +6,13 @@ // right now this has no double-spending protection, spender binding, etc // it's the simplest possible case +use url::Url; + use crate::error::Error; use crate::utils::{obtain_aggregate_signature, prepare_credential_for_spending}; use coconut_interface::{hash_to_scalar, Credential, Parameters, Signature, VerificationKey}; -use url::Url; -const BANDWIDTH_VALUE: &str = "Bandwidth: infinite (for now)"; +const BANDWIDTH_VALUE: u64 = 1024 * 1024; // 1 MB pub const PUBLIC_ATTRIBUTES: u32 = 1; pub const PRIVATE_ATTRIBUTES: u32 = 1; @@ -19,8 +20,8 @@ pub const TOTAL_ATTRIBUTES: u32 = PUBLIC_ATTRIBUTES + PRIVATE_ATTRIBUTES; // TODO: this definitely has to be moved somewhere else. It's just a temporary solution pub async fn obtain_signature(raw_identity: &[u8], validators: &[Url]) -> Result { - let public_attributes = vec![hash_to_scalar(raw_identity)]; - let private_attributes = vec![hash_to_scalar(BANDWIDTH_VALUE)]; + let public_attributes = vec![hash_to_scalar(BANDWIDTH_VALUE.to_be_bytes())]; + let private_attributes = vec![hash_to_scalar(raw_identity)]; let params = Parameters::new(TOTAL_ATTRIBUTES)?; @@ -32,15 +33,15 @@ pub fn prepare_for_spending( signature: &Signature, verification_key: &VerificationKey, ) -> Result { - let public_attributes = vec![hash_to_scalar(raw_identity)]; - let private_attributes = vec![hash_to_scalar(BANDWIDTH_VALUE)]; + let public_attributes = vec![BANDWIDTH_VALUE.to_be_bytes().to_vec()]; + let private_attributes = vec![raw_identity.to_vec()]; let params = Parameters::new(TOTAL_ATTRIBUTES)?; prepare_credential_for_spending( ¶ms, - &public_attributes, - &private_attributes, + public_attributes, + private_attributes, signature, verification_key, ) diff --git a/common/credentials/src/error.rs b/common/credentials/src/error.rs index 552d346d6d..f2161ca9ac 100644 --- a/common/credentials/src/error.rs +++ b/common/credentials/src/error.rs @@ -18,4 +18,16 @@ pub enum Error { #[error("Run into a validato client error - {0}")] ValidatorClientError(#[from] ValidatorClientError), + + #[error("Not enough public attributes were specified")] + NotEnoughPublicAttributes, + + #[error("Bandwidth is expected to be represented on 8 bytes")] + InvalidBandwidthSize, + + #[error("Bandwidth operation overflowed. {0}")] + BandwidthOverflow(String), + + #[error("There is not associated bandwidth for the given client")] + MissingBandwidth, } diff --git a/common/credentials/src/utils.rs b/common/credentials/src/utils.rs index d12ab4decc..b4f7438f74 100644 --- a/common/credentials/src/utils.rs +++ b/common/credentials/src/utils.rs @@ -3,9 +3,9 @@ use crate::error::Error; use coconut_interface::{ - aggregate_signature_shares, aggregate_verification_keys, prepare_blind_sign, prove_credential, - Attribute, BlindSignRequestBody, Credential, Parameters, Signature, SignatureShare, - VerificationKey, + aggregate_signature_shares, aggregate_verification_keys, hash_to_scalar, prepare_blind_sign, + prove_credential, Attribute, BlindSignRequestBody, Credential, Parameters, Signature, + SignatureShare, VerificationKey, }; use url::Url; @@ -118,12 +118,16 @@ pub async fn obtain_aggregate_signature( // TODO: better type flow pub fn prepare_credential_for_spending( params: &Parameters, - public_attributes: &[Attribute], - private_attributes: &[Attribute], + public_attributes: Vec>, + private_attributes: Vec>, signature: &Signature, verification_key: &VerificationKey, ) -> Result { - let theta = prove_credential(params, verification_key, signature, private_attributes)?; + let private_attributes = private_attributes + .iter() + .map(hash_to_scalar) + .collect::>(); + let theta = prove_credential(params, verification_key, signature, &private_attributes)?; Ok(Credential::new( (public_attributes.len() + private_attributes.len()) as u32, diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index 221cb9a8ac..284be17faa 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -7,15 +7,14 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -aes-ctr = "0.6.0" -bs58 = "0.4" -blake3 = "0.3" -#blake3 = { version = "0.3", features = ["traits-preview"]} -digest = "0.9" +aes = { version = "0.7.4", features = ["ctr"] } +bs58 = "0.4.0" +blake3 = { version = "1.0.0", features = ["traits-preview"] } +digest = "0.9.0" generic-array = "0.14" -hkdf = "0.10" -hmac = "0.8" -cipher = "0.2" +hkdf = "0.11.0" +hmac = "0.11.0" +cipher = "0.3.0" x25519-dalek = "1.1" ed25519-dalek = "1.0" log = "0.4" diff --git a/common/crypto/src/hmac.rs b/common/crypto/src/hmac.rs index 10de75d027..659bfe036b 100644 --- a/common/crypto/src/hmac.rs +++ b/common/crypto/src/hmac.rs @@ -18,7 +18,7 @@ where D::OutputSize: ArrayLength, { let mut hmac = - Hmac::::new_varkey(key).expect("HMAC should be able to take key of any size!"); + Hmac::::new_from_slice(key).expect("HMAC should be able to take key of any size!"); hmac.update(data); hmac.finalize() } @@ -31,7 +31,7 @@ where D::OutputSize: ArrayLength, { let mut hmac = - Hmac::::new_varkey(key).expect("HMAC should be able to take key of any size!"); + Hmac::::new_from_slice(key).expect("HMAC should be able to take key of any size!"); hmac.update(data); // note, under the hood ct_eq is called hmac.verify(tag).is_ok() diff --git a/common/crypto/src/lib.rs b/common/crypto/src/lib.rs index 97f90b3694..04ea643513 100644 --- a/common/crypto/src/lib.rs +++ b/common/crypto/src/lib.rs @@ -13,7 +13,7 @@ pub use generic_array; // with the below my idea was to try to introduce having a single place of importing all hashing, encryption, // etc. algorithms and import them elsewhere as needed via common/crypto -pub use aes_ctr; +pub use aes; pub use blake3; // TODO: this function uses all three modules: asymmetric crypto, symmetric crypto and derives key..., diff --git a/common/crypto/src/shared_key.rs b/common/crypto/src/shared_key.rs index f4334e652d..21042d9b21 100644 --- a/common/crypto/src/shared_key.rs +++ b/common/crypto/src/shared_key.rs @@ -3,7 +3,7 @@ use crate::asymmetric::encryption; use crate::hkdf; -use cipher::stream::{Key, NewStreamCipher, SyncStreamCipher}; +use cipher::{CipherKey, NewCipher, StreamCipher}; use digest::{BlockInput, FixedOutput, Reset, Update}; use generic_array::{typenum::Unsigned, ArrayLength}; use rand::{CryptoRng, RngCore}; @@ -13,9 +13,9 @@ use rand::{CryptoRng, RngCore}; pub fn new_ephemeral_shared_key( rng: &mut R, remote_key: &encryption::PublicKey, -) -> (encryption::KeyPair, Key) +) -> (encryption::KeyPair, CipherKey) where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, D: Update + BlockInput + FixedOutput + Reset + Default + Clone, D::BlockSize: ArrayLength, D::OutputSize: ArrayLength, @@ -31,7 +31,7 @@ where .expect("somehow too long okm was provided"); let derived_shared_key = - Key::::from_exact_iter(okm).expect("okm was expanded to incorrect length!"); + CipherKey::::from_exact_iter(okm).expect("okm was expanded to incorrect length!"); (ephemeral_keypair, derived_shared_key) } @@ -40,9 +40,9 @@ where pub fn recompute_shared_key( remote_key: &encryption::PublicKey, local_key: &encryption::PrivateKey, -) -> Key +) -> CipherKey where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, D: Update + BlockInput + FixedOutput + Reset + Default + Clone, D::BlockSize: ArrayLength, D::OutputSize: ArrayLength, @@ -53,5 +53,5 @@ where let okm = hkdf::extract_then_expand::(None, &dh_result, None, C::KeySize::to_usize()) .expect("somehow too long okm was provided"); - Key::::from_exact_iter(okm).expect("okm was expanded to incorrect length!") + CipherKey::::from_exact_iter(okm).expect("okm was expanded to incorrect length!") } diff --git a/common/crypto/src/symmetric/stream_cipher.rs b/common/crypto/src/symmetric/stream_cipher.rs index 0c135891fd..6f98c3205f 100644 --- a/common/crypto/src/symmetric/stream_cipher.rs +++ b/common/crypto/src/symmetric/stream_cipher.rs @@ -1,13 +1,14 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use cipher::stream::{Nonce, StreamCipher, SyncStreamCipher}; +use cipher::{Nonce, StreamCipher}; use generic_array::{typenum::Unsigned, GenericArray}; use rand::{CryptoRng, RngCore}; // re-export this for ease of use -pub use cipher::stream::{Key, NewStreamCipher}; +pub use cipher::{CipherKey, NewCipher}; +// SECURITY: // TODO: note that this is not the most secure approach here // we are not using nonces properly but instead "kinda" thinking of them as IVs. // Nonce require, as the name suggest, being only seen once. Ever. @@ -20,9 +21,9 @@ pub use cipher::stream::{Key, NewStreamCipher}; #[allow(clippy::upper_case_acronyms)] pub type IV = Nonce; -pub fn generate_key(rng: &mut R) -> Key +pub fn generate_key(rng: &mut R) -> CipherKey where - C: NewStreamCipher, + C: NewCipher, R: RngCore + CryptoRng, { let mut key = GenericArray::default(); @@ -32,7 +33,7 @@ where pub fn random_iv(rng: &mut R) -> IV where - C: NewStreamCipher, + C: NewCipher, R: RngCore + CryptoRng, { let mut iv = GenericArray::default(); @@ -42,14 +43,14 @@ where pub fn zero_iv() -> IV where - C: NewStreamCipher, + C: NewCipher, { GenericArray::default() } pub fn iv_from_slice(b: &[u8]) -> &IV where - C: NewStreamCipher, + C: NewCipher, { if b.len() != C::NonceSize::to_usize() { // `from_slice` would have caused a panic about this issue anyway. @@ -66,38 +67,42 @@ where // TODO: there's really no way to use more parts of the keystream if it was required at some point. // However, do we really expect to ever need it? -pub fn encrypt(key: &Key, iv: &IV, data: &[u8]) -> Vec +#[inline] +pub fn encrypt(key: &CipherKey, iv: &IV, data: &[u8]) -> Vec where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, { let mut ciphertext = data.to_vec(); encrypt_in_place::(key, iv, &mut ciphertext); ciphertext } -pub fn encrypt_in_place(key: &Key, iv: &IV, data: &mut [u8]) +#[inline] +pub fn encrypt_in_place(key: &CipherKey, iv: &IV, data: &mut [u8]) where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, { let mut cipher = C::new(key, iv); - cipher.encrypt(data) + cipher.apply_keystream(data) } -pub fn decrypt(key: &Key, iv: &IV, ciphertext: &[u8]) -> Vec +#[inline] +pub fn decrypt(key: &CipherKey, iv: &IV, ciphertext: &[u8]) -> Vec where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, { let mut data = ciphertext.to_vec(); decrypt_in_place::(key, iv, &mut data); data } -pub fn decrypt_in_place(key: &Key, iv: &IV, data: &mut [u8]) +#[inline] +pub fn decrypt_in_place(key: &CipherKey, iv: &IV, data: &mut [u8]) where - C: SyncStreamCipher + NewStreamCipher, + C: StreamCipher + NewCipher, { let mut cipher = C::new(key, iv); - cipher.decrypt(data) + cipher.apply_keystream(data) } #[cfg(test)] @@ -108,7 +113,7 @@ mod tests { #[cfg(test)] mod aes_ctr128 { use super::*; - use aes_ctr::Aes128Ctr; + use aes::Aes128Ctr; #[test] fn zero_iv_is_actually_zero() { diff --git a/common/mixnet-contract/Cargo.toml b/common/mixnet-contract/Cargo.toml index 6b963cfcac..67c94e3355 100644 --- a/common/mixnet-contract/Cargo.toml +++ b/common/mixnet-contract/Cargo.toml @@ -14,3 +14,4 @@ cosmwasm-std = { git = "https://github.com/jstuczyn/cosmwasm", branch="0.14.1-up serde = { version = "1.0", features = ["derive"] } serde_repr = "0.1" schemars = "0.8" +ts-rs = "3.0" diff --git a/common/mixnet-contract/src/delegation.rs b/common/mixnet-contract/src/delegation.rs index 023472bb02..f0efe37297 100644 --- a/common/mixnet-contract/src/delegation.rs +++ b/common/mixnet-contract/src/delegation.rs @@ -45,6 +45,10 @@ impl Delegation { pub fn owner(&self) -> Addr { self.owner.clone() } + + pub fn block_height(&self) -> u64 { + self.block_height + } } impl Display for Delegation { diff --git a/common/mixnet-contract/src/gateway.rs b/common/mixnet-contract/src/gateway.rs index fec4448bcd..a458c37892 100644 --- a/common/mixnet-contract/src/gateway.rs +++ b/common/mixnet-contract/src/gateway.rs @@ -6,8 +6,9 @@ use cosmwasm_std::{coin, Addr, Coin}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::fmt::Display; +use ts_rs::TS; -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema, TS)] pub struct Gateway { pub host: String, pub mix_port: u16, diff --git a/common/mixnet-contract/src/mixnode.rs b/common/mixnet-contract/src/mixnode.rs index c5ddded39c..2f12cf8338 100644 --- a/common/mixnet-contract/src/mixnode.rs +++ b/common/mixnet-contract/src/mixnode.rs @@ -7,8 +7,9 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::fmt::Display; +use ts_rs::TS; -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema)] +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, JsonSchema, TS)] pub struct MixNode { pub host: String, pub mix_port: u16, diff --git a/common/network-defaults/Cargo.toml b/common/network-defaults/Cargo.toml index 94e5c6d126..6cbde55586 100644 --- a/common/network-defaults/Cargo.toml +++ b/common/network-defaults/Cargo.toml @@ -7,4 +7,6 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +serde = {version = "1.0", features = ["derive"]} url = "2.2" +time = { version = "0.3", features = ["macros"] } diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index 072f1845ff..1542c8a3ad 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -1,19 +1,26 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 - +use serde::{Deserialize, Serialize}; +use std::time::Duration; +use time::OffsetDateTime; use url::Url; -pub struct ValidatorDetails<'a> { +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ValidatorDetails { // it is assumed those values are always valid since they're being provided in our defaults file - pub nymd_url: &'a str, + pub nymd_url: String, // Right now api_url is optional as we are not running the api reliably on all validators // however, later on it should be a mandatory field - pub api_url: Option<&'a str>, + pub api_url: Option, } -impl<'a> ValidatorDetails<'a> { - pub const fn new(nymd_url: &'a str, api_url: Option<&'a str>) -> Self { - ValidatorDetails { nymd_url, api_url } +impl ValidatorDetails { + pub fn new(nymd_url: &str, api_url: Option<&str>) -> Self { + let api_url = api_url.map(|api_url_str| api_url_str.to_string()); + ValidatorDetails { + nymd_url: nymd_url.to_string(), + api_url, + } } pub fn nymd_url(&self) -> Url { @@ -24,27 +31,30 @@ impl<'a> ValidatorDetails<'a> { pub fn api_url(&self) -> Option { self.api_url + .as_ref() .map(|url| url.parse().expect("the provided api url is invalid!")) } } -pub const DEFAULT_VALIDATORS: &[ValidatorDetails] = &[ - ValidatorDetails::new( - "https://testnet-milhon-validator1.nymtech.net", - Some("https://testnet-milhon-validator1.nymtech.net/api"), - ), - ValidatorDetails::new("https://testnet-milhon-validator2.nymtech.net", None), -]; +pub fn default_validators() -> Vec { + vec![ + ValidatorDetails::new( + "https://testnet-milhon-validator1.nymtech.net", + Some("https://testnet-milhon-validator1.nymtech.net/api"), + ), + ValidatorDetails::new("https://testnet-milhon-validator2.nymtech.net", None), + ] +} pub fn default_nymd_endpoints() -> Vec { - DEFAULT_VALIDATORS + default_validators() .iter() .map(|validator| validator.nymd_url()) .collect() } pub fn default_api_endpoints() -> Vec { - DEFAULT_VALIDATORS + default_validators() .iter() .filter_map(|validator| validator.api_url()) .collect() @@ -80,3 +90,7 @@ pub const DEFAULT_SOCKS5_LISTENING_PORT: u16 = 1080; pub const DEFAULT_VALIDATOR_API_PORT: u16 = 8080; pub const VALIDATOR_API_VERSION: &str = "v1"; + +// REWARDING +pub const DEFAULT_FIRST_EPOCH_START: OffsetDateTime = time::macros::datetime!(2021-08-23 12:00 UTC); +pub const DEFAULT_EPOCH_LENGTH: Duration = Duration::from_secs(24 * 60 * 60); // 24h diff --git a/common/nymsphinx/acknowledgements/src/identifier.rs b/common/nymsphinx/acknowledgements/src/identifier.rs index 54bb30d475..988bdad156 100644 --- a/common/nymsphinx/acknowledgements/src/identifier.rs +++ b/common/nymsphinx/acknowledgements/src/identifier.rs @@ -3,7 +3,7 @@ use crate::AckKey; use crypto::generic_array::typenum::Unsigned; -use crypto::symmetric::stream_cipher::{self, encrypt, iv_from_slice, random_iv, NewStreamCipher}; +use crypto::symmetric::stream_cipher::{self, encrypt, iv_from_slice, random_iv, NewCipher}; use nymsphinx_params::{ packet_sizes::PacketSize, AckEncryptionAlgorithm, SerializedFragmentIdentifier, FRAG_ID_LEN, }; @@ -33,7 +33,7 @@ pub fn recover_identifier( return None; } - let iv_size = ::NonceSize::to_usize(); + let iv_size = ::NonceSize::to_usize(); let iv = iv_from_slice::(&iv_id_ciphertext[..iv_size]); let id = stream_cipher::decrypt::( diff --git a/common/nymsphinx/acknowledgements/src/key.rs b/common/nymsphinx/acknowledgements/src/key.rs index 9f27427137..a7ff5f9271 100644 --- a/common/nymsphinx/acknowledgements/src/key.rs +++ b/common/nymsphinx/acknowledgements/src/key.rs @@ -2,13 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 use crypto::generic_array::{typenum::Unsigned, GenericArray}; -use crypto::symmetric::stream_cipher::{generate_key, Key, NewStreamCipher}; +use crypto::symmetric::stream_cipher::{generate_key, CipherKey, NewCipher}; use nymsphinx_params::AckEncryptionAlgorithm; use pemstore::traits::PemStorableKey; use rand::{CryptoRng, RngCore}; use std::fmt::{self, Display, Formatter}; -pub struct AckKey(Key); +pub struct AckKey(CipherKey); #[derive(Debug)] pub enum AckKeyConversionError { @@ -33,7 +33,7 @@ impl AckKey { } pub fn try_from_bytes(bytes: &[u8]) -> Result { - if bytes.len() != ::KeySize::to_usize() { + if bytes.len() != ::KeySize::to_usize() { return Err(AckKeyConversionError::BytesOfInvalidLengthError); } @@ -48,7 +48,7 @@ impl AckKey { self.0.as_ref() } - pub fn inner(&self) -> &Key { + pub fn inner(&self) -> &CipherKey { &self.0 } } diff --git a/common/nymsphinx/anonymous-replies/src/encryption_key.rs b/common/nymsphinx/anonymous-replies/src/encryption_key.rs index 85520bf6c8..c8ce8b851d 100644 --- a/common/nymsphinx/anonymous-replies/src/encryption_key.rs +++ b/common/nymsphinx/anonymous-replies/src/encryption_key.rs @@ -5,7 +5,7 @@ pub use crypto::generic_array::typenum::Unsigned; use crypto::{ crypto_hash, generic_array::GenericArray, - symmetric::stream_cipher::{generate_key, Key, NewStreamCipher}, + symmetric::stream_cipher::{generate_key, CipherKey, NewCipher}, Digest, }; use nymsphinx_params::{ReplySurbEncryptionAlgorithm, ReplySurbKeyDigestAlgorithm}; @@ -15,10 +15,10 @@ use std::fmt::{self, Display, Formatter}; pub type EncryptionKeyDigest = GenericArray::OutputSize>; -pub type SurbEncryptionKeySize = ::KeySize; +pub type SurbEncryptionKeySize = ::KeySize; #[derive(Clone, Debug)] -pub struct SurbEncryptionKey(Key); +pub struct SurbEncryptionKey(CipherKey); #[derive(Debug)] pub enum SurbEncryptionKeyError { @@ -64,7 +64,7 @@ impl SurbEncryptionKey { self.0.as_ref() } - pub fn inner(&self) -> &Key { + pub fn inner(&self) -> &CipherKey { &self.0 } } diff --git a/common/nymsphinx/anonymous-replies/src/reply_surb.rs b/common/nymsphinx/anonymous-replies/src/reply_surb.rs index 32cb6cb84e..6e146d721a 100644 --- a/common/nymsphinx/anonymous-replies/src/reply_surb.rs +++ b/common/nymsphinx/anonymous-replies/src/reply_surb.rs @@ -196,7 +196,7 @@ impl ReplySurb { message: &[u8], packet_size: Option, ) -> Result<(SphinxPacket, NymNodeRoutingAddress), ReplySurbError> { - let packet_size = packet_size.unwrap_or_else(Default::default); + let packet_size = packet_size.unwrap_or_default(); if message.len() != packet_size.plaintext_size() { return Err(ReplySurbError::UnpaddedMessageError); diff --git a/common/nymsphinx/params/src/lib.rs b/common/nymsphinx/params/src/lib.rs index ba230827c0..b8954fc975 100644 --- a/common/nymsphinx/params/src/lib.rs +++ b/common/nymsphinx/params/src/lib.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crypto::aes_ctr::Aes128Ctr; +use crypto::aes::Aes128Ctr; use crypto::blake3; // Re-export for ease of use diff --git a/contracts/mixnet/Cargo.lock b/contracts/mixnet/Cargo.lock index ed361dcf24..8dcd1c31c6 100644 --- a/contracts/mixnet/Cargo.lock +++ b/contracts/mixnet/Cargo.lock @@ -408,9 +408,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36" +checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" [[package]] name = "log" @@ -461,6 +461,7 @@ dependencies = [ name = "network-defaults" version = "0.1.0" dependencies = [ + "time", "url", ] @@ -727,9 +728,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.60" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663" dependencies = [ "proc-macro2", "quote", @@ -756,6 +757,22 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a776787d9c5d455bec3db044586ccdd8a9c74d5da5dc319fb80f3db08808fe6" +dependencies = [ + "libc", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a153416002296880a3b51329a0e3df31c779c53ec827993e865ce427982843" + [[package]] name = "tinyvec" version = "1.3.1" diff --git a/contracts/mixnet/schema/execute_msg.json b/contracts/mixnet/schema/execute_msg.json new file mode 100644 index 0000000000..b329acb2a8 --- /dev/null +++ b/contracts/mixnet/schema/execute_msg.json @@ -0,0 +1,349 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "anyOf": [ + { + "type": "object", + "required": [ + "bond_mixnode" + ], + "properties": { + "bond_mixnode": { + "type": "object", + "required": [ + "mix_node" + ], + "properties": { + "mix_node": { + "$ref": "#/definitions/MixNode" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "unbond_mixnode" + ], + "properties": { + "unbond_mixnode": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "bond_gateway" + ], + "properties": { + "bond_gateway": { + "type": "object", + "required": [ + "gateway" + ], + "properties": { + "gateway": { + "$ref": "#/definitions/Gateway" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "unbond_gateway" + ], + "properties": { + "unbond_gateway": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_state_params" + ], + "properties": { + "update_state_params": { + "$ref": "#/definitions/StateParams" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "delegate_to_mixnode" + ], + "properties": { + "delegate_to_mixnode": { + "type": "object", + "required": [ + "mix_identity" + ], + "properties": { + "mix_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "undelegate_from_mixnode" + ], + "properties": { + "undelegate_from_mixnode": { + "type": "object", + "required": [ + "mix_identity" + ], + "properties": { + "mix_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "delegate_to_gateway" + ], + "properties": { + "delegate_to_gateway": { + "type": "object", + "required": [ + "gateway_identity" + ], + "properties": { + "gateway_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "undelegate_from_gateway" + ], + "properties": { + "undelegate_from_gateway": { + "type": "object", + "required": [ + "gateway_identity" + ], + "properties": { + "gateway_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reward_mixnode" + ], + "properties": { + "reward_mixnode": { + "type": "object", + "required": [ + "identity", + "uptime" + ], + "properties": { + "identity": { + "type": "string" + }, + "uptime": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reward_gateway" + ], + "properties": { + "reward_gateway": { + "type": "object", + "required": [ + "identity", + "uptime" + ], + "properties": { + "identity": { + "type": "string" + }, + "uptime": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Gateway": { + "type": "object", + "required": [ + "clients_port", + "host", + "identity_key", + "location", + "mix_port", + "sphinx_key", + "version" + ], + "properties": { + "clients_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "host": { + "type": "string" + }, + "identity_key": { + "description": "Base58 encoded ed25519 EdDSA public key of the gateway used to derive shared keys with clients", + "type": "string" + }, + "location": { + "type": "string" + }, + "mix_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "sphinx_key": { + "type": "string" + }, + "version": { + "type": "string" + } + } + }, + "MixNode": { + "type": "object", + "required": [ + "host", + "http_api_port", + "identity_key", + "mix_port", + "sphinx_key", + "verloc_port", + "version" + ], + "properties": { + "host": { + "type": "string" + }, + "http_api_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "identity_key": { + "description": "Base58 encoded ed25519 EdDSA public key.", + "type": "string" + }, + "mix_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "sphinx_key": { + "type": "string" + }, + "verloc_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "version": { + "type": "string" + } + } + }, + "StateParams": { + "type": "object", + "required": [ + "epoch_length", + "gateway_bond_reward_rate", + "gateway_delegation_reward_rate", + "minimum_gateway_bond", + "minimum_mixnode_bond", + "mixnode_active_set_size", + "mixnode_bond_reward_rate", + "mixnode_delegation_reward_rate" + ], + "properties": { + "epoch_length": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "gateway_bond_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "gateway_delegation_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "minimum_gateway_bond": { + "$ref": "#/definitions/Uint128" + }, + "minimum_mixnode_bond": { + "$ref": "#/definitions/Uint128" + }, + "mixnode_active_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "mixnode_bond_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "mixnode_delegation_reward_rate": { + "$ref": "#/definitions/Decimal" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/mixnet/schema/handle_msg.json b/contracts/mixnet/schema/handle_msg.json deleted file mode 100644 index 8e3729ceb6..0000000000 --- a/contracts/mixnet/schema/handle_msg.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "HandleMsg", - "anyOf": [ - { - "type": "object", - "required": [ - "register_mixnode" - ], - "properties": { - "register_mixnode": { - "type": "object", - "required": [ - "mix_node" - ], - "properties": { - "mix_node": { - "$ref": "#/definitions/MixNode" - } - } - } - } - }, - { - "type": "object", - "required": [ - "un_register_mixnode" - ], - "properties": { - "un_register_mixnode": { - "type": "object" - } - } - }, - { - "type": "object", - "required": [ - "bond_gateway" - ], - "properties": { - "bond_gateway": { - "type": "object", - "required": [ - "gateway" - ], - "properties": { - "gateway": { - "$ref": "#/definitions/Gateway" - } - } - } - } - }, - { - "type": "object", - "required": [ - "unbond_gateway" - ], - "properties": { - "unbond_gateway": { - "type": "object" - } - } - } - ], - "definitions": { - "Gateway": { - "type": "object", - "required": [ - "clients_host", - "identity_key", - "location", - "mix_host", - "sphinx_key", - "version" - ], - "properties": { - "clients_host": { - "type": "string" - }, - "identity_key": { - "description": "Base58 encoded ed25519 EdDSA public key of the gateway used to derive shared keys with clients", - "type": "string" - }, - "location": { - "type": "string" - }, - "mix_host": { - "type": "string" - }, - "sphinx_key": { - "type": "string" - }, - "version": { - "type": "string" - } - } - }, - "MixNode": { - "type": "object", - "required": [ - "host", - "identity_key", - "layer", - "location", - "sphinx_key", - "version" - ], - "properties": { - "host": { - "type": "string" - }, - "identity_key": { - "description": "Base58 encoded ed25519 EdDSA public key.", - "type": "string" - }, - "layer": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "location": { - "type": "string" - }, - "sphinx_key": { - "type": "string" - }, - "version": { - "type": "string" - } - } - } - } -} diff --git a/contracts/mixnet/schema/init_msg.json b/contracts/mixnet/schema/instantiate_msg.json similarity index 73% rename from contracts/mixnet/schema/init_msg.json rename to contracts/mixnet/schema/instantiate_msg.json index 2b274b4e6d..44588cf226 100644 --- a/contracts/mixnet/schema/init_msg.json +++ b/contracts/mixnet/schema/instantiate_msg.json @@ -1,5 +1,5 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InitMsg", + "title": "InstantiateMsg", "type": "object" } diff --git a/contracts/mixnet/schema/mix_node_bond.json b/contracts/mixnet/schema/mix_node_bond.json index bc6e6c97a2..21c52482ec 100644 --- a/contracts/mixnet/schema/mix_node_bond.json +++ b/contracts/mixnet/schema/mix_node_bond.json @@ -3,25 +3,40 @@ "title": "MixNodeBond", "type": "object", "required": [ - "amount", + "bond_amount", + "layer", "mix_node", - "owner" + "owner", + "total_delegation" ], "properties": { - "amount": { - "type": "array", - "items": { - "$ref": "#/definitions/Coin" - } + "block_height": { + "default": 0, + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "bond_amount": { + "$ref": "#/definitions/Coin" + }, + "layer": { + "$ref": "#/definitions/Layer" }, "mix_node": { "$ref": "#/definitions/MixNode" }, "owner": { - "$ref": "#/definitions/HumanAddr" + "$ref": "#/definitions/Addr" + }, + "total_delegation": { + "$ref": "#/definitions/Coin" } }, "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, "Coin": { "type": "object", "required": [ @@ -37,44 +52,59 @@ } } }, - "HumanAddr": { - "type": "string" + "Layer": { + "type": "string", + "enum": [ + "Gateway", + "One", + "Two", + "Three" + ] }, "MixNode": { "type": "object", "required": [ "host", + "http_api_port", "identity_key", - "layer", - "location", + "mix_port", "sphinx_key", + "verloc_port", "version" ], "properties": { "host": { "type": "string" }, + "http_api_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, "identity_key": { "description": "Base58 encoded ed25519 EdDSA public key.", "type": "string" }, - "layer": { + "mix_port": { "type": "integer", - "format": "uint64", + "format": "uint16", "minimum": 0.0 }, - "location": { - "type": "string" - }, "sphinx_key": { "type": "string" }, + "verloc_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, "version": { "type": "string" } } }, "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" } } diff --git a/contracts/mixnet/schema/query_msg.json b/contracts/mixnet/schema/query_msg.json index 43c7bff800..5a9c13e1fd 100644 --- a/contracts/mixnet/schema/query_msg.json +++ b/contracts/mixnet/schema/query_msg.json @@ -19,10 +19,124 @@ "format": "uint32", "minimum": 0.0 }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_gateways" + ], + "properties": { + "get_gateways": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "owns_mixnode" + ], + "properties": { + "owns_mixnode": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "$ref": "#/definitions/Addr" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "owns_gateway" + ], + "properties": { + "owns_gateway": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "$ref": "#/definitions/Addr" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "state_params" + ], + "properties": { + "state_params": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mix_delegations" + ], + "properties": { + "get_mix_delegations": { + "type": "object", + "required": [ + "mix_identity" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "mix_identity": { + "type": "string" + }, "start_after": { "anyOf": [ { - "$ref": "#/definitions/HumanAddr" + "$ref": "#/definitions/Addr" }, { "type": "null" @@ -31,17 +145,82 @@ } } } - } + }, + "additionalProperties": false }, { "type": "object", "required": [ - "get_gateways" + "get_reverse_mix_delegations" ], "properties": { - "get_gateways": { + "get_reverse_mix_delegations": { "type": "object", + "required": [ + "delegation_owner" + ], "properties": { + "delegation_owner": { + "$ref": "#/definitions/Addr" + }, + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mix_delegation" + ], + "properties": { + "get_mix_delegation": { + "type": "object", + "required": [ + "address", + "mix_identity" + ], + "properties": { + "address": { + "$ref": "#/definitions/Addr" + }, + "mix_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_gateway_delegations" + ], + "properties": { + "get_gateway_delegations": { + "type": "object", + "required": [ + "gateway_identity" + ], + "properties": { + "gateway_identity": { + "type": "string" + }, "limit": { "type": [ "integer", @@ -53,7 +232,7 @@ "start_after": { "anyOf": [ { - "$ref": "#/definitions/HumanAddr" + "$ref": "#/definitions/Addr" }, { "type": "null" @@ -62,11 +241,83 @@ } } } - } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_reverse_gateway_delegations" + ], + "properties": { + "get_reverse_gateway_delegations": { + "type": "object", + "required": [ + "delegation_owner" + ], + "properties": { + "delegation_owner": { + "$ref": "#/definitions/Addr" + }, + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_gateway_delegation" + ], + "properties": { + "get_gateway_delegation": { + "type": "object", + "required": [ + "address", + "gateway_identity" + ], + "properties": { + "address": { + "$ref": "#/definitions/Addr" + }, + "gateway_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "layer_distribution" + ], + "properties": { + "layer_distribution": { + "type": "object" + } + }, + "additionalProperties": false } ], "definitions": { - "HumanAddr": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", "type": "string" } } diff --git a/contracts/mixnet/schema/state.json b/contracts/mixnet/schema/state.json index d559e403ee..33ea553981 100644 --- a/contracts/mixnet/schema/state.json +++ b/contracts/mixnet/schema/state.json @@ -3,15 +3,91 @@ "title": "State", "type": "object", "required": [ - "owner" + "gateway_epoch_bond_reward", + "gateway_epoch_delegation_reward", + "mixnode_epoch_bond_reward", + "mixnode_epoch_delegation_reward", + "network_monitor_address", + "owner", + "params" ], "properties": { + "gateway_epoch_bond_reward": { + "$ref": "#/definitions/Decimal" + }, + "gateway_epoch_delegation_reward": { + "$ref": "#/definitions/Decimal" + }, + "mixnode_epoch_bond_reward": { + "$ref": "#/definitions/Decimal" + }, + "mixnode_epoch_delegation_reward": { + "$ref": "#/definitions/Decimal" + }, + "network_monitor_address": { + "$ref": "#/definitions/Addr" + }, "owner": { - "$ref": "#/definitions/HumanAddr" + "$ref": "#/definitions/Addr" + }, + "params": { + "$ref": "#/definitions/StateParams" } }, "definitions": { - "HumanAddr": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "StateParams": { + "type": "object", + "required": [ + "epoch_length", + "gateway_bond_reward_rate", + "gateway_delegation_reward_rate", + "minimum_gateway_bond", + "minimum_mixnode_bond", + "mixnode_active_set_size", + "mixnode_bond_reward_rate", + "mixnode_delegation_reward_rate" + ], + "properties": { + "epoch_length": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "gateway_bond_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "gateway_delegation_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "minimum_gateway_bond": { + "$ref": "#/definitions/Uint128" + }, + "minimum_mixnode_bond": { + "$ref": "#/definitions/Uint128" + }, + "mixnode_active_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "mixnode_bond_reward_rate": { + "$ref": "#/definitions/Decimal" + }, + "mixnode_delegation_reward_rate": { + "$ref": "#/definitions/Decimal" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" } } diff --git a/contracts/mixnet/src/contract.rs b/contracts/mixnet/src/contract.rs index b250dfdafd..63f0e041a6 100644 --- a/contracts/mixnet/src/contract.rs +++ b/contracts/mixnet/src/contract.rs @@ -10,7 +10,9 @@ use cosmwasm_std::{ entry_point, to_binary, Addr, Decimal, Deps, DepsMut, Env, MessageInfo, QueryResponse, Response, Uint128, }; -use mixnet_contract::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, StateParams}; +use mixnet_contract::{ + ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, RawDelegationData, StateParams, +}; pub const INITIAL_DEFAULT_EPOCH_LENGTH: u32 = 2; @@ -205,7 +207,74 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result Result { +======= +pub fn migrate(mut deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { + use crate::storage::{ + gateway_delegations, gateway_delegations_read, gateway_delegations_read_old, gateways_read, + mix_delegations, mix_delegations_read, mix_delegations_read_old, mixnodes_read, + }; + use crate::transactions::delegations; + use cosmwasm_std::{Order, StdResult}; + use mixnet_contract::{GatewayBond, MixNodeBond}; + + // Read existing delegations data, drop invalid values, and rewrite delegations data with valid data only + fn overwrite_mixnode_delegations_data( + identity: &str, + deps: &mut DepsMut, + ) -> Result<(), ContractError> { + let delegations_bucket = mix_delegations_read(deps.storage, identity); + let old_delegations_bucket = mix_delegations_read_old(deps.storage, identity); + let mut delegations_vec = delegations(delegations_bucket)?; + let old_delegations = delegations::(old_delegations_bucket)?; + for delegation in old_delegations { + delegations_vec.push((delegation.0, RawDelegationData::new(delegation.1, 1))) + } + + for (key, delegation) in delegations_vec { + mix_delegations(deps.storage, identity).save(&key, &delegation)?; + } + Ok(()) + } + + fn overwrite_gateway_delegations_data( + identity: &str, + deps: &mut DepsMut, + ) -> Result<(), ContractError> { + let delegations_bucket = gateway_delegations_read(deps.storage, identity); + let old_delegations_bucket = gateway_delegations_read_old(deps.storage, identity); + let mut delegations_vec = delegations(delegations_bucket)?; + let old_delegations = delegations::(old_delegations_bucket)?; + for delegation in old_delegations { + delegations_vec.push((delegation.0, RawDelegationData::new(delegation.1, 1))) + } + + for (key, delegation) in delegations_vec { + gateway_delegations(deps.storage, identity).save(&key, &delegation)?; + } + Ok(()) + } + + let mixnet_bonds = mixnodes_read(deps.storage) + .range(None, None, Order::Ascending) + .map(|res| res.map(|item| item.1)) + .collect::>>()?; + + for bond in mixnet_bonds { + overwrite_mixnode_delegations_data(bond.identity(), &mut deps)?; + } + + let gateway_bonds = gateways_read(deps.storage) + .range(None, None, Order::Ascending) + .map(|res| res.map(|item| item.1)) + .collect::>>()?; + + for bond in gateway_bonds { + overwrite_gateway_delegations_data(bond.identity(), &mut deps)?; + } + +>>>>>>> develop Ok(Default::default()) } diff --git a/contracts/mixnet/src/storage.rs b/contracts/mixnet/src/storage.rs index c038691389..43f1398d89 100644 --- a/contracts/mixnet/src/storage.rs +++ b/contracts/mixnet/src/storage.rs @@ -36,6 +36,8 @@ const PREFIX_REVERSE_GATEWAY_DELEGATION: &[u8] = b"dg"; // Contract-level stuff +// TODO Unify bucket and mixnode storage functions + pub fn config(storage: &mut dyn Storage) -> Singleton { singleton(storage, CONFIG_KEY) } @@ -316,6 +318,14 @@ pub fn mix_delegations_read<'a>( ReadonlyBucket::multilevel(storage, &[PREFIX_MIX_DELEGATION, mix_identity.as_bytes()]) } +// https://github.com/nymtech/nym/blob/122f5d9f2e5c1ced96e3b9ba0c74ef8b7dbde2c7/contracts/mixnet/src/storage.rs +pub fn mix_delegations_read_old<'a>( + storage: &'a dyn Storage, + mix_identity: IdentityKeyRef, +) -> ReadonlyBucket<'a, Uint128> { + ReadonlyBucket::multilevel(storage, &[PREFIX_MIX_DELEGATION, mix_identity.as_bytes()]) +} + pub fn reverse_mix_delegations<'a>(storage: &'a mut dyn Storage, owner: &Addr) -> Bucket<'a, ()> { Bucket::multilevel(storage, &[PREFIX_REVERSE_MIX_DELEGATION, owner.as_bytes()]) } @@ -347,6 +357,16 @@ pub fn gateway_delegations_read<'a>( ) } +pub fn gateway_delegations_read_old<'a>( + storage: &'a dyn Storage, + gateway_identity: IdentityKeyRef, +) -> ReadonlyBucket<'a, Uint128> { + ReadonlyBucket::multilevel( + storage, + &[PREFIX_GATEWAY_DELEGATION, gateway_identity.as_bytes()], + ) +} + pub fn reverse_gateway_delegations<'a>( storage: &'a mut dyn Storage, owner: &Addr, diff --git a/contracts/mixnet/src/transactions.rs b/contracts/mixnet/src/transactions.rs index 2e753ebf06..74707e4e4d 100644 --- a/contracts/mixnet/src/transactions.rs +++ b/contracts/mixnet/src/transactions.rs @@ -14,6 +14,8 @@ use cosmwasm_storage::ReadonlyBucket; use mixnet_contract::{ Gateway, GatewayBond, IdentityKey, Layer, MixNode, MixNodeBond, RawDelegationData, StateParams, }; +use serde::de::DeserializeOwned; +use serde::Serialize; const OLD_DELEGATIONS_CHUNK_SIZE: usize = 500; pub(crate) const MINIMUM_BLOCK_AGE_FOR_REWARDING: u64 = 17280; @@ -25,12 +27,15 @@ pub(crate) const MINIMUM_BLOCK_AGE_FOR_REWARDING: u64 = 17280; // 3. The node unbonds // 4. Some of the addresses that delegated in the past have not removed the delegation yet // 5. The node rebonds with the same identity -fn find_old_delegations(delegations_bucket: ReadonlyBucket) -> StdResult { +pub fn delegations( + delegations_bucket: ReadonlyBucket, +) -> StdResult, T)>> { // I think it's incredibly unlikely to ever read more than that // but in case we do, we should guard ourselves against possible // out of memory errors (wasm contracts can only allocate at most 2MB // of RAM, so we don't want to box the entire iterator) - let mut total_delegation = Coin::new(0, DENOM); + let mut delegations = Vec::new(); + // let mut total_delegation = Coin::new(0, DENOM); let mut start = None; loop { let iterator = delegations_bucket @@ -39,16 +44,23 @@ fn find_old_delegations(delegations_bucket: ReadonlyBucket) - let mut iterated = 0; - for delegation in iterator { + for result_tuple in iterator { iterated += 1; - if iterated == OLD_DELEGATIONS_CHUNK_SIZE + 1 { - // we reached start of next chunk, don't process it, mark it for the next iteration of the loop - start = Some(delegation?.0); - continue; + match result_tuple { + Ok((position, delegation)) => { + // We might skip some values due to deserializatio errors + if iterated > OLD_DELEGATIONS_CHUNK_SIZE { + // we reached start of next chunk, don't process it, mark it for the next iteration of the loop + start = Some(position); + continue; + } + delegations.push((position, delegation)) + } + Err(_e) => { + // Skip errors + continue; + } } - - let value = delegation?.1.amount; - total_delegation.amount += value; } if iterated <= OLD_DELEGATIONS_CHUNK_SIZE { @@ -57,7 +69,17 @@ fn find_old_delegations(delegations_bucket: ReadonlyBucket) - } } - Ok(total_delegation) + Ok(delegations) +} + +fn total_delegations(delegations_bucket: ReadonlyBucket) -> StdResult { + match delegations(delegations_bucket) { + Ok(delegations) => Ok(Coin::new( + delegations.iter().fold(0, |acc, x| acc + x.1.amount.u128()), + "upunk", + )), + Err(e) => Err(e), + } } fn validate_mixnode_bond(bond: &[Coin], minimum_bond: Uint128) -> Result<(), ContractError> { @@ -138,7 +160,7 @@ pub(crate) fn try_add_mixnode( // this might potentially require more gas if a significant number of delegations was there let delegations_bucket = mix_delegations_read(deps.storage, &bond.mix_node.identity_key); - let existing_delegation = find_old_delegations(delegations_bucket)?; + let existing_delegation = total_delegations(delegations_bucket)?; bond.total_delegation = existing_delegation; let identity = bond.identity(); @@ -270,7 +292,7 @@ pub(crate) fn try_add_gateway( // this might potentially require more gas if a significant number of delegations was there let delegations_bucket = gateway_delegations_read(deps.storage, &bond.gateway.identity_key); - let existing_delegation = find_old_delegations(delegations_bucket)?; + let existing_delegation = total_delegations(delegations_bucket)?; bond.total_delegation = existing_delegation; let identity = bond.identity(); @@ -403,6 +425,10 @@ pub(crate) fn try_update_state_params( Ok(Response::default()) } +// Note: if any changes are made to this function or anything it is calling down the stack, +// for example delegation reward distribution, the gas limits must be retested and both +// validator-api/src/rewarding/mod.rs::{MIXNODE_REWARD_OP_BASE_GAS_LIMIT, PER_MIXNODE_DELEGATION_GAS_INCREASE} +// must be updated appropriately. pub(crate) fn try_reward_mixnode( deps: DepsMut, env: Env, @@ -474,6 +500,10 @@ pub(crate) fn try_reward_mixnode( }) } +// Note: if any changes are made to this function or anything it is calling down the stack, +// for example delegation reward distribution, the gas limits must be retested and both +// validator-api/src/rewarding/mod.rs::{GATEWAY_REWARD_OP_BASE_GAS_LIMIT, PER_GATEWAY_DELEGATION_GAS_INCREASE} +// must be updated appropriately. pub(crate) fn try_reward_gateway( deps: DepsMut, env: Env, @@ -502,7 +532,7 @@ pub(crate) fn try_reward_gateway( } // check if the bond even exists - let mut current_bond = match gateways(deps.storage).load(gateway_identity.as_bytes()) { + let mut current_bond = match gateways_read(deps.storage).load(gateway_identity.as_bytes()) { Ok(bond) => bond, Err(_) => { return Ok(Response { @@ -3928,7 +3958,7 @@ pub mod tests { let node_identity: IdentityKey = "nodeidentity".into(); let read_bucket = mix_delegations_read(&deps.storage, &node_identity); - let old_delegations = find_old_delegations(read_bucket).unwrap(); + let old_delegations = total_delegations(read_bucket).unwrap(); assert_eq!(Coin::new(0, DENOM), old_delegations); } @@ -3945,14 +3975,14 @@ pub mod tests { OLD_DELEGATIONS_CHUNK_SIZE * 3 + 1, ]; - for total_delegations in num_delegations { + for delegations in num_delegations { let mut deps = helpers::init_contract(); let node_identity: IdentityKey = "nodeidentity".into(); // delegate some stake let mut write_bucket = mix_delegations(&mut deps.storage, &node_identity); - for i in 1..=total_delegations { + for i in 1..=delegations { let delegator = Addr::unchecked(format!("delegator{}", i)); let delegation = raw_delegation_fixture(i as u128); write_bucket @@ -3961,9 +3991,9 @@ pub mod tests { } let read_bucket = mix_delegations_read(&deps.storage, &node_identity); - let old_delegations = find_old_delegations(read_bucket).unwrap(); + let old_delegations = total_delegations(read_bucket).unwrap(); - let total_delegation = (1..=total_delegations as u128).into_iter().sum(); + let total_delegation = (1..=delegations as u128).into_iter().sum(); assert_eq!(Coin::new(total_delegation, DENOM), old_delegations); } } diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index c5906c376a..cf97221de4 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -23,4 +23,4 @@ pretty_env_logger = "0.4.0" mixnet-contract = { path = "../common/mixnet-contract" } network-defaults = { path = "../common/network-defaults" } -validator-client = { path = "../common/client-libs/validator-client" } +validator-client = { path = "../common/client-libs/validator-client", features=["nymd-client"] } diff --git a/explorer-api/src/mix_node/http.rs b/explorer-api/src/mix_node/http.rs index 20b5c2434c..56cb5ba848 100644 --- a/explorer-api/src/mix_node/http.rs +++ b/explorer-api/src/mix_node/http.rs @@ -6,11 +6,11 @@ use serde::Serialize; use mixnet_contract::{Addr, Coin, Layer, MixNode}; use crate::mix_node::models::{NodeDescription, NodeStats}; -use crate::mix_nodes::Location; +use crate::mix_nodes::{get_mixnode_delegations, Location}; use crate::state::ExplorerApiStateContext; pub fn mix_node_make_default_routes() -> Vec { - routes_with_openapi![get_description, get_stats, list] + routes_with_openapi![get_delegations, get_description, get_stats, list] } #[derive(Clone, Debug, Serialize, JsonSchema)] @@ -51,6 +51,12 @@ pub(crate) async fn list( ) } +#[openapi(tag = "mix_node")] +#[get("//delegations")] +pub(crate) async fn get_delegations(pubkey: &str) -> Json> { + Json(get_mixnode_delegations(pubkey).await) +} + #[openapi(tag = "mix_node")] #[get("//description")] pub(crate) async fn get_description( diff --git a/explorer-api/src/mix_nodes/mod.rs b/explorer-api/src/mix_nodes/mod.rs index 9ed89fc4d0..2c82ef22d9 100644 --- a/explorer-api/src/mix_nodes/mod.rs +++ b/explorer-api/src/mix_nodes/mod.rs @@ -8,8 +8,11 @@ use rocket::tokio::sync::RwLock; use serde::{Deserialize, Serialize}; use crate::mix_nodes::utils::map_2_letter_to_3_letter_country_code; -use mixnet_contract::MixNodeBond; -use network_defaults::default_api_endpoints; +use mixnet_contract::{Delegation, MixNodeBond}; +use network_defaults::{ + default_api_endpoints, default_nymd_endpoints, DEFAULT_MIXNET_CONTRACT_ADDRESS, +}; +use validator_client::nymd::QueryNymdClient; pub(crate) type LocationCache = HashMap; @@ -163,6 +166,32 @@ pub(crate) async fn retrieve_mixnodes() -> Vec { bonds } +pub(crate) async fn get_mixnode_delegations(pubkey: &str) -> Vec { + let client = new_nymd_client(); + let delegates = match client + .get_all_nymd_mixnode_delegations(pubkey.to_string()) + .await + { + Ok(result) => result, + Err(e) => { + error!("Could not get delegations for mix node {}: {:?}", pubkey, e); + vec![] + } + }; + delegates +} + +fn new_nymd_client() -> validator_client::Client { + let mixnet_contract = DEFAULT_MIXNET_CONTRACT_ADDRESS.to_string(); + let nymd_url = default_nymd_endpoints()[0].clone(); + let api_url = default_api_endpoints()[0].clone(); + + let client_config = + validator_client::Config::new(nymd_url, api_url, Some(mixnet_contract.parse().unwrap())); + + validator_client::Client::new_query(client_config).expect("Failed to connect to nymd!") +} + // TODO: inject constants fn new_validator_client() -> validator_client::ApiClient { validator_client::ApiClient::new(default_api_endpoints()[0].clone()) diff --git a/gateway/gateway-requests/Cargo.toml b/gateway/gateway-requests/Cargo.toml index e9d28094ae..442d9837f0 100644 --- a/gateway/gateway-requests/Cargo.toml +++ b/gateway/gateway-requests/Cargo.toml @@ -24,6 +24,7 @@ crypto = { path = "../../common/crypto" } pemstore = { path = "../../common/pemstore" } coconut-interface = { path = "../../common/coconut-interface" } +credentials = { path = "../../common/credentials"} [dependencies.tungstenite] version = "0.13.0" diff --git a/gateway/gateway-requests/src/iv.rs b/gateway/gateway-requests/src/iv.rs index 95fae40095..568d69f48c 100644 --- a/gateway/gateway-requests/src/iv.rs +++ b/gateway/gateway-requests/src/iv.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use crypto::generic_array::{typenum::Unsigned, GenericArray}; -use crypto::symmetric::stream_cipher::{random_iv, NewStreamCipher, IV as CryptoIV}; +use crypto::symmetric::stream_cipher::{random_iv, NewCipher, IV as CryptoIV}; use nymsphinx::params::GatewayEncryptionAlgorithm; use rand::{CryptoRng, RngCore}; -type NonceSize = ::NonceSize; +type NonceSize = ::NonceSize; // I think 'IV' looks better than 'Iv', feel free to change that. #[allow(clippy::upper_case_acronyms)] diff --git a/gateway/gateway-requests/src/registration/handshake/shared_key.rs b/gateway/gateway-requests/src/registration/handshake/shared_key.rs index b07c6827d7..2d40bf613d 100644 --- a/gateway/gateway-requests/src/registration/handshake/shared_key.rs +++ b/gateway/gateway-requests/src/registration/handshake/shared_key.rs @@ -7,7 +7,7 @@ use crypto::generic_array::{ GenericArray, }; use crypto::hmac::{compute_keyed_hmac, recompute_keyed_hmac_and_verify_tag}; -use crypto::symmetric::stream_cipher::{self, Key, NewStreamCipher, IV}; +use crypto::symmetric::stream_cipher::{self, CipherKey, NewCipher, IV}; use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; use pemstore::traits::PemStorableKey; use std::fmt::{self, Display, Formatter}; @@ -17,14 +17,14 @@ pub type SharedKeySize = Sum; // we're using 16 byte long key in sphinx, so let's use the same one here type MacKeySize = U16; -type EncryptionKeySize = ::KeySize; +type EncryptionKeySize = ::KeySize; /// Shared key used when computing MAC for messages exchanged between client and its gateway. pub type MacKey = GenericArray; #[derive(Clone, Debug)] pub struct SharedKeys { - encryption_key: Key, + encryption_key: CipherKey, mac_key: MacKey, } @@ -138,7 +138,7 @@ impl SharedKeys { Ok(message_bytes_mut.to_vec()) } - pub fn encryption_key(&self) -> &Key { + pub fn encryption_key(&self) -> &CipherKey { &self.encryption_key } diff --git a/gateway/src/node/client_handling/bandwidth.rs b/gateway/src/node/client_handling/bandwidth.rs new file mode 100644 index 0000000000..203b75fd0a --- /dev/null +++ b/gateway/src/node/client_handling/bandwidth.rs @@ -0,0 +1,85 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::HashMap; +use std::convert::TryFrom; +use std::sync::Arc; +use tokio::sync::RwLock; + +use coconut_interface::Credential; +use credentials::error::Error; +use nymsphinx::DestinationAddressBytes; + +const BANDWIDTH_INDEX: usize = 0; + +pub type BandwidthDatabase = Arc>>; + +pub fn empty_bandwidth_database() -> BandwidthDatabase { + Arc::new(RwLock::new(HashMap::new())) +} + +pub struct Bandwidth { + value: u64, +} + +impl Bandwidth { + pub fn value(&self) -> u64 { + self.value + } + + pub async fn consume_bandwidth( + bandwidths: &BandwidthDatabase, + remote_address: &DestinationAddressBytes, + consumed: u64, + ) -> Result<(), Error> { + if let Some(bandwidth) = bandwidths.write().await.get_mut(remote_address) { + if let Some(res) = bandwidth.checked_sub(consumed) { + *bandwidth = res; + Ok(()) + } else { + Err(Error::BandwidthOverflow(String::from( + "Allocate more bandwidth for consumption", + ))) + } + } else { + Err(Error::MissingBandwidth) + } + } + + pub async fn increase_bandwidth( + bandwidths: &BandwidthDatabase, + remote_address: &DestinationAddressBytes, + increase: u64, + ) -> Result<(), Error> { + let mut db = bandwidths.write().await; + if let Some(bandwidth) = db.get_mut(remote_address) { + if let Some(new_bandwidth) = bandwidth.checked_add(increase) { + *bandwidth = new_bandwidth; + } else { + return Err(Error::BandwidthOverflow(String::from( + "Use some of the already allocated bandwidth", + ))); + } + } else { + db.insert(*remote_address, increase); + } + Ok(()) + } +} + +impl TryFrom for Bandwidth { + type Error = Error; + + fn try_from(credential: Credential) -> Result { + match credential.public_attributes().get(BANDWIDTH_INDEX) { + None => Err(Error::NotEnoughPublicAttributes), + Some(attr) => match <[u8; 8]>::try_from(attr.as_slice()) { + Ok(bandwidth_bytes) => { + let value = u64::from_be_bytes(bandwidth_bytes); + Ok(Self { value }) + } + Err(_) => Err(Error::InvalidBandwidthSize), + }, + } + } +} diff --git a/gateway/src/node/client_handling/mod.rs b/gateway/src/node/client_handling/mod.rs index 9ad982e49b..8e8013fb93 100644 --- a/gateway/src/node/client_handling/mod.rs +++ b/gateway/src/node/client_handling/mod.rs @@ -1,5 +1,6 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +mod bandwidth; pub(crate) mod clients_handler; pub(crate) mod websocket; diff --git a/gateway/src/node/client_handling/websocket/connection_handler.rs b/gateway/src/node/client_handling/websocket/connection_handler.rs index 9cf55b0e31..dc81c5b1dd 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler.rs @@ -1,6 +1,7 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::node::client_handling::bandwidth::{Bandwidth, BandwidthDatabase}; use crate::node::client_handling::clients_handler::{ ClientsHandlerRequest, ClientsHandlerRequestSender, ClientsHandlerResponse, }; @@ -24,6 +25,7 @@ use mixnet_client::forwarder::MixForwardingSender; use nymsphinx::DestinationAddressBytes; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; +use std::mem; use std::sync::Arc; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_tungstenite::{ @@ -53,14 +55,13 @@ pub(crate) struct Handle { rng: R, remote_address: Option, shared_key: Option, - // TODO: This should be replaced by an actual bandwidth value, with 0 meaning no bandwidth - has_bandwidth: bool, clients_handler_sender: ClientsHandlerRequestSender, outbound_mix_sender: MixForwardingSender, socket_connection: SocketStream, local_identity: Arc, aggregated_verification_key: VerificationKey, + bandwidths: BandwidthDatabase, } impl Handle @@ -76,17 +77,18 @@ where outbound_mix_sender: MixForwardingSender, local_identity: Arc, aggregated_verification_key: VerificationKey, + bandwidths: BandwidthDatabase, ) -> Self { Handle { rng, remote_address: None, shared_key: None, - has_bandwidth: false, clients_handler_sender, outbound_mix_sender, socket_connection: SocketStream::RawTcp(conn), local_identity, aggregated_verification_key, + bandwidths, } } @@ -194,9 +196,6 @@ where } async fn handle_binary(&self, bin_msg: Vec) -> Message { - if !self.has_bandwidth { - return ServerResponse::new_error("Not enough bandwidth").into(); - } trace!("Handling binary message (presumably sphinx packet)"); // this function decrypts the request and checks the MAC @@ -210,8 +209,19 @@ where Ok(request) => match request { // currently only a single type exists BinaryRequest::ForwardSphinx(mix_packet) => { - self.outbound_mix_sender.unbounded_send(mix_packet).unwrap(); - ServerResponse::Send { status: true } + let consumed_bandwidth = mem::size_of_val(&mix_packet) as u64; + if let Err(e) = Bandwidth::consume_bandwidth( + &self.bandwidths, + &self.remote_address.unwrap(), + consumed_bandwidth, + ) + .await + { + ServerResponse::new_error(format!("{:?}", e)) + } else { + self.outbound_mix_sender.unbounded_send(mix_packet).unwrap(); + ServerResponse::Send { status: true } + } } }, } @@ -351,6 +361,9 @@ where if self.shared_key.is_none() { return ServerResponse::new_error("No shared key has been exchanged with the gateway"); } + if self.remote_address.is_none() { + return ServerResponse::new_error("No remote address has been set"); + } let iv = match IV::try_from_bytes(&iv) { Ok(iv) => iv, Err(e) => { @@ -368,9 +381,29 @@ where return ServerResponse::new_error(e.to_string()); } }; - let status = credential.verify(&self.aggregated_verification_key); - self.has_bandwidth = status; - ServerResponse::Bandwidth { status } + if credential.verify(&self.aggregated_verification_key) { + match Bandwidth::try_from(credential) { + Ok(bandwidth) => { + if let Err(e) = Bandwidth::increase_bandwidth( + &self.bandwidths, + &self.remote_address.unwrap(), + bandwidth.value(), + ) + .await + { + return ServerResponse::Error { + message: format!("{:?}", e), + }; + } + ServerResponse::Bandwidth { status: true } + } + Err(e) => ServerResponse::Error { + message: format!("{:?}", e), + }, + } + } else { + ServerResponse::Bandwidth { status: false } + } } // currently the bandwidth credential request is the only one we can receive after diff --git a/gateway/src/node/client_handling/websocket/listener.rs b/gateway/src/node/client_handling/websocket/listener.rs index 7978e77a93..fa1c26aaa6 100644 --- a/gateway/src/node/client_handling/websocket/listener.rs +++ b/gateway/src/node/client_handling/websocket/listener.rs @@ -1,6 +1,7 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::node::client_handling::bandwidth::empty_bandwidth_database; use crate::node::client_handling::clients_handler::ClientsHandlerRequestSender; use crate::node::client_handling::websocket::connection_handler::Handle; use coconut_interface::VerificationKey; @@ -46,6 +47,8 @@ impl Listener { } }; + let bandwidths = empty_bandwidth_database(); + loop { match tcp_listener.accept().await { Ok((socket, remote_addr)) => { @@ -59,6 +62,7 @@ impl Listener { outbound_mix_sender.clone(), Arc::clone(&self.local_identity), self.aggregated_verification_key.clone(), + Arc::clone(&bandwidths), ); tokio::spawn(async move { handle.start_handling().await }); } diff --git a/gateway/src/node/client_handling/websocket/mod.rs b/gateway/src/node/client_handling/websocket/mod.rs index b9920c505f..df45a32a69 100644 --- a/gateway/src/node/client_handling/websocket/mod.rs +++ b/gateway/src/node/client_handling/websocket/mod.rs @@ -1,8 +1,8 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +pub(crate) use listener::Listener; + pub(crate) mod connection_handler; pub(crate) mod listener; pub(crate) mod message_receiver; - -pub(crate) use listener::Listener; diff --git a/tauri-wallet/.babelrc b/tauri-wallet/.babelrc new file mode 100644 index 0000000000..7a840ad24e --- /dev/null +++ b/tauri-wallet/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "esmodules": true + } + } + ], + "@babel/preset-react", + "@babel/preset-typescript" + ], + "plugins": ["@babel/plugin-transform-async-to-generator"] +} diff --git a/tauri-wallet/.eslintrc b/tauri-wallet/.eslintrc new file mode 100644 index 0000000000..a7a2869a49 --- /dev/null +++ b/tauri-wallet/.eslintrc @@ -0,0 +1,109 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true, + "jest": true + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 2019, + "sourceType": "module" + }, + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "plugins": ["react", "react-hooks", "jsx-a11y", "prettier", "jest"], + "extends": [ + "plugin:react/recommended", + "airbnb", + "prettier", + "plugin:jest/recommended", + "plugin:jest/style" + ], + "rules": { + "jest/prefer-strict-equal": "error", + "jest/prefer-to-have-length": "warn", + "prettier/prettier": "error", + "import/prefer-default-export": "off", + "react/prop-types": "off", + "react/jsx-filename-extension": "off", + "react/jsx-props-no-spreading": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": [ + "**/*.test.[jt]s", + "**/*.spec.[jt]s", + "**/*.test.[jt]sx", + "**/*.spec.[jt]sx" + ] + } + ], + "import/extensions": [ + "error", + "ignorePackages", + { + "ts": "never", + "tsx": "never", + "js": "never", + "jsx": "never" + } + ] + }, + "overrides": [ + { + "files": "**/*.+(ts|tsx)", + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json" + }, + "plugins": ["@typescript-eslint/eslint-plugin"], + "extends": [ + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-var-requires": "off", + "no-use-before-define": [0], + "@typescript-eslint/no-use-before-define": [1], + "import/no-unresolved": 0, + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx" + ] + } + ], + "quotes": "off", + "@typescript-eslint/quotes": [ + 2, + "single", + { + "avoidEscape": true + } + ], + "@typescript-eslint/no-unused-vars": [2, { "argsIgnorePattern": "^_" }] + } + } + ], + "settings": { + "import/resolver": { + "root-import": { + "rootPathPrefix": "@", + "rootPathSuffix": "src", + "extensions": [".js", ".ts", ".tsx", ".jsx", ".mdx"] + } + } + } +} diff --git a/tauri-wallet/.nvmrc b/tauri-wallet/.nvmrc new file mode 100644 index 0000000000..da2d3988d7 --- /dev/null +++ b/tauri-wallet/.nvmrc @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/tauri-wallet/Cargo.lock b/tauri-wallet/Cargo.lock new file mode 100644 index 0000000000..cec8fe76d8 --- /dev/null +++ b/tauri-wallet/Cargo.lock @@ -0,0 +1,5213 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anomaly" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550632e31568ae1a5f47998c3aa48563030fc49b9ec91913ca337cf64fbc5ccb" +dependencies = [ + "backtrace", +] + +[[package]] +name = "anyhow" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + +[[package]] +name = "ast_node" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93f52ce8fac3d0e6720a92b0576d737c01b1b5db4dd786e962e5925f00bf755" +dependencies = [ + "darling", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "attohttpc" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8bda305457262b339322106c776e3fd21df860018e566eb6a5b1aa4b6ae02d" +dependencies = [ + "flate2", + "http", + "log", + "native-tls", + "openssl", + "serde", + "serde_json", + "serde_urlencoded 0.6.1", + "url", + "wildmatch", +] + +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.4.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bip32" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d0f0fc59c7ba0333eed9dcc1b6980baa7b7a4dc7c6c5885994d0674f7adf34" +dependencies = [ + "bs58", + "hkd32", + "hmac", + "k256", + "ripemd160", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "bip39" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e89470017230c38e52b82b3ee3f530db1856ba1d434e3a67a3456a8a8dec5f" +dependencies = [ + "bitcoin_hashes", + "rand 0.6.5", + "rand_core 0.4.2", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce18265ec2324ad075345d5814fbeed4f41f0a660055dc78840b74d19b874b1" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blake3" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", + "digest 0.9.0", + "rayon", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding 0.2.1", + "generic-array 0.14.4", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bls12_381" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54757888b09a69be70b5ec303e382a74227392086ba808cb01eeca29233a2397" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2", +] + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "memchr", +] + +[[package]] +name = "bumpalo" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "bzip2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cairo-rs" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9164355c892b026d6257e696dde5f3cb39beb3718297f0f161b562fe2ee3ab86" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c9c3928781e8a017ece15eace05230f04b647457d170d2d9641c94a444ff80" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "cc" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfb" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" +dependencies = [ + "byteorder", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +dependencies = [ + "smallvec 1.6.1", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "time 0.1.43", + "winapi", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "coconut-interface" +version = "0.1.0" +dependencies = [ + "coconut-rs", + "getset", + "serde", +] + +[[package]] +name = "coconut-rs" +version = "0.5.0" +source = "git+https://github.com/nymtech/coconut.git?branch=0.5.0#a1b72d51aa2a67b73b9f58d707030ae6dc70af7f" +dependencies = [ + "bls12_381", + "bs58", + "digest 0.9.0", + "ff", + "getrandom 0.2.3", + "group", + "itertools 0.10.1", + "rand 0.8.4", + "serde", + "serde_derive", + "sha2", + "thiserror", +] + +[[package]] +name = "com" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a30a2b2a013da986dc5cc3eda3d19c0d59d53f835be1b2356eb8d00f000c793" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7606b05842fea68ddcc89e8053b8860ebcb2a0ba8d6abfe3a148e5d5a8d3f0c1" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn", +] + +[[package]] +name = "com_macros_support" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97e9a6d20f4ac8830e309a455d7e9416e65c6af5a97c88c55fbb4c2012e107da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "config" +version = "0.1.0" +dependencies = [ + "handlebars", + "humantime-serde", + "network-defaults", + "serde", + "toml", + "url", +] + +[[package]] +name = "const-oid" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdab415d6744056100f40250a66bc430c1a46f7a02e20bc11c94c79a0f0464df" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "cosmos-sdk-proto" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7115eae4b8518967b8e737a3ef76025f2d007de7906d88c18f00b8bbfc70f51e" +dependencies = [ + "prost", + "prost-types", + "tendermint-proto", +] + +[[package]] +name = "cosmrs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609eba7eee6d9929927cbdf15f9fe96d250c316c5e1b983c4a47a10f60da5ea7" +dependencies = [ + "bip32", + "cosmos-sdk-proto", + "ecdsa", + "eyre", + "getrandom 0.2.3", + "k256", + "prost", + "prost-types", + "rand_core 0.6.3", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", +] + +[[package]] +name = "cosmwasm-crypto" +version = "0.14.1" +source = "git+https://github.com/jstuczyn/cosmwasm?branch=0.14.1-updatedk256#308781cd5f33b0e996176c6b500793d3648c0f7b" +dependencies = [ + "digest 0.9.0", + "ed25519-zebra", + "k256", + "rand_core 0.5.1", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "0.14.1" +source = "git+https://github.com/jstuczyn/cosmwasm?branch=0.14.1-updatedk256#308781cd5f33b0e996176c6b500793d3648c0f7b" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-std" +version = "0.14.1" +source = "git+https://github.com/jstuczyn/cosmwasm?branch=0.14.1-updatedk256#308781cd5f33b0e996176c6b500793d3648c0f7b" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "credentials" +version = "0.1.0" +dependencies = [ + "coconut-interface", + "thiserror", + "url", + "validator-client", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d12477e115c0d570c12a2dfd859f80b55b60ddb5075df210d3af06d133a69f45" +dependencies = [ + "generic-array 0.14.4", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.4", + "subtle", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec 1.6.1", + "syn", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "ct-logs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" +dependencies = [ + "sct", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deflate" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "der" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2adca118c71ecd9ae094d4b68257b3fdfcb711a612b9eec7b5a0d27a5a70a5b4" +dependencies = [ + "const-oid", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dprint-core" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93bd44f40b1881477837edc7112695d4b174f058c36c1cbc4c50f8d0482e2ac8" +dependencies = [ + "bumpalo", + "fnv", + "serde", +] + +[[package]] +name = "dprint-plugin-typescript" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba0077bd2ab9235848e793fbbfb563e6a04b4c8e4149827802a84063c15805" +dependencies = [ + "dprint-core", + "dprint-swc-ecma-ast-view", + "fnv", + "serde", + "swc_common", + "swc_ecmascript", +] + +[[package]] +name = "dprint-swc-ecma-ast-view" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecf692a2ee5c5f699ed0e95f21686cf6367f3a591e5d8e7bd3041bbf184651f9" +dependencies = [ + "bumpalo", + "fnv", + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecmascript", +] + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" + +[[package]] +name = "ecdsa" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43ee23aa5b4f68c7a092b5c3beb25f50c406adc75e2363634f242f28ab255372" +dependencies = [ + "der", + "elliptic-curve", + "hmac", + "signature", +] + +[[package]] +name = "ed25519" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4620d40f6d2601794401d6dd95a5cf69b6c157852539470eeda433a99b3c0efc" +dependencies = [ + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "serde_bytes", + "sha2", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a128b76af6dd4b427e34a6fd43dc78dbfe73672ec41ff615a2414c1a0ad0409" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.5.1", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "elliptic-curve" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beca177dcb8eb540133e7680baff45e7cc4d93bf22002676cec549f82343721b" +dependencies = [ + "crypto-bigint", + "ff", + "generic-array 0.14.4", + "group", + "pkcs8", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "embed_plist" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99" + +[[package]] +name = "encoding_rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "enum_kind" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b940da354ae81ef0926c5eaa428207b8f4f091d3956c891dfbd124162bed99" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + +[[package]] +name = "eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221239d1d5ea86bf5d6f91c9d6bc3646ffe471b08ff9b0f91c44f115ac969d2b" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +dependencies = [ + "instant", +] + +[[package]] +name = "ff" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f40b2dcd8bc322217a5f6559ae5f9e9d1de202a2ecee2e9eafcbece7562a4f" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide 0.4.4", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "from_variant" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0951635027ca477be98f8774abd6f0345233439d63f307e47101acb40c7cc63d" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" + +[[package]] +name = "futures-executor" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +dependencies = [ + "autocfg 1.0.1", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" + +[[package]] +name = "futures-task" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" + +[[package]] +name = "futures-util" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +dependencies = [ + "autocfg 1.0.1", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a453eae5ec10345b3a96ca1b547328bfc94edd40aa95b08f14bb4c35863db140" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590" +dependencies = [ + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "gdk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "pkg-config", + "system-deps 3.2.0", +] + +[[package]] +name = "generator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "winapi", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getset" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b328c01a4d71d2d8173daa93562a73ab0fe85616876f02500f53d82948c504" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "gimli" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" + +[[package]] +name = "gio" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a29d8062af72045518271a2cd98b4e1617ce43f5b4223ad0fb9a0eff8f718c" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys 0.14.0", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac" +dependencies = [ + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "system-deps 1.3.2", + "winapi", +] + +[[package]] +name = "gio-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", + "winapi", +] + +[[package]] +name = "glib" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a930b7208e6e0ab839eea5f65ac2b82109f729621430d47fe905e2e09d33f4" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "once_cell", + "smallvec 1.6.1", +] + +[[package]] +name = "glib-macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1" +dependencies = [ + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "glib-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" +dependencies = [ + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "globset" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" +dependencies = [ + "glib-sys 0.10.1", + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "gobject-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "group" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c363a5301b8f153d80747126a04b3c82073b9fe3130571a9d170cacdeaf7912" +dependencies = [ + "byteorder", + "ff", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "gtk" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6603bb79ded6ac6f3bac203794383afa8b1d6a8656d34a93a88f0b22826cd46c" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk3-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "h2" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "handlebars" +version = "3.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" +dependencies = [ + "log", + "pest", + "pest_derive", + "quick-error", + "serde", + "serde_json", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "headers" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" +dependencies = [ + "base64", + "bitflags", + "bytes", + "headers-core", + "http", + "mime", + "sha-1 0.9.8", + "time 0.1.43", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkd32" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2a5541afe0725f0b95619d6af614f48c1b176385b8aa30918cfb8c4bfafc8" +dependencies = [ + "hmac", + "once_cell", + "pbkdf2", + "rand_core 0.6.3", + "sha2", + "zeroize", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "html5ever" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "http" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "humantime-serde" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac34a56cfd4acddb469cc7fff187ed5ac36f498ba085caf8bbc725e3ff474058" +dependencies = [ + "humantime", + "serde", +] + +[[package]] +name = "hyper" +version = "0.14.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures", + "headers", + "http", + "hyper", + "hyper-tls", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +dependencies = [ + "ct-logs", + "futures-util", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "webpki", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "ico" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804" +dependencies = [ + "byteorder", + "png 0.11.0", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg 1.0.1", + "hashbrown", +] + +[[package]] +name = "infer" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +dependencies = [ + "cfb", +] + +[[package]] +name = "inflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" +dependencies = [ + "adler32", +] + +[[package]] +name = "instant" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "ipnet" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" + +[[package]] +name = "is-macro" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a322dd16d960e322c3d92f541b4c1a4f0a2e81e1fdeee430d8cecc8b72e8015f" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "javascriptcore-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca9c7d1445bba2889672fbadc16c3d5007bfdcf0a15a18a3a50fe9fab2c7427" +dependencies = [ + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f46ada8a08dcd75a10afae872fbfb51275df4a8ae0d46b8cc7c708f08dd2998" +dependencies = [ + "libc", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903ae2481bcdfdb7b68e0a9baa4b7c9aff600b9ae2e8e5bb5833b8c91ab851ea" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", + "sha2", + "sha3", +] + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "loom" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2111607c723d7857e0d8299d5ce7a0bf4b844d3e44f8de136b13da513eaf8fc4" +dependencies = [ + "cfg-if 1.0.0", + "generator", + "scoped-tls", + "serde", + "serde_json", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg 1.0.1", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg 1.0.1", +] + +[[package]] +name = "mio" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "mixnet-contract" +version = "0.1.0" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "serde_repr", + "ts-rs", +] + +[[package]] +name = "native-tls" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-glue" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +dependencies = [ + "darling", + "proc-macro-crate 0.1.5", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" + +[[package]] +name = "network-defaults" +version = "0.1.0" +dependencies = [ + "serde", + "time 0.3.3", + "url", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg 1.0.1", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg 1.0.1", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg 1.0.1", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg 1.0.1", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "nym_wallet" +version = "0.1.0" +dependencies = [ + "bip39", + "coconut-interface", + "config", + "cosmrs", + "cosmwasm-std", + "credentials", + "dirs", + "mixnet-contract", + "rand 0.6.5", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tendermint-rpc", + "thiserror", + "tokio", + "ts-rs", + "url", + "validator-client", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" + +[[package]] +name = "openssl-sys" +version = "0.9.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" +dependencies = [ + "autocfg 1.0.1", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "owning_ref" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "pairing" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de9d09263c9966e8196fe0380c9dbbc7ea114b5cf371ba29004bc1f9c6db7f3" +dependencies = [ + "group", +] + +[[package]] +name = "pango" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc88307d9797976ea62722ff2ec5de3fae279c6e20100ed3f49ca1a4bf3f96" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall", + "smallvec 1.6.1", + "winapi", +] + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1 0.8.2", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.4", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" + +[[package]] +name = "pmutil" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "png" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" +dependencies = [ + "bitflags", + "deflate 0.7.20", + "inflate", + "num-iter", +] + +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags", + "crc32fast", + "deflate 0.8.6", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + +[[package]] +name = "proc-macro2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prost" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "169a15f3008ecb5160cba7d37bcd690a7601b6d30cfb87a117d45e59d52af5d4" +dependencies = [ + "anyhow", + "itertools 0.9.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb" +dependencies = [ + "bytes", + "prost", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg 0.1.2", + "rand_xorshift", + "winapi", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", + "rand_pcg 0.2.1", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core 0.6.3", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" +dependencies = [ + "libc", +] + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg 1.0.1", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.3", + "redox_syscall", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded 0.7.0", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rfd" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609ed912e110af7d7084b6b17d2a68b25e766208e015a37beba1be3c2d7cbb3b" +dependencies = [ + "block", + "dispatch", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "js-sys", + "lazy_static", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ripemd160" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls", + "schannel", + "security-framework", +] + +[[package]] +name = "rustversion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "schemars" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a48d098c2a7fdf5740b19deb1181b4fb8a9e68e03ae517c14cde04b5725409" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9ea2a613fe4cd7118b2bb101a25d8ae6192e1975179b67b2f17afd11e70ac8" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-foundation-sys 0.8.2", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec 1.6.1", + "thin-slice", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50eef3672ec8fa45f3457fd423ba131117786784a895548021976117c1ded449" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_urlencoded" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +dependencies = [ + "dtoa", + "itoa", + "serde", + "url", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug 0.3.0", +] + +[[package]] +name = "signature" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" +dependencies = [ + "digest 0.9.0", + "rand_core 0.6.3", +] + +[[package]] +name = "siphasher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" + +[[package]] +name = "slab" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" + +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e" +dependencies = [ + "bitflags", + "gio-sys 0.10.1", + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "pkg-config", + "system-deps 1.3.2", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" +dependencies = [ + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +dependencies = [ + "loom", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a" +dependencies = [ + "lazy_static", + "new_debug_unreachable", + "phf_shared 0.8.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_enum" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f584cc881e9e5f1fd6bf827b0444aa94c30d8fe6378cf241071b5f5700b2871f" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "strum" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" + +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" + +[[package]] +name = "strum_macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "swc_atoms" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "837a3ef86c2817228e733b6f173c821fd76f9eb21a0bc9001a826be48b00b4e7" +dependencies = [ + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "swc_common" +version = "0.10.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c93df65683ec1a001e15ce1de438c7c2c226c0c2462d1cb93fa1bd2a7664170b" +dependencies = [ + "ast_node", + "cfg-if 0.1.10", + "either", + "from_variant", + "fxhash", + "log", + "num-bigint", + "once_cell", + "owning_ref", + "scoped-tls", + "serde", + "string_cache", + "swc_eq_ignore_macros", + "swc_visit", + "unicode-width", +] + +[[package]] +name = "swc_ecma_ast" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83eb6a73820660a5af3c24ae1d436e84e4d4c13822021140011361e678df247b" +dependencies = [ + "is-macro", + "num-bigint", + "serde", + "string_enum", + "swc_atoms", + "swc_common", +] + +[[package]] +name = "swc_ecma_parser" +version = "0.52.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03250697857164f16fa98f8e1726f566652d13e52ea3f0c3ecea9deb63ee327" +dependencies = [ + "either", + "enum_kind", + "fxhash", + "log", + "num-bigint", + "serde", + "smallvec 1.6.1", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_ecma_visit", + "unicode-xid", +] + +[[package]] +name = "swc_ecma_visit" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3d60b9dc97ae4f181d4d60f43142d8ac9669953db410bcedefb29a14627e19" +dependencies = [ + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_visit", +] + +[[package]] +name = "swc_ecmascript" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffb53afe008c15d4dc4957e80148c4b457659f93e4d4e8736eaeae352e48ec8" +dependencies = [ + "swc_ecma_ast", + "swc_ecma_parser", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c8f200a2eaed938e7c1a685faaa66e6d42fa9e17da5f62572d3cbc335898f5e" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_macros_common" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08ed2e930f5a1a4071fe62c90fd3a296f6030e5d94bfe13993244423caf59a78" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_visit" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a423caa0b4585118164dbad8f1ad52b592a9a9370b25decc4d84c6b4309132c0" +dependencies = [ + "either", + "swc_visit_macros", +] + +[[package]] +name = "swc_visit_macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b2825fee79f10d0166e8e650e79c7a862fb991db275743083f07555d7641f0" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "system-deps" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" +dependencies = [ + "heck", + "pkg-config", + "strum 0.18.0", + "strum_macros 0.18.0", + "thiserror", + "toml", + "version-compare 0.0.10", +] + +[[package]] +name = "system-deps" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" +dependencies = [ + "anyhow", + "cfg-expr", + "heck", + "itertools 0.10.1", + "pkg-config", + "strum 0.21.0", + "strum_macros 0.21.1", + "thiserror", + "toml", + "version-compare 0.0.11", +] + +[[package]] +name = "tao" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "core-video-sys", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "glib-sys 0.14.0", + "gtk", + "instant", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "raw-window-handle", + "scopeguard", + "serde", + "unicode-segmentation", + "winapi", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tauri" +version = "1.0.0-beta.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09" +dependencies = [ + "attohttpc", + "bincode", + "cfg_aliases", + "dirs-next", + "either", + "embed_plist", + "flate2", + "futures", + "futures-lite", + "glib", + "gtk", + "http", + "ignore", + "once_cell", + "percent-encoding", + "rand 0.8.4", + "raw-window-handle", + "rfd", + "semver 1.0.4", + "serde", + "serde_json", + "serde_repr", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "zip", +] + +[[package]] +name = "tauri-build" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9c9a9bea25b9d6f5845b8662e18447e17218f99860cab37e39e2b57a9fcd49" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1663739ab53e281919676f216fb56a031104d0d2cd1a2dd5b012d279bcdb0ea4" +dependencies = [ + "blake3", + "kuchiki", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "walkdir", + "zstd", +] + +[[package]] +name = "tauri-macros" +version = "1.0.0-beta.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddf9f5868402323f35ef94fa6ab1d5d10b29aea9de598d829723aa1db5693b4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "tauri-codegen", +] + +[[package]] +name = "tauri-runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c52eccfb7f2ce5a09262bdc3671f0f07f637e27f8aa25e5f38145cddcd4e01" +dependencies = [ + "gtk", + "http", + "http-range", + "infer", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "uuid", + "winapi", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fed8dd0a448c303fa764859d6dfa1c746c4f2c6c30a83c162f8bebb12e4af4e" +dependencies = [ + "gtk", + "ico", + "infer", + "png 0.16.8", + "tauri-runtime", + "tauri-utils", + "uuid", + "winapi", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb9b79594f22b6ed0cc8362e0dfde5b7969962de3cd8ca683de702e59e8221b" +dependencies = [ + "html5ever", + "kuchiki", + "phf 0.10.0", + "proc-macro2", + "quote", + "serde", + "serde_json", + "thiserror", + "url", + "zstd", +] + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "rand 0.8.4", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "tendermint" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0752808f59b612916614e92e43be64e9ba566b762a266bcfcf7dce1b324e9319" +dependencies = [ + "anomaly", + "async-trait", + "bytes", + "chrono", + "ed25519", + "ed25519-dalek", + "futures", + "k256", + "num-traits", + "once_cell", + "prost", + "prost-types", + "ripemd160", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto", + "thiserror", + "toml", + "url", + "zeroize", +] + +[[package]] +name = "tendermint-proto" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfd0371c6b0c7fc4f6b053b8a1bc868a2a47c49a1408c4cd6f595d9f3bd3c238" +dependencies = [ + "anomaly", + "bytes", + "chrono", + "num-derive", + "num-traits", + "prost", + "prost-types", + "serde", + "serde_bytes", + "subtle-encoding", + "thiserror", +] + +[[package]] +name = "tendermint-rpc" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fa8d172e3129802d28de980531993dd25cc01841c5bc8fe4a87c7750a7f222" +dependencies = [ + "async-trait", + "bytes", + "chrono", + "futures", + "getrandom 0.1.16", + "http", + "hyper", + "hyper-proxy", + "hyper-rustls", + "pin-project", + "serde", + "serde_bytes", + "serde_json", + "subtle-encoding", + "tendermint", + "tendermint-proto", + "thiserror", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tendril" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "time" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde1cf55178e0293453ba2cca0d5f8392a922e52aa958aee9c28ed02becc6d03" +dependencies = [ + "libc", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25eb0ca3468fc0acc11828786797f6ef9aa1555e4a211a60d64cc8e4d1be47d6" + +[[package]] +name = "tokio" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +dependencies = [ + "autocfg 1.0.1", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-util" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98863d0dd09fa59a1b79c6750ad80dbda6b75f4e71c437a6a1a8cb91a8bcbd77" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "ts-rs" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "369e48de67506679b3a576b0faf666fa9f9acf2fd00b4c61e28bdb6c8e08ec06" +dependencies = [ + "dprint-plugin-typescript", + "ts-rs-macros", +] + +[[package]] +name = "ts-rs-macros" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f269e8fd28e26b4cdbd01f81f345aaf666131511e54a735a76a614b5062d0a5a" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "uint" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" + +[[package]] +name = "unicode-normalization" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c8070a9942f5e7cfccd93f490fdebd230ee3c3c9f107cb25bad5351ef671cf" +dependencies = [ + "smallvec 0.6.14", +] + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.3", +] + +[[package]] +name = "validator-client" +version = "0.1.0" +dependencies = [ + "async-trait", + "base64", + "bip39", + "coconut-interface", + "config", + "cosmrs", + "cosmwasm-std", + "flate2", + "itertools 0.10.1", + "log", + "mixnet-contract", + "network-defaults", + "prost", + "reqwest", + "serde", + "serde_json", + "sha2", + "thiserror", + "ts-rs", + "url", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe" +dependencies = [ + "cfg-if 1.0.0", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73157efb9af26fb564bb59a009afd1c7c334a44db171d280690d0c3faaec3468" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa" + +[[package]] +name = "web-sys" +version = "0.3.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e47b7f870883fc21612d2a51b74262f7f2cc5371f1621370817292a35300a9" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys 0.14.0", + "glib", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66ccc9f0cb4de7c3b92376a5bf64e7ddffb33852f092721731a039ec38dda98" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup-sys", + "system-deps 3.2.0", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webview2" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b132bb76313456e93b17037262a030d54c9fe0f11838ef1593f845e3807ef8a" +dependencies = [ + "com", + "once_cell", + "webview2-sys", + "widestring", + "winapi", +] + +[[package]] +name = "webview2-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b7889e893ac4c50d7346356be3ce13a85e56512c38b8fde0526559b8012a4c" +dependencies = [ + "com", + "winapi", +] + +[[package]] +name = "widestring" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" + +[[package]] +name = "wildmatch" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "winres" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4fb510bbfe5b8992ff15f77a2e6fe6cf062878f0eda00c0f44963a807ca5dc" +dependencies = [ + "toml", +] + +[[package]] +name = "wry" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9549393a3917b5303277abb0267f8eecf9fd629b25f1c04e5284aa58b61915" +dependencies = [ + "cocoa", + "core-graphics 0.22.2", + "gdk", + "gio", + "glib", + "gtk", + "http", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2", + "webview2-sys", + "winapi", +] + +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + +[[package]] +name = "zeroize" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf68b08513768deaa790264a7fac27a58cbf2705cfcdc9448362229217d7e970" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zip" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +dependencies = [ + "byteorder", + "bzip2", + "crc32fast", + "flate2", + "thiserror", + "time 0.1.43", +] + +[[package]] +name = "zstd" +version = "0.9.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33" +dependencies = [ + "cc", + "libc", +] diff --git a/tauri-wallet/Cargo.toml b/tauri-wallet/Cargo.toml new file mode 100644 index 0000000000..b9fb14e41b --- /dev/null +++ b/tauri-wallet/Cargo.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["src-tauri"] \ No newline at end of file diff --git a/tauri-wallet/README.md b/tauri-wallet/README.md new file mode 100644 index 0000000000..db954805b7 --- /dev/null +++ b/tauri-wallet/README.md @@ -0,0 +1,19 @@ + + +# Nym Tauri Wallet + +A Rust and Tauri desktop wallet implementation. + +## Installation prerequisites + +* `Yarn` +* `NodeJS >= v16.8.0` +* `Rust & cargo >= v1.51` + +## Installation & usage + +* `yarn install` +* `yarn dev` diff --git a/tauri-wallet/dist/.gitkeep b/tauri-wallet/dist/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tauri-wallet/package.json b/tauri-wallet/package.json new file mode 100644 index 0000000000..0c8c172fa3 --- /dev/null +++ b/tauri-wallet/package.json @@ -0,0 +1,52 @@ +{ + "name": "tauri-app", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "scripts": { + "webpack:dev": "yarn webpack serve", + "tauri:dev": "yarn tauri dev", + "dev": "yarn run webpack:dev & yarn run tauri:dev " + }, + "dependencies": { + "@babel/preset-typescript": "^7.15.0", + "@hookform/resolvers": "^2.8.0", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@material-ui/styles": "^4.11.4", + "@types/react-dom": "^17.0.9", + "bs58": "^4.0.1", + "clsx": "^1.1.1", + "qrcode.react": "^1.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-error-boundary": "^3.1.3", + "react-hook-form": "^7.14.2", + "react-router-dom": "^5.2.0", + "semver": "^6.3.0", + "yup": "^0.32.9" + }, + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/preset-env": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@tauri-apps/api": "^1.0.0-beta.6", + "@tauri-apps/cli": "^1.0.0-beta.9", + "@types/bs58": "^4.0.1", + "@types/qrcode.react": "^1.0.2", + "@types/react-router-dom": "^5.1.8", + "@types/semver": "^7.3.8", + "babel-loader": "^8.2.2", + "css-loader": "^6.2.0", + "favicons-webpack-plugin": "^5.0.2", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.3.2", + "style-loader": "^3.2.1", + "url-loader": "^4.1.1", + "webpack": "^5.50.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.1.0" + } +} diff --git a/tauri-wallet/public/favicon.ico b/tauri-wallet/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc951a1c6f2c406072df036cea6e73163f6a687e GIT binary patch literal 5430 zcmc&%drVtp6tBjAwtraU57|Idos~Ef+d5%b>g&1$p%NeV5&G3m5tT=9hdq_kQ=B z^E=Xx-n) zt#yjjH3Lnu{O{}%;^v}6adT0w`qr*D_ca-f4$)@vo5?uW^6<56{qN!y1~PI3zTLhSUpCWL!`J&HO0On^xEC|`)_dLgKOS*tgq5y0@uh0 z;BSon*P>z|U)tMr;?xgzW(`wEUmrAoa>L74Ra^)Q3kz_+=Pvz?&8tfN#-3i>y2xH* z%bzYQhJTT4U3C?F{Nc3?^0K6+#m(f;RFu-PZ&y{)wrnQPWq+@&hnB6aEcfn%OCHAC7^bOZ*PQf7!rS;)nRo!4?-g)PewDc!POtFA4GSVmZnHXSG z;ekjcH+#8G$ME!7d?mJE!QPT}aQwl*45$+e4ZNutwI3yn` z0IjMMj9Q1yq@|(*v4ObYjL*I3bY+)zKrCMn0`9u|rwa?yAT^Yc(|F?d{Ai|c zO~d%f-~My6(qLkIjK-RGyP-s{q4yC8zBslB zd36MWpA@6U_{*W-Yffgt)Z`?MJva9l3e-w3HuhPN_(Az!C(VZGsVN%!@$4*^@)SPU zf#S3LA8`Ctn2j(qGfiX9&dh+3kZ!;Z6yF;A#`Yxl2((_XGUgu2Fc|I$97>yN+wm-++a?{@tqL^a@6^%w1fU8+AZwk%`o z`V-^h;ZuL_KrI*-ME$*L0kVPJe~6!M|H0Vc+kgFx`mdrO`Y+42`Y*-?OmY9IJ~z~c z`%jfm|5@^+|J1JbpJ~4Rr#|1&ww?ZyZ3BMB{kNu?GHI#@Tb}gaW2paLM*a7)u554& W_upg@)k0b*(@yr^>+RU-_x}JZi=y2C literal 0 HcmV?d00001 diff --git a/tauri-wallet/public/index.html b/tauri-wallet/public/index.html new file mode 100644 index 0000000000..7255670d07 --- /dev/null +++ b/tauri-wallet/public/index.html @@ -0,0 +1,9 @@ + + + + Nym Wallet + + +
+ + diff --git a/tauri-wallet/src-tauri/.gitignore b/tauri-wallet/src-tauri/.gitignore new file mode 100644 index 0000000000..c123704591 --- /dev/null +++ b/tauri-wallet/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +WixTools diff --git a/tauri-wallet/src-tauri/Cargo.toml b/tauri-wallet/src-tauri/Cargo.toml new file mode 100644 index 0000000000..9737017ee4 --- /dev/null +++ b/tauri-wallet/src-tauri/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "nym_wallet" +version = "0.1.0" +description = "Nym Native Wallet" +authors = ["you"] +license = "" +repository = "" +default-run = "nym_wallet" +edition = "2018" +build = "src/build.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.0.0-beta.4" } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.0.0-beta.8", features = [] } +tokio = { version = "1.10", features = ["sync"] } +dirs = "3.0" +# url = "2.2" +bip39 = "1.0" +thiserror = "1.0" +tendermint-rpc = "0.21.0" +ts-rs = "3.0" +url = "2.0" +rand = "0.6.5" + +cosmrs = { version = "0.1", features = ["rpc", "bip32", "cosmwasm"] } +cosmwasm-std = { git = "https://github.com/jstuczyn/cosmwasm", branch = "0.14.1-updatedk256" } + +validator-client = { path = "../../common/client-libs/validator-client", features = [ + "nymd-client", +] } +mixnet-contract = { path = "../../common/mixnet-contract" } +config = { path = "../../common/config" } +coconut-interface = { path = "../../common/coconut-interface" } +credentials = { path = "../../common/credentials" } + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/tauri-wallet/src-tauri/icons/128x128.png b/tauri-wallet/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/128x128@2x.png b/tauri-wallet/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/Square107x107Logo.png b/tauri-wallet/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/Square284x284Logo.png b/tauri-wallet/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/Square30x30Logo.png b/tauri-wallet/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/Square310x310Logo.png b/tauri-wallet/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/Square71x71Logo.png b/tauri-wallet/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 zcmV<12PF83P) zNQT)H*aaHEvPo@cmXa#lOYSVWlpR1nAeK#0OX|;=*_qi5z??aA=FFLM-4Sq2kUOhO z__7Kf+yUXO;t~3LY3h_?kg^Ly_=vx^#d`M`3g*hiK~ZY3AT~jwFz3ZcM?f3JYN1%a z6(!V_i6eLKHt^>r*a)I0z_0NJhQk($6o5l!E{?JkPrSxoeQ-;Fqc_D`_YF8=rsANr zG)LA_971eEG~9CGYBLi@?p9m)@)Tx607JQ+*Ue@kj-@a(D+T!4#k)I>|5h&OqgB`h z?c4$tE)KfVHvW8WK2f$Y7BwM~AJbeyzOSy~m#(8wbuiN%36#mj3KfSHV@MPU&upJC z26nV0*ffeHL`yvW^BH8IFmcq)d*U$Vl;hFt@(S`@2NOr}7Sd+Fp?rbjZ-XVpiL+ZJ zVf=)*k4NU-1sB(fAHUA1R4M)eyT=i=ZEY{1xRDA;0LLFcXEjsGBO-LlIJ_9C(9GAXuL zTaWXYBX?I{f^r>rHH*sm()GzY;)y_KC4pG$l!1wRaq#9`i86Kr+wt%Lp<83lq@x7B zc+~kD7&vz;-52pYhf9^cUJaN~#g4OG2QA=;{?W`wITJf(pw%Y67s?G_QcOUGi6G6& zes8BV2#>7foT{<4uXDpmrPUS?Y#N*Dc@w_-L=?H*HrkF$d z3#j0$2Sp3K2%hvFtymS9Sa)qEdq;w&zs&Xs0O0ycQ zotoD}7%D-MawgdX3vAu0raMUP)Mv~{MWbR(S_xv|QUu#_sO6A2bqlWvmiXwRRCa(P zrkd;tCrIm!27Jr$U`;uIDWY{FbGBTGA*OV zaq5*ndh8t-G|j7}W|J`FP8pl}HkPBUggH&DxJAlnPY$8scRI#6B;VhC88^|5Yw+Yw zFCZhin_c2;@Q?8%idU?`0AtcEb2~yxj9bROOps?20l^aI_TFE9(tF{z-yMMgA%zc2 z&=P-y{B&LH&tZx4DR**bcD>1&f?pVFQJX093q$1Y1bU|txk2hWkd(uZoI-_?$%A_< zj9#-AT7##pEbqV(?3jbINuVFV+y(4ETyBH8=ZjV&T43g4Od410WtYMbY;mOUw5}mR zm}em*yjgmZBrt*Rwfgs$&57DLxX0`84J8Wpfr?mqW>@9Q`v=b@3@>-;s2ay^AGb|G z<6sHfKvDhCp|(Ve;bzEcvl3O;*J%g4%2fpH=m(LF-ZdyZU1QbHsqFQSE-uy)Xaxb* zSL{BCOVmU2;8(hf{{5BA37-zT*~-HPxP<1#!&DztK74BQf4R+BWyl2;uM4NAH38ll z)?^!My^IQCPqXx!6D!LZt!(O(KGg{Rd}Pcg?FQ!DagHC3ltZvYG*|f@ACA5 z(y$gMwjP<7kBkLc{{3_A^=#U;p=LeX-Jli8g)Q4S zGsR5xg_uRQNQ?m0(5Dd4a{mz+l&#zm6l9G~=l9G~=k}HOSD-3Se z=jhwnuK|Cl<(>yq#FY^_60{B#=L!9<4oE+T!cL+`@6H3nF8HuR!uOycre0(cw+R)s zrXgw)9=+XH;QO7tEq!W5CUINfkhlOY*hZ-ijQkgQi9K~92bSxob%4Nfvqh88H~~nx4}GW7*L4jK^Py8nIo~x?+DryN$BTbk-|idT*N-e1Rex&uYxV8 zs;+vp|9Rr`zilkh+9til7D(?B%R(0-awITYu&enHvQ*rlq~fJXBoGMhV~fOV=|9Sz zk1j^!w~cK|E}ELFSzIe&R%qSO0o{x1yR+jkFgySCIvN*o&;lgREZ5PMw8rCoZ%QaX64C6^AXjaDf@M)O$fvw-Xm4 zt^`?V3UU)UuwtamC!Smc9uo<@k+`s;bllrS^0Va7iZ6r1vL1bPqV(2-93i1s$!T_D z7tto2#+s{;0~f3~jCJXYVqMD{n-L>?PJ6{s>>3BCj-7BZCXma<7nLp7)5N-2qp=YV z=uVqAdF{DaGK9W%ej3I74qbe*Ru1bXZOmb3#=x4dbdQe->(6ixLJ_>E)#QNzWXYcvW6ai{SG;$nFpf0nwv+(Nj!yGQQA zUjKFVWcY)R=mSTSED7eq+Po4|hgBUmOg zkxAe-S?M+cy74QOzJD{YBEl8BjD+U{A(=!MwcUdbDtM-|mVC1Zx*)wlldbxix&h}~ zRB>33<*kdnuy;t-t6PvK<3wNI%9No1-|!#7YMWLcVAWl)1%p7~kc$3Nj$`HYL?M?0 zHxgEOAjF!;?1ND$Ef*2drN7=hd~o}v;4!>O3aweAlzARE_O}LilNFK4f?FK>YAxny zg2e4Vs4e$@uZb#ffkjd|RPYdw(%@GhA!(do1fM}jYLPj~0OjZkyfM7?RV?ngr&#W7 zX>~NBj1Qz>{1lVP2ySYTM{2Z|9H#MIhAaKWJF8x!k$U$IIvSxxdzUT<8vqS)N*xyF z<7b`?NEKahvOxm3lGd@nhY#*Zd~YHoV28eSq9K;?>@rv3-WZouE6y`|u9yYXY%m~Q z2&dzR6|@f*?FxME>BG)S>h6kG4^pWuFu>SduoXjcxYq42)?UC>ppv++c&4o~W06%- zxJK2rAr7q$?q!9R6{DG}V2niO%37i?c3{JM_^St3fp9J_9t7h%(n#c) zI1GAp+(Mf4lE_tjdT?hR1hBxA)FjuQ$)d=r+mM2As#CFx(5bUnnd%h#WNL!Or=6fg zSrK0}ErG))U%UPO@26l$bbO7cO7#j^KK@~2RzxhaN)kiZv!lDBr6utA>3wGtgs`~5 z;JIkJAKSK$3X4VN4Jr2bC=;11U)JbUFc&34T41-n8HlSr*&jTr9Zr1O!FrERIr{b1 zDBgBKiUUj9Yo+yH4%aLS%;Y-+{sXhe$40FlMCA&W3q&RhZuYEasfCVd9na1V$R~po zrGm42x@cZVTpyFZk|kE=HRcDjk$NCS2_`F5;_C^+w2TC1x+ucV%B0sb2s$ib9Bd_un1t9}B+W_q;KcXHeqea5`f}#vwDo;9E(yh-Bp~2o zJ1Nz{OB2MFJe;k@UUh{iN*35uR)R_oo=Nz~RRkam&4m)cMMec9L)|06# z%}rAOmFG@q1~y+tYxV$h!wE+OQ_4x7-z({de9*XF4mQVf1=dWz@46 zg>a{{Gg}lEOcsz*-|DxY^8T0`EjT4#cz?KFJsuq;l?ZHMe4HWCWw13vwc$OS_n<(= z7R%@GcvBwlB_<_VQ;ah{M0~}k_$Mx4Ylb1a6!{cSN^b4;TaLmf6tUFtWatK_6f^cE&b_un2M|G?W_mkF9Cw)GzMsK>bTBr9#h4x_TJ_mxiyvpcx z(mHY#ojg0~sYK?TnQqBW;=&w+W((Hou&^&4;V9REo74rO)9W*EFf?P;`-M{5ebqtk(uz+ljul8XxR$4c;uCf zPh2p%Y@JJ++Klp_Aoy&xO%M?I;pL*n#;l6Wme+33E;?q zyB_qeHy|InYJ`nx5}3)GqQV0000N?3#xh7$lMzK8K=2xV( zktZjJ6YWNPc&1V{V~9QO?wPSoe)&new!5c$`gL_xy=nl)7-I|@5S|!RE;#(*f`XTT z%IP$>fC3K!xWbiM1xA1;A;OEF0;RS9X&Hz~*wF&SQ}Ba5Cgs6^7&#F-f3wB^@9@_t z$O^=xK?#kFNN9x|9p)QaAUVyy&=;T|sk zwhJjSG?B<3unKw-yl^_;g;(&W>UnIOJn!-fHn`t4%wEFf+A*ZS@I>Cf;p0RlP0s;G zB{}b{#5u}^5^sk1l@se~@i8l=@tL8BbQW-^>Dl6){24N!b39M@YXN#!DArs_8n0j& zM7tPYQf3l@aMuHp1$({Ify*S_r11k239S(w1##jdA;7!m4npDq;V}$oy{{vu+pySJ z7!XWki(gQUJMkz$=Y@S<+E!0v+E`2_>}$m~UZ zH-FM*u>cn2AtPR2G@Z6;pKvrONJx2ntwR0z zRj_HCj7Ti`&d}?{ep{75CX38{XcpSwS0fTBLDmIK(TCzoZBGDy#h(QWQWFtNkn+nc z&HE=LXekQxj*eiAG$2mDRQ&_=D~l7fDuh%-goKX<5(vBP$9+U0P%XB-$mzC<2akVu51 zlgo=P^}d5VpZt~UrEfh*fsW{#ruW6=u)(J*o0#lK5~p_(u+}HZ7D4Ej2dH+vxAPuk zL~0d~!_BUM7$E@bSgVhSZvgbx+-!}b>xJ1=HNqeWHC(*PWG$B@<*gR+F<6baDgVwY z3MJd;Z`$GcZY<7KAOo00fqkhzNfPWOjkQ{Ykla{Ht-kb~(Ya?X8wdH@_Mdzl%kqzZ zH=W3;i3t573JATCF@-e*3E{UlQc00xdQv0{%aqOD$H~cY*mkN_V=|LcnYGw~mV|^{ zf^A3vJCRrjL^8*6MBLD}Gnr?%FSLCfE3nEXos98pqB4$55+y*To%Hp^?@m0=^o#># zlQcSOJ&^DqC59_?JGhygkor0+MRoPyBssdv=ttOB9g>F{=5yuOz}46V&w& zb7%Z<1{okpGn%*@BeMw&Uq4`weLC;GC04vZCMN~FHmn!ET^;!t{M z=&o?zkssvFyM5mj+0|(Jpy#B&oYVj^Dir- z2+^5u8u=)#@r}uT;vy4YOh@+Jo~XWb@&88ok_Je<>CeaphA(VDzcbpBxnEt08?I0 z>ix?*{J$3j<>gv#?Yss6VE>bs64&s|I@b5n(9q7Xl$Dms(*YwddBjV@rQz;`-rn?< ziPkd*Gpq6{-rg#L7TnoO-g?UK=y75|_3}V8P(e#xSzaFOUIl+Z&rTX2Swjt7v2O0X ztMxR2nn)WBP330fH0vh(Z0%eiEHN+nyrXSn-`2MVM%z76xsM$2rPK$bkCXr+_Z2vSEmjy% zM=(?o)PktK2qSX;iHObSZJ~Wz7~uNQkh3cjXZ%6#8|!Kv3&B!+oh`+*2dF3=si@#j zA~F027J@blA_Y>B5~ikhAjVlI24%eg2vmsC3l%=&QwKLpU3l3>)K`v~z13QBa^pwQ zO#!4608%}G)F24;umFz5`zh%eHMJ}zKl=G1N51(q)K`OxxHz9HHc_cRUY0^}o|$eH z-q{xJ-RMPJ*sTqn+l4rdlfV|xU_SgXYPk1+i;C2mCTEVxll%gIiNjv3V}JuS{mQI{ zi|G7{;2Ghxs5r*KX!>b1Gu1rgJ`nPe7eG+>PXE@T{T@a6bZ-A$vs&s}y&@vh9l&n~ ztX=_ZFChe0Y&6mw?uJr`J_RQa9*J6833;X9aeSs5XTzy$VY8rHcX$rPEy*WZRDO}oFksvcYo3Kr{9EcZo zy+esI08j`Z{qg{f7!HM<@Q|9C?`&mJ-6?KG-|qXyQ+}BaB?^`^-|=Cy`24G2qmC3M z&Hxx?DDJ!7>UA3yJWWdcQ`!QF+CWCPCunFx-TS){59!)jg7$d zh{tQMyLTa2bX&CXD6Uuqav+x7u)A#sQPhP1uq1G}`aG!`QNd6H7ghZm# z8^4ahn^GnT-VRdx-bS0_eQ3^FahVf{#(}WRfieG;Gfe$1Cb5$%w~YR(L_|t9vQ55$ z`cOAOH#|(u;P?}+jW3|QQ(SM8?yz;orr@EHV`$N9#v`IBW0H^_7R&#(Y&OLHj>4v1 zaGk2`0=aAzea77AuY&R|3axKZ4PUC+yz>6%ZE~0*&$xz7U%Fnm-{dy-M*szn#z#EnvS_r-N+Fd*vJ?AGGY$>JMv(5C|G#e<%=yKsH6EU0CUxdB0{7G!5X=b2q_F1X*D5d!Hhwism9H@_x zxmd0!AFD2n`}g|aLWgZbVE!~dT|xXa!d!QH!S%O*FDlc}V_H?x zQ>E78kVEJrO$0bABB7)Xso$**7@Qm~jLzZcuby=xw-hA4S$*w7_74lVtN{4(Se8}bU+{wzq8wQ9qdk`BO~3bmO`^}zKcv10 zae9mt+tu#rJ!7=?OfQ=pkp_$!BNES>#=r?U=@F?N@O*<9dJ`@gFb-@^9yC*xyfUXr zNaDmpnIy%SbcROM>xDNV+f>oTt>!XwYZ;}C?|n!6(Tsf5rkq60WrPr_Vw*3lK)Swc z2xjOc@9SdL54ib>b+%vN=H1Yop%~sr8i_8qi!u% z127q>mCDaA)w-!o>`ujQf%-l}2+|lCE5BDP)HsVcfPNg#1xmfTa;X}))4j-Q+0x-) z|8E=TS-XMmu7juFX{-9?p(+CGL?1de+tF z>l5FopDAPt0W#D;(%ATEX6y{+tRsBL&KJthS+bA)pfx#74k@J+q3)BXI?~uvT)%+= zHin$;t+EytbN!jCYCjrsvW)$W#a~FVZuZ?i?8G8Us9R(Ny+qVN9IiRSr{ca5qrje@ zs4|-~ysyt4xLukKH~*Xvu6nT1D_AG6m|z=5;j7p=e^VMSX=?6oswO-l@$T(v`Zh1j zCx10`BQGG!j&uV7>~YF1Ca@}K#y9oJ8wWyF21-X)4xK)Pu8*D+?!9f7{3;Z-;xe2I z)~&1feTrVm>`hZuao<}~f^BDe-&0;jzi)ms9!+))ep162#Ca7F!6dUyh{oWD?5pU) zBN@_&hHk*#oNzDLFKjp@F#qcdaOY_l0 zb8RV)^y-kAVTY0h(8~o_Q;T}+}Hd(Fhi5l#V9a--Gu<#bGQLG zRB!0keF`TS2xM{*Bf0X$LHnW>+9B_a!pO+J`r)x!g-G_HKz0|51_St(HcA<)Zil#CcQF)u|r{;pcsV4uN_J72Fq)!vE z=!@-R4~>>C^^R(l)xOW00N_7_>r)|Cq;A3cw5c*Gnvd@j(w+>>H-W!S&2KylJ#$=Y zUwag8H<8Wnr=sIM6Ee?5eelh_n%$;CSNg1L;?llVM9pPq<9+^jtv7l8m7G-XnmBXf zPqq+eTy8Z6v?4L1zkGkI{Y*kf9r}FWA+c_GZ%|Wb`O!psUC}kcK~8o<0XKCLRVE>@ul&x6j;qG_BAZ zuk&SJU91j)20E>3dQbBH-SIeXCN_-BUjExo55hvs&JK*!9{!94dVSGpw6pZD4dvY5 zVNyu5L@1BZEMRFCGfp6~VG<_4()f@*Z!WsO9gRdWamG%n^f?XGz?P!$ z0hLZdpFTPV{DB9$N~`ky#=bEN!X%W)WG+pcbr>ynuqum0*$}GgmhRl=2tQqhO0F99au~3?%xWfiQd$+o8n3v9s+alLZ#VR^?V_(^jz!C&Mj%g_ zah>W^r+M(mj=fC`sur85D_nbxC9}BJ`dj+fo{F_#bj`oLdhUzl6jnoB>Elr~6ZjyxXf*S8vEld;=%hEB5Uyp>o3%;p1OL6c24XKlt4wRGX^rwY(`NH7GOOkg(QXJ2%Fv!Z0en z#utT384w>YJpKDix_-@wAFe)bZbC^XNfFN>Xq#@BK+2@wE|L22?NClcV|A*1d zH8aDSo~C+xzi#pO?{?G5O3?&JtR-L(a+JBV3WxfvV+!AY2K`e`G4CvP`R|@pEbU^d z?rW(MY+k}-Zf@`0>Y+T-;Joy~Eo=JAuGw@$^t4^!m9}pUr#LQ!faV?d!fP)NY2&tD z2HTV7E)k8_Ub$t489h*(yugS_rL74odaNe}-fe!{j3L_YfuEJ0h^Th8QM=aCb~ODj z`qyhH|J{@}CHFCB=Ar4sLFn$v$CahNagT{7^AM-P(u5yfiZtNW2^-CDAlj21KUVR;qrm^t+xh;AT^5OT^ z+`W%N{~eBf^7lxw3R>kT4Rt8axqVBg9 zer9-uG8R>m^HNMEL&z)j9(Hhg^9u=0si{Kk+)rudh=RaPdzS; zk!H=XE^3Npsl^WEj4(HUjNHu1>avgQ}+4J4vct7exaW6pcZ>81gl&*+y7 z4>23hz;Gh>Du%pjffq6WATO;VRV`r>WNpgH4*<|9{vW6V#ETi?f2f0g(GR09Mri+= zI>`1g&|GR9VghN!uT|g`M^Nj;8-YjD(no01<#R3)N4_i3r+1{&US$0%Au^T4lLoWC zFa{7tX0&M^$LZ1Ho3%}so0a=tpV;^KkOM!#@BBpn)DUz0$-3|Ksrq)K_a}nYT3%6a zIx(f8h>p!#-mwU!L-YF}J7bM$j`kY=LGi=e2KA)9FAlXonM6#oHKWbFnCT@HO|sQI z$Ij!sk&gR{!XG@w)Lpu>1(+<~`o4ESUR|gyBDUH{T(1A%sQG6^v0SXySEEpuP}3){ z8Lj6C)Nt{`?&3XYgUrDae`)tCpojRE@HS8&M#&+_O`$s8OX8aPqUe{SOx);?DZd!S z-)i$8%>PD?k~k#!lW5cX%?Sn82m-on00w>IviOM4!w{$w1RS`*1OdMVsBF5wkA3w) zj!3BOdL}m44DX=pnqRMQfk$(Y!}h7CtzZdIZ3S>5&JcSzPq^EJLSbhTa1@|;4=_*% zQx4|oR0RP;09ov0Su%|UiIKx zK|mPbmkS7-U(q`XhY}H#zyz2+!vU3B_35vN%x^p%WM#gb++Qr)u&Qc*_#O6B*GbY6 z!(aip(Z&Y=PC~(8$bY{E1M5g2Na8yFa751tcHZAWfHD9g`K)Uzd(-J%h4)EE*={@R zBv)6w%@C$ah{zm<0r=&hPJsx?m*~S0JEfwN&N9W72SqLl_trZ@S3_T@S5%l~n{rg6 zti`^5neoy4ic<|4OWj4?uH{UoG=aiRx#C9FPM&mSLQi~}_veW7D)=di2(cXwfMY>< zR1nUWq_)7*^e|-}d4)2C=T5j)DxO%jQ0Yn|0+`DxwRNxi==5~;l(uWwS&9>}M~G9O zV9);jIH5D-L-^cO82`BvhV{(l`CRTVKbP!lb^4QZ6+Z)6q`I-eHArczVKQ*oORjr2 z%-Ll2q{p`o!Zn-xnml4|4enfyX{S(l&wWqDVJiZ}J_22+bA1kT6<3K9Z?)nT;` z2VDA(4M;gpWj1o*HG9~V35?HbCxugQ(0Dnp(K%_e;*W!=dSkGR2}8Y4Nto-YqtD@K zI6Z(3I2;5t#`LcFBTbk+!(F&yS%e7YPK@q9eU#B~K zSU!we=VE*+p~#-YJY2p?4%n+*(=Sw)`cz#weRB`ZYXC(rM=k<}8xB}D`~EM1``N9# zWMx5HZP~*GEtn!oUZOd9iA5sd6i4?{n_sbXa02}^NUa3$Z3qJTRX>3wfv{)Wf}SBbo%KX3FDv-BVP9FD9uNOASj@q^X?l*Buz*;gKXoIX znt4;UR~=bbNqte`?~2WyE|4JrtiFBuJF%%_20D`H<$dIwbR=kSGzM_R#-S#F%~9&# z%{f|sjzV(ZA-0LG-g?g~FXb1{+E+664It-CdhsKAggD}*9syM}ec$)6t8EY5KdpVa zFYJ@i$rYeITJ-uQNtNY5xu-nQfgv?y%3mCOI}VWO;lqXWt63mx`_HBntW4Z#jdKme z8Ed4VOb{6yTss@_oY~FzzA9x1o@e)MaZp%4TFr#% zrcRc9tDfFf~4 zX+GpWlcU|=ufrRRYdrapG;>u&hYhQQk^4eYUBIhPAzmA>MGT7c>N|GLj2bXF## zd&+WaPb?*wtSxW(yKz%Bn$8;YRTq<9EN9V>vU_Ii9$lqf7*N$3;@0QxI%^Xo-wxodcmJd*!z!a;`G_Lo}P}e()ZhO>cv=J-4mXmuux}BGL z_!|Rh!dF>}zTRUt_!l`~8%6_P#QK+5dA{D{{W93qws;0iIr?Q z5nIT;)Lh`ok~15X8-ZTm>$)Krvf@Ot$lJ#U2B844`W(o>H~HTsOeZ)(9T*!!NZCkV zO^KlkMd|3U5Fb)Wjj}~GLck5kpJUBFL=s#S*$te%T8jCy%4lF-IwuO9-xmB`QI~BK zU{O^E%A{AdLx*#Pyu_jMQz-6OPd%XFbgayMe*_%cncnkCm$KmrVB`+ss+C~WR+kuFUy6lT3xb8z9P&ZcA}sd%=?XjeV3E3 z?(&7ecJR5zDDxjmAH2Tl3X#IzWZvw2il50C5Pc`vGvH{ul$VA81WLSs27H3N)<%XC=(ggs>9>ix3`q?;Z_1SPLW|d6 z(BT`Y@#6iGLSs^ew#h=m<)}~wm$5f!$!@aST54_+qDwSv$l44gc}+L31YU(Qi|tCe z$*)|&0Dv!xK|xX2z3U{7NGsQ5R!coiG^C4EG?JXk(2&qjL%&Gnd9H=ji+>3LLmCd$ z4xcEsT!Vi6RGngC7Lt8LDcgcvkri0X!0`w+#$^=QaR^NOIXz|m+LoWB=l|eNSQ}kd zHu#3^1WnU!^!<8nsxq5wYPw|bm+!XxiFt7;5#7CM7nC_qW-=27GYReqL|}vYz-CY* zJOYDzbv-f`3VrnRLXr93Z;pNe$;F1Y=48vRp~<<0Ye=(xcu_ZG1+k_s{(%0zmS%I&&a50)7;h+G-^0ut?bU(#TNnb&B3wK!Xf za>5#S->LaPZn$IIIx$k?z_`!`!s{7&*8mJ{%A1m>EtiJR$<;aW!UxJ;oE}Qh@1P#9 zk(`c&a?Gd|#$5-0wPq9mPo^!nC6=9UCYx&}-K=TJ_@6el`PNqD*splOdtivLDwOfJ zh4YPHse}}M-w=6Gq^GL)K7m%ezl58-qq3p|*~=F8GqSS6p{nvE#{P)r(!vLTKTcKG z@)!F7KBMVZme{=;IbnSr`I!pI*l$wkwp#a7&a(pa=LqU6iI4$H^KGD)9V`w=8-M2y4c%%(lN8cbqiD1~*9!j1$-mmF(aYUb|peEfoyjqm6X`Ps!=)HBn3ExzLZn zva1v!Ly#LgU{(OAx(TRdc-_De$X7hs#KR!g^H~!IQdHa1)}5p4D*rBrIbfxFe?VDT zGCd>aJI1t+Tr&1dinQ`l)VTRw94qtZo)qSnX3h>hn*%IsM*}9c9{B*8v3bJIL!#xr zcD^US(K1#6R!+!>O$<1%0VWhe2L-$6K+`DG0u$ttN;U4HW^rn(btZMlcB|a@zg}(? zbGP{D+o%s*lxB{8?%j?0h=A3?UqH=QF>;*&v!^G$?jvyG|vD(b7Ht2`QMb~*^fG!ov~`S!zku+YP;^pw|u9C zvcH51X8`A82El(~o9LKm3SeO1Et1)cHMMigR{bIg&T z!8Xgq6+iXdwY69Mx0k$wUd8zI$Y-M*Az?4I`2ufD((&<~udZ$uT8>bZ&j`a3IWU5l zpocC;Vg(29jdUFhE=F!GHx*$o^;lIB1kUxqC*~A~#=|+sIUaIu)-^1aMr$)x>1)kX5P$(gi1@p7bxzFGzdu|U zySfMbc-(>vBl_4S#CPWj`5D?n4hR?0O;@ITXQtwILM`3VEIlFh#unKe^2XCY(S z4YTxP1R}JMz#t6Fz>HE6P49P~2a^1^;gJ-OnXdv#oU3Sv~a)b=!PH zQMJ0*p5^G={{lVa2)NknS?xM|l2jDT;td!-d@)or`=X9DFWLWJI%*)r1AmgHLkN^H z_*?wqM7*gW5a?O0YSPvj3mS*HmdlCUC81WzE??UAo6HIKl{UQwvA&is!nB`tFm*chMKF}C$rP*G_6KOlZNED>@h~Mo6gsB z1U%&Y;SA6vLFu(Zn<>7FJgD$@Kf&+M)`9L)aqKqW*R)C zW?CNs&=>N7h~CWazJ7vHp&p;uan&$H#ODG5xInVds;mMcr*hlsBHu^8^`ND5E>H0M zF}=a;^sFh?ewE`4^NhkOI1|?`T8i9C7;N7?kRoM8zRM_Iv;hY^+Fi)r6n z=FH2Cs3zSLF0va4apOXuK|ftmb=h(?epK%#L@EX>r^VOvq5Y~S#+kO0_CE)@PmL#o@`uG*yp@U-pnnI$!!Qj%XBq9yfxnh|aRqh7 zr&9EY&5ti#N5=eJ zmq?voY--u@b@5@rwe0L14vnKH#C~g5e<;N4ZZL^aK~~V9YJ~;qnSTwuf~r%k9EEY+ zdc;V92a9-BZ&oLMVEr-~j#}Y~RaTHJjiZI?Oj*#ZZqh4UcrtOMsC?8caB$&;Lu}IqteS*KuG8AlIcxOhPgzw58zbv*0s z&PB}l8%lDYHnq<|ia4xQE#;>TuWbTVBrp*$fFUkK?}L2JLt=2O_l;ZLUKQ67Ckhe} z1PA4Bw*DFVeG zU#rJXth;2^4fESx6$-`+IYtJudc(7-)(YrObLf7U7t{%I4<3ce=B|C-;$>(gqHiz*QMyB zpXq0dyKvjyHD=$Gl)e&H5@uG1YMub!KMrW}T8@jqpl@V|{&=-7h)_a83JgsD_ZYO@ z`lRp7^@2JUn22PCits`HhWBW4|_1dy~cy>P$}EDltI@)*03ab=(-KVxypJ z_^I#vF5^adx^jv#(GR2`aZFV4J8w{Nh>dp^!IFmFWw12<5ns?Fa#TD7N)bn@g#ZDcp0l}1ZfH#6PmoMcClL4I0vaYWpB@CPcA zZO7ESWyiqx{;C(%KekZvaOVIT&d^yWD4rjMnjp8iq(yIO*$EUs)1lhrh9r+Z$sV(| z5#ySmVDPYyk>$y-;tGLCB&pYxZ*_=CjbTX&P<~T zZm|*m)E`Kun0=JIQ=?J!2UBgJ1kzpH&~QZ0d}8Wc6ejPlJm17@Ju0Ws_+(`irSOvq zQo97^%lqgTRyMO3_L_iuQwHN#S9bTk9_5O>uNEM_F^+v?Yr0zYR{*Kie$m5Z_Q_YE^# zoX)C5`iR?gHUe~kRQVjwFIHT)@wtgEnU>hQv?=`sS%##eWw1`g@CddNx|%6k4rNb?#^`bo)m1lTR#Mi^?#?)i z&8K5>6UzRC1m;p|l|mLf7wPe0$+?rB`W*5w&;J4lKu#-m$CQ+AQu(ww+M&qTzy)Wo zBp&_`y}-cdR6EidceRIhVdohed?{nA1PEX80OJEHZ|dHD305K2+6yFiFA_(8fY0mD ze?FHCrc*^kE0_n)O?ASx2O3*`ih)Zlbe>C%(nq({!0j z8-ny@-3j~dC*^m@wYc1vI}&qKKICutKJOJz)_ah2nxE#APITQ7fhV_v6!t_)5*xYm zicPMn++pO?X!Btb#(CJ=wRu?mpcKj;Q=3ja_jD2=F}R^(agV?o{S9Y3wUVT3xzQX} z7pkZ{8}rIfY5T?-mwdm!ArC|06;+RjH(*mzYZ5e2Z#nCZA@k`|>JJtayh90F`D&Vu0EkV*pg)&hd^UXg?&O;1s%%&wq~hxSL6z zsXq}u9p>ee##W&aLB>t47PM!}&LtmoVrRLZf8vf*7@7=Rsnjypl2^8_qL`h)yTLoC z``>YQP|IA|>ZCTL#uFb5NwNwpyXtwwVUR^5eRa2q zU8!kt%#(e38cC>0STO7u|D828&F+jf^X|$FjdLrhoMABR*FK;k2nOl3pX8vr6DOn5 zXDNqom};3v3XuW|AkuQWB&c9;peocIsI^tys}`o%ll$2*#Ch=d#%aaM@$BsEU;Sc$?9JU4a@Al-r`JBro-4{Q# z83u%i#Fl(mU~PFCBq6oMxhTjI{K$&srI#VCtFqX!nshgNm^c5Ow|PnN7!LwP^yr1P z7vEbok) zql3!zM-|KL`=_oHkrUN;J>OtrOr2@N7Kv{&rsuYw73< zu|)$BeWC(aaO^%M{g3gtZ~bx?3ANdBc6LU(QxWnKmwl@j0SQ{Snl*Y}-~7xpVM2fC zgKPiUNN1!GtkYbRGCc};6pu&cU|(R2eAIUqEuN9yGhnH17JUdpZ^51PyoPcCK4E%CpI(Gi)Yrw}0#j2L&hx=rHlaiQd05A+0+{c_Np%*1dm^d%c z9z|riUGi61vEPD0G?zz3MbC49;?0!HDcZpfkX+J=Fct~OW5?UFHp_PPuKVpDY@KLs zPu%9=j7b6v}La6U(5@z@5r+}!H0s(zz~*B^tFAnNyfJfzBY0MFA)Yh zyFcB#-t#jAO)Tk85geTZ%%A`=u$?r-$|m_=_%mrM+P<`KU5KXq?Xd840}qc7S9j48 zC$ojK{d1RGV(Lm#@kSuVOFaPVs6EA=(;c46=9h28@Ob5zq8Y->^3Qp=A*A)6jRbjY z)#RtU{rCkFXkhVuT1eNgR-+J2R9|V{9Z;Gm<e_d&(5y>^dtH;m#;m3d=|QaoLQF6s?gLzAP`-;L_Oj zUZ4iId$O!!thvHAJpda%2n>XvKPmGjGT;(geCuZ|c4k=9;{WOr?Px{;l+g2PICQRA z5W|Qvwi819+!}c)Q5b~wkwl&D>CsHI*5q!WNzO<43Uj3I1sYRLDl!@xoL=Tu zeOJ*MjxaoABD^^^mqY}^HpLoAp}!3jzcI=l(dud-{Vy9MucHZ(99WYkHgd{*_Ygq^I6o zhy_jE9?d2+erT6YW6w&A#jC1sHJa8tzh8N_)WhHi7Ym4iP6XM0=xJ{CT}lA|FlrYi zeBYY%sCZ>H2sn*r<%a0hXZ8eqd%SsA1;QmQv{wQ#MAjarj=ZG5w7=}6Rpjtim zWa4xj-OHlelAy2;WFDkA@x2Ew=#bg*;bKFk<_v8--WdORjMYxEya+E?>wFCXy);Hh z!~+7OkGuOt`d^AJhJU{i{x)EJtwL^|M#+e(Wf+|=g|oFJ{|sZKue7-FtL#G8*_?o5 zQ-|P9g!j!=|J=)|VkgO&2;V;sVPkjd`-P7_&q|6l9hcY(MLUk$eicM&>*Ktbp_Z&z zbtGjnTt75VQ`xEsIP|ustk_-ho6&;dP)NsJ;5*aw5X%wc?_yWUC4C|XN!arvYm9Z$j9`lLIYUr>wOhrkYMle<9U6~Guy zwIZ4PTJup{>7Ly)T*FA&Y))HS!>l^lxBl8fm(0$^{KM+c?Il#<8C6b5UhkXT8L1LR~I*nV`(bV}jY5r7W#w-1k^wajf((`k)n!fmC zQFE>e-_cQ%)4ns3f`rgt^Mf0;6*}c4L)CH=!|IkP=H=Gj|0^$zgB9Xs zw_OR5IK+;q=jpOBw~~52YV)4|wRRFq=}J0k$k{G~OTL?h>w5Wuwo&$PYQlg1s8!pc zcfivp;A!2PQdZ0wWjrwG9sg^Oq(2(XZ@Ngni$hXUe15o=NGomo-iYFyt}#OTifV^s zy6nx*ZF)QTFb}p-yo%S5k=KWW|qA?>Be%$%FaRDn9O$ zVKQ!N`;U!=c!Lp^?7H{bLJo?Ce}w7Wsu2B*&x=Ir|0AX1dIJEM8UFvJRKOQ2AmD$bR0b|(7B5C*|F4t^RfBwJZU`9ICWQ)= zD9c+5Wj-uZOgR>CKB8423t*Qw_)T%ctf+O`d1Lg#MKXdS*}YFY`KP3_9WC4~){nZ7 zc}WjmH7BGjJLkZkW86M| zyR%IGat^rS@L)`|-hbQb&_0#XW-s&Su!;EDsCn+Tw2e*1c;24Nx7(p&Q@=42Q+vUI zFT<#A%|vd1zJJYS{qu`|T8%Cb_{5DQPWwSiqLiH(8TYKo7Fgwa8f;s*%SGVkEX2 z4=nT{ksmpTobvz&>F0@^-8BTNuflhHJArygh?%p?nd z4Cr*=QVleDgLZ4lPIAak93q)o`_&@2%kaQE_{2p_QaVcT3v(O>PnC$(U!ytEPo;yw z1iTx0$QylGpOI*<3*i7nWUM%%nzoE3J_zs!q60mGVTm81a6;0y*O}ds82=(e0Vb~r zV@R(QD*_g}-?xiDU!AXC{rmA~htFh_ie_NC+{sjM!6LQq63+rFaW1EFSOR-MKK}(LJJPV^j>l!y`0yqS|FvrIfW+_@M%sZ z1g_e~=|43-EyBc{#_DlU0J3U5A+p-MkoY`k56r|6fCT#bgjmF>g+jleLI4F8RLDIl zJnArZbSc=zJ(AK{ET9#L0)~PF`1W~c9Vb6|H;6kJr`7>+fSqS$vmEaM ze(!*|M$_Sk!{7z}!Txf`D4qOh3kNo%kL~Y^$_6yNr^_9WnJQ{X-s$WFzUKVy+`#=u+bn7{JJB1RH8bwxAh2kI%HH4G0D~Tf<)# z9|OXdcMcb;cJEvxMgHU3KJwVEUbLUS^X~$XoiP)>k#=t@Oz2REiM3OWRm_P-Yd~of zo`@DPYE{@mF8OcpPYmD&hJvr>K%jqEWURyniVj3B8M%QLdV?zEfXL?Crh=h}zlo9X zr&4>vf;LBh%T*j`V(t9$&DC5;-xA1TS#<}(2_Y$8I3Q=yFSTU8In_y^=54L!I#u&` z8J>u-4A%<&CJ7Yy41mKB)p(#;AvoJpZaf(pKZ^&9%WHZdp-HxtNw=fiV^v3J|=IzTQep;Qo0?# zRa(4}almd)mlAJQ%@?(ovqY!0zyQa>HE_$4k>7tqR?>yvBayb$1D*_Yy0lKK&;!(e zfTWM5-VULxXyj6mVExSh9v)bIYngVrKS2bZMUD`Mg#ivQCq)A_0uZ^}w6Pm$=JqEl zpYt}1m9c-_uWff5t!J{XJy!?b;jv^plsq=(u&8YW)NlDLddg<2D>H3gQ=VE32eZrOhoT3;Tmd zL3+;8!dXd>6&~sDPo(6F#|lV;enGY~MzjQ${6k{JfC6H%%YQ6>*gU*QI#?hSATwn^Mm!eP(1kj18Q_N=9 zGDrO~>l!*P1%7Jov|P;J{a%VaKY#w95a7NnSV+z*6n#;Y8KM*i@5oTyfDGdm6p?O_ z0kgQr#_r@jntt6>mA$U`;aucC;PoeFPFb_H7ZSd-$CS*Wl;ESvc#q$xaJSW)s z{KKz1N-*DsOqN8$nCJw|9tSWu@0ZdJ1^|I=?;#s3E0nNm_z}ua%&*bwAG~_5w7+p7 z#R%;wECz<@k*uwgL`OeNnTXkuXemg-KRzP#bSEF`KkDFS{e7x6=4d_DR%1}Riov1T z;13{c0VPo)EBHD`h$C<*TY(gy_vXD&RUZpE>;3saTmOg8{;B03Jf1sqM}ki==4b8r znUjsgdQOC3K%|kmkn*LVj4SW1tIR8aK{_iG=Q%X(n}R=MDi8b{C{8kSz(wEYE{zHM13j0yoj2hraqzVvPbGA+vHp~Lw5 z!9b+#uI}ri*QW;=rIoybKd&IP*A!MRgNOrkITcb8JUYKZTb7$grb82NPp|J48-rzf z5C8%Rh>!pP0|kQ^+>!d>y(9S^+4DL|U+&kID^N&1W?IezPZ~NfWkeBY6TpwmgMc}Hk*ss+85jayk7O^!EiNCG#YVk?d0 z_87Y*4+;x31jzeRpeQ*aoWY@%RY=)qet8v)EJv^BfAr zrKdgGF1EWEUK%8qY^5ba-;{Z?S?opd)CV*qCd#V-ydala^Ik~2*Ydx~t93S^0kp2` z5|QVlbq=@eDX+~t%c~@c zPyiSY6ivDz-tz_dy3mF?4#UUe@tK$?|L2H3~^n$(Bd=7G+bamVjh=Cb}CeiA`M$l$w~8it6csZ zH+#iJcS6cdkb%Nw6a+&o$fO+>7C$U)EZh9@8B>4fOFw?9q}YyEWq!yhALQ?$tFd}U zO!6K7Xy(YZ$fwJRLl!1ru`mI5)to{kk|~eG_ALEv zFLhN0>$i+orG9v?Wj!5FX{ou?sBiq_#Ij}X@tl70(x?9Q7df#>{_d;ILu(rteyINx zSUnOHE>(TWk%%|-xAmH;-2IxAdcKe967*U(=gt%N_inCwFyMTpezCVF#+kXjB3cdP zZ9N#T;xov7uf1ImemkR%XQZ~CiYJnYe;{vIf#niDr$|hMC2^3r5NMXg89}k=RZZ-9 z&91?t#%M6hpe{4!u=n0Ue7#cU_TkH)O}ajmsqW%~yAn+KjqsW*=p9v|0o&IuUb=&=9#TiLqgFXqAhzEc*d^*hi4U9$QZm01*e zFGSOQrxkX#UYT*7?V7wwsMeLCBd5MP`J_)QGd#ws$|m=Hw%q+R+7ug=*$^yt|Jv08 zhg0W~E?iCP!*yxKDpo9Q4?Xl4jDAr+yHJ9;C^kvTN&HBVY-_EE>y!-t!f z{(JdZT66yD3x%BCJ5yr&xgnGNPjcVAq1*KP(t|na5UnPBNI4F=u^S(=5#7H|o0{fX zd)L9IKE2r)ldd(E1W{yJ<KW+x+J#U>(;Q9sLY(RG{HJd$R4kBcw|kp>7<~Nzw#%Q5i=rV& zod7Z+euflI>oH7&%1RUe;ybM<@6>HkZk_VAs+Yg>?nFB#Z9SaibPzhb%J5cA$m;(; zdwD-Yx&m4-z76|I>q9g=o=(7#h+Sei-cL=vRvq4vJO;yGOm_FOuhxA<8NW-{nJ<0Q z8#aF`)=nrkXIh*{Fm;So7i>=;~qZA79=$_>fN-dfoiN z-$ne5<8&OF!=y-b63zad+36+|jL6J?ua)xjChsjmZL$>Rv{inX6GtWy$qDo73$>ru zlc)Duv+QikoyJ{`m9ef}z|wnS!`9#|!N|9-zS%vA8Av&Jz~^6#zV^|0Nr47p0PL8_o{qzkk)ghkeh@Y`*q4u76dOmBK5rX(2FP$DS^mpAz7hH zFL-<)V@cPo4I`x+6G+&s%;5r!-5aHV#Y1{+@&1<={>tChLGRw&QJ!OfgdgD&WSFrm zZ%YJ1@#`BrI;W<7S2x+7Rl-1QX-miRC2+~;9u7BLLzTwB-a7mDWRYOaf?vCpp(Pc$ zulLBA0^q;Mk*23$Mr8FD`tm!~U*39I;4wiCywdTsQ7mlxBBJyN8X9B5V%?Ux`0)&G zt{(rsIsf`PCR+XCSN9*WSbNGYN{|4jBS~DHQSrr3f@HwAPOWT=HQS^UV&I&u<2uWVWN497hJoup@tH6DMat%V}G_syp`E+d5_#idpCLp0=mt1RQFvO;=^%@ z68+*rfjp;dr{j-HLu$Dk8(+rOU*X6^q6i`ioQ0)p3(AK*N6oLCwasR}y{;ATdMLpk z&4556Sx`(!k8u&O)sCmQsysdfo?cmQB_n`;!-N5c#6dT)INZ`WwTU&tS~Tyt_vidW z-Qs*uqA-bqMl8Zv+o6qyNIED0~O=Fa2Q#nK(9$b%i+2fRTbrWZ@*QqU!x&?pOjGdStufq4}ud% zjDx;Hm}%D9{Q1@5g&JVH+;MaS28uR2ch0Y_R6$EQY%ynq(DutZiI&_PL0$=|~>-1X#8)SPC zY(!)HApnYJF{hU=niKH}Q|f<{z(;nSIQ|9xz}%xrN2$W%5Dq?_qk&{XR-L)}Wa&Y{ z!~W65A97`C^IS{N;e8_{WM+!ZCr}_a-D6jJM@=}6#ETgXP?VshnsACDYnKD_+2Y50 znf! zGAt3h)X$anY##BI&2lqal3(kFEL60i1THYiU*jdiAcE&2i_wbdAc06x{o7U3S1hHX_qQ@V=D5Q!S-SB1R*R0`#jkTRvA1}oW zsE!>hq<$4k&vFQazZcp3borP%E*hA6scbPO5qRcKuwmeegL6qJ{Ns$YewIDA{O+`s ztJ2I%E6>`aeEJ|j;EvK}IX!Yw4ayrY|L)VQv!*0n5^k&F6lQN1j=P?=BZI|u^;6n8 zYWp*GVh`SO2+!6wC45K*0WD%=usQNX7vfKu_rG05rPoW#Gj0mMj)858WAU(*Rv3gq zL_$VBq8J6NJ#yRDHd!K*TSc}$FV;NlWeSBE1K)9^Ya-c@tcSI}C#|6RE|lHq9K<~T zh`=6hG|3A(Lt_g&x-T$&q_xw0VEjr~)`@`U*4Az}O;y+-;iX9l8ObeFEytyKmHj7R zoi50+r}?u)h(qmw5Qw8tAz9{|uIDu**GqXmg}z$IcVnn0e|br43^igwT;L=Sa(Z2> z^cUQHWiRWb@i3f&+O=V@Zn)@1#gMwev1TE&DMcgq!e?T^-f}VH519M+@1%yzD)R3~ z{YAvY&;M`@DV7yeQ z+xmD0&Rx64V_K5+gMGJl$G7+amD$ zW}ED8PV)JAS$XrTovI`3M|SI8T)gVlEmSdmSc8jQB>p@RQk_-1wDZANVwdlanWAbA z8!i6I`Xb8s+D|t?m(mF2ekh8<1lt8FN*x@C=OYx0Me1D*$WWcBju8}iLggdKCM;UU=b6$cA zg`Ee>8*#&8SE222y?aqe?rsj`<_tsTQ7AWoIs;|wT_K{F%eBrQvWmsJMD}kqhl#{O zTF3)xU@vcYmEsn&b96v{&5p!^#zTk5yfFtALptKqL_1yHBfk7x&RoshNfw9~`S1|n zIvBzVv06)4rka2FHV%zq-|n2Y zCSK;uAwr3nzVHl=SaAIJzv%2>sru@Yt~cJIqin*bP;R!|P`4q{EtxXJiKy{MA}{fp z;_~f)j?ID9v~9zkJcLUIom<2AO}$)0_x`9*Yw??-~@24;9Z93+RsOM?lipF-yV3=xd{ zU0u$IQq1!t`5|#4k*>;Qox{HQ&oT2{V{X9{O6OI`rN&Jd)kUQAL&zF5430Mz z`>a%#82|m09hF0-_tuiP{7%5{*y2iuTT$Zop0Nj?Qh>Y25W=l?`T4=uW2)Bp$yD3w z1b5(|;{=HO!xsA;^W5E)(stB@>W`*Mic9%pGw z#9!vUyA43E*81AXxwDj>go)!nC!bJ+?vtgs*GapN? z%j987USFuNZ$&B-rp-=%ji`r)LfB&Vr8fvG+G&Ym@WhB8H1TCDlUbbdK@UeHEVLc zU`M?vq8}9kOXpL#>+Sb;yvd!7D`n_nT)R#7#$8V=qMK0| z>v9ZFvqLb40Vei>9n~w8ro5-7|K!Tn<>n7}TTp-0p?0DRg+go>GF4%0X206ksIy?4 z8~xmK04`WTD4>Ww{SSufi^9o1#yFO=odZV;d07HSmyZMz4GW|U(Ftm^3#9R^uXfC2)!2r*WqwNCN zMaCr*0vQ4?=JsX}daSC@cl(FqVBXz7HvUN6=wpOl_tB)!2%v-fpd_Kj85H*cZqWL) zjIs~C!Bv72KDUQfXjo<_?j_NArF5BK1Ykv|mTX8QuAL514g-B{=h!5iwgAphdu?^4_Q!+z>Qm?V1`eS-V4fVv@WwSsdT)>_>RX>FRZs{p2@kF?}pe zqD>aN0F3y%h)cZfdyo(6&dUTeVuf07N4>QRDKOt&d(0!eSMIWYWy`x+ZhuhGXUKtq z)Q2=6Wo*wLg~!jU>uj%Nk;*6Oo!=s%t!|i)g?bdl`*+fI)YbXO4E1HgVY+xGU6s^7n}3?t}P8rbi8c>Fj(qxAh)Usw*8vxUkzgGFf|ivh#V z+wOrcCHqu7dEgwe@><|T>fqyHf5)|r@Fy`w)>cx@YUGK^>FVKik*U|xUP4|08;s1z zPkT@VrBoMR76POM`z_St-z|Ic^}8j-H+|T*_y^TkS&&Rn9V^X2k7yeF{j7%b+gEm6 z3yx|Mit7HSPRXR*LrI;8pno??TLmHnOkgp!pi?O+u;qckaua(u0M0s|mMW59FEsDt z^?C7MXpee^pySrevd_QtJ0BLmpYto=3K*m=1QUHpb(3NVg%rT87D808y?aiE5_1*E zTd4n--n%W*jr~n0a>c&yx0K;WBK)xVE<`MH3i{Oq&eBVP$HSVPkC5FpwRwh(CJ0I% z77RZd_a9{<5Q~_63A`N@4`_j8h8%@7bN&lj(kE zm`jmd)NL1enAL>r7o*|HO-N;|WOLZWFLoA8Ss;Vz=8MaQzjDP|2FL035RnspyGQ(2 zP%}F&>YJT#J|^$yYEt`lXXh7s%<;6<>9=Y3K6J6tYO`xn;VurkJQ8x`zG(I4<9nWUP>;d28(44#o~cT@&}4C-I^*Cn z28?&pv1OOt|Mqyj$VjmbK4YPkFPlPUHg+aH^S|o;wihZe zV#$>aQh>?%y39>r8yK_P00V+n*6Y`&rh6o#M4zM!vzZ#5drlI^-Op2i)um}j>RSc8 z4zf#fEQ2^2!|yuTxX?W*SiSb*b^m(bg(jva)rc$wB)*X?C!A6xzL~X)C<+0LSVFog z_j|FSe&Rx-jdkO$!ZrQB448esR4sMWk#nU8O?^Eia!9MJ{?G7n6`fPQ7t$8z-<*-z z{7Qf}4zzK~;0`}@9Kg|4Y>)jg!!%!w$%o9{n`>)><5exZ<~!k=dDNnBP}Y~zQGfuW zG$FTMa1V;%10_|}oMkLP5u|{^_gL|?hT|XE)at1DqAezAT{&MExbetOAz9Y9CTyE0 z!3xN*>iRc)m(n=eBc+U_4T)3oVW+&a}4 zt3C((jfholu(-l}GzDUV+gb5AJeIya0a^;|6%Q9HfUZ#uD#D1}H-5N*H3q>N_p(_j z)V4#`mvMRU_$?hJl}NkTZ%P{$kbMQ{+=UY>c#{$A=7Tx)WMh2bLSAv!k;)lHZm zI%7kRqL9-e`0XP~Bv8$)(vOrTEsNxsWZlchMU=Pn$q?j?cejpIa4Xo$;sUa*u*6E;DjAWZ~Sh)kwH0Id9!VL{1X zsG#^ZZTFXmih-m8=}Yi+ld{FKPeq~I@YCfOo({Y#nvQRfa)H9Z0y2v-AVd0aREqE` zCE%xMzTf<`KG1r<_ig9#%iqrG96gRjQKHg?0M=Q$=5h0Gp%~FqFl4i0JZmF|J7b41 zl^h0$qApZAvx+`i9# zeff}#xNelE1sw-;m4jd9@=%4fs?M*^-4!Tm8& z6pHT3E3GxOatk_)JN;aV5;S#;_j2{$dPG~rPoKcH|*7OWPxXUVE3Edstth2iI z=I^jguyoxiU1DRr1TP8jln7!Xe&{R;rlvmXC+YPK4l$%phg`(c*wxvQ$r9?pUO)KD zGD%KynjZf9_cJbY&^FK%5<#McyBJ8AG# z<07r^-z2pcNl+kcN?`x|1uibGqIw-aH(R~qXZKFCK`dBx{?n=OO{`H2Q{|&4%NL*z zu8w#tmPo9c-YBHAMFjNjnJrAV_nkd&>3I42&dsAT)Y$f$2eU-F9P`E=q;~xamC}3b za{EDL3U2>?x-D@Oh`HUrQhrB~TyHYaUDFPE06c$J!q019>rwxxORC_kSbm`1rQ>vj zIGsxLzN`U;@2cZCDju=7_)uIZYOcROS0SWBys9x0D60sBmGIZnFuy?!-KJgPKD{^h zj$FMwmKz7Ni^FHZoCt0LLdY?vPqTyRYk@ss{#Rq+NT2ET>WK1Aqw%WxV$-Ds@#{6- zg(DC3DC~@&m33M24>)E&$+WNy4;vIRd6aqMNf;!@=!XNa-(2wI&sg@QO}4>k*>ZGBm4E$LtNKi*d#I#Jq?W;lAtW*N|6><2Zn zhJ0ui_TzVRA$tUQwbb5CFz=~W)4Dm#v{UnK@TO$XBZ_LpMj@Fa=d@)~<(&_t>=P}g z-p6F|-FV+%Ey8?O9Gf8I_hJwF_?|xn{qG*LzQ@-IB_MzGU0A7G|Ai?z#W(V*^|%aF z>q0@0rY&X}0VDe7mXT@NbZJA+cXtkD2#ti;kubQwodxk+p4=36-+jF@<-z^}A->ms zDg1gH2?}w0^K|?vw1fLtiQw!$a$e}r*Ov*G1AWhToVjQHFTiX<&SVNZ<97g?|87yg zA6EIM%7f$m#pw^yeQv;TO>8=Y;aw0z`@MSz6-?T)$# z8amHPR~ICz_F4+ASI-s5G}-i64jz+m2o#ydWlu!RiLHt46mkvVA~mcSlVSCfIEtCC z-N^*7ebof##g;dF@~=YT5GrJa3ro{o!2>PE4_kY(JBB?V|3z8oOKtzZmsy|_cZC4` zsT0P6MDRP3R^m%KB&L?H;kej;?t@Ae;);ec+HPV9p{Z9;jj|-jtpb!R$PE( z4i1}2`~26&CM@0hEPEnf=(p}Xbs1O&E5kC?_JCxtJQ6d`%u=55%GpV=c`5zl$U|2S zoq2u{|2UK$^sNb#8Fkpgc-~{Zf0HZFsr!#$VmyN4bFQw2PGmuF{!BI8F<2;Q{=o4J zp>ry_HfnS%8*$)Q0a|-0jTWlgSe?vK;D*tC^(~wt%K+~pc(4oQtqVmA*NPchD*U|~ zmTwPot`*txBITb8(c;KwTIYS%XXajg3b!BGWdlB97HI0%v^EUyQlpm7Nj%%ot~Y)+ zEV@@6$94||+Z$Jt8)& z>72xcG0~Da!G#$u0jbdWoFR2em>v-gj=moM&<)b9F_mV;-2p+Z0N%-QbXwwK)Tb}DQ_JaMKAwocAIj`VuT>4;T%cf) zvCN}+iVp+lPV`mnBfPgQA;wwwMTrh@+E$*hW2R zVR~Zb*&^HMpAIHP5bb$(~?pH7O5@+kqaLHW~zONuw~X5`Ow5W$0_^A()KV$LacW3 zD|B22K6NaPh(`Wmt)+BOZCp>ZRa++)D6ovZ_@?lk(_9tU@21(gzbVG;Z*|%<-61kN z&1_bVw!f*L>REa9^TZE84+ER-Ug)`nJ;}+Q)boqKbGzK{92%Hm5s7<&LCnAr_#99E zV8d4TW+kV*_7(|bS#7qt(j{Y}2-2M&dKvzr_4@n4Wy}2&mh@$bkVbUgEv|4#Du@eT z>Kj-*c1XgYO)1fQu85Cs^L6{nHZg#HUPCG@?-o+qSWie_*I#OFwR!Njwcc;tws7(} z1Q#6#FqIAdsdj2*F~>`T)qS~GP!wmabBJ@)zdjFt2yvhOEzg zS8|&w+6-JT7cAX3FN{Gz9HpC&r>3E~Ig`H0Vy7XcQpPzM>32Es{d3yNj zwYdV55AOBPM7f$gPG1)eI@){l+eq6FO{8UXSsMqC`B17w=u2=h`18x$erx23L zkBpJO``5bt@EZ1(Q%jYvUF)N>`xsCXFzSXxz&E`(B_2utaUt)4v(7*Qmqh4jn+`2o z+y>W9hUofa;T(72?Y3f3r}BrNTz4#-s$t5_($ESlvVqm@V1IFv{zmftUN4@CJIZL| zV;_r_cREmy@m9Q-vXoi|3qyjkwY&6OTH<{*@=K9YCt|+E2!WMUhA+9$OKOx_9B*Ea zU5O5T@-Nr(scAzdB_bUB$`oM3d0R;9@SpoS()@A@*pz-JM+F#MzrHQ?tA+xdu5D~X zGXRkoiR_WU5y=goev1{=r8ON(wPrwnFJCBt;-q z)!wcp4D7~Zz=?f{fIqLtgiPDvh95BN7=sT9H;LQgFMWYBX?QMO!3B&Gmjt^sViR+% z#ml1tr02viiJ6!%01PLwmw-n6wNmd;%P-eoF0snvuN16e2i>z5%U1BX8j3f%0iC6I zPSf+|=Veh}`CBdV%5zVp{~HZAo_b@* z4Oa-^N!zFliCgcz_?wxf9)PPq>Ll$x652g#@uJVCDNOrmGzOZeM2}50@U{mhJb@Rqb!Mh?K6{e+rk2y z8YdVZKZ}Y9*8^M?40*SX?pzPNGk+y~F=Ai6ON&wJ1nU9w=ZL$?g=O*nyE0YoXYlUX zp^F(+JI7ckhtj4hgvh{1BZnpOCHM}1U;R*?{*Fhbd9p8)H@Rlau!cyHXTF3tEkl0L z&CmK$?sa2TW%rk0cUkUNuUT!WarbOtGwf-=AEDp=pw;>BWL|f&oWByya#1enX16I+g{tLx5XjsHF_dq0aMv zy$x75m#uOQ3=n&da59rbq77j6o5KwJ7xtZV-3_b-%c;7nNurU)Bx0K`unFetnl2ta z(QDH(bVb(ocO_;pHc;TOZUn>*@q$v`MIww9XFf>zaN|i#!EvW=nk*0kPCxMQ{40}h z63P26+#?k}cQbuF_}}63qq=MmVNUWuw4vD5ym%D&{Ns*E$%Y?WuE0^2{wJ2P2%AfSp`Qw!D5Vn#K*hnU@@L(?yaH;59DG-7@)Y0r*jJ{;Kap+^+2;bXM z5jRI#Aq9>EKs*9Mg@@JJncukD<;~~wDFqX{=~9BW80heMCAnz<0X69t>!nSVRui9R zzaH6YY&4T&=dN?PE@g|HBLNnRixfT^k#Qlqz{<0)r%9#nX1=+H&e;$aNEB(wa@ekh zzza|P9+XhX8C*{7TZMZI=aRLQpIczB;#Pv z_wD1ctxx~bw8~GpZWPpqSq^@WWJl5USdhs=`7b}h7haLdT>q|a*IysIzP{7S5n%Tr z@#B*6WItnlJc7!EWOd;>c21cGC07SZ>Lb|kU-o8_4 zs$E>=@xbx;jTr49<7Yjr1Vej9VFUwpgJv*0&hP2a{hl1Hf`xpJ<6ts202Q`O38#m} zXdTgAtk&tdYWT9&smaWZUDUOe0ZmPk!0FL`Igf;bmg8k)F%Tz;NUY{SK>AQL4w!kV z;|3+t1EYDbc(@94tiOK!snLVZ7k7h=EGXG*8u+g9y!YCrzV|&^13`Cg>HNx@f>9-7 z@qEO*3JGGY9{=~x2yP$rjkZ6GM(&Sy42M|bRjb*##6aZT?_14h1O`*f+7)PY->dJa zQ8rqXRG;)JaHKnY;WZ?v4cZnR2gW-VQ5XjeoQZvXJw7JMvp-Tmem}ge?kj`cQK~oy zA4HPtAS4A6?;kYoohXa6Th6u<^yJd%=RL8?zHam`Tg!!~1@elo`m!g3k{hq^# zxc`@*F+4k<_MFXkHVii-+WF|u;Qx3_#c=|Ai5rCUvt>gp^zTA zy@g>Qy>dL*e8i?kZvJf;AJQLt*QWhH$9yL4SGlG>>@Mh*($If-%s?`MhUCwN)G-24 zq?VPQIqBf9eUbCTQhvvq)yFf8LFAExzkmdjArqolVMv&?`=?Ru`UZ!Wf<-@8rO3-9 zH?jr+F&Mc$6ru+sF7V>b$st{Pwq^BkNx~ohyFIG!CpDn&bwNo(l8XV2K!K61M@HeS z^_w}N9wx!PmDFIMb0#awFxEn3aXbu6NO;`$wzZyr3i~&nrM6rddcYYf$jF4?3V}2%qA{*zO;3~pj zvwR#-Xc`BSgeYdS8soE9N_XQ9GpARfZKF z??Fr-CDf{u1N(3COui2g5RLzHH?cbA;2*M6`G|L>eyop)x;p&Iaju>QLh_qBNQP+$ zPl1U2fIGlp32|hXx3kwxme(27jRlcm_7jLukbp8>X2#>?7-2l!Y`ekp>;vGwPdHjF z;Go>Dl3Vjdg_Zsef>K<7JzO73LDvbz8$Ak~yYN;qbo#pK+64&~B;;*qnqCr6{-k+F z)vBxqyzH6QKbr>ZbnP)XUuXzKj47&2kN4<1!g(*_w*yhG=T$!}XNs~S?dfCLHF^-n z8;LZeA&GB(kBRjSaTJ9<9z5&!bHrFMzci5vNF~_*lX!r5SP=Y51r|CEN?qXd&&#UW z{+vl4;rmJi6U8J}lqWaN#KiJ%YVPmyi4*M3xsOT4gKbBGphU4#;#9~BRdfW%ElF@K z>-V;Dv7h~e0*ku(ViB!O2r5X_K|Mo%AfcH!T8+a@@Dll2chGMW1<&lPd2Pte?SOB7 zl(_~DJfV6j@Wz6>uJLalqpsyOOZC^!XV^oHVy*Y2GXs4Ri*v=gZ?>n;c>TEP)6D!WTk9tJz+SgUa0;%cs}f|)BX+4QEl(8t^L(oZ$k4VZZF4P?40B!GC<-K zWDQ6@$gubsny%4&?$4Sv>L4vY7|of_=zbN_rZkGGC&J7KBqWQ&NkfVIHtD;y&z*N< z`trU%y`bG<^`orTmxRXy9YxQO@@17~o7!*XP`HAAY4P_)X3LqCkbK%0NoSA#!%?9$ zD|z95v&chqeEo;N@|HJ-LT;XU)R|Euwp-AgER5RQ@`&F&Jp9VjY=jF(Hl$b~(9}{h z>^9^m`k*#6wKlO7_C8=Ej5~bJj5usCwE`Wy)3Z?yhzMW+LpC9-9#R(UUbbDjj z!}cYeh$sjNMM3UJ7SPYgMGL2&%un@+9`6`UU-+Ix8@%&TU(S9KL)GwSht^x_f)m~4 z2O8e0uD%xPU1JKT2q%;kt`6+JI@6k4Wpg&L^ZQ+`XX=}8xNad~;4#I)6Iq`_8}~%a z)?W*SH}r}FGn+0F+&<;Ujl|L98OLBZ0-jN@!h5l>L-oW<@gqO9&j zT|&3ruLG(ZJq!dgtSoSMg-Jhm9bNE#pD(O`JX$GQ9zgNbB-%`5M2X`e1eL1cg7f%5 zrhlVD^Q5Pt!(D#XCM{<=YOMPt4Z2Luv!OaKe5J1znGz&);P2mo<`ac$Ai3c029-9d z30Ta12`66S#jEAN?UVMixc{50&DZz8^Odgq*=0)tEsc|5VH98ZkQ#+dP^K2mvr?tTVp1>Tk8-64n!mfGgfI+ zAcD?}&uKvC7b}#wbY$@JeRR2S2hjOqh}V))s3%!&;88q)CRfZ4*T~^$>__KazJ626 z(Iu{buXmw@(fYLfE$(lV%N9R$O8#(@N|K!CMUL1B)41qbCtY& z(AY>uG0i6^3IxCB!q=d{{H>j40qNNnXYx4BpLxwDTh5?Pf@l={5S|{v4{WYd_19dv z>epU$R3S2B;$tveFJ97X(@qm)jnQFmu&^u+`KE!D0DLhAVKrYA;3wsn-v*7OO8IH8 z55JkWkP5x=$H~RUj|V9kqFNy|)P!7pe=Db-NVW|bD?Ek6aOtpsy#^=<6haxBwS^)b z6XO|ps%f&|(C%V)J2R+r^@=7@973R=kH0fO`jF7){>gxC=T4sB@Pd}Fk)P$Co+W;Q z(jmc^_(OOK&@u4h$Q~TdNFNVEey?@u*Z%-nskyzNFY-oQv9F0&p8)dfV`r2PW68eBLZIvU^X$IWQ4odRP$s!y*+T>FDoSr}l3Kab52t3{nWXhD7LDDr>0rVGRAtj}?#^SR4 zcb%eo8sE0-MCW4iwZe=6JI`>&J#+|BnzX8NW^V!yWMDtT_8#2r-*OHYedGk5vCOb0 zR=3tFbCI!2cp}K@Bt-+U(DLKTXA72Tsr8=g`lzFdF=SvMk|m<5*YEo=ns?^xT_fnLp_l8od1D_mx39%U)ACq@a0Z;9Q%pq z(V349dGWu2@E(}^{SSk{S5yzbG3M15<8`c=GSh5A7bNhC7kdF7YyY+<@ z7X6hk|8W)f=EF2R`5dZ_btfSNN69GzXbohQNwgV`F3G`S5HZ-EGd)_t59mhb5QVqch>sq}cs!)Ex_YIOVZw z)+|GN(et;ucpc|kLbF>h4>a=Q|CT;)@;JBZ^ z>+EiKcm8JCV!>BNBssDmSc(t^Bmfjb77fzAVf3+poipGR2_Dthrl&laIobSl`dwRw z5HV2fg-AljbD5$8iFgcy1Eww_n5dC`Vl+F_#aRZL5DlMye#t9g+oC9IZC+$ExOiL|~(b?t_%}$d`!<%Mug&*94B~vP&w!8uvn>i^n8N z1HY}G`vW~bYS$03VJW^x^J>PT?}_Tf!&C@Ca;_D&&h+GBXb8>|xe~?4x%Z!!gb;t9 z1IQz=pgt8I2mutUl1#_$Uu#O?iQ>An?c^)!%0HyeZ81*xvN*Ax}e40p0 zSB=2Yn(uG!LFuYvO-L6D<(&!nyE391)8!(C92=wiQQpj}`Bn)+s*BvGtuC=X;zcIh zVz3o&FbU%5`Hu+w7vTYsi8K#b4_A@wkD~C8Kv%IR+ng1cpH;SPE^R1Pc7O3~9t!$m z&61}Nwl^M103+SmkU5NSD@uTcyXet^S4EMwyGWrOd#+5PK(WPx)-4FyAjI5R=n~^NYowG&2{b6#DU7FfL%wha+cYz&f7u0O~ z{|u9_?X2rqv|0pRsQep^_;YAy;ymTdzNf*+3)6(+QjU;ORD#~2$MD$@WW=K^KKhs! z7V6rj@3MbGqtB9kM&Kf|x@`U(nUm;`+r0)9Dh@=36( z5q(1VUGOE9o-UuKheRLRd*!RaFlF6>5XRoph}aU7!(p3{z$lWYdXo8`WHu{$7vUoQ zkfuO9hACh_Iu^ovb9bKSql0r3oxh?Ak)Mq|V;BVV7!eLKaP`2?0jmD1!yWyz+ zX^(Pym#z+aah@0jpT<3LWLERReuZQ2cFOMij^Pt4H_k9!Te7{fp%>khbXWs#D+>t_ zraNt3yd0~CXgK0M6LBJuf(qW2kj}?uNmgU-;GhPkGY6!B9zR}IH$YfAiy-`4ghC5{UA=Nj-`NNFO!orp#CfNky zfjMjpx^dQ>=?q)OAIHJ?1giiCuIyn~O&9{dMFDeHg8qTBioP|qSl;buj$AwOOrUG> z&WWi&CHB>D7n-gY3JY)H;Fe_c`E>?<9HIGsucQ9oZS+e^mps2dcj;3K!LN=w*d02t zSqh=GclixY#PUF6$`2ph)Zo*QAs3Fy$K2UC#>7Nb0GTa6egd9mOo@aRv3KS1ar7hO zgZ=kU3&OBAbd`@tCMf>ez9zqu&SN(HG)922dR(xBK{&LbfD0t9#OdnDU0ae3ScFeq zE5siqmBu`j0S6|KDewSa5qP!=DPfckPw{rtv7+aty5MF4um+0EZZ8RM8+InGpUs?a zz6+Hv4huxbs&6*ls}}~%6vk7YW5C@VOb`o#5%=E(Lx}4s$cciS`YS}N0bO?d+yS{L zvpJmX2{>&!0pDl>xzUnCe%?>;VvnAlwrb4H7IWE^zj@Fm<(OlHnLUcWM;HG_k)9c9 zIxSvbRX4lTx$>Vl4L@~`NKZu@y-bjQa1vB`D!DJ=`jzjwQvap$yxT(EDkdknHl$<= zxLQs4 zczVcQtG#IQI4EI$_yoS}9Qicf$?ZV--M2jA|FpPYzwwnVKf8Ezy{1m($cMmtLPH`5 zS!UBv`iYX~-MUqCMcas}xpO*QyH`1;+>v@v7;W8g3e)=k_bCrB9;6|uZP#ZMN`JJ< z0B-BJYypwzMnZ8cXLAID7NUM8#;v?Fd9Tu3XpVkktR=-p0SF3(0-pO6G&c;o{$~Ud zb&V6RMo-0X#!=8nS!SQtcfLY6B4sX@A+s92uL4gTGvGr)Xe2@r zc)tN;aYqF2mH)YRfOS6SvJ2(}7iGQQ?l=TY$`_g7|B8vJip=SA>QKUHD;iH!qA_B%&xBIuSwT?c4KUpz!}jQhmP*F1_cxoKvC+dOpiPT(>1&Kq44+$W zzp^ek^mcFZqcQ&6182q0_lY2nHG|o5^_l7VW#s7^m-4G7+TpW^0-`Va0kzc(3w$TS zll{aaQY9V zuMlzvc03<&41oAnmZeL(!b>m)zGE;&e7|}vQM9Td#Mr~_6|3decRkAB5h@xn&2D7E z?#drLpJf1I13U#Yp;Ge%3nCf6z`i;->S+RY*S)pW)sCL)ck;@_^nh*yBS{t%;=%NV ztO%jZvJXv0KjW)@pXOf;R@cQLDZSiYDe%|x;HBbZ`!m0oYiQh3n)joZHauC7X;XJx z!E6uyNWq*x&iKTc`zV1%B)Z^zE%d$n9_>#}q<3e} z)BSf7RnguD^$#dvm5f+Z3komin`CsD-8X?@H{0aNf!af|_M2x-F;+wYqY#$=dw2>Y z5+Fpi50H0HD@ooIsbMlr{a8^d>HqgrbmO@b*eczU#*ZU){sWsx1mqeMCSeJI?4K~W z;V6xBJao-JGya9NX=Zpw@Yd7jTm#$`gKm)m_+W6>izTO4{yqHg@5-+a71Qmk{oVcM zOnx}pse_74YQJOwJ;|}dm|qC}F*x6MbFo0WUTL2rsj?Q_6F^~nBT6L~6Jh90T5-9( za3r@w69C8@UCJNg#m=Zn&(5vP^V?_E@7#BEVwttsdl33Y)?Znl6}pLAB9dPNBAA~) zsls$c#@E2cV8SDFq{}XPg)=4SAy2j6<*fZ3YWKXuiGMv?Ed@W*xp~r~0InV2aKjHZ zhfA`-Tsu0?%Cs-6Cd~wD&dOjQ)@z&z!0>GJGJlXQ&v^675ZA1Ou0)ITbm-5%hXog% ztgD<#{s<`d1s?rTzIe`L-ks2yH#r=`Tp5=Y{AZguxB4tI^Ugn!kf4gWfH8*;*D{hT zb~@i@jq9e4=k=MUl-zc**}5N2Fs@NIODo>N#)K2rwBh{+( zVUY~&nfpJGw~qbONIx3ubb|w!3Bi>NKk#FMk!7@XHAAg=0qXs0r(XW~WBh!VO&yy9 z(3_NQXoX-D!kpLWK34lM$X6x>EXMy_@YF1csA4)tqH7|y?1iuMu39Xv7W_Z=`fB~h zxjrsi+hqcD3x_q82FYg+I7TQ9H?{i=4d0XMpq##I!N&gu_cP>rO6So%Kv;#?Z1s~!*9hC= zTX71ks;oN+vf{Th1xLp}g&+sE6Mp}_i(y7y;~nzku`!BaIV0x&_x~|)1UO8Qjv-Iw&=&Lsl+Ox84d0_ z1VsvbV^65!jhuf|^}k!3_PMZP)r6S@>G8#B?7?Uv3e=i>@kF^(9wzG)7llk*Ty57;Vz=-!Y4Q=A6R0wJk{^Le3yNe z_qD*zuId!7*U4F!T<+f4{T%r-VFT-V83x-_r3eO!`{k=@dF-h*$!M` z1yVTQ`Z5BX8kVNPqHeCxgbZ`bng01MneL#|=kieHByB-tM?nY_8-xGISc;RAIXw%v zNu5It9~|i9Y25p%H>0s?h?xMIVRY=H7`*nyzLihGmFI4;mR%_>nGz1{Y~u)>rlLk6 zSuv00X+2kk!DRWCLyHJp(qlX8d$IE_o9d5l*4a|S=d7W;+ZaUi*6o5}xy9NOXvv$& z=w&VSaMRH6WsdOvL@_Z;%?W5~`x!Ilp80cCKYJ%wHbG$FxyAtPH9xCZet@|U4X5VT zZD5a!Vw7%ZYx~c$^%zU`VZZD!QGMrfdElns@M<|2GPNoyveX@b*yqw*7f<# z;5a&`8_rAt1{qI4%9smbk7(rh__tPB>z<>R)zrNLJ``+iUp_h@o&3dYuX$uP>2j25H|Vxmk{q6yl#aAZ*bUDGvkoWG=;goVRQeG2{Yw6Oi8ytGfh{3`z#P@lQUEvPo- z1~=Q{G4MgNv)+_9dCcw%?kvIrZ!MI1l@e7Fgp0DK0CqUaVjNsg@ z85A$VOAanI`=bO81SjCJd@P#!>8YG_!CMM`)ozLeJkAfvq=;@dXV+Lb+>!t3{N22? zrPpPM-Te~s=66p7L()S_)z^b|0ixfr0G4C*33!Fc z*!%=-zfZZR!6N^|!)mZrJ@bk9y)L9ThaeV%q0I|GmP&DaXTNd0u5KD%;gfh1 ziz5aUC#ccIqi+G{*f1V6qc4bEcCCfSgMB|^XL1G^w`EhW`WWaK5 zTmxE-_OBUA?3oo73(FXdJT*poSEoiC3%z(`Znoqjx7F2`P=p_UQ-Dom-W3)B%*N^b zw4s9sgXsUnUcb<0~jcb<@m#QPJMQP$DR3Wio~*6n*LaP(mEsD zm;<*W+ZIBqaKe|{FmNc+qwmZYZ3|#_nG0a z2ttEP{=Khp&eZ#AO|^$XrbXW-$G^=bhqIwh!8Y zwr)38XE|N!Pu=SQKqw9i3vZrx!1e&>ya9 zZ!y0cR-JNwm34fR3s0Tsy__2LCOE=nIr|B4rwE4Q6jX%;Vha$FX~#FHXwL;PoHdk-^z>4*9mdBAspRyL2kziJ{KE; zl)wtL^MYV>$eY%8Z8WN|ZtG(^tUCJX_{OC*c z58BFD2G<{29oXrj#20`vH3dx~y?e)Ec+}VP$68S7lY3gES%$sH{s|VsZG;Zstb$!l z!J}dxO~O2D%%3jFlKtS|D?UkubfD!Roi>Dm4b&cTX&1aK|GDi0$0)O9@a-#<1F!(@ z-DvagTJ-CNAO?V&WMJhCK}#g~?LNt3S{I zjt*m|EiWg1sy`Rk8zJlL&~&tOAz-?4H7Iu6rVV%RETKmS-hnw#a%+{AmRLEn_O^#> zu5jDRR@Po5OWh--t=Yl>RZD~%h5*Z*9Du>g@M%X#+fPW=z~gSOP~*xI$@ihZZ}|K@ z(YA+fdIFfh71ZN?JHq*BYB)uSmm^)9z80RC+D=oLeKF9q@a@ZljBWt{VFl%V#r#7Ar#euL+0Sqd$ z4EBv1R}9ij2h{DaJ#JLfvI@|;4FtjhspSLENvcL(xVCgQ1!#)C_^wX%#2c;t^V?5f zR1+k7J^z+z|B^|3#1=wWf1U1$h7BNmIN3k}uGB^Ao5W8abw_9=U1AFaiAWazq}@3OtU@Z5wmRx1#5{s{PM#JN^E= zN~`b3l}kgpuZxj1-0+ETxQua}DFmirIaLk}aN&vvI?O|2ai3LwEb|RYHQMWA#1jrg zx;yBo2JfgJr6e^o&y_a|ubP>?uFp)LR&j5bNqRDWSL~GHZzV#cS^*6PmSM}=7xFa1 zp`%H3p-)|SW($g*ZP*AsI&haggBc=0fY@zekP=B9bIr8Ka`=R02t1FYyg`q?v5VfF zZK+HtjXc^l8k|dATtwy%B%x22AQf5Uc0OJ!Ns~k(eqcU0;1cjq`cylAd(Wl5VczRg z4<2tmJ8+MJWTqK|5uWS zXB`VgGZjMcQGtNONfLf5*<0jwmH5}0+)3#nVw6rQ-^PuEms(Du&0Mxd(23Q zti48@P20TLde<>($LQRjZ{8LQe>d;t?W!%E!f zELO>x&A!1spD$F_rEG^)BX%>(qJPvm^J!ytENrfaF4G9HF(vYos>ReZ3o8O}%NHwU zG~G+xFF$!yzqW2#Wb!;DnMVQc(gwO{IZ$wy)A^cXfA*5x0hlF;$I89D_w}m3tjqkS z6FQPsqByfQ?hy!(cCwBl} zsf7#gF|3Ou=HAxrGL{H@b&L1Q;d(pmM}Hc%kI%GMwniQ-@NVplPrJFrwEepZwPPvb z0NQl88EmtZ1=b>)LBr)>TQ>NZloSn?)|AIa;Nzc5lCMvSd+GV~I-~eg`x-$e1V&B~ z&4Tu-pt3R|wn%eI)Ac_@s=ofAQ#Y~~RsOekIhreu?fTR|n~JTy6E`=%O|QO~eBQr^ z9=YzlQT+>u^_JUl<+#u%02ef`Bh^uGd2$yyM7N5CJE3V2zdz8#g`MB+iI_@iia9Cd z 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�wB40g3N9Va*+ibOpQ4M)?M%VNP`VV%KOQdI}Z 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 literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/icon.ico b/tauri-wallet/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 zcmeEP2|U!>7oQpXz6;qIyGWagPzg~;i?ooGXpc%o)+~`MC6#O`?P*_Srl`>>O4^Vl zt=7su|8s`v_4?O)M!om+p5N#5ojdpUyUV%foO|y2yFUVfNMI)j3lqRqBrISj5XKP* z1VzP8|30{X1nva{bow>8iG-;V5CAR=-#C~+ST9E;Xn-Gr!ky0h;1D2Lf*4;X82+F5 z^O!~^Jf^7tRQm(w05$`n0FD500O1jY`PTJCTr&uF8&Ctd3%CcU15g0^07(D;)9Adf zstIlhAP-;y5Cn(-CIB#7-_;YEcYcq9pC`~SCax^yT;tqFlpu0SAAgb0M(%>+U?7k~|H%oqaU zG7;{Jz;i$ysD3TnZ-VD-5EkR2olyjs0?__2E-*ZQm7VF#;NSU+_7OmYx`1^UZOBN# zZ~z&=UqaKwI`Y#Ck2VnUWrsY50ipqDyIunt0QGGg8gr?2RTL#iQ3}^>n-k1l{K?P(24g%0NBOjQwp>0N6 zhjzBRS^h3uXS+k@hxlm#X1Zv9Hv0OTvCgXwwP zq#48g-{<`$)9@L955ofX03HIiAkD1kBgDb{vAtuK;{yB_#QPb z7^H|%!06@BiN3iB9Ci78{h)m}hG)EA_Y1zH`^*1Wf4llgsP9;I#3BHLhv)*3H@g5R zlV^Z+P(Cg!<3L6m(}8Vg0JP8Z6)1FRdI6mvlhg2JHsAe^X#fq({sQKWx@-!-`2=vgJA|ipM_2(ARW89@<$pz0wRD0er!Mg=)&?pq^Uuj`CRX?9*x7azbOAK z@H2G-^F}=%gkdm!Y=a>`Q^09J3jk?AHwd1ygZo_)zQ|)8q{l2D{8#x>{=D$a3qS*8 z111CAXbTwW4yLv;z_e*M;Xm3zM*5f!0C|LU zg0Iuw|9`uKynsF=_C>Le(g8pk&cc1r&p*nakv`gza{%N4>RJSp5&Mw;$GgsaI*5=q zmKXbCpZlKhA9*1IxDCMk>j5T!|4WB?1IvT?0BiuDe+(M19t1$Sg}`OV0>fk8pmV72 z*#F7{U_NW0eAu7a2&1HW%{zY}3)Up9h#SY3NF47`W8{X8O(W ze>OhDK0LaB@qi`(hS@cO+Q^{od->yi%maY-6m1cfpQ(>qnED85VcK)M(q-n4ZhYr6 z?DL`?bPNYS@*baIA02u2N7*x;b?F+k<*G9Px4US_gnGiT>6iw<41l`L%)cG}F9P5* zCd}dgCjf>?g|QY9W!Ign^11>c|FRO{UA~Ycj6Ga{hP6N!@P*9aA*6#kz6$UJfa8a) z0PLSLo}&x!1~BPEU4Uop-N_!}GWdt%ozXHBy3E`wDI75VA-wBVTOGd0>2?(2cQ9fd87SHgfKkd{y|RPf7B@l#{7Ukq=937 zOc#Ow3jj#VQ2-6_9>9Fw2LE>h7~|aU=kVuGP^Lf!^3@q|AAsdz=JPEV<>d=;gux{Y zr8fO}CVvtF`Or1iSA;ZI04@NY0crqf2Qbg8fDHgW2v5Q|Kl{S^JB<1Pbg6?E@=*d9 z00sld071yJ+cxHB)Ap;SM`vCXf0#BfB^<>kvv01CC`J_@zV+k|RO1cjR9xrCYoxrEvTxwtwwxwz<|Ttaj%K_NO@n-D#) zNr4^!2~!9r^m2kfBuuAwurYI`<2*$GG7aW4KF?FYzrJ}2WJ=%F$ALZ$^l_k%1AQFm z<3Jw=`Z&D9AVFj7Vcf(hBajw0PLk8I{=n~yu$%I0l1F|_gft6 za?!s75C&KbVeKIv>~A1Tfy;$^S>XP!%94LQ-B@QI(6mS(b1{&Y5y)*h$P4#F-2%J> z;97ngfVrOkM=plL@Ku28fHc5jNOw5wlMyMV>41&U{MYlew-@jM$UKSWi1i%z1sVeU zKu$RT+^g7KS^tq9eEF;u(!{-I7eKdsAg{ro3%svrg3zYu_I6hNtLVeJcZW6<_r{5W z9Kf!t?gQX{w06LkGW)Ckqi#J1q=PO@02+j=XySeC!(Xgr4?*rvXo^_hg@NZ&fcK|B z2DlINuaa|j(yf8~j{!Y)ppOEuSE|n*`~`aO2=*ree>s8Aroiumy+H0?>jvsU2GBPG z=;Qz${R_D8-%ApBNhqbs;@(qPsP93*<4VBSyzfo^a-b9TrmIOkfqmOJ7U{cs#sQQ) zjN@?6E7p1FcYWRy+?(Y6En4vXkrP0-VF^tK#w6-JW59nn7TQmcKkWG@&j((X0=~uP z-hQtH=${GYfcI4T+Jo+@Gt?Wj_aeZ%V30fWU4-5)>+jL`7Rs>(#)^V{I`GFD0J6ru zJp$e{Cnta(-$VKyUw@_h`2Ke!0N-K#V2j;&S(5D06(DAN%k8`()z$2V%`%#|b`*UD>8D~&L zfjyZ4X%7X+0)!wxe4mgDfbZ8~`;2`JoL7(s41@o(;6BPL5AYs<>HR28r~{iIFUbG< z@AQ6yJ^$)kD0}E5;k#wH_VT0k4(-N0KqT;ZG^8y7X~P(Twf+~h*GLnNJ^BG%;~+iM zg$IBi)lFDeAp61^B&;{GM$^Ah34q72ZljHSUI@JXk-0palP!RBya8n3E&I>nZmDB5BQO}=69e2E^yug@xMGa#CiPk&bb{6;AaJ(r}h=s>B2xhYWHEhjXL#L zT%9(7@eZyQ0^+7G~b+gU#t=Xw1ZKfZik4slKJ9O2%+pQ3AyfCw(M=Qv-4dl$%aK>pZ2JOOwN zfOhPg`f#K-+qWO7cwd|$IUdSh^PTd4DRbt393%OH+*zK({SkV9X522Fz`f}Lpc85U z2Po4f;6Xm%%Q??i@N5*^Biy1H{!9}7@wA}qI7a7yvc&_Kvh9w06?mcm_{Yoevk1Vl z0N_knRcUZx3`~Zz1sP}f!rBEn9PB^p%FoKKSEPgG0VqH@3s{gp&Z)SUG4}lad*uJ6 zK)Uz>^@6dsuoB7}0}uy%8SIz-UqsV~ecSl{6xkli)d1*Dy~i-u0J4Bzy8PWC9{V-0 z*AePHSq#dH>(bqc_Dh7pxzb{qHVNdv5z5tF+2eT6r+_v9*2sRm?(d~}!CI3X@R+fO zoD8(s0hVAMoi6GoSrhVtd3{CD)xLeZKTEk#eqiT>f!7yVkUy*kGTy)ZVKPwvpnl;T z`v^!A_m!0Za8DNM81Cyp7yIPcH{S&?g|I)oo`h#o!}+OPa3-cMoSP{J;MVKGIjld- zfPXjv;3wLCZE(u~-L3ywAUFOWt@~Z=E9f4173BS_oB6+h@arKi>__T(KMc=hA3|+~ zb5c9-T=pVBI$!}{Am{{t*O}@6uyp>~?DJ_RAbZCAIIfj;x9!KdvsGm@d9WKjxBXw( z9UNE|d{;sF z_vFHOopqlvmjeBWZs+?gx~d^9E1Z`t?!kNBAXAV(T^aBIz?A#fE}m6h0tf(IQ5`|8 zBf?qzJt=yxi-YYa)J53m!8nWITm1djy=;&_w%I)@Pp9nFFwdkPlzkU%52T?`BIXX-^U=z+^%Y8wxZC4R-LQx=SMZCZEb4{{Hq(rkziK$fgt*zYTa{eX}c zj`x1XI~!fPKn~tVTZnBLOC$}2?{jXZZo}_~g!DlEs0TF=HxwX&x`gA2U+L`|6+@o_;pr6KgrvTE#aox*ecLry)%;_6Z@) zze9vSlt-8R1%ZEO0pH{A*Y|h-$ec@8|6dRC>+XE-*ZF_#$2kC8J7Ad?(1(ZqUmMQr zYy>dBMaYzAPh9-=*ilGV9_2rrTFWv`e`kbF`7_4i`&f|wg~zbBzbE|0vZ0NJej2<_ z%J}~K*Rt$^pA2WYsQ2hy1C&wM9B_a5KMQ3Ccn9c-?3r=e!4B*Ky%IzF(wi@o1=@0u z1@xb~UH^+g_DT@GM@57AMwoNPbK=NWkVa45FZohOY9O5{xE9fq@d&d3Aa4SEn;826 zI2U9MI09gPCy^;vR@^2?%OB(q>x;ct2XOu$&%^_Ht^ir!y3Uup{oem~5ZBSp} zJ1vSD$M^;`GmqZn-i32If%hnXJ8*H${g3#~e1?2qih9H9c>Bw;ceXubDabPwz^V=a z4XOvhe#wDL$bzx|&%ChzHkA4S=JwjPpdP1!9GTy%{+_JAcmEF5e;tSq-{t)DGfDhu zX<gsXSELq@*pp%q)9^DAK#0I_4q!_Cj%`o79|^koZSIofLK5{ zz!RR01i1?r!h1Zdj`M$%fjCcWNd3SL?E-$Q8^7iJ2lf41&pN0Ow|{T!3o>me@YoT+ z%9_k2kO#~i{`cF;d$hq^ou(?_`Ave)BK9R^tr0vGp%v7!Uns5`xJ zEYR5oFven+S&%>4fCmtF5V$|3FZe6yMOR;d2(n)e!1dqm>Od{%jWzBqAJNP9jxo;c zfbXzDeO?N(WOY8~0Q4gz{#)$;?j7rp0ohYnkU!{2M?BaN4(vF4z%Mu@kbVPpa5hq-y7QiTo1TTGr@QImiNF0 z;93lf)79`S&hE1DFA0b9EHGz70zN}uy`2x{-?#=-o5BBc`(04~u`h@=Addz4*F(Gs z5FXlq#=oTeKawcQ4rGY)>a6SuVU7uL?rsk10N8^cA%o?(U{|4E*1-n6RRq@&_!|Mp z1i+eZ#~yHTkDo0-dNAzU#Wws$FRa58s1?`__&~b&o93$w4Xv0I@sVgJ>dOuKzIA%xSp2=P{uhq)S;eUC_{iCq;(R|UHLzPu&RKbX8V`M zyANkVpxmJT;(Nh&dSC<4R>0hV>LEyDa50>n0Q&S(X&yvv0l8!Q+XnA%cU)nC_e>d~ zJ-|Ji3Mhw3)Q3Hy58HsQJ*2*nPIvbT)IiuVm~U^r@Jy&^S_taE6p-VO?9(ZMG?u~m zQ0f7siR%qN0Sz_)Y+t%V1KKH9 zoCkpUn!xbLRB z{lIU9!!;u+U^%4AI5!Obvs{oae)j{nCwBj9IiUX#)PMe-%b)Qcp(Lb31AHs}Z{14( z+2eX5%jN$&BV^Mi;#w@~K!0%e1G>9U@LTd{-oteR&(1R=S?d=t&*cCcU;(_wcJy1k zW%b^3kOQ9k(IeJ&jRE+97VLv|H}8Eg{^RcL^&c66?`?IS6QK%ogN!{oKdJ*bzl`V1 zqF%AYb8Pp!*3ogS$2_;AyFCA1IA}vUrlW2#-U(ufA_AlR2i?KTaa z|4eX{70&5^i#mXI;OjkF%(~qj7v_sqodJZ$`K;N0=&Rwp83}mzGv3)@>I3SL7s|gU z^FoF&7d(nu3v>GI+gXtRIS7m6#(zejJ;=2PzNvtA0P3s^$Sx7U%6_3Q^#bMZ(kXux zmMFpcX+o{Rb~AwmUNhzVJr~DqJ_aBQ)B#p6BbY<7pjP4jutXMUIuBugDfu(`($yyv z279m;WQhARzm#ov{^R~Z_s;KXXfc!RmJ4!+z1gj}_8P_lufHdE=6yWdVMZ~(^MnwV?1SGI!}(@bF0{|cGk_bQ zyYqcaIe*W^ar<~o7xsCwLJlJ=>Lk#`1M&9*zL&?>_m4t*!Pk@ahGhc(q6nx1xQ`#& z131rxyaRLq=6$YR{Gma zzJKjv+mCC7>^~@fIf!2f_&WXX`J-`7`d6<1U+M?W7vF?&Vprb~&+f%DMX;auJw3qh zfy#p2_%fMp{Wqr8b-l0IZU+3WWP#`3lEr<9uM1$bE8QaCt3X|Ghk^SF@U1+)z6axt z4li7P#JmD9J;1YA6hO9~;9dfJYaJQiBQ@=b{E=T+Z@_+HpKBHH9M|){=5crY zZ$S<&c#c<3>mkYy`;CylGoY!PbbJK5r$ShQQ7=Cupr^Wt?*+m4UU4rGtO2V|03-m4 z0L=GHVGfDB>J?1{`;k4$2G?!j-5ep{C5{DHeP0{j=UWEy=SDg7^uo9RY&+rs-O)J= zQw2N^TIFQNqc0DH{Ik)Q`T;3mL*z8_f=#Q9SI&fVi$Pzm7A z<^&n%I70a85buZkUnoO>G=P=4|C^w9xNq#2k>k%I6lD!E$Mb_k;J-Ya+rYu<81QRa zPzS&kumMj808fJf*8r~p*e;+=hBF)KF9B4LyAOmXgWbUQyT49~CBGr{Bg6JXnl_Mj z9iY4Qe>dcf?-8+-Uti!q<^b>?>mu#}lmd4IxDLQ)C(sK!_&)?(c=w|9r}eoZJzO*9 zguD^~-IYDsAI7_YJ?(S+F&F-sr&yPuKPCYDkc0odeqHlta0%py`Zf?y3h1u<(GD2` zeg+A>CJmH7jLYF2XU3QuZ7{wc1!Hsuk9rNAKZ_77FN_;d&vEXcyZgRSN6tcAJX7Ll zkj)VzJmUG@7?dzT}BRtvs|D|2<*eNQulF> zxHp~!@o$qqo^OLZfpU!l_Z@&~4?n{H2LRY_+c6(p$nn{k$*_)4S~= zt`8bf>ygemKr<_Se$yGf0cSyf$l$`c znLqYUMtA9DH5|@2;oc*VJ=(Bhz#ot{IMgtn2fe!*(qze;$lA2271@8aaJ$RF%O z;W^skfL>QzGwK`WSYHw7Jj-I)P!}=*zwCN{cLjp|0L9KaG8@W^^DbZ4gFo`adVa?y z&>tbxquz2s8K7^2?-$Z>UST)j&*m7vF5@fE>2avnnAX4j>KY4*LRqr_U-RP6{J1s} z0k&2c+mnC#!uJEQO@nga9Pcgw_F?|43|~Lr20Y>Ejdty?;IARrfUbVPSm4!*9`FnL z1Re3vACSiOwkLaXenz=akAZefN4_)2(>e$Jgzw^VohZ1Uv!!nXZ28Iio)dbPFRN z{)-p(1-p2Ob?8wK`G~x&1szBRJ;FUU9Pt0Av(ueQCE&aq%t!G+`ePuU!+@UdD?ys` zAsu`t5Yp_OXFvaRCVnHqPCMEG`?Wi8JkY~4lo|C8>r**k69Dyq7x2UVX{_%?ARnlw zxOQa*z&RS+pYg3a-Q9cTkd7suCI4To`(LU8w4*pDfb(8H09N#9jjCVIk=Li7z41Ap*tNu5T-W=$!;5$m+rQyH! zptCQ~j&&>?c#Ly?tn&3+;V~UtTfn)MRgm^X0KUg54}f{3cHEN<=d7U1m{(E+Kc3Yx z3E&GrnPdCj1o&3^tloomioP877;vJ__g%l|0Ms|M1Gx4X1$_EhI>3|>+6A;NINrPm z$OBvioCDco{~gyHiUBVH*sk}aKhMnTTP~jSz8dQNFZ(^v-%IPS@!@$F@Xa;cvx$2I z>H**4<*#<{HI!!w*tq}99M6wvN0%MIws$GWAM4|*3#ScKo77F_p|#1U)Ix~`5(`5 z-Uf85sx!uT|E_myvx$&;OZ-kKf_Id8od%ns0LX*Sl#5_0|}^-3#>?)|}~VObmlQdn`4I zFq3-y*DF*X#eE#;<3Jw=`Z&0DllK&!ua>irA=OR!#{huigfYLykpEG3q4fw4D1dLk#*$?DE zR*-2|eh?M@!Cn8(8*QB-Kl__HQx0Gf*wo1@3e#WPNm)6QBek7>x*W{e1QYHG_SsJl z=qeDUE90iF0#TTReeJ*2NnZdwFaOL8Iz0eH6~IRCQ0RQj@Iw(gnEb$JSVU&|zz;?C zr+1PG_nH2#{J;;)F~R$c>$AU$uHXFrzkAMP5U>a0E6@YFGWgBkN%U{=J2U*v-M zci#H!FYoks$pa*&z_`)TDL)W&XFgr>{4DscijKB|A^0u_{gBz`U??$$pv!^9jH}Cn zP?&y3^+OSwbUp{aKf~g5`56*K7QtP{6@VFl8SL^xOrQ|O)^&jeG=bos{ZKXVVo-rW zx-2MzO7w%Y@cL{tATC}C_zW)~2rm4B7vI|oS7^3&4^870BpDV)RJjwhl(t9ZRT^x0Gu~~X zUyxI9Re%$v?0t%aStR**yJ?DTL7DAhf8%VnRHf9y^ZKv$4?j)S3=oN~a-Sn2RzA$9 zgpFgDM)fm_2t_1F{*eAemo1~SO$B0z#{(X|e}3IG)zYefm^veNfY~s@LGd+H3o--U zC8lnpEjg5yqYyRzO;E-**Rd7i6zUOV`%3ZcRWtZ}5 z?fMJK57(U9a>n%GbdJ_=2f~!`C+qIBZRee7d9qHup+586v+DuMLTowGsa1NL6Zaq7 z`&eD7XoQ}}xdXhJgac6voy zpi9;Tt4U(<3EFv%=8{_VCS-$Q96q}Q8Vwbw6PNKS=CLWAZJ@hJ%Ef zoD=7(_Me)6;DY3$U7aaE$!UW@_hG1(cM!gKX$To%9va(ZaThX za1H;|<*Bl}ZIi1-*4r1H2*21Kowoa$>k;ke&JwQ4hvx>wCVN3h-thM=le9~$IodM} z)t!^}DGN=nENZWOf79;txni!k1kHg^Ug2AJC>3*KuNb{`=kU|ES4&n|Kh&}E%{+q# zZW^D~9^R~~YpV<;5Z;ku6(KACLX7|8PSRnk8-q!j0<(EWO}j$Ta>+IBcV2xDdqJBG z$!IS3?S`yjXK$rQO%L{)mQb%3Svf!TjpLx2w;A&eXiOwdPJG|C-&tyAi7 zkL}||1YH_o-8@Vy>|)C*uMz!U?utEWDUozxw`)lA!!31hj&Cs;P)iRupD}O6#c<_= zqi;%#dYTh9LXJm|9g+*b-S&#TVzX!Ad%c#BZO=*T3a@jPi>2ns@a)M?BJCrvHOCXL z`h+-t;3*4US7tj>PN~#=*o}P)Jy)haF^uBdY{(%zD6h?m-Dmeg>88Duk^2VZM3Ts< z{Y%nm^UX#E+!ii+J|}Xl`6zRdGUeeyGi)bEx$)bNeZC;wz-@bm`iX6gAwDUu_ICIi zYzYo6ZjDb+mrNps$M(C`k$kk7eOqite2(ShlVuS@vB=?Gy{~> zMl@eA_gH%-wM^|ieJ_#Ei1>u}3BS(1#=T|IPn#Vy$B&aaNe|$sdIZfTtUXO>%ILSa z|0CV1ccJyZ`d7yB7;@-`jD40po&V#^lv;O+nbi$;b_&V-NWaF-sdq^Gv+pd)zr#Tr zTsZPd>Qc@DvWuo9gqC^k%)6LpH(T@YX0q;$n3zy=xuN`}t()1F5cZOFCUWZ#){~y_ z&o>U4;zGu><`@gQ7q2 z_z!fXs#_)7RXRns9oQLqYWJ%{J2vGQp(9A7NEZ>KZQ+H;hh5wnHkE^F0)kbgbu zjTq<3DYNI_1TMHJ`isspc(}GDN3Ghza>=X&Y6WxFkHBFy`ZU@#VhaN zY*EAD%C(B##BDQf3hdo@=z!caamxDR%S)xBPH6K~rbhZ*Rv>P&qNUYp(6(``)3)?D zyQpp3&APmg?sIjk4DH8&QJypMGRj^x3 zIL$fMnRl&({pzQ4oU1$=E>0~TG;wcrk#5lX2%5}3pO8Ju{#tQ<7gA@PD?XjEZC=VU zUKbOMD%;VqEjlk0_|`5bDH|!cUK(tA>nJoAYAucJ$xCh&M)q+H|hQ`qXiLU+c^ zYZGc~KMi%Cop<&e-Dd6dk1{|+tZwtvac{gr45|!-TFWLI`k2RZjlOv;;YRGIi7xTc zJJ+o)w2tEr*3+9_E?Rzrq9h@wkStJFs!=^={hKRRde>$o=3 zB)(X~x_v1?i}{N5#{WP5QmPVD$F-j$*C@kJyYS-#c^rCE@hGwCA^lYYtPg zx5_#fJm}vzA!yONXO2S*IkL7bSkF0q{JkRo(_>>jw<>cFeBfQ!bXQ)cSZK9HS*hsC zR*zhDN7F5<{M8Lc-JwYU39j7bcI&?zb;7cx=HL?zO&K=FO4=D*MUq>;G!*%{ioP4(BvZz7cP} zGot0-$HV6e7fm6N4Q#j6nPgb*3Hqq+Q}RhOZoi~+0OUk_w8lNYNWe`q$ErYDLgr%) zu~gkG)V#uq99z7>O*4LuON6olDftlXY;_KA(j?tW1SnOE{Uh@nS?|O!zmZ#;S1Irf zoJLsaJKoARM=L^hk9=rgt8UeJ7i*4CIlh^kI}UR)GNKe0nTYM`xOUYz`Em=PMohBd ztZkwXHQIBWQ$M@(5RO|P6W_Jc@8)hR`Fb>mOQ(0wv?Nm`;5bBt?U$r<6YS4$%{ zu2@1icOZoRiJzLa`OQ)GA%}%xcDu2))o8Eq;s}+^q&;4{uVG_zd|YzJ04uFs$32^F z7%SwRIWuR!-&5gT9lVWf{Uwsw*2wtqI_{^*1kX}guud*-PW<(qoW~Cfr8iHXMJ#=3 z{PtMz{fN0^3cUJP?-a~9?;YbnxbW=MDtU96{>QiIxt0}cvkzsn)jIB2utD+!%_T)Q z{$aUTqs$^tYi|KP@sx^5)>Su1CTgX{i^2#m1C91JZ{NSE#GBV;m>W-4Vm$k<6JhkR zfwMQP3gilC4ctH}3VO$RXxauVl`BM#S*9^2^5#n<-#!eQEz=P5GI%!MakW?HYP=`J zNh;p*eqlTJRMa-jmYbhA+9?A%UKh8t@C82Bt(qNaH2ZQ{MOtxoS!Sf7zY)b-sMS4P zjlA5Ra{$MYuu&N+*AzPVOW!7yaC~SSI6YXF38i>pJR_!ME+x`|xTPpUSvrRx{v5dAsj1FtTr_P(=n zO3=ws=TAjbR#N&0CP;;im#v*pcy8YR91%W45O0SZnObmY? z(HK0Nvn8A=`Se0tt?Rkr8>g>&HlN(U=OQ?8Ix$GT%+z_1=0#3JJ{R@sRaO}*#ubVV zuW%{ow@lIgPOjKo+1Kq9p`umc`24Iu&cbw=c1mPe_|&>n3yf<=x=to+yeX&H`rNf6 zH+Am^YR1b}(rwbRw+R|&p6&>E>mxK$+R&*$MR)#1uIHq^YfEz2!mbUr8M#cY)_2Dtf;-W0m8JLPVMOD(0S?rW57d+RWQq6KT$N4o zPt$o7#j8WI5|*Dk_l<%b`~wY-;Xd^b>F&|TNPd@a6(4NoQA ziIZchPOqAukTNI2-%+62$9%_Y&C}~j>e+N(<;yA1Qle6K8*I7L&!^uqqnO9nHa~V9 zxO&D-A-|wCrdp2^Jl1n=T%DXcOxR)jYV%PlA(?5}z@79tpFMB}# zLV-!!*ch=ukJQ!u8|w*r9s`NhH&Z6&RH`1_IgvPuyiC%*XjA)~C~ET3tfNyaLk&8H zHKv4_oGX?!cFZ59E5*K8g|~j=o>Lc6PjJ$jC+}6G%0q)ET=b+^e%?pE;V$)|8WGht zF%M;)>YYg*P)upx>7ikAw=n5s$%6Hg<82oQf6TTh&<^AoW0b35rgum9B>Rf;t(14r zvm0W(MwB;XAtfg)QJkPZ#9DvioLPk@o^HHA;upEKVU@VS^vhPnDjoCLTuB63O7z@Y zDIa+5Om)kvPf%UE@sg!`hc~ItVpH*vJ5q1CN>+RM+fL{5B{e=UO_WrBRvuqYrsye2 zo;bwjBT(z&bi@p*l+cdHkEXxeR1xEH!_fStQ{|?47pIBrO1@yDFXD6a+Nk(O+4J?8 zb7J?Zy=&et~&cEUfz7%$SQODsZ z;*sNtf@A9T4i>+qVg5e)-KoJ0nnMB-YRYWX+zL#GlQHBZ0zlxmP^Q%74~C?h!cw}CO>#~f1rTZ zJvHgMYa6^4`Mqh&$b7po=sgcGbqC)&&cqG%v&xrBHXAMzZ>_SJJ}*|n>b7R?6=8Xm zYWMv!BTsBo($BlH{;J9%%kxpI+yXTyyK9dthAE9!AG*N#aK8uFYRJ$`BaQKorp75H zxfUD@ugEhY$X+x_(atik&Qh{Yq+J|Q@AXh|uAi9+yXu?3D4$^Em)fHX$D4|XPoFsX z?L3-@Ax(Wzy+gfd^%26z)N=)brlHGx_ths5YW#S|lyJ`6cGP|Ha;<}6+nrUi@4co( zkou`AQ*P`RX>6y^Me|;$kCWOJanSej2THY6sFX^zqoTx0(k_lHxf8sRQs&OZS1zSR ztv-?GJ9oh_6KE$-&$S0oZf~E^I5xCuZcX-ahtWo( zZ8FE{5tkR3R<>F$ihc}3c*PTZo9{Y0+L}DHdU|iYUT&L=;ij}tQ9|4;87VQ%H6jM% z*Ug@jb#%hmfL-y#0ffU=h57;m8!cy<(7Xl;#7ao*Od!Z+5&}Fn?BS2uzuolO&M`Mr zbXE-4*V_ARt@!k9_k<`{D#Vh<`%Yildc{gHBGkP2%x(9iRga|NSNXckTr}#cpYZ(L z!Y9Si2M8~C?Da;i=@%OzsXi-cYP!{n8(grjX37bxTgt!Xo?|RH`Kv9>?cOq{hyk|LDbp zpovGD%GZSw=Lho_D_Zg@2wfO{$yTWUCzETQ``n}hZM1dvh~<~6IFzN+`iTo3d{SMg zTWuONF?IRa#Rm(oSBlP-Y|B`ezFKtNyS!r-uM6Ws2LboA`8My?KOc2&Qml}u#F>3k zyvA&9alY*G7QP*u(#lPR4m%7U$l)?@OI_=UEsJa(58jrrtXyO_0V-+!0!!{NE}vQ`@B$iI(Mrj}b|sJu6B*+8yuoy0$< zUxCm)wQT;82{Fk5H%;RVxD#~9&IM-=1!Tx2>FF=h4Ol$h>lEohT*56O`5jSfJO+mN z>3N3vlS1fg!O$^;dGW1#>xc*j!wP6_Tt!+`2MZsR#7mF5?rk1No z2bbg-?+B{sKT^rg$I+ww?75r?cKngbT)9K7+TNdhLJHkVTCilH`=+S9fq`?!+@#0I zpP+My@7Jz)$?5uLT(;NMJK20guB9*Qm!T^8fxPfagJeytJ~ib<&HHw7J5KK$&rxqZ zcZ@O%i)4=?PBD8Xp;Xm6_SGH_v%n!ir95q=t|Q{>4Xi5z7N~em`EWg>-~5rU-oGJ# zvYE6!jzE_wH8YtoJKA;T-LydEorU$+^%sd#Do2kDUA8E^Sub^n#~Mx^_Jn|r+2xyg zwZ(bj-m#?yoZ)<{n_*3CWXn-7pBCd5Z*N|kwKCU1T-=3Fl32oiX0D?~!2S*Me72k* zw`ofZH}O~#?n+Z&Td!4pE8hF*qbUXn*PP<+P-BZZX53gZ%XTuGiLM9r6ZhKHg=Y$7 zt_x4miPm;bf1tcGFPp?KFo-wOqv(!E`K$x9RGm#@WvT`1jtCB%rI{aZ5~bm;EI72kH%ycfrW_{RPI68S9x*XN@6vVG zQ5GA-)}5Z4o$6edwRC}d{rw4zM`x^QahsZKlyN^dG~|3S=~hb;r_Te875;_wj+GCL z?{zGV)v?+^f2_YXQH!j7NH_MCrdm0BsR*Pz^~QqNniKhBk1klDd1Rj1(z>jd^SDif zjI1MTEpIHh(z`QY`l7utY5u3oN7)8tzZT!FP~n#ydudYP%KBk9M~c1Otzi(EsJxOr zd4JkblWlPpi3g?-ig>N_g^Rb;joMGssFbVz7K0L+ptAvl+vhYu|Zc?F6CpNmArTHHhHU$K}%LdrTZUHPD!u-)RCTQGPER8 z{QX143FlME=M0KlZ#11-eb>}>&55XvWb-2#2DX!}16Rv59+fw%FeaXH3EoaPQ?StEC!GjCy9FbNoQ|yzyGQeAnG5Ik!fz_`^K& z^)3TzCcD|&jM=cUZAk6~ZqE1Y)=rPy`ZcH*S{$|&A0zsp|I-G_fsB{ub*JoM2tQ2L zylt4qisj^MlHR9M6?C5a9gHe_P#SkYJh(l@`3-64b*Y8kw{(f6&5~XMcO!;OHrlgn zUcjef;fBPM118+c7m6XLMprxwx*f5Q-(0>X{nA`T@*IlYJYJWT;xGNPHch0D-_h}o z)9=&f@g}Xe%pOS}S+u{y!Qa9raUECvf&1(}+FbjZS8r$ta27lD=FzsWHvt-zP5qUs zKA0abyKYxHsi?)Y(BUajGBRmmRG>Yt(2%=w#ivh`jUV>2v@k4`FPP*L60|)}{Beh7 zr0=<)<3|Yt#^leHl2oH7Pr98#SRi?G@a9_Cf^(v?E?gCp5P#S~;0c`VGNd-ke95o{ z@{PkOdtc?2B`ErnB=^_xEER6Nm>Bwsr*5`h$(q@3RIF^9IS#0a`|y2`T|Dh#p=;@c z7eoC=s(3fBxj8A2G(6TruHp2#s#4;j zZ|3yA>B49`qee$F+sNgKnG#boZdD)Q<YKP2 zs4Qv7anqe`bdD<^lZ)P8a#8-ByplDJUTtf}CQQ)LsHZfnC^*j+=fQi*p>R+1s?iEV zyzPedue{7F@Q^t3oYBY^r`1|48mkoEN2Tv9ko6CtUY*x6#(T(hg|vkyj}57#z1bGC zmXSSM^~cdSM-F){*KZg(c>SK_icJpIH_rLruCvk$R8cFwJ+lAZiKeBN;&cVRjfVz2 z?{``J^jw>EiPX(98{Ot>i)MzdCz|=kDm9t$6Yj$4$pnsfLp+tB)* z?3)H{DRQbjt#*F=ro*4e#_zVpdh#h!RB~;mRnjNBoPEhL%HguJZd~-t#TLF%MS_#Z zDZCK7+J2z%P~MY0npX6u$@iQHgZLtSh91aYMy%WF{%CxDYMIkOk9t1=e#6W%eOMRJ zcrG1tBYb$$%vfKObD42E-siO^EhLKPFB5+w#8cZb|5$>4+q-nxX-cPalLYQ z1;w>CE0en=Ix$Sfu5$AP?=TO6pz+5@wRKtU+BT7E_DvxEpaHeVfwHwm36dNAt zDPvxVQ397o@1b2L)XcVe^-4%Hn{@Gbt)YOp7bQpZM4V`&y4buTw(acJ_9L~fB=~9% zdAit5(^;!};d6Q0*fRH(MSF*c9!!3yH_3yzrB=lIfO6*5;nAslzHe=(y^%V6HAp_% z*rH)jz{JZ}pWA-OQV90RUa`?g+Ow}EU9EVBn#G9H%qZOv>tQb(YV*!!2 z`TRb=BM}`LneW242kV%-yQ$){Du1-0>nB+8`J#s?+a2P#eDTibr?g;3_+^8DMDyEyDF?+!7U z5Nr6fj#%4Z(9sfcUh|daNY}9qgLp*hxb+5=e6rhaQ@GRA!M@CQb;fw&OhdW?f3dZR zgp}L^LlU3S+mwYGUJsHIkiLlMwpXdz!iHs6)+g)>HG6W1bG@Kz(fXD#*TpHLhbPJI zNm4$x!y~A)#Qfd)W0Q|_AK4uTOHdOUgJk{A+txbgPOEMpJ64_{&YqIg5i?qWKpU%g zx@1vcCP((3i1k%xGWG}7-rhdcUvp}%Lq>k;+#5c-17;4E8_)TUaJnf(PFf&%gV(rK z`VOrZ{n=)Xj~%G~!0zI>@_pl@4rUop=&{tPc_2{-f}~l&c1lRoxV!$cV_#l>ztJ(c zb)r|A+y)t;T~5)S_fKiq2<*<-w>I5fhj?A`72D9QbqQPZvqBJzrhf0`3QU_E(j?x7;L@8t-(q(7`rp@pkrvH6>i_;#Ko(wRPsL zo#Sye)tzVUZsi9HC-18;{W#H{Pk&tOgAIu(3AIZl8{48nhd^r_pFDrjq3xe!mJB*7 zno=$s+;K8)r$V*;%`?87#kzy#9Y!K43t zypQuqTFnsNpz8uu3wLo3fq^-^`ehDo6$3Zy8GPoHy73F8Jtk$NcYk!deXOBWt@=*j zZtdZh%$HQByvh zDKkj0khiI$!IFQ~0ox`A=sUg`<_}>GSY*wdDnvbeYNlxQoiqAQ7fz(fE=vn*4^CaGN?bTK_D##a z_E{z?_j`Js9+okh=os?+;|rf#n9o`gWxSuo_@Hb2E`14&A8 zjEMgh<*?kL>_!QpNp!H;3o^<=5{0JjD}E+upSUpA)}7}-#Y$6HT=h^M`R1woGhNPX z*#(xCNvA0OEg^TBHJc{96WVV_kfbUJA}QWm2)_bsMSl5C9W6(@#{CwIchZS$-k;ZYGPdJDSzC-KM=H0HL13b*21oL3(MEQj{zmO?B8`*HZ(B`{ zS!`E%k5Kc0SarUN>(TTzlUCRU+uu)COLgZjI6!;MZY(CXwQ&T|@#bM-X}^H=IUk;7 z{`XAm39l1syt7&MkhTny=z@%Whb(T z%WnKyiPQ0(E2ZfsS&=pG(=T}j`>iss;7xTt;qAHWZqsbSM#-X`8FYU!fvDZ;2Q4R= zXEqAR<;91hH(4b)c5kn&!Bi65Iw10fm(n%-a<(QjX26N@xiuRr#w7_!C zw6Zj1iHWA^V-(ej9IxoSIIia0ni1{2hJGe~7pEL^rTa^SpFJ zx9X|!z1c73SX5SpiE9L0@g8)va8H`q^GSpu@}~#pPcDDnIDN!^0aFEQoA9TK)p7a9 zkBp4i!NcpA5z%y=y4YH}DL8MYOJlRi;Jadzz05YZlb3VU?oHj)e_phfci!N!#mdj) zP7;*kNZ9N2gzML|%*QFtjd)11bDTRcMJH~}w16DP*{7D| z8n&()SHWA}p6Qp!c1kSf?4!oDB(b>gWsfBlBEx1WW+~g7t-9I3xz2e-v#4bH61(Ni zgzFpIbaU4|SCekvr91=|8bhjf3=o}05T24hutZ?F-zDWRE~x=K=$~?{9Ix))w&O$U z8M0dLMB&EwYMjZ3CZswC!5RdAki2A(u&u^S`>XUErP4OGm!%#S0!3M+eo7L&ietjf zi_MHIVlHdTXtZp;9vg9M`Meu$$JsUN*SSn^4Z4^#Kq!0tpbylb1l1iIWlW9JlZD6R zOKwm|pj|YJJ$Pcv$fx`1D<;+PYiMvj6;?J+k9n9@MKe=(sF-&&s$|1~6~W5WRCW0R zQqSC0E$@0Igk#HfLW%G%2(Gxj4!>QldTRHtF zr4z)>hLPUPm2r)_Tv<8sTtCg{_NpfeQ=K{1#*62rmaX5g$VZXm)+F^~H4Ige1LbqQ`G9?f1|^D=;_W3V&Zdh8?@x!Q&0z6Fs1JE^Oz-|SY=+Opc;YJ*Vu zvZuMuZmX6XESz@L@MeUm?haq0j^hdYZFF_C=W*vu%{3AB=`S()Drfeo(E3c>!t9KB zPOfj3E%(tTei$PEEPq{-?M8}gxnz3$dTGo2?ai$dwZtjTRTnqz=G7)9Wot-$)~4AtqbWl%UF-ZS=7MT=BuV(PN=JZO(iz2yu~XSwZGR?vKQ^camR z;^>vd_65$oEf1Hhc$4fY{d(FNKWe(qiPgev1za$K7NVJOEbf0%KJ@((las1768+s) z%;6YY+HxVl@w@|fO9QNaUkFR`%Xo1%BeRVJ0~-AWd&71#h&QCj>IZ|^ zA8`5j-Eb&ST-kncTEj(IxA`S6Oa_-&OC)nmPp=Iyd&y>P`hcx?S7TkQ3}0#}!E6|R z%&fG5nuM652ZKD7Yi(dzCxJuvn!$xy$7UYEmZ##yqoiC*(`aOv#ixr?oyvtc+n=$Y zHoCO&*r7#MM;h*&9=t%$;X{7Z<+8vst|o2L#Z&#=d|xf|D;{32HP%xnfbS(eILJoX zqSwQLd*aVm5xj`YjwoLf{c!V9e9ggrjsvR8OqamZ z@iC{HUq97rr#GImmX^*KMohw)slZVMf-&x<{rHR)#pZGEv>Uv*e_8B+NnRY`Aw0wcjnWgm z4i!>ko_R;gav3Ey`mWBq9`9Uob{3_r>h#BE$$_Vw4)D}@ve|G7Z_e7X`$?JRN^_xw zk8M}=FFp1W#wzzFUA}VURceQb>m&ljr+k8TOQw;}qG!t`)tdw_4dd5hx1Kyrzs`~K zTCL)gX@mf)4O@LmR?nz>B=uq)$w#i>y-nq_Ylki?^A~&DuS-;xGu_sjyxK-gA2ueX z>BqjS*I=LZT5QyolQ%uox1!y&ZK@rRqbd~!?pe5W~@TCR5E!f0-JN!)8k&=zgD^6*6Av;ORUa<$9WSQj4p+>Q!rnbp*1MHbl+wcce+CCaAD8EHNrX%LdbF_AnjY~B_%9fcdBzP_Gw zrh81kyr%xjCg?Z|-{XE{cU57Jy?$}pzKNoVqU94fqU|abl@~7cU-dqKvT0shg_!Ow zD_i3a8BXSc9m~`b>Xtf$Uzj&xvsqbxmm|X#cpk4hunQKhE`^95ILGgksr)?rJmJ3B z7tFgctx z7#`}v*seB<%c-(I?+I;vH$t1NW6Jx;#pf-vNsjjncFkYIx#@qcoQprx-yg@fF|ugN zHkVv7mzev?Epo|5C>q*?&2%GCa>=FK8d(x4m)x3-klPlLYq?)izN6Usb|ch64??x( z_WS%EzklKP2b}Xb=RD5k^?tpd@8e=e>N6zGj-$7>#TqEe3sjwJ5A|xk2E@VUmR}~_CV^_|G=M2k!(iDUumE&^I{=P=X)xH}?wRWc< z2F;X7-bcjxwF#TbxgR%n#L?`ReoLK-z1PV7ombro33=4Yb-THogZ*?IcY%?6+K#(4 zK@e5r+fYyYRPw!4luvp)%goUr9c;{s8AgGO;k?z@Fvk>hmX#N^FgTC_SD2)3J*)t?D97Ua|a#gP!HZ}h`w4mox{%kWQ(42T_f^)SiQ)z@&f zXk#qycX(ywOkEWlkr7RRX3Vw|JaU1nC3Z&AwbGh>#x^*c4Ji=s(}9VsXbA=y)8pXR z((g4{1*!O1oe|W$J7*{m8EY_H8=Fv(X!hNzDAWBu{Ak3&(TK za&>GY&WBz~?Q)RLdA_%|vnR02S+n;OX96yj&o#)dhO$n}-9mHRxW0&l67`Us%M!%$ z78^2fMaeWD-B-a(iLUPNkh4hBQNms@i{(e>FK^G@iYiLnp@;%Hs??>O9}zMLLh)gX zs;js(+-pwaMQ-9G!Oy>kr=|Ot*!a|t!JcNKEced7R?4MbJnGYIFOvT4f^79U8S>P> zW_*A{0LfZHlLycROBgSVT&TM)7(jcA?62rDT zxL-xiq>`bAEudHqA|ZRliL`pc**ZWW z7a5F8uC1O9K)|a^gF1Wo-PP@BFlE-5qivGFhQVL`Ncm!x2vvLzE3J!PKovkX=<^w;$#|*{-3#-;lz7(NC%ath)OXpeYXaQ>Elip9&N7C5th2!Gy$S zbJuxNuWhVjErkCvrw3*iu}>a=!f}L%Oy)Ne+E!rZN+?)6rep3w`P>y_2pjaik#!D+ zI$%7y@HaK>use5emETNuwjH~aC*rU2j72C0H*^bO@&!m)TefkO;l65964?5mde6ff6;y@+is%x(IOQNL zt{(rXW=OY1r{~9a`86Qq^WnBbRl>d|L`@;ORJj2DP?;w^Ex>+y;XO;HA;X>8&;qUW zGNDPBB=?8g#(a-%QYWC;V$ zFKw+WDK?O!^QcU`$z@`U452q;TGXTjafgXWv@K#b^v13h(Z<9b0PJxFWEd^3OLHm; zw(XQXlT2_PF%#F}5T@+8wo-A|=&^2HmVa(axq$&%DfCB5a8=n`1!|_}tbS@E!ZJ^1 zf#WmjlYIP!jZ)N?u|#3Yi1pLW_=atSAZ*JPfj1+Ws$OG z313h8CQjD5E5DYY*531m^G~Q~8W@ZTfLo1r+wU*x6ot?&aoHDOfRuV$rTM2D$4hlV z{?HdA<8tY0lJU4~CvkF~x?ld7vA0EKn@@q|ZWfrr5)&K@avzS-D)aeii2Hxl{QR$SC}|sBR)4XPFAh@xs+mB}csE@A5$cWq0B-FI AKmY&$ literal 0 HcmV?d00001 diff --git a/tauri-wallet/src-tauri/icons/icon.png b/tauri-wallet/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 -> fmt::Result { + match *self { + Denom::Major => f.write_str(&DENOM[1..]), + Denom::Minor => f.write_str(DENOM), + } + } +} + +impl FromStr for Denom { + type Err = String; + + fn from_str(s: &str) -> Result { + let s = s.to_lowercase(); + if s == DENOM.to_lowercase() || s == "minor" { + Ok(Denom::Minor) + } else if s == DENOM[1..].to_lowercase() || s == "major" { + Ok(Denom::Major) + } else { + Err(format_err!(format!( + "{} is not a valid denomination string", + s + ))) + } + } +} + +#[derive(TS, Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct Coin { + amount: String, + denom: Denom, +} + +// TODO convert to TryFrom +impl From for Coin { + fn from(g: GasPrice) -> Coin { + Coin { + amount: g.amount.to_string(), + denom: Denom::from_str(&g.denom.to_string()).unwrap(), + } + } +} + +impl fmt::Display for Coin { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&format!("{} {}", self.amount, self.denom)) + } +} + +// Allows adding minor and major denominations, output will have the LHS denom. +impl Add for Coin { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + let denom = self.denom.clone(); + let lhs = self.to_minor(); + let rhs = rhs.to_minor(); + let lhs_amount = lhs.amount.parse::().unwrap(); + let rhs_amount = rhs.amount.parse::().unwrap(); + let amount = lhs_amount + rhs_amount; + let coin = Coin { + amount: amount.to_string(), + denom: Denom::Minor, + }; + match denom { + Denom::Major => coin.to_major(), + Denom::Minor => coin, + } + } +} + +// Allows adding minor and major denominations, output will have the LHS denom. +impl Sub for Coin { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + let denom = self.denom.clone(); + let lhs = self.to_minor(); + let rhs = rhs.to_minor(); + let lhs_amount = lhs.amount.parse::().unwrap(); + let rhs_amount = rhs.amount.parse::().unwrap(); + let amount = lhs_amount - rhs_amount; + let coin = Coin { + amount: amount.to_string(), + denom: Denom::Minor, + }; + match denom { + Denom::Major => coin.to_major(), + Denom::Minor => coin, + } + } +} + +impl Coin { + pub fn major(amount: T) -> Coin { + Coin { + amount: amount.to_string(), + denom: Denom::Major, + } + } + + pub fn minor(amount: T) -> Coin { + Coin { + amount: amount.to_string(), + denom: Denom::Minor, + } + } + + pub fn new(amount: T, denom: &Denom) -> Coin { + Coin { + amount: amount.to_string(), + denom: denom.clone(), + } + } + + pub fn to_major(&self) -> Coin { + match self.denom { + Denom::Major => self.clone(), + Denom::Minor => Coin { + amount: (self.amount.parse::().unwrap() / MINOR_IN_MAJOR).to_string(), + denom: Denom::Major, + }, + } + } + + pub fn to_minor(&self) -> Coin { + match self.denom { + Denom::Minor => self.clone(), + Denom::Major => Coin { + amount: (self.amount.parse::().unwrap() * MINOR_IN_MAJOR).to_string(), + denom: Denom::Minor, + }, + } + } + + pub fn amount(&self) -> String { + self.amount.clone() + } + + pub fn denom(&self) -> Denom { + self.denom.clone() + } +} + +impl TryFrom for CosmWasmCoin { + type Error = String; + + fn try_from(coin: Coin) -> Result { + Ok(CosmWasmCoin::new( + Uint128::try_from(coin.amount.as_str()).unwrap().u128(), + coin.denom.to_string(), + )) + } +} + +impl TryFrom for CosmosCoin { + type Error = String; + + fn try_from(coin: Coin) -> Result { + match Decimal::from_str(&coin.amount) { + Ok(d) => Ok(CosmosCoin { + amount: d, + denom: CosmosDenom::from_str(&coin.denom.to_string()).unwrap(), + }), + Err(e) => Err(format_err!(e)), + } + } +} + +impl From for Coin { + fn from(c: CosmosCoin) -> Coin { + Coin { + amount: c.amount.to_string(), + denom: Denom::from_str(&c.denom.to_string()).unwrap(), + } + } +} + +impl From for Coin { + fn from(c: CosmWasmCoin) -> Coin { + Coin { + amount: c.amount.to_string(), + denom: Denom::from_str(&c.denom).unwrap(), + } + } +} + +#[cfg(test)] +mod test { + use crate::coin::{Coin, Denom}; + use cosmrs::Coin as CosmosCoin; + use cosmrs::Decimal; + use cosmrs::Denom as CosmosDenom; + use cosmwasm_std::Coin as CosmWasmCoin; + use serde_json::json; + use std::convert::{TryFrom, TryInto}; + use std::str::FromStr; + + #[test] + fn json_to_coin() { + let minor = json!({ + "amount": "1", + "denom": "Minor" + }); + + let major = json!({ + "amount": "1", + "denom": "Major" + }); + + let test_minor_coin = Coin::minor("1"); + let test_major_coin = Coin::major("1"); + + let minor_coin = serde_json::from_value::(minor).unwrap(); + let major_coin = serde_json::from_value::(major).unwrap(); + + assert_eq!(minor_coin, test_minor_coin); + assert_eq!(major_coin, test_major_coin); + } + + #[test] + fn denom_conversions() { + let minor = Coin::minor("1"); + let major = minor.to_major(); + + assert_eq!(major, Coin::major("0.000001")); + + let minor = major.to_minor(); + assert_eq!(minor, Coin::minor("1")); + } + + fn amounts() -> Vec<&'static str> { + vec![ + "1", + "10", + "100", + "1000", + "10000", + "100000", + "10000000", + "100000000", + "1000000000", + "10000000000", + "100000000000", + "1000000000000", + "10000000000000", + "100000000000000", + "1000000000000000", + "10000000000000000", + "100000000000000000", + "1000000000000000000", + ] + } + + #[test] + fn coin_to_cosmoswasm() { + for amount in amounts() { + let coin: Coin = Coin::minor(amount).into(); + let cosmoswasm_coin: CosmWasmCoin = coin.try_into().unwrap(); + assert_eq!( + cosmoswasm_coin, + CosmWasmCoin::new(amount.parse::().unwrap(), Denom::Minor.to_string()) + ); + assert_eq!( + Coin::try_from(cosmoswasm_coin).unwrap(), + Coin::minor(amount) + ); + + let coin: Coin = Coin::major(amount).into(); + let cosmoswasm_coin: CosmWasmCoin = coin.try_into().unwrap(); + assert_eq!( + cosmoswasm_coin, + CosmWasmCoin::new(amount.parse::().unwrap(), Denom::Major.to_string()) + ); + assert_eq!( + Coin::try_from(cosmoswasm_coin).unwrap(), + Coin::major(amount) + ); + } + } + + #[test] + fn coin_to_cosmos() { + for amount in amounts() { + let coin: Coin = Coin::minor(amount).into(); + let cosmos_coin: CosmosCoin = coin.try_into().unwrap(); + assert_eq!( + cosmos_coin, + CosmosCoin { + amount: Decimal::from_str(amount).unwrap(), + denom: CosmosDenom::from_str(&Denom::Minor.to_string()).unwrap() + } + ); + assert_eq!(Coin::try_from(cosmos_coin).unwrap(), Coin::minor(amount)); + + let coin: Coin = Coin::major(amount).into(); + let cosmos_coin: CosmosCoin = coin.try_into().unwrap(); + assert_eq!( + cosmos_coin, + CosmosCoin { + amount: Decimal::from_str(amount).unwrap(), + denom: CosmosDenom::from_str(&Denom::Major.to_string()).unwrap() + } + ); + assert_eq!(Coin::try_from(cosmos_coin).unwrap(), Coin::major(amount)); + } + } + + #[test] + fn test_add() { + assert_eq!(Coin::minor("1") + Coin::minor("1"), Coin::minor("2")); + assert_eq!(Coin::major("1") + Coin::major("1"), Coin::major("2")); + assert_eq!(Coin::minor("1") + Coin::major("1"), Coin::minor("1000001")); + assert_eq!(Coin::major("1") + Coin::minor("1"), Coin::major("1.000001")); + } + + #[test] + fn test_sub() { + assert_eq!(Coin::minor("1") - Coin::minor("1"), Coin::minor("0")); + assert_eq!(Coin::major("1") - Coin::major("1"), Coin::major("0")); + assert_eq!(Coin::minor("1") - Coin::major("1"), Coin::minor("-999999")); + assert_eq!(Coin::major("1") - Coin::minor("1"), Coin::major("0.999999")); + } +} diff --git a/tauri-wallet/src-tauri/src/config/mod.rs b/tauri-wallet/src-tauri/src/config/mod.rs new file mode 100644 index 0000000000..90fbf670fa --- /dev/null +++ b/tauri-wallet/src-tauri/src/config/mod.rs @@ -0,0 +1,90 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use config::defaults::{default_validators, ValidatorDetails, DEFAULT_MIXNET_CONTRACT_ADDRESS}; +use config::NymConfig; +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; +use std::str::FromStr; +use tendermint_rpc::Url; + +mod template; + +use template::config_template; + +use crate::error::BackendError; + +#[derive(Debug, Default, Deserialize, Serialize, Clone)] +#[serde(deny_unknown_fields)] +pub struct Config { + base: Base, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +#[serde(deny_unknown_fields)] +pub struct Base { + validators: Vec, + + /// Address of the validator contract managing the network + mixnet_contract_address: String, + + /// Mnemonic (currently of the network monitor) used for rewarding + mnemonic: String, +} + +impl Default for Base { + fn default() -> Self { + Base { + validators: default_validators(), + mixnet_contract_address: DEFAULT_MIXNET_CONTRACT_ADDRESS.to_string(), + mnemonic: String::default(), + } + } +} + +impl NymConfig for Config { + fn template() -> &'static str { + config_template() + } + + fn default_root_directory() -> PathBuf { + dirs::home_dir() + .expect("Failed to evaluate $HOME value") + .join(".nym") + .join("wallet") + } + + fn root_directory(&self) -> PathBuf { + Self::default_root_directory() + } + + fn config_directory(&self) -> PathBuf { + self.root_directory().join("config") + } + + fn data_directory(&self) -> PathBuf { + self.root_directory().join("data") + } +} + +impl Config { + pub fn get_nymd_validator_url(&self) -> Result { + // TODO make this a random choice + if let Some(validator_details) = self.base.validators.first() { + match tendermint_rpc::Url::from_str(&validator_details.nymd_url().to_string()) { + Ok(url) => Ok(url), + Err(e) => Err(e.into()), + } + } else { + panic!("No validators found in config") + } + } + + pub fn get_mixnet_contract_address(&self) -> String { + self.base.mixnet_contract_address.clone() + } + + // pub fn get_mnemonic(&self) -> String { + // self.base.mnemonic.clone() + // } +} diff --git a/tauri-wallet/src-tauri/src/config/template.rs b/tauri-wallet/src-tauri/src/config/template.rs new file mode 100644 index 0000000000..3242277b83 --- /dev/null +++ b/tauri-wallet/src-tauri/src/config/template.rs @@ -0,0 +1,17 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub(crate) fn config_template() -> &'static str { + r#" +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +##### main base tauri-wallet config options ##### + +[base] + +# Validator server to which the API will be getting information about the network. +validator_url = '{{ base.validator_url }}' + +"# +} diff --git a/tauri-wallet/src-tauri/src/error.rs b/tauri-wallet/src-tauri/src/error.rs new file mode 100644 index 0000000000..2031829a9a --- /dev/null +++ b/tauri-wallet/src-tauri/src/error.rs @@ -0,0 +1,21 @@ +use thiserror::Error; +use validator_client::nymd::error::NymdError; + +#[derive(Error, Debug)] +pub enum BackendError { + #[error("Error parsing bip39 mnemonic")] + Bip39Error { + #[from] + source: bip39::Error, + }, + #[error("Error parsing into tendermint Url")] + TendermintError { + #[from] + source: tendermint_rpc::Error, + }, + #[error("Error getting balances")] + NymdError { + #[from] + source: NymdError, + }, +} diff --git a/tauri-wallet/src-tauri/src/main.rs b/tauri-wallet/src-tauri/src/main.rs new file mode 100644 index 0000000000..1b6a7c3ebd --- /dev/null +++ b/tauri-wallet/src-tauri/src/main.rs @@ -0,0 +1,78 @@ +#![cfg_attr( + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" +)] + +use mixnet_contract::{Gateway, MixNode}; +use std::sync::Arc; +use tokio::sync::RwLock; +use ts_rs::export; +use validator_client::nymd::fee_helpers::Operation; + +mod coin; +mod config; +mod error; +mod operations; +mod state; +mod utils; + +use crate::operations::account::*; +use crate::operations::admin::*; +use crate::operations::bond::*; +use crate::operations::delegate::*; +use crate::operations::send::*; +use crate::utils::*; + +use crate::state::State; + +#[cfg(test)] +use crate::coin::{Coin, Denom}; + +#[macro_export] +macro_rules! format_err { + ($e:expr) => { + format!("line {}: {}", line!(), $e) + }; +} + +fn main() { + tauri::Builder::default() + .manage(Arc::new(RwLock::new(State::default()))) + .invoke_handler(tauri::generate_handler![ + connect_with_mnemonic, + get_balance, + minor_to_major, + major_to_minor, + owns_gateway, + owns_mixnode, + bond_mixnode, + unbond_mixnode, + bond_gateway, + unbond_gateway, + delegate_to_mixnode, + undelegate_from_mixnode, + delegate_to_gateway, + undelegate_from_gateway, + send, + create_new_account, + get_fee, + get_state_params, + update_state_params + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} + +export! { + MixNode => "../src/types/rust/mixnode.ts", + Coin => "../src/types/rust/coin.ts", + Balance => "../src/types/rust/balance.ts", + Gateway => "../src/types/rust/gateway.ts", + TauriTxResult => "../src/types/rust/tauritxresult.ts", + TransactionDetails => "../src/types/rust/transactiondetails.ts", + Operation => "../src/types/rust/operation.ts", + Denom => "../src/types/rust/denom.ts", + DelegationResult => "../src/types/rust/delegationresult.ts", + Account => "../src/types/rust/account.ts", + TauriStateParams => "../src/types/rust/stateparams.ts" +} diff --git a/tauri-wallet/src-tauri/src/operations/account.rs b/tauri-wallet/src-tauri/src/operations/account.rs new file mode 100644 index 0000000000..95416fcb0d --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/account.rs @@ -0,0 +1,113 @@ +use crate::coin::{Coin, Denom}; +use crate::config::Config; +use crate::error::BackendError; +use crate::format_err; +use crate::state::State; +use bip39::{Language, Mnemonic}; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use std::sync::Arc; +use tokio::sync::RwLock; +use ts_rs::TS; +use validator_client::nymd::{AccountId, NymdClient, SigningNymdClient}; + +#[derive(TS, Serialize, Deserialize)] +pub struct Account { + contract_address: String, + client_address: String, + denom: Denom, + mnemonmic: Option, +} + +#[derive(TS, Serialize, Deserialize)] +pub struct Balance { + coin: Coin, + printable_balance: String, +} + +#[tauri::command] +pub async fn connect_with_mnemonic( + mnemonic: String, + state: tauri::State<'_, Arc>>, +) -> Result { + let mnemonic = match Mnemonic::from_str(&mnemonic) { + Ok(mnemonic) => mnemonic, + Err(e) => return Err(BackendError::from(e).to_string()), + }; + let client; + { + let r_state = state.read().await; + client = _connect_with_mnemonic(mnemonic, &r_state.config()); + } + + let contract_address = match client.contract_address() { + Ok(address) => address.to_string(), + Err(e) => return Err(format_err!(e)), + }; + let client_address = client.address().to_string(); + let denom = match client.denom() { + Ok(denom) => denom, + Err(e) => return Err(format_err!(e)), + }; + + let account = Account { + contract_address, + client_address, + denom: Denom::from_str(&denom.to_string())?, + mnemonmic: None, + }; + + let mut w_state = state.write().await; + w_state.set_client(client); + + Ok(account) +} + +#[tauri::command] +pub async fn get_balance(state: tauri::State<'_, Arc>>) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.get_balance(client.address()).await { + Ok(Some(coin)) => { + let coin = Coin::new( + &coin.amount.to_string(), + &Denom::from_str(&coin.denom.to_string())?, + ); + Ok(Balance { + coin: coin.clone(), + printable_balance: coin.to_major().to_string(), + }) + } + Ok(None) => Err(format!( + "No balance available for address {}", + client.address() + )), + Err(e) => Err(BackendError::from(e).to_string()), + } +} + +#[tauri::command] +pub async fn create_new_account( + state: tauri::State<'_, Arc>>, +) -> Result { + let mnemonic = random_mnemonic(); + let mut client = connect_with_mnemonic(mnemonic.to_string(), state).await?; + client.mnemonmic = Some(mnemonic.to_string()); + Ok(client) +} + +fn random_mnemonic() -> Mnemonic { + let mut rng = rand::thread_rng(); + Mnemonic::generate_in_with(&mut rng, Language::English, 24).unwrap() +} + +fn _connect_with_mnemonic(mnemonic: Mnemonic, config: &Config) -> NymdClient { + match NymdClient::connect_with_mnemonic( + config.get_nymd_validator_url().unwrap(), + Some(AccountId::from_str(&config.get_mixnet_contract_address()).unwrap()), + mnemonic, + ) { + Ok(client) => client, + Err(e) => panic!("{}", e), + } +} diff --git a/tauri-wallet/src-tauri/src/operations/admin.rs b/tauri-wallet/src-tauri/src/operations/admin.rs new file mode 100644 index 0000000000..8e4f832936 --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/admin.rs @@ -0,0 +1,84 @@ +use crate::format_err; +use crate::state::State; +use cosmwasm_std::Decimal; +use cosmwasm_std::Uint128; +use mixnet_contract::StateParams; +use serde::{Deserialize, Serialize}; +use std::convert::{TryFrom, TryInto}; +use std::str::FromStr; +use std::sync::Arc; +use tokio::sync::RwLock; +use ts_rs::TS; + +#[derive(Serialize, Deserialize, TS)] +pub struct TauriStateParams { + epoch_length: u32, + minimum_mixnode_bond: String, + minimum_gateway_bond: String, + mixnode_bond_reward_rate: String, + gateway_bond_reward_rate: String, + mixnode_delegation_reward_rate: String, + gateway_delegation_reward_rate: String, + mixnode_active_set_size: u32, +} + +impl From for TauriStateParams { + fn from(p: StateParams) -> TauriStateParams { + TauriStateParams { + epoch_length: p.epoch_length, + minimum_mixnode_bond: p.minimum_mixnode_bond.to_string(), + minimum_gateway_bond: p.minimum_gateway_bond.to_string(), + mixnode_bond_reward_rate: p.mixnode_bond_reward_rate.to_string(), + gateway_bond_reward_rate: p.gateway_bond_reward_rate.to_string(), + mixnode_delegation_reward_rate: p.mixnode_delegation_reward_rate.to_string(), + gateway_delegation_reward_rate: p.gateway_delegation_reward_rate.to_string(), + mixnode_active_set_size: p.mixnode_active_set_size, + } + } +} + +impl TryFrom for StateParams { + type Error = Box; + + fn try_from(p: TauriStateParams) -> Result { + Ok(StateParams { + epoch_length: p.epoch_length, + minimum_mixnode_bond: Uint128::try_from(p.minimum_mixnode_bond.as_str())?, + minimum_gateway_bond: Uint128::try_from(p.minimum_gateway_bond.as_str())?, + mixnode_bond_reward_rate: Decimal::from_str(p.mixnode_bond_reward_rate.as_str())?, + gateway_bond_reward_rate: Decimal::from_str(p.gateway_bond_reward_rate.as_str())?, + mixnode_delegation_reward_rate: Decimal::from_str(p.mixnode_delegation_reward_rate.as_str())?, + gateway_delegation_reward_rate: Decimal::from_str(p.gateway_delegation_reward_rate.as_str())?, + mixnode_active_set_size: p.mixnode_active_set_size, + }) + } +} + +#[tauri::command] +pub async fn get_state_params( + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.get_state_params().await { + Ok(params) => Ok(params.into()), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn update_state_params( + params: TauriStateParams, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + let state_params: StateParams = match params.try_into() { + Ok(state_params) => state_params, + Err(e) => return Err(format_err!(e)), + }; + match client.update_state_params(state_params.clone()).await { + Ok(_) => Ok(state_params.into()), + Err(e) => Err(format_err!(e)), + } +} diff --git a/tauri-wallet/src-tauri/src/operations/bond.rs b/tauri-wallet/src-tauri/src/operations/bond.rs new file mode 100644 index 0000000000..b7046feef2 --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/bond.rs @@ -0,0 +1,64 @@ +use crate::coin::Coin; +use crate::format_err; +use crate::state::State; +use crate::{Gateway, MixNode}; +use cosmwasm_std::Coin as CosmWasmCoin; +use std::convert::TryInto; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[tauri::command] +pub async fn bond_gateway( + gateway: Gateway, + bond: Coin, + state: tauri::State<'_, Arc>>, +) -> Result<(), String> { + let r_state = state.read().await; + let bond: CosmWasmCoin = match bond.try_into() { + Ok(b) => b, + Err(e) => return Err(format_err!(e)), + }; + let client = r_state.client()?; + match client.bond_gateway(gateway, bond).await { + Ok(_result) => Ok(()), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn unbond_gateway(state: tauri::State<'_, Arc>>) -> Result<(), String> { + let r_state = state.read().await; + let client = r_state.client()?; + match client.unbond_gateway().await { + Ok(_result) => Ok(()), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn unbond_mixnode(state: tauri::State<'_, Arc>>) -> Result<(), String> { + let r_state = state.read().await; + let client = r_state.client()?; + match client.unbond_mixnode().await { + Ok(_result) => Ok(()), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn bond_mixnode( + mixnode: MixNode, + bond: Coin, + state: tauri::State<'_, Arc>>, +) -> Result<(), String> { + let r_state = state.read().await; + let bond: CosmWasmCoin = match bond.try_into() { + Ok(b) => b, + Err(e) => return Err(format_err!(e)), + }; + let client = r_state.client()?; + match client.bond_mixnode(mixnode, bond).await { + Ok(_result) => Ok(()), + Err(e) => Err(format_err!(e)), + } +} diff --git a/tauri-wallet/src-tauri/src/operations/delegate.rs b/tauri-wallet/src-tauri/src/operations/delegate.rs new file mode 100644 index 0000000000..9438b5e7c6 --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/delegate.rs @@ -0,0 +1,94 @@ +use crate::coin::Coin; +use crate::format_err; +use crate::state::State; +use cosmwasm_std::Coin as CosmWasmCoin; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::sync::Arc; +use tokio::sync::RwLock; +use ts_rs::TS; + +#[derive(TS, Serialize, Deserialize)] +pub struct DelegationResult { + source_address: String, + target_address: String, + amount: Option, +} + +#[tauri::command] +pub async fn delegate_to_mixnode( + identity: &str, + amount: Coin, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let bond: CosmWasmCoin = match amount.try_into() { + Ok(b) => b, + Err(e) => return Err(format_err!(e)), + }; + let client = r_state.client()?; + match client.delegate_to_mixnode(identity, &bond).await { + Ok(_result) => Ok(DelegationResult { + source_address: client.address().to_string(), + target_address: identity.to_string(), + amount: Some(bond.into()), + }), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn undelegate_from_mixnode( + identity: &str, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.remove_mixnode_delegation(identity).await { + Ok(_result) => Ok(DelegationResult { + source_address: client.address().to_string(), + target_address: identity.to_string(), + amount: None, + }), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn delegate_to_gateway( + identity: &str, + amount: Coin, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let bond: CosmWasmCoin = match amount.try_into() { + Ok(b) => b, + Err(e) => return Err(format_err!(e)), + }; + let client = r_state.client()?; + match client.delegate_to_gateway(identity, &bond).await { + Ok(_result) => Ok(DelegationResult { + source_address: client.address().to_string(), + target_address: identity.to_string(), + amount: Some(bond.into()), + }), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn undelegate_from_gateway( + identity: &str, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.remove_gateway_delegation(identity).await { + Ok(_result) => Ok(DelegationResult { + source_address: client.address().to_string(), + target_address: identity.to_string(), + amount: None, + }), + Err(e) => Err(format_err!(e)), + } +} diff --git a/tauri-wallet/src-tauri/src/operations/mod.rs b/tauri-wallet/src-tauri/src/operations/mod.rs new file mode 100644 index 0000000000..47f4788d6c --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/mod.rs @@ -0,0 +1,5 @@ +pub mod account; +pub mod admin; +pub mod bond; +pub mod delegate; +pub mod send; diff --git a/tauri-wallet/src-tauri/src/operations/send.rs b/tauri-wallet/src-tauri/src/operations/send.rs new file mode 100644 index 0000000000..bf223a9c39 --- /dev/null +++ b/tauri-wallet/src-tauri/src/operations/send.rs @@ -0,0 +1,69 @@ +use crate::coin::Coin; +use crate::format_err; +use crate::state::State; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::str::FromStr; +use std::sync::Arc; +use tendermint_rpc::endpoint::broadcast::tx_commit::Response; +use tokio::sync::RwLock; +use ts_rs::TS; +use validator_client::nymd::{AccountId, CosmosCoin}; + +#[derive(Deserialize, Serialize, TS)] +pub struct TauriTxResult { + code: u32, + gas_wanted: u64, + gas_used: u64, + block_height: u64, + details: TransactionDetails, +} + +#[derive(Deserialize, Serialize, TS)] +pub struct TransactionDetails { + from_address: String, + to_address: String, + amount: Coin, +} + +impl TauriTxResult { + fn new(t: Response, details: TransactionDetails) -> TauriTxResult { + TauriTxResult { + code: t.check_tx.code.value(), + gas_wanted: t.check_tx.gas_wanted.value(), + gas_used: t.check_tx.gas_used.value(), + block_height: t.height.value(), + details, + } + } +} + +#[tauri::command] +pub async fn send( + address: &str, + amount: Coin, + memo: String, + state: tauri::State<'_, Arc>>, +) -> Result { + let address = match AccountId::from_str(address) { + Ok(addy) => addy, + Err(e) => return Err(format_err!(e)), + }; + let cosmos_amount: CosmosCoin = match amount.clone().try_into() { + Ok(b) => b, + Err(e) => return Err(format_err!(e)), + }; + let r_state = state.read().await; + let client = r_state.client()?; + match client.send(&address, vec![cosmos_amount], memo).await { + Ok(result) => Ok(TauriTxResult::new( + result, + TransactionDetails { + from_address: client.address().to_string(), + to_address: address.to_string(), + amount, + }, + )), + Err(e) => Err(format_err!(e)), + } +} diff --git a/tauri-wallet/src-tauri/src/state.rs b/tauri-wallet/src-tauri/src/state.rs new file mode 100644 index 0000000000..40b21e9106 --- /dev/null +++ b/tauri-wallet/src-tauri/src/state.rs @@ -0,0 +1,24 @@ +use crate::config::Config; +use validator_client::nymd::{NymdClient, SigningNymdClient}; + +#[derive(Default)] +pub struct State { + config: Config, + signing_client: Option>, +} + +impl State { + pub fn client(&self) -> Result<&NymdClient, String> { + self.signing_client.as_ref().ok_or_else(|| { + "Client has not been initialized yet, connect with mnemonic to initialize".to_string() + }) + } + + pub fn config(&self) -> Config { + self.config.clone() + } + + pub fn set_client(&mut self, signing_client: NymdClient) { + self.signing_client = Some(signing_client) + } +} diff --git a/tauri-wallet/src-tauri/src/utils.rs b/tauri-wallet/src-tauri/src/utils.rs new file mode 100644 index 0000000000..21a048a60c --- /dev/null +++ b/tauri-wallet/src-tauri/src/utils.rs @@ -0,0 +1,54 @@ +use crate::coin::{Coin, Denom}; +use crate::format_err; +use crate::state::State; +use crate::Operation; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[tauri::command] +pub fn major_to_minor(amount: &str) -> Result { + let coin = Coin::new(amount, &Denom::Major); + Ok(coin.to_minor()) +} + +#[tauri::command] +pub fn minor_to_major(amount: &str) -> Result { + let coin = Coin::new(amount, &Denom::Minor); + Ok(coin.to_major()) +} + +#[tauri::command] +pub async fn owns_mixnode(state: tauri::State<'_, Arc>>) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.owns_mixnode(client.address()).await { + Ok(o) => Ok(o), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn owns_gateway(state: tauri::State<'_, Arc>>) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + match client.owns_gateway(client.address()).await { + Ok(o) => Ok(o), + Err(e) => Err(format_err!(e)), + } +} + +#[tauri::command] +pub async fn get_fee( + operation: Operation, + state: tauri::State<'_, Arc>>, +) -> Result { + let r_state = state.read().await; + let client = r_state.client()?; + let fee = client.get_fee(operation); + let mut coin = Coin::new("0", &Denom::Major); + for f in fee.amount { + coin = coin + f.into(); + } + + Ok(coin) +} diff --git a/tauri-wallet/src-tauri/tauri.conf.json b/tauri-wallet/src-tauri/tauri.conf.json new file mode 100644 index 0000000000..55cdd8014e --- /dev/null +++ b/tauri-wallet/src-tauri/tauri.conf.json @@ -0,0 +1,65 @@ +{ + "package": { + "productName": "tauri-wallet", + "version": "0.1.0" + }, + "build": { + "distDir": "../dist", + "devPath": "http://localhost:9000", + "beforeDevCommand": "", + "beforeBuildCommand": "" + }, + "tauri": { + "bundle": { + "active": true, + "targets": "all", + "identifier": "com.tauri.dev", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "resources": [], + "externalBin": [], + "copyright": "", + "category": "DeveloperTool", + "shortDescription": "", + "longDescription": "", + "deb": { + "depends": [], + "useBootstrapper": false + }, + "macOS": { + "frameworks": [], + "minimumSystemVersion": "", + "useBootstrapper": false, + "exceptionDomain": "", + "signingIdentity": null, + "entitlements": null + }, + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "updater": { + "active": false + }, + "allowlist": {}, + "windows": [ + { + "title": "nym-wallet", + "width": 1268, + "height": 768, + "resizable": true, + "fullscreen": false + } + ], + "security": { + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" + } + } +} diff --git a/tauri-wallet/src/components/AdminForm.tsx b/tauri-wallet/src/components/AdminForm.tsx new file mode 100644 index 0000000000..f3ac868a72 --- /dev/null +++ b/tauri-wallet/src/components/AdminForm.tsx @@ -0,0 +1,223 @@ +import React, { useContext, useEffect, useState } from 'react' +import { useForm } from 'react-hook-form' +import { + Backdrop, + Box, + Button, + CircularProgress, + FormControl, + Grid, + Paper, + Slide, + TextField, + Theme, +} from '@material-ui/core' +import { useTheme } from '@material-ui/styles' +import { ClientContext } from '../context/main' +import { NymCard } from '.' +import { getContractParams, setContractParams } from '../requests' +import { TauriStateParams } from '../types' + +export const Admin: React.FC = () => { + const { showAdmin, handleShowAdmin } = useContext(ClientContext) + const [isLoading, setIsLoading] = useState(false) + const [params, setParams] = useState() + + const onCancel = () => { + setParams(undefined) + setIsLoading(false) + handleShowAdmin() + } + + useEffect(() => { + const requestContractParams = async () => { + if (showAdmin) { + setIsLoading(true) + const params = await getContractParams() + setParams(params) + setIsLoading(false) + } + } + requestContractParams() + }, [showAdmin]) + + return ( + + + + + {isLoading && ( + + + + )} + {!isLoading && params && ( + + )} + + + + + ) +} + +const AdminForm: React.FC<{ + params: TauriStateParams + onCancel: () => void +}> = ({ params, onCancel }) => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ defaultValues: { ...params } }) + + const onSubmit = async (data: TauriStateParams) => { + await setContractParams(data) + console.log(data) + onCancel() + } + + const theme: Theme = useTheme() + + return ( + +

+ + + + + + + + + + ) +} diff --git a/tauri-wallet/src/components/Confirmation.tsx b/tauri-wallet/src/components/Confirmation.tsx new file mode 100644 index 0000000000..593eed90af --- /dev/null +++ b/tauri-wallet/src/components/Confirmation.tsx @@ -0,0 +1,43 @@ +import React from 'react' +import Typography from '@material-ui/core/Typography' +import Grid from '@material-ui/core/Grid' +import { CircularProgress } from '@material-ui/core' +import { Alert, AlertTitle } from '@material-ui/lab' + +type ConfirmationProps = { + isLoading: boolean + progressMessage: string + SuccessMessage: React.ReactNode + failureMessage: string + error: Error | null +} + +export const Confirmation = ({ + isLoading, + progressMessage, + SuccessMessage, + failureMessage, + error, +}: ConfirmationProps) => { + return isLoading ? ( + <> + + {progressMessage} + + + + + + ) : ( + <> + {error === null ? ( + SuccessMessage + ) : ( + + {error.name} + {failureMessage} - {error.message} + + )} + + ) +} diff --git a/tauri-wallet/src/components/CopyToClipboard.tsx b/tauri-wallet/src/components/CopyToClipboard.tsx new file mode 100644 index 0000000000..c1c6da79d2 --- /dev/null +++ b/tauri-wallet/src/components/CopyToClipboard.tsx @@ -0,0 +1,50 @@ +import React, { useState } from 'react' +import { Button } from '@material-ui/core' +import { Check } from '@material-ui/icons' +import { green } from '@material-ui/core/colors' +import { clipboard } from '@tauri-apps/api' + +const copy = (text: string): Promise<{ success: boolean; value: string }> => { + return new Promise((resolve, reject) => { + clipboard + .writeText(text) + .then(() => resolve({ success: true, value: text })) + .catch((e) => reject({ success: false, value: 'Failed to copy: ' + e })) + }) +} + +export const handleCopy = async ({ + text, + cb, +}: { + text: string + cb: (success: boolean) => void +}) => { + const res = await copy(text) + if (res.success) { + setTimeout(() => { + cb(true) + }, 750) + } else { + console.log(res.value) + } +} + +export const CopyToClipboard = ({ text }: { text: string }) => { + const [copied, setCopied] = useState(false) + + const updateCopyStatus = (isCopied: boolean) => setCopied(isCopied) + + return ( + + ) +} diff --git a/tauri-wallet/src/components/Error.tsx b/tauri-wallet/src/components/Error.tsx new file mode 100644 index 0000000000..0537674d8b --- /dev/null +++ b/tauri-wallet/src/components/Error.tsx @@ -0,0 +1,20 @@ +import React from 'react' +import { FallbackProps } from 'react-error-boundary' +import { Alert, AlertTitle } from '@material-ui/lab' +import { Button } from '@material-ui/core' + +export const ErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => { + return ( +
+ + {error.name} + {error.message} + + + Stack trace + {error.stack} + + +
+ ) +} diff --git a/tauri-wallet/src/components/Nav.tsx b/tauri-wallet/src/components/Nav.tsx new file mode 100644 index 0000000000..679e0365b3 --- /dev/null +++ b/tauri-wallet/src/components/Nav.tsx @@ -0,0 +1,145 @@ +import React, { useContext } from 'react' +import { Link, useLocation } from 'react-router-dom' +import { + List, + ListItem, + ListItemIcon, + ListItemText, + Theme, +} from '@material-ui/core' +import { + AccountBalanceWalletRounded, + ArrowBack, + ArrowForward, + AttachMoney, + Cancel, + ExitToApp, + HowToVote, + MoneyOff, + Description, + Settings, +} from '@material-ui/icons' +import { makeStyles } from '@material-ui/styles' +import clsx from 'clsx' +import { ADMIN_ADDRESS, ClientContext } from '../context/main' + +let routesSchema = [ + { + label: 'Balance', + route: '/balance', + Icon: , + }, + { + label: 'Send', + route: '/send', + Icon: , + }, + { + label: 'Receive', + route: '/receive', + Icon: , + }, + { + label: 'Bond', + route: '/bond', + Icon: , + }, + { + label: 'Unbond', + route: '/unbond', + Icon: , + }, + { + label: 'Delegate', + route: '/delegate', + Icon: , + }, + { + label: 'Undelegate', + route: '/undelegate', + Icon: , + }, +] + +if (process.env.NODE_ENV) { + routesSchema.push({ + label: 'Docs', + route: '/docs', + Icon: , + }) +} + +const useStyles = makeStyles((theme: Theme) => ({ + navItem: { + color: '#fff', + fontSize: 24, + }, + selected: { + color: theme.palette.primary.main, + }, +})) + +export const Nav = () => { + const classes = useStyles() + const { clientDetails, handleShowAdmin, logOut } = useContext(ClientContext) + const location = useLocation() + + return ( +
+ + {routesSchema.map((r, i) => ( + + + {r.Icon} + + + + ))} + {clientDetails?.client_address === ADMIN_ADDRESS && ( + + + + + + + )} + + + + + + + + +
+ ) +} diff --git a/tauri-wallet/src/components/NavigationCards.tsx b/tauri-wallet/src/components/NavigationCards.tsx new file mode 100644 index 0000000000..89e842b69e --- /dev/null +++ b/tauri-wallet/src/components/NavigationCards.tsx @@ -0,0 +1,118 @@ +import React, { useContext, useEffect, useState } from 'react' +import { + CardContent, + CircularProgress, + IconButton, + Tooltip, + Typography, + useTheme, +} from '@material-ui/core' +import { ClientContext } from '../context/main' +import { CheckCircleOutline, FileCopy, Refresh } from '@material-ui/icons' +import { NymCard } from './NymCard' +import { Alert } from '@material-ui/lab' +import { handleCopy } from './CopyToClipboard' +import { truncate } from '../utils' + +export const BalanceCard = () => { + const { getBalance } = useContext(ClientContext) + const theme = useTheme() + + useEffect(getBalance.fetchBalance, []) + + return ( +
+ + + + + + } + > + +
+ {getBalance.isLoading ? ( + + ) : getBalance.error ? ( + + {getBalance.error} + + ) : ( + + {getBalance.balance?.printable_balance} + + )} +
+
+
+
+ ) +} +enum EnumCopyState { + copying, + copySuccess, +} + +export const AddressCard = () => { + const { clientDetails } = useContext(ClientContext) + + const [copyState, setCopyState] = useState() + + const theme = useTheme() + + return ( +
+ + + { + setCopyState(EnumCopyState.copying) + await handleCopy({ + text: clientDetails?.client_address || '', + cb: (isCopied) => { + if (isCopied) { + setCopyState(EnumCopyState.copySuccess) + setTimeout(() => { + setCopyState(undefined) + }, 2500) + } + }, + }) + }} + > + {copyState === EnumCopyState.copying ? ( + + ) : copyState === EnumCopyState.copySuccess ? ( + + ) : ( + + )} + + + + } + > + + + {truncate(clientDetails?.client_address!, 35)} + + + +
+ ) +} diff --git a/tauri-wallet/src/components/NoClientError.tsx b/tauri-wallet/src/components/NoClientError.tsx new file mode 100644 index 0000000000..9e1022babb --- /dev/null +++ b/tauri-wallet/src/components/NoClientError.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import { Link } from 'react-router-dom' +import { Alert, AlertTitle } from '@material-ui/lab' + +export const NoClientError = () => { + return ( + + No client detected + Have you signed in? Try to go back to{' '} + the main page and try again + + ) +} diff --git a/tauri-wallet/src/components/NodeTypeSelector.tsx b/tauri-wallet/src/components/NodeTypeSelector.tsx new file mode 100644 index 0000000000..b949eb00d3 --- /dev/null +++ b/tauri-wallet/src/components/NodeTypeSelector.tsx @@ -0,0 +1,48 @@ +import { + FormControl, + FormControlLabel, + FormLabel, + Radio, + RadioGroup, +} from '@material-ui/core' +import React from 'react' +import { EnumNodeType } from '../types/global' + +export const NodeTypeSelector = ({ + disabled, + nodeType, + setNodeType, +}: { + disabled: boolean + nodeType: EnumNodeType + setNodeType: (nodeType: EnumNodeType) => void +}) => { + const handleNodeTypeChange = (e: React.ChangeEvent) => + setNodeType(e.target.value as EnumNodeType) + + return ( + + Select node type + + } + label="Mixnode" + disabled={disabled} + /> + } + label="Gateway" + disabled={disabled} + /> + + + ) +} diff --git a/tauri-wallet/src/components/NymCard.tsx b/tauri-wallet/src/components/NymCard.tsx new file mode 100644 index 0000000000..c77fe38359 --- /dev/null +++ b/tauri-wallet/src/components/NymCard.tsx @@ -0,0 +1,34 @@ +import React from 'react' +import { Card, CardContent, CardHeader, useTheme } from '@material-ui/core' + +export const NymCard: React.FC<{ + title: string + subheader?: string + Action?: React.ReactNode + noPadding?: boolean +}> = ({ title, subheader, Action, noPadding, children }) => { + const theme = useTheme() + return ( + + + + {children} + + + ) +} diff --git a/tauri-wallet/src/components/RequestStatus.tsx b/tauri-wallet/src/components/RequestStatus.tsx new file mode 100644 index 0000000000..2650f55400 --- /dev/null +++ b/tauri-wallet/src/components/RequestStatus.tsx @@ -0,0 +1,33 @@ +import React from 'react' +import { CircularProgress, Theme } from '@material-ui/core' +import { useTheme } from '@material-ui/styles' + +export enum EnumRequestStatus { + initial = 'initial', + error = 'error', + loading = 'loading', + success = 'success', +} + +export const RequestStatus = ({ + status, + Success, + Error, +}: { + status: EnumRequestStatus + Success: React.ReactNode + Error: React.ReactNode +}) => { + const theme: Theme = useTheme() + return ( +
+ {status === EnumRequestStatus.loading && ( +
+ +
+ )} + {status === EnumRequestStatus.success && Success} + {status === EnumRequestStatus.error && Error} +
+ ) +} diff --git a/tauri-wallet/src/components/index.ts b/tauri-wallet/src/components/index.ts new file mode 100644 index 0000000000..e304e4a5f8 --- /dev/null +++ b/tauri-wallet/src/components/index.ts @@ -0,0 +1,10 @@ +export * from './AdminForm' +export * from './Error' +export * from './Confirmation' +export * from './CopyToClipboard' +export * from './NymCard' +export * from './Nav' +export * from './NavigationCards' +export * from './NodeTypeSelector' +export * from './RequestStatus' +export * from './NoClientError' diff --git a/tauri-wallet/src/context/main.tsx b/tauri-wallet/src/context/main.tsx new file mode 100644 index 0000000000..da14162777 --- /dev/null +++ b/tauri-wallet/src/context/main.tsx @@ -0,0 +1,55 @@ +import React, { createContext, useEffect, useState } from 'react' +import { useHistory } from 'react-router-dom' +import { TClientDetails, TSignInWithMnemonic } from '../types' +import { TUseGetBalance, useGetBalance } from '../hooks/useGetBalance' + +export const ADMIN_ADDRESS = 'punk1h3w4nj7kny5dfyjw2le4vm74z03v9vd4dstpu0' + +type TClientContext = { + clientDetails?: TClientDetails + getBalance: TUseGetBalance + showAdmin: boolean + handleShowAdmin: () => void + logIn: (clientDetails: TSignInWithMnemonic) => void + logOut: () => void +} + +export const ClientContext = createContext({} as TClientContext) + +export const ClientContextProvider = ({ + children, +}: { + children: React.ReactNode +}) => { + const [clientDetails, setClientDetails] = useState() + const [showAdmin, setShowAdmin] = useState(false) + + const history = useHistory() + const getBalance = useGetBalance() + + useEffect(() => { + !clientDetails ? history.push('/signin') : history.push('/balance') + }, [clientDetails]) + + const logIn = async (clientDetails: TSignInWithMnemonic) => + setClientDetails(clientDetails) + + const logOut = () => setClientDetails(undefined) + + const handleShowAdmin = () => setShowAdmin((show) => !show) + + return ( + + {children} + + ) +} diff --git a/tauri-wallet/src/hooks/useCheckOwnership.ts b/tauri-wallet/src/hooks/useCheckOwnership.ts new file mode 100644 index 0000000000..6022fd0a4b --- /dev/null +++ b/tauri-wallet/src/hooks/useCheckOwnership.ts @@ -0,0 +1,39 @@ +import { useEffect, useState } from 'react' +import { checkGatewayOwnership, checkMixnodeOwnership } from '../requests' +import { EnumNodeType, TNodeOwnership } from '../types' + +export const useCheckOwnership = () => { + const [ownership, setOwnership] = useState({ + hasOwnership: false, + nodeType: undefined, + }) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState() + + const checkOwnership = async () => { + const status = {} as TNodeOwnership + + setIsLoading(true) + + try { + const ownsMixnode = await checkMixnodeOwnership() + const ownsGateway = await checkGatewayOwnership() + + if (ownsMixnode) { + status.hasOwnership = true + status.nodeType = EnumNodeType.mixnode + } + + if (ownsGateway) { + status.hasOwnership = true + status.nodeType = EnumNodeType.gateway + } + + setOwnership(status) + } catch (e) { + setError(e as string) + } + } + + return { isLoading, error, ownership, checkOwnership } +} diff --git a/tauri-wallet/src/hooks/useGetBalance.tsx b/tauri-wallet/src/hooks/useGetBalance.tsx new file mode 100644 index 0000000000..8325cbb736 --- /dev/null +++ b/tauri-wallet/src/hooks/useGetBalance.tsx @@ -0,0 +1,36 @@ +import { useState } from 'react' +import { invoke } from '@tauri-apps/api' +import { Balance } from '../types' + +export type TUseGetBalance = { + error?: string + balance?: Balance + isLoading: boolean + fetchBalance: () => void +} + +export const useGetBalance = (): TUseGetBalance => { + const [balance, setBalance] = useState() + const [error, setError] = useState() + const [isLoading, setIsLoading] = useState(false) + + const fetchBalance = () => { + setIsLoading(true) + setError(undefined) + invoke('get_balance') + .then((balance) => { + setBalance(balance as Balance) + }) + .catch(setError) + setTimeout(() => { + setIsLoading(false) + }, 1000) + } + + return { + error, + isLoading, + balance, + fetchBalance, + } +} diff --git a/tauri-wallet/src/images/logo-background.svg b/tauri-wallet/src/images/logo-background.svg new file mode 100644 index 0000000000..ad11626724 --- /dev/null +++ b/tauri-wallet/src/images/logo-background.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/tauri-wallet/src/images/logo.png b/tauri-wallet/src/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a1625dc8ec2af6a66d532e4641e74449d132c486 GIT binary patch literal 356966 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�nwrRRU>`Zzxcn#*(VSATuH(omZ#cr(LLl#VnlrvykM$}c?$2v*H(%z zQNZt0FTtXEha#ye?Xg%KV84pn|z+s64 zgzaMPE176oY%*a*E~rK^<_Xvyyj!Vl-6{0)d{kqs=QI*kh5}@GaDk%1{0Q zduu0>WvG((XpNV*Av?Y#2BBim3J;IeNZ{h@jE5_(T`JxEr=K8JElRDNeE$PqGs0D+ z@BZ`trTf|~=@ldIwq#;Zs#t~qxNA6H&uf?3OcN5c9a`!pkmvj3B5?2hbFcgYxj@Im> z2x**qkFEa$OPXaT$63s}e$VWad0l&=&z+2(HwB3a5VmR@if3(?QSV3mf&1kIq^x`36+X>*-we|j@dbM8yD zv?`(Il*>Resr|vfzwu42+w_nMwMU;zNq|i zV?g|g%N_Jc?hpO)58yx$T0K@1gVtxos=ZrhCtTK0r*yMo9h~;O2Qv(dIgV#;Th##@ zf9uMWPzmZUVBjJq4XE;1ppjAMJ9bnea&N2lY(49SQs1a+o)0J}yu}!HUxMatKuR3< zzYkm^w2)Lt?7RW5{@!k@!azZZ$N~9o_Xz(PFqz6E0U|Bs(3>L&r&$hC2Z#i2$`Vgf=q=ic}P;3>$l)v6YCCV^88P7nSAB34;-VeeKGe<*N zMP84;*%)!)*8)i+H^ZqP0V*btoJ|MT7d(0E%W7p8j|_)sVnGC4$GHpWN$nGr#N_0_ zUC>|Ze0v^wdFSG7@)v&ryQrjlD$Lqcc7rg9Ozs+_3wB>g#+P%^F$-+Fu#5nR)4IhG zp?h<(3m+To-0$-XKQFT>QWADMW>0$*cAyTK-3wJ zw3P#q@TtL^& { + const { clientDetails } = useContext(ClientContext) + return ( + + + {!clientDetails ? ( + + ) : ( + + <> + + + + + )} + + ) +} + +const App = () => { + return ( + + + + + + + + ) +} + +const root = document.getElementById('root') + +ReactDOM.render(, root) diff --git a/tauri-wallet/src/layouts/AppLayout.tsx b/tauri-wallet/src/layouts/AppLayout.tsx new file mode 100644 index 0000000000..1c9f6d0d66 --- /dev/null +++ b/tauri-wallet/src/layouts/AppLayout.tsx @@ -0,0 +1,71 @@ +import React from 'react' +import { Divider } from '@material-ui/core' +import { AddressCard, BalanceCard, Nav } from '../components' +import Logo from '../images/logo-background.svg' +import { theme } from '../theme' + +export const ApplicationLayout = ({ + children, +}: { + children: React.ReactElement +}) => { + return ( +

+
+
+ +
+ +
+ + +
+ +
+
+
+
+
+ {children} +
+
+ ) +} diff --git a/tauri-wallet/src/layouts/ContentLayout.tsx b/tauri-wallet/src/layouts/ContentLayout.tsx new file mode 100644 index 0000000000..627cea10a7 --- /dev/null +++ b/tauri-wallet/src/layouts/ContentLayout.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import { Grid, Theme, useTheme } from '@material-ui/core' + +export const Layout = ({ children }: { children: React.ReactElement }) => { + const theme: Theme = useTheme() + + return ( +
+ + + {children} + + +
+ ) +} diff --git a/tauri-wallet/src/layouts/index.tsx b/tauri-wallet/src/layouts/index.tsx new file mode 100644 index 0000000000..831d294045 --- /dev/null +++ b/tauri-wallet/src/layouts/index.tsx @@ -0,0 +1,2 @@ +export * from './AppLayout' +export * from './ContentLayout' diff --git a/tauri-wallet/src/requests/index.ts b/tauri-wallet/src/requests/index.ts new file mode 100644 index 0000000000..ed94e7c503 --- /dev/null +++ b/tauri-wallet/src/requests/index.ts @@ -0,0 +1,85 @@ +import { invoke } from '@tauri-apps/api' +import { + Balance, + Coin, + DelegationResult, + EnumNodeType, + Gateway, + MixNode, + Operation, + TauriStateParams, + TauriTxResult, + TCreateAccount, + TSignInWithMnemonic, +} from '../types' + +export const createAccount = async (): Promise => + await invoke('create_new_account') + +export const signInWithMnemonic = async ( + mnemonic: string +): Promise => + await invoke('connect_with_mnemonic', { mnemonic }) + +export const minorToMajor = async (amount: string): Promise => + await invoke('minor_to_major', { amount }) + +export const majorToMinor = async (amount: string): Promise => + await invoke('major_to_minor', { amount }) + +export const getGasFee = async (operation: Operation): Promise => + await invoke('get_fee', { operation }) + +export const delegate = async ({ + type, + identity, + amount, +}: { + type: EnumNodeType + identity: string + amount: Coin +}): Promise => + await invoke(`delegate_to_${type}`, { identity, amount }) + +export const undelegate = async ({ + type, + identity, +}: { + type: EnumNodeType + identity: string +}): Promise => + await invoke(`undelegate_from_${type}`, { identity }) + +export const send = async (args: { + amount: Coin + address: string + memo: string +}): Promise => await invoke('send', args) +export const checkMixnodeOwnership = async (): Promise => + await invoke('owns_mixnode') + +export const checkGatewayOwnership = async (): Promise => + await invoke('owns_gateway') + +export const bond = async ({ + type, + data, + amount, +}: { + type: EnumNodeType + data: MixNode | Gateway + amount: Coin +}): Promise => await invoke(`bond_${type}`, { [type]: data, bond: amount }) + +export const unbond = async (type: EnumNodeType) => + await invoke(`unbond_${type}`) + +export const getBalance = async (): Promise => + await invoke('get_balance') + +export const getContractParams = async (): Promise => + await invoke('get_state_params') + +export const setContractParams = async ( + params: TauriStateParams +): Promise => await invoke('update_state_params', { params }) diff --git a/tauri-wallet/src/routes/404.tsx b/tauri-wallet/src/routes/404.tsx new file mode 100644 index 0000000000..0452e298ae --- /dev/null +++ b/tauri-wallet/src/routes/404.tsx @@ -0,0 +1,12 @@ +import React, { useState } from 'react' +import { Layout } from '../layouts' + +export const NotFound = () => { + return ( + + <> +

404

+ +
+ ) +} diff --git a/tauri-wallet/src/routes/balance.tsx b/tauri-wallet/src/routes/balance.tsx new file mode 100644 index 0000000000..b14fba3270 --- /dev/null +++ b/tauri-wallet/src/routes/balance.tsx @@ -0,0 +1,60 @@ +import React, { useEffect } from 'react' +import { Button, CircularProgress, Grid } from '@material-ui/core' +import { Alert } from '@material-ui/lab' +import { Refresh } from '@material-ui/icons' +import { NymCard } from '../components' +import { Layout } from '../layouts' +import { theme } from '../theme' +import { useGetBalance } from '../hooks/useGetBalance' + +export const Balance = () => { + const { balance, isLoading, error, fetchBalance } = useGetBalance() + + useEffect(fetchBalance, []) + + const RefreshAction = () => ( + + ) + + return ( + + + + + {error && ( + } + style={{ padding: theme.spacing(2) }} + > + {error} + + )} + {!error && ( + } + > + {'The current balance is ' + balance?.printable_balance} + + )} + + + + + ) +} diff --git a/tauri-wallet/src/routes/bond/BondForm.tsx b/tauri-wallet/src/routes/bond/BondForm.tsx new file mode 100644 index 0000000000..8d1152bed9 --- /dev/null +++ b/tauri-wallet/src/routes/bond/BondForm.tsx @@ -0,0 +1,381 @@ +import React, { useContext } from 'react' +import { + Button, + Checkbox, + CircularProgress, + FormControl, + FormControlLabel, + Grid, + InputAdornment, + TextField, + Theme, +} from '@material-ui/core' +import { useTheme } from '@material-ui/styles' +import { Alert } from '@material-ui/lab' +import { yupResolver } from '@hookform/resolvers/yup' +import { useForm } from 'react-hook-form' +import { EnumNodeType } from '../../types/global' +import { NodeTypeSelector } from '../../components/NodeTypeSelector' +import { bond, majorToMinor } from '../../requests' +import { validationSchema } from './validationSchema' +import { Coin, Gateway, MixNode } from '../../types' +import { ClientContext } from '../../context/main' +import { checkHasEnoughFunds } from '../../utils' + +type TBondFormFields = { + withAdvancedOptions: boolean + nodeType: EnumNodeType + identityKey: string + sphinxKey: string + amount: string + host: string + version: string + location?: string + mixPort: number + verlocPort: number + clientsPort: number + httpApiPort: number +} + +const defaultValues = { + withAdvancedOptions: false, + nodeType: EnumNodeType.mixnode, + identityKey: '', + sphinxKey: '', + amount: '', + host: '', + version: '', + location: undefined, + mixPort: 1789, + verlocPort: 1790, + httpApiPort: 8000, + clientsPort: 9000, +} + +const formatData = (data: TBondFormFields) => { + const payload: { [key: string]: any } = { + identity_key: data.identityKey, + sphinx_key: data.sphinxKey, + host: data.host, + version: data.version, + mix_port: data.mixPort, + } + + if (data.nodeType === EnumNodeType.mixnode) { + payload.verloc_port = data.verlocPort + payload.http_api_port = data.httpApiPort + return payload as MixNode + } else { + payload.clients_port = data.clientsPort + payload.location = data.location + return payload as Gateway + } +} + +export const BondForm = ({ + disabled, + fees, + onError, + onSuccess, +}: { + disabled: boolean + fees?: { [key in EnumNodeType]: Coin } + onError: (message?: string) => void + onSuccess: (message?: string) => void +}) => { + const { + register, + handleSubmit, + setValue, + setError, + watch, + formState: { errors, isSubmitting }, + } = useForm({ + resolver: yupResolver(validationSchema), + defaultValues, + }) + + const { getBalance } = useContext(ClientContext) + + const watchNodeType = watch('nodeType', defaultValues.nodeType) + const watchAdvancedOptions = watch( + 'withAdvancedOptions', + defaultValues.withAdvancedOptions + ) + + const onSubmit = async (data: TBondFormFields) => { + const hasEnoughFunds = await checkHasEnoughFunds(data.amount) + if (!hasEnoughFunds) { + return setError('amount', { message: 'Not enough funds in wallet' }) + } + + const formattedData = formatData(data) + const amount = await majorToMinor(data.amount) + + await bond({ type: data.nodeType, data: formattedData, amount }) + .then(() => { + getBalance.fetchBalance() + onSuccess(`Successfully bonded to ${data.identityKey}`) + }) + .catch((e) => { + onError(e) + }) + } + + const theme: Theme = useTheme() + + return ( + +
+ + + + { + setValue('nodeType', nodeType) + if (nodeType === EnumNodeType.mixnode) + setValue('location', undefined) + }} + disabled={disabled} + /> + + {fees && ( + + + {`A fee of ${ + watchNodeType === EnumNodeType.mixnode + ? fees.mixnode.amount + : fees.gateway.amount + } PUNK will apply to this transaction`} + + + )} + + + + + + + + + punks + ), + }} + disabled={disabled} + /> + + + + + + + {/* if it's a gateway - get location */} + + {watchNodeType === EnumNodeType.gateway && ( + + )} + + + + + + + + { + if (watchAdvancedOptions) { + setValue('mixPort', defaultValues.mixPort, { + shouldValidate: true, + }) + setValue('clientsPort', defaultValues.clientsPort, { + shouldValidate: true, + }) + setValue('verlocPort', defaultValues.verlocPort, { + shouldValidate: true, + }) + setValue('httpApiPort', defaultValues.httpApiPort, { + shouldValidate: true, + }) + setValue('withAdvancedOptions', false) + resizeTo + } else { + setValue('withAdvancedOptions', true) + } + }} + /> + } + label="Use advanced options" + /> + + {watchAdvancedOptions && ( + <> + + + + {watchNodeType === EnumNodeType.mixnode ? ( + <> + + + + + + + + + ) : ( + + + + )} + + )} + +
+
+ +
+
+ ) +} diff --git a/tauri-wallet/src/routes/bond/index.tsx b/tauri-wallet/src/routes/bond/index.tsx new file mode 100644 index 0000000000..1c06f9051e --- /dev/null +++ b/tauri-wallet/src/routes/bond/index.tsx @@ -0,0 +1,128 @@ +import React, { useContext, useEffect, useState } from 'react' +import { Box, Button, CircularProgress, Theme } from '@material-ui/core' +import { Alert } from '@material-ui/lab' +import { useTheme } from '@material-ui/styles' +import { BondForm } from './BondForm' +import { NymCard } from '../../components' +import { + EnumRequestStatus, + RequestStatus, +} from '../../components/RequestStatus' +import { Layout } from '../../layouts' +import { getGasFee, unbond } from '../../requests' +import { TFee } from '../../types' +import { useCheckOwnership } from '../../hooks/useCheckOwnership' +import { ClientContext } from '../../context/main' + +export const Bond = () => { + const [status, setStatus] = useState(EnumRequestStatus.initial) + const [message, setMessage] = useState() + const [fees, setFees] = useState() + + const { checkOwnership, ownership } = useCheckOwnership() + const { getBalance } = useContext(ClientContext) + + const theme: Theme = useTheme() + + useEffect(() => { + if (status === EnumRequestStatus.initial) { + const initialiseForm = async () => { + await checkOwnership() + setFees({ + mixnode: await getGasFee('BondMixnode'), + gateway: await getGasFee('BondGateway'), + }) + setStatus(EnumRequestStatus.initial) + } + initialiseForm() + } + }, [status]) + + return ( + + + {ownership?.hasOwnership && ( + { + setStatus(EnumRequestStatus.loading) + await unbond(ownership.nodeType!) + getBalance.fetchBalance() + setStatus(EnumRequestStatus.initial) + }} + > + Unbond + + } + style={{ margin: theme.spacing(2) }} + > + {`Looks like you already have a ${ownership.nodeType} bonded.`} + + )} + {status === EnumRequestStatus.loading && ( + + + + )} + {status === EnumRequestStatus.initial && ( + { + setMessage(e) + setStatus(EnumRequestStatus.error) + }} + onSuccess={(message?: string) => { + setMessage(message) + setStatus(EnumRequestStatus.success) + }} + disabled={ownership?.hasOwnership} + /> + )} + {(status === EnumRequestStatus.error || + status === EnumRequestStatus.success) && ( + <> + Successfully bonded node + } + Error={ + + An error occurred with the request: {message} + + } + /> +
+ +
+ + )} +
+
+ ) +} diff --git a/tauri-wallet/src/routes/bond/validationSchema.ts b/tauri-wallet/src/routes/bond/validationSchema.ts new file mode 100644 index 0000000000..3b84755b9a --- /dev/null +++ b/tauri-wallet/src/routes/bond/validationSchema.ts @@ -0,0 +1,85 @@ +import * as Yup from 'yup' +import { + isValidHostname, + validateAmount, + validateKey, + validateLocation, + validateRawPort, + validateVersion, +} from '../../utils' + +export const validationSchema = Yup.object().shape({ + identityKey: Yup.string() + .required('An indentity key is required') + .test('valid-id-key', 'A valid identity key is required', function (value) { + return validateKey(value || '') + }), + sphinxKey: Yup.string() + .required('A sphinx key is required') + .test( + 'valid-sphinx-key', + 'A valid sphinx key is required', + function (value) { + return validateKey(value || '') + } + ), + amount: Yup.string() + .required('An amount is required') + .test( + 'valid-amount', + 'A valid amount is required (min 100 punks)', + function (value) { + return validateAmount(value || '', '100000000') + // minimum amount needs to come from the backend - replace when available + } + ), + + host: Yup.string() + .required('A host is required') + .test('valid-host', 'A valid host is required', function (value) { + return !!value ? isValidHostname(value) : false + }), + version: Yup.string() + .required('A version is required') + .test('valid-version', 'A valid version is required', function (value) { + return !!value ? validateVersion(value) : false + }), + location: Yup.lazy((value) => { + if (!!value) { + return Yup.string() + .required('A location is required') + .test( + 'valid-location', + 'A valid version is required', + function (value) { + return !!value ? validateLocation(value) : false + } + ) + } + return Yup.mixed().notRequired() + }), + mixPort: Yup.number() + .required('A mixport is required') + .test('valid-mixport', 'A valid mixport is required', function (value) { + return !!value ? validateRawPort(value) : false + }), + verlocPort: Yup.number() + .required('A verloc port is required') + .test('valid-verloc', 'A valid verloc port is required', function (value) { + return !!value ? validateRawPort(value) : false + }), + httpApiPort: Yup.number() + .required('A http-api port is required') + .test('valid-http', 'A valid http-api port is required', function (value) { + return !!value ? validateRawPort(value) : false + }), + clientsPort: Yup.number() + .required('A clients port is required') + .test( + 'valid-clients', + 'A valid clients port is required', + function (value) { + return !!value ? validateRawPort(value) : false + } + ), +}) diff --git a/tauri-wallet/src/routes/check-delegation.tsx b/tauri-wallet/src/routes/check-delegation.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tauri-wallet/src/routes/delegate/DelegateForm.tsx b/tauri-wallet/src/routes/delegate/DelegateForm.tsx new file mode 100644 index 0000000000..fb32dc2c44 --- /dev/null +++ b/tauri-wallet/src/routes/delegate/DelegateForm.tsx @@ -0,0 +1,167 @@ +import React, { useContext } from 'react' +import { + Button, + CircularProgress, + FormControl, + Grid, + InputAdornment, + TextField, + Theme, + useTheme, +} from '@material-ui/core' +import { useForm } from 'react-hook-form' +import { NodeTypeSelector } from '../../components/NodeTypeSelector' +import { EnumNodeType, TFee } from '../../types' +import { yupResolver } from '@hookform/resolvers/yup' +import { validationSchema } from './validationSchema' +import { Alert } from '@material-ui/lab' +import { ClientContext } from '../../context/main' +import { delegate, majorToMinor } from '../../requests' +import { checkHasEnoughFunds } from '../../utils' + +type TDelegateForm = { + nodeType: EnumNodeType + identity: string + amount: string +} + +const defaultValues: TDelegateForm = { + nodeType: EnumNodeType.mixnode, + identity: '', + amount: '', +} + +export const DelegateForm = ({ + fees, + onError, + onSuccess, +}: { + fees: TFee + onError: (message?: string) => void + onSuccess: (message?: string) => void +}) => { + const theme = useTheme() + const { + register, + setValue, + watch, + handleSubmit, + setError, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + }) + + const watchNodeType = watch('nodeType', defaultValues.nodeType) + + const { getBalance } = useContext(ClientContext) + + const onSubmit = async (data: TDelegateForm) => { + const hasEnoughFunds = await checkHasEnoughFunds(data.amount) + if (!hasEnoughFunds) { + return setError('amount', { + message: 'Not enough funds in wallet', + }) + } + + const amount = await majorToMinor(data.amount) + + await delegate({ + type: data.nodeType, + identity: data.identity, + amount, + }) + .then((res) => { + onSuccess( + `Successfully delegated ${data.amount} punk to ${res.source_address}` + ) + getBalance.fetchBalance() + }) + .catch((e) => { + console.log(e) + onError(e) + }) + } + + return ( + +
+ + + + setValue('nodeType', nodeType)} + disabled={isSubmitting} + /> + + + + {`A fee of ${ + watchNodeType === EnumNodeType.mixnode + ? fees.mixnode.amount + : fees.gateway.amount + } PUNK will apply to this transaction`} + + + + + + + + + punks + ), + }} + /> + + +
+
+ +
+
+ ) +} diff --git a/tauri-wallet/src/routes/delegate/index.tsx b/tauri-wallet/src/routes/delegate/index.tsx new file mode 100644 index 0000000000..f329e6c126 --- /dev/null +++ b/tauri-wallet/src/routes/delegate/index.tsx @@ -0,0 +1,110 @@ +import React, { useEffect, useState } from 'react' +import { Box, Button, CircularProgress, Theme } from '@material-ui/core' +import { useTheme } from '@material-ui/styles' +import { DelegateForm } from './DelegateForm' +import { Layout } from '../../layouts' +import { NymCard } from '../../components' +import { + EnumRequestStatus, + RequestStatus, +} from '../../components/RequestStatus' +import { Alert, AlertTitle } from '@material-ui/lab' +import { TFee } from '../../types' +import { getGasFee } from '../../requests' + +export const Delegate = () => { + const [status, setStatus] = useState( + EnumRequestStatus.initial + ) + const [message, setMessage] = useState() + const [isLoading, setIsLoading] = useState(true) + const [fees, setFees] = useState() + + useEffect(() => { + const getFees = async () => { + const mixnode = await getGasFee('DelegateToMixnode') + const gateway = await getGasFee('DelegateToGateway') + setFees({ + mixnode: mixnode, + gateway: gateway, + }) + setIsLoading(false) + } + + getFees() + }, []) + + const theme: Theme = useTheme() + return ( + + + {isLoading && ( + + + + )} + <> + {status === EnumRequestStatus.initial && fees && ( + { + setStatus(EnumRequestStatus.error) + setMessage(message) + }} + onSuccess={(message?: string) => { + setStatus(EnumRequestStatus.success) + setMessage(message) + }} + /> + )} + {status !== EnumRequestStatus.initial && ( + <> + + An error occurred with the request: {message} + + } + Success={ + + Delegation complete + {message} + + } + /> +
+ +
+ + )} + +
+
+ ) +} diff --git a/tauri-wallet/src/routes/delegate/validationSchema.ts b/tauri-wallet/src/routes/delegate/validationSchema.ts new file mode 100644 index 0000000000..5c6844c44c --- /dev/null +++ b/tauri-wallet/src/routes/delegate/validationSchema.ts @@ -0,0 +1,17 @@ +import * as Yup from 'yup' +import { validateAmount, validateKey } from '../../utils' + +export const validationSchema = Yup.object().shape({ + identity: Yup.string() + .required() + .test( + 'valid-id-key', + 'A valid identity key is required e.g. 824WyExLUWvLE2mpSHBatN4AoByuLzfnHFeHWiBYzg4z', + (value) => (!!value ? validateKey(value) : false) + ), + amount: Yup.string() + .required() + .test('valid-amount-key', 'A valid amount is required', (value) => + !!value ? validateAmount(value, '0') : false + ), +}) diff --git a/tauri-wallet/src/routes/index.tsx b/tauri-wallet/src/routes/index.tsx new file mode 100644 index 0000000000..6450688f0b --- /dev/null +++ b/tauri-wallet/src/routes/index.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import { Switch, Route } from 'react-router-dom' +import { NotFound } from './404' +import { Balance } from './balance' +import { Bond } from './bond' +import { Delegate } from './delegate' +import { Receive } from './receive' +import { Send } from './send' +import { SignIn } from './sign-in' +import { Unbond } from './unbond' +import { Undelegate } from './undelegate' +import { InternalDocs } from './internal-docs' + +export const Routes = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) diff --git a/tauri-wallet/src/routes/internal-docs/ApiList.tsx b/tauri-wallet/src/routes/internal-docs/ApiList.tsx new file mode 100644 index 0000000000..ef7347a38e --- /dev/null +++ b/tauri-wallet/src/routes/internal-docs/ApiList.tsx @@ -0,0 +1,165 @@ +import React from 'react' +import { List, ListItem } from '@material-ui/core' +import { DocEntry } from './DocEntry' + +export const ApiList = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/tauri-wallet/src/routes/internal-docs/DocEntry.tsx b/tauri-wallet/src/routes/internal-docs/DocEntry.tsx new file mode 100644 index 0000000000..188bcff199 --- /dev/null +++ b/tauri-wallet/src/routes/internal-docs/DocEntry.tsx @@ -0,0 +1,97 @@ +import React from 'react' +import { Button, Card, TextField } from '@material-ui/core' +import { invoke } from '@tauri-apps/api' +import CardContent from '@material-ui/core/CardContent' + +interface DocEntryProps { + function: FunctionDef +} + +interface FunctionDef { + name: string + args: ArgDef[] +} + +interface ArgDef { + name: string + type: string +} + +const argKey = (functionName: string, arg: string) => `${functionName}_${arg}` + +function collectArgs(functionName: string, args: ArgDef[]) { + let invokeArgs: { [key: string]: string } = {} + + args.forEach((arg) => { + let elem: HTMLElement | null = document.getElementById( + argKey(functionName, arg.name) + ) + + if (arg.type === 'object') { + console.log(arg) + invokeArgs[arg.name] = JSON.parse((elem as HTMLInputElement).value) + } else { + invokeArgs[arg.name] = (elem as HTMLInputElement).value || '' + } + }) + console.log(invokeArgs) + return invokeArgs +} + +export const DocEntry = (props: DocEntryProps) => { + const [card, setCard] = React.useState() + + const onClick = () => { + invoke( + props.function.name, + collectArgs(props.function.name, props.function.args) + ) + .then((result) => { + setCard( + + {JSON.stringify(result, null, 4)} + + ) + }) + .catch((e) => + setCard( + + {e} + + ) + ) + } + + return ( +
+ + +
+ {props.function.args.map((arg) => ( + + ))} +
+
+ {card} +
+ ) +} diff --git a/tauri-wallet/src/routes/internal-docs/index.tsx b/tauri-wallet/src/routes/internal-docs/index.tsx new file mode 100644 index 0000000000..f7cdc36375 --- /dev/null +++ b/tauri-wallet/src/routes/internal-docs/index.tsx @@ -0,0 +1,18 @@ +import React, { useState } from 'react' +import { NymCard } from '../../components' +import { ApiList } from './ApiList' +import { Layout } from '../../layouts' + +export const InternalDocs = () => { + if (process.env.NODE_ENV == 'development') { + return ( + + + + + + ) + } + + return null +} diff --git a/tauri-wallet/src/routes/receive.tsx b/tauri-wallet/src/routes/receive.tsx new file mode 100644 index 0000000000..4037228255 --- /dev/null +++ b/tauri-wallet/src/routes/receive.tsx @@ -0,0 +1,75 @@ +import React, { useContext } from 'react' +import QRCode from 'qrcode.react' +import { Box, Card, Grid, Typography } from '@material-ui/core' +import { Alert } from '@material-ui/lab' +import { useMediaQuery } from '@material-ui/core' +import { CopyToClipboard, NymCard } from '../components' +import { Layout } from '../layouts' +import { theme } from '../theme' +import { ClientContext } from '../context/main' + +export const Receive = () => { + const { clientDetails } = useContext(ClientContext) + const matches = useMediaQuery('(min-width:769px)') + + return ( + + + + + + You can receive tokens by providing this address to the sender + + + + + + + + {clientDetails?.client_address} + + + + + + {clientDetails && ( + + )} + + + + + + + + + ) +} diff --git a/tauri-wallet/src/routes/send/SendConfirmation.tsx b/tauri-wallet/src/routes/send/SendConfirmation.tsx new file mode 100644 index 0000000000..4b19369641 --- /dev/null +++ b/tauri-wallet/src/routes/send/SendConfirmation.tsx @@ -0,0 +1,81 @@ +import React from 'react' +import { Card, CircularProgress, Theme, Typography } from '@material-ui/core' +import { CheckCircleOutline } from '@material-ui/icons' +import { useTheme } from '@material-ui/styles' +import { SendError } from './SendError' +import { TauriTxResult } from '../../types/rust/tauritxresult' + +export const SendConfirmation = ({ + data, + error, + isLoading, +}: { + data?: TauriTxResult['details'] + error?: string + isLoading: boolean +}) => { + const theme: Theme = useTheme() + + return ( +
+ {isLoading && } + {!isLoading && !!error && } + {!isLoading && data && ( + <> +
+ + Transaction complete +
+ + +
+
+ + Recipient + +
+
+ {data.to_address} +
+
+
+
+ + Amount + +
+
+ {data.amount.amount + ' punks'} +
+
+
+ + )} +
+ ) +} diff --git a/tauri-wallet/src/routes/send/SendError.tsx b/tauri-wallet/src/routes/send/SendError.tsx new file mode 100644 index 0000000000..2fcb9ce5be --- /dev/null +++ b/tauri-wallet/src/routes/send/SendError.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import { Card, Theme, Typography } from '@material-ui/core' +import { ErrorOutline } from '@material-ui/icons' +import { Alert } from '@material-ui/lab' +import { useTheme } from '@material-ui/styles' + +export const SendError = ({ message }: { message?: string }) => { + const theme: Theme = useTheme() + + return ( +
+ <> +
+ + Transaction failed +
+ + + + An error occured during the request {message} + + + +
+ ) +} diff --git a/tauri-wallet/src/routes/send/SendForm.tsx b/tauri-wallet/src/routes/send/SendForm.tsx new file mode 100644 index 0000000000..de4461bac3 --- /dev/null +++ b/tauri-wallet/src/routes/send/SendForm.tsx @@ -0,0 +1,58 @@ +import React from 'react' +import { Grid, InputAdornment, TextField } from '@material-ui/core' +import { useFormContext } from 'react-hook-form' + +export const SendForm = () => { + const { + register, + formState: { errors }, + } = useFormContext() + + return ( + + + + + + + + + + punks, + }} + /> + + + ) +} diff --git a/tauri-wallet/src/routes/send/SendReview.tsx b/tauri-wallet/src/routes/send/SendReview.tsx new file mode 100644 index 0000000000..e9d0e23095 --- /dev/null +++ b/tauri-wallet/src/routes/send/SendReview.tsx @@ -0,0 +1,92 @@ +import React, { useContext, useEffect, useState } from 'react' +import { + Card, + CircularProgress, + Divider, + Grid, + Theme, + Typography, +} from '@material-ui/core' +import { useTheme } from '@material-ui/styles' +import { useFormContext } from 'react-hook-form' +import { ClientContext } from '../../context/main' +import { getGasFee } from '../../requests' + +export const SendReview = () => { + const { getValues } = useFormContext() + const [transferFee, setTransferFee] = useState() + const [isLoadingFee, setIsLoadingFee] = useState(true) + + const values = getValues() + + const theme: Theme = useTheme() + + useEffect(() => { + const getFee = async () => { + const fee = await getGasFee('Send') + setTransferFee(fee.amount) + setIsLoadingFee(false) + } + getFee() + }, []) + + return ( + + {isLoadingFee ? ( + + ) : ( + + + + + + + + + + + + + + + + + + + + + + + + )} + + ) +} + +export const SendReviewField = ({ + title, + subtitle, +}: { + title: string + subtitle?: string +}) => { + const theme: Theme = useTheme() + return ( + <> + + {title} + + {subtitle} + + ) +} diff --git a/tauri-wallet/src/routes/send/SendWizard.tsx b/tauri-wallet/src/routes/send/SendWizard.tsx new file mode 100644 index 0000000000..ee03bab9aa --- /dev/null +++ b/tauri-wallet/src/routes/send/SendWizard.tsx @@ -0,0 +1,180 @@ +import React, { useContext, useEffect, useState } from 'react' +import { useForm, FormProvider } from 'react-hook-form' +import { yupResolver } from '@hookform/resolvers/yup' +import { Button, Step, StepLabel, Stepper, Theme } from '@material-ui/core' +import { useTheme } from '@material-ui/styles' +import { SendForm } from './SendForm' +import { SendReview } from './SendReview' +import { SendConfirmation } from './SendConfirmation' +import { ClientContext } from '../../context/main' +import { validationSchema } from './validationSchema' +import { TauriTxResult } from '../../types' +import { majorToMinor, send } from '../../requests' +import { checkHasEnoughFunds } from '../../utils' + +const defaultValues = { + amount: '', + memo: '', + to: '', +} + +export type TFormData = { + amount: string + memo: string + to: string + from: string +} + +export const SendWizard = () => { + const [activeStep, setActiveStep] = useState(0) + const [isLoading, setIsLoading] = useState(false) + const [requestError, setRequestError] = useState() + const [confirmedData, setConfirmedData] = useState() + + const { getBalance } = useContext(ClientContext) + + const steps = ['Enter address', 'Review and send', 'Await confirmation'] + + const { clientDetails } = useContext(ClientContext) + const methods = useForm({ + defaultValues: { + ...defaultValues, + from: clientDetails?.client_address!, + }, + resolver: yupResolver(validationSchema), + }) + + const theme: Theme = useTheme() + + const handleNextStep = methods.handleSubmit(() => setActiveStep((s) => s + 1)) + + const handlePreviousStep = () => setActiveStep((s) => s - 1) + + const handleFinish = () => { + methods.reset() + setIsLoading(false) + setRequestError(undefined) + setConfirmedData(undefined) + setActiveStep(0) + } + + const handleSend = async () => { + const formState = methods.getValues() + + const hasEnoughFunds = await checkHasEnoughFunds(formState.amount) + if (!hasEnoughFunds) { + methods.setError('amount', { + message: 'Not enough funds in wallet', + }) + return handlePreviousStep() + } else { + setIsLoading(true) + setActiveStep((s) => s + 1) + const amount = await majorToMinor(formState.amount) + + send({ + amount, + address: formState.to, + memo: formState.memo, + }) + .then((res: any) => { + const { details } = res as TauriTxResult + setActiveStep((s) => s + 1) + setConfirmedData({ + ...details, + amount: { denom: 'Major', amount: formState.amount }, + }) + setIsLoading(false) + getBalance.fetchBalance() + }) + .catch((e) => { + setRequestError(e) + setIsLoading(false) + console.log(e) + }) + } + } + + return ( + +
+ + {steps.map((s, i) => ( + + {s} + + ))} + +
+ {activeStep === 0 ? ( + + ) : activeStep === 1 ? ( + + ) : ( + + )} +
+
+ {activeStep === 1 && ( + + )} + +
+
+
+ ) +} diff --git a/tauri-wallet/src/routes/send/index.tsx b/tauri-wallet/src/routes/send/index.tsx new file mode 100644 index 0000000000..eed0b844fa --- /dev/null +++ b/tauri-wallet/src/routes/send/index.tsx @@ -0,0 +1,14 @@ +import React, { useState } from 'react' +import { NymCard } from '../../components' +import { SendWizard } from './SendWizard' +import { Layout } from '../../layouts' + +export const Send = () => { + return ( + + + + + + ) +} diff --git a/tauri-wallet/src/routes/send/validationSchema.ts b/tauri-wallet/src/routes/send/validationSchema.ts new file mode 100644 index 0000000000..cde14baf11 --- /dev/null +++ b/tauri-wallet/src/routes/send/validationSchema.ts @@ -0,0 +1,11 @@ +import * as Yup from 'yup' +import { validateAmount } from '../../utils' + +export const validationSchema = Yup.object().shape({ + to: Yup.string().strict().trim('Cannot have leading space').required(), + amount: Yup.string() + .required() + .test('valid-amount', 'A valid amount is required', (amount) => { + return validateAmount(amount || '0', '0') + }), +}) diff --git a/tauri-wallet/src/routes/sign-in.tsx b/tauri-wallet/src/routes/sign-in.tsx new file mode 100644 index 0000000000..6ef052ef41 --- /dev/null +++ b/tauri-wallet/src/routes/sign-in.tsx @@ -0,0 +1,316 @@ +import React, { useContext, useState } from 'react' +import { + TextField, + CircularProgress, + Button, + Typography, + Grid, + Link, + Theme, + Card, + Divider, +} from '@material-ui/core' +import { Alert } from '@material-ui/lab' +import { useTheme } from '@material-ui/styles' +import { ArrowBack, CheckCircleOutline } from '@material-ui/icons' +import logo from '../images/logo-background.svg' +import logo_alt from '../images/logo.png' +import { ClientContext } from '../context/main' +import { theme } from '../theme' +import { createAccount, signInWithMnemonic } from '../requests' +import { TCreateAccount } from '../types' +import { CopyToClipboard } from '../components' + +export const SignIn = () => { + const theme: Theme = useTheme() + const [showCreateAccount, setShowCreateAccount] = useState(false) + return ( +
+
+ +
+
+ {showCreateAccount ? ( + setShowCreateAccount(false)} + /> + ) : ( + setShowCreateAccount(true)} /> + )} +
+
+ ) +} + +const SignInContent = ({ + showCreateAccount, +}: { + showCreateAccount: () => void +}) => { + const [mnemonic, setMnemonic] = useState('') + const [inputError, setInputError] = useState() + const [isLoading, setIsLoading] = useState(false) + + const { logIn } = useContext(ClientContext) + + const theme: Theme = useTheme() + + const handleSignIn = async (e: React.FormEvent) => { + e.preventDefault() + + setIsLoading(true) + setInputError(undefined) + + try { + const res = await signInWithMnemonic(mnemonic || '') + setIsLoading(false) + logIn(res) + } catch (e: any) { + setIsLoading(false) + setInputError(e) + } + } + + return ( + + <> + Sign in +
+ + + ) => + setMnemonic(e.target.value) + } + size="medium" + variant="outlined" + margin="normal" + required + fullWidth + id="mnemonic" + label="BIP-39 Mnemonic" + name="mnemonic" + autoComplete="mnemonic" + autoFocus + disabled={isLoading} + /> + + + + + {inputError && ( + + {inputError} + + )} + + + Don't have an account? + {' '} + + Create one + + + +
+ +
+ ) +} + +const SignInCard: React.FC = ({ children }) => { + const theme: Theme = useTheme() + return ( + <> + + + {children} + + + ) +} + +const CreateAccountContent = ({ showSignIn }: { showSignIn: () => void }) => { + const [accountDetails, setAccountDetails] = useState() + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState() + + const handleCreateAccount = async () => { + setIsLoading(true) + setError(undefined) + try { + const res = await createAccount() + setTimeout(() => { + setAccountDetails(res) + setIsLoading(false) + }, 2500) + } catch (e: any) { + console.log(e) + setError(e) + } + } + return ( + + Create wallet + + Create an new wallet to start using the Nym network + + + + {isLoading && } + {!isLoading && accountDetails && ( + <> +
+ + Wallet setup complete +
+ + Please store your mnemonic in a safe place. + You'll need it to access your wallet + + + + + + Mnemonic + + + + {accountDetails.mnemonic} +
+ +
+
+ + + + + + Address + + + + {accountDetails.client_address} + +
+
+ + )} +
+ {error && ( + + {error} + + )} + + {!accountDetails && ( + + )} + + +
+
+ ) +} diff --git a/tauri-wallet/src/routes/unbond/index.tsx b/tauri-wallet/src/routes/unbond/index.tsx new file mode 100644 index 0000000000..9ae5ed6f01 --- /dev/null +++ b/tauri-wallet/src/routes/unbond/index.tsx @@ -0,0 +1,69 @@ +import React, { useContext, useEffect, useState } from 'react' +import { NymCard } from '../../components' +import { UnbondForm } from './UnbondForm' +import { Layout } from '../../layouts' +import { useCheckOwnership } from '../../hooks/useCheckOwnership' +import { Alert } from '@material-ui/lab' +import { Box, Button, CircularProgress, Theme } from '@material-ui/core' +import { ClientContext } from '../../context/main' +import { unbond } from '../../requests' +import { useTheme } from '@material-ui/styles' + +export const Unbond = () => { + const [isLoading, setIsLoading] = useState(false) + const { checkOwnership, ownership } = useCheckOwnership() + const { getBalance } = useContext(ClientContext) + + const theme: Theme = useTheme() + + useEffect(() => { + const initialiseForm = async () => { + await checkOwnership() + } + initialiseForm() + }, [ownership.hasOwnership, checkOwnership]) + + return ( + + + {ownership?.hasOwnership && ( + { + setIsLoading(true) + await unbond(ownership.nodeType!) + getBalance.fetchBalance() + setIsLoading(false) + }} + > + Unbond + + } + style={{ margin: theme.spacing(2) }} + > + {`Looks like you already have a ${ownership.nodeType} bonded.`} + + )} + {!ownership.hasOwnership && ( + + You don't currently have a bonded node + + )} + {isLoading && ( + + + + )} + + + ) +} diff --git a/tauri-wallet/src/routes/undelegate/UndelegateForm.tsx b/tauri-wallet/src/routes/undelegate/UndelegateForm.tsx new file mode 100644 index 0000000000..61bdf0b920 --- /dev/null +++ b/tauri-wallet/src/routes/undelegate/UndelegateForm.tsx @@ -0,0 +1,134 @@ +import React, { useContext } from 'react' +import { useForm } from 'react-hook-form' +import { + Button, + CircularProgress, + FormControl, + Grid, + TextField, + Theme, +} from '@material-ui/core' +import { Alert } from '@material-ui/lab' +import { useTheme } from '@material-ui/styles' +import { yupResolver } from '@hookform/resolvers/yup' +import { validationSchema } from './validationSchema' +import { NodeTypeSelector } from '../../components/NodeTypeSelector' +import { EnumNodeType, TFee } from '../../types' +import { ClientContext } from '../../context/main' +import { minorToMajor, undelegate } from '../../requests' + +type TFormData = { + nodeType: EnumNodeType + identity: string +} + +const defaultValues = { + nodeType: EnumNodeType.mixnode, + identity: '', +} + +export const UndelegateForm = ({ + fees, + onError, + onSuccess, +}: { + fees: TFee + onError: (message?: string) => void + onSuccess: (message?: string) => void +}) => { + const { + handleSubmit, + register, + setValue, + watch, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + }) + const watchNodeType = watch('nodeType') + const { getBalance } = useContext(ClientContext) + + const onSubmit = async (data: TFormData) => { + await undelegate({ + type: data.nodeType, + identity: data.identity, + }) + .then(async (res) => { + onSuccess(`Successfully undelegated from ${res.source_address}`) + getBalance.fetchBalance() + }) + .catch((e) => onError(e)) + } + + const theme: Theme = useTheme() + + return ( + +
+ + + + setValue('nodeType', nodeType)} + /> + + + + {`A fee of ${ + watchNodeType === EnumNodeType.mixnode + ? fees.mixnode.amount + : fees.gateway.amount + } PUNK will apply to this transaction`} + + + + + + + + {/* {allocationWarning && ( + + + {allocationWarning} + + + )} */} + +
+
+ +
+
+ ) +} diff --git a/tauri-wallet/src/routes/undelegate/index.tsx b/tauri-wallet/src/routes/undelegate/index.tsx new file mode 100644 index 0000000000..833825ad4b --- /dev/null +++ b/tauri-wallet/src/routes/undelegate/index.tsx @@ -0,0 +1,92 @@ +import React, { useEffect, useState } from 'react' +import { Alert, AlertTitle } from '@material-ui/lab' +import { useTheme } from '@material-ui/styles' +import { NymCard } from '../../components' +import { UndelegateForm } from './UndelegateForm' +import { Layout } from '../../layouts' +import { + EnumRequestStatus, + RequestStatus, +} from '../../components/RequestStatus' +import { Box, CircularProgress, Theme } from '@material-ui/core' +import { getGasFee } from '../../requests' +import { TFee } from '../../types' + +export const Undelegate = () => { + const [message, setMessage] = useState() + const [status, setStaus] = useState( + EnumRequestStatus.initial + ) + const [isLoading, setIsLoading] = useState(true) + const [fees, setFees] = useState() + + useEffect(() => { + const getFees = async () => { + const mixnode = await getGasFee('UndelegateFromMixnode') + const gateway = await getGasFee('UndelegateFromGateway') + setFees({ + mixnode: mixnode, + gateway: gateway, + }) + setIsLoading(false) + } + + getFees() + }, []) + + const theme: Theme = useTheme() + + return ( + + + {isLoading && ( + + + + )} + <> + {status === EnumRequestStatus.initial && fees && ( + { + setMessage(message) + setStaus(EnumRequestStatus.error) + }} + onSuccess={(message) => { + setMessage(message) + setStaus(EnumRequestStatus.success) + }} + /> + )} + {status !== EnumRequestStatus.initial && ( + + An error occurred with the request: {message} + + } + Success={ + + {' '} + Undelegation complete + {message} + + } + /> + )} + + + + ) +} diff --git a/tauri-wallet/src/routes/undelegate/validationSchema.ts b/tauri-wallet/src/routes/undelegate/validationSchema.ts new file mode 100644 index 0000000000..659df6bcef --- /dev/null +++ b/tauri-wallet/src/routes/undelegate/validationSchema.ts @@ -0,0 +1,10 @@ +import * as Yup from 'yup' +import { validateKey } from '../../utils' + +export const validationSchema = Yup.object().shape({ + identity: Yup.string() + .required() + .test('valid-id-key', 'A valid identity key is required', function (value) { + return validateKey(value || '') + }), +}) diff --git a/tauri-wallet/src/theme.tsx b/tauri-wallet/src/theme.tsx new file mode 100644 index 0000000000..c6a8d74f4f --- /dev/null +++ b/tauri-wallet/src/theme.tsx @@ -0,0 +1,66 @@ +import { createTheme } from '@material-ui/core' + +const nymPalette = { + primary: { + main: '#F4731B', + }, + secondary: { + main: '#009FA8', + }, + background: { + main: '#121726', + }, +} + +export const theme = createTheme({ + palette: { + primary: { + main: nymPalette.primary.main, + }, + secondary: { + main: nymPalette.secondary.main, + }, + }, + shape: { + borderRadius: 24, + }, + overrides: { + MuiButton: { + root: { + padding: '12px 24px', + }, + containedPrimary: { + color: 'white', + }, + text: { + padding: '12px 24px', + }, + outlined: { + padding: '12px 24px', + }, + textSizeSmall: { + padding: '6px 12px', + }, + outlinedSizeSmall: { + padding: '8px 12px', + }, + containedSizeSmall: { + padding: '8px 12px', + }, + }, + + MuiStepIcon: { + text: { + fill: '#fff', + }, + }, + + MuiTooltip: { + tooltipPlacementBottom: { + background: nymPalette.background.main, + padding: '8px 12px', + fontSize: 12, + }, + }, + }, +}) diff --git a/tauri-wallet/src/types/global.ts b/tauri-wallet/src/types/global.ts new file mode 100644 index 0000000000..672f1629d6 --- /dev/null +++ b/tauri-wallet/src/types/global.ts @@ -0,0 +1,26 @@ +import { Coin } from '.' + +export enum EnumNodeType { + mixnode = 'mixnode', + gateway = 'gateway', +} + +export type TNodeOwnership = { + hasOwnership: boolean + nodeType?: EnumNodeType +} + +export type TClientDetails = { + client_address: string + contract_address: string +} + +export type TSignInWithMnemonic = { + denom: string +} & TClientDetails + +export type TCreateAccount = { + mnemonic: string +} & TSignInWithMnemonic + +export type TFee = { [key in EnumNodeType]: Coin } diff --git a/tauri-wallet/src/types/index.ts b/tauri-wallet/src/types/index.ts new file mode 100644 index 0000000000..c0f4287d79 --- /dev/null +++ b/tauri-wallet/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './rust' +export * from './global' diff --git a/tauri-wallet/src/types/rust/account.ts b/tauri-wallet/src/types/rust/account.ts new file mode 100644 index 0000000000..d826983913 --- /dev/null +++ b/tauri-wallet/src/types/rust/account.ts @@ -0,0 +1,8 @@ +import { Denom } from "./denom"; + +export interface Account { + contract_address: string; + client_address: string; + denom: Denom; + mnemonmic: string | null; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/balance.ts b/tauri-wallet/src/types/rust/balance.ts new file mode 100644 index 0000000000..611e94db2d --- /dev/null +++ b/tauri-wallet/src/types/rust/balance.ts @@ -0,0 +1,6 @@ +import { Coin } from "./coin"; + +export interface Balance { + coin: Coin; + printable_balance: string; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/coin.ts b/tauri-wallet/src/types/rust/coin.ts new file mode 100644 index 0000000000..db465263b6 --- /dev/null +++ b/tauri-wallet/src/types/rust/coin.ts @@ -0,0 +1,6 @@ +import { Denom } from "./denom"; + +export interface Coin { + amount: string; + denom: Denom; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/delegationresult.ts b/tauri-wallet/src/types/rust/delegationresult.ts new file mode 100644 index 0000000000..a02bcf6b83 --- /dev/null +++ b/tauri-wallet/src/types/rust/delegationresult.ts @@ -0,0 +1,7 @@ +import { Coin } from "./coin"; + +export interface DelegationResult { + source_address: string; + target_address: string; + amount: Coin | null; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/denom.ts b/tauri-wallet/src/types/rust/denom.ts new file mode 100644 index 0000000000..f8f1d41147 --- /dev/null +++ b/tauri-wallet/src/types/rust/denom.ts @@ -0,0 +1 @@ +export type Denom = "Major" | "Minor"; \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/gateway.ts b/tauri-wallet/src/types/rust/gateway.ts new file mode 100644 index 0000000000..98a81a9914 --- /dev/null +++ b/tauri-wallet/src/types/rust/gateway.ts @@ -0,0 +1,9 @@ +export interface Gateway { + host: string; + mix_port: number; + clients_port: number; + location: string; + sphinx_key: string; + identity_key: string; + version: string; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/index.ts b/tauri-wallet/src/types/rust/index.ts new file mode 100644 index 0000000000..8e22182af6 --- /dev/null +++ b/tauri-wallet/src/types/rust/index.ts @@ -0,0 +1,11 @@ +export * from './account' +export * from './balance' +export * from './coin' +export * from './delegationresult' +export * from './denom' +export * from './gateway' +export * from './mixnode' +export * from './operation' +export * from './stateparams' +export * from './tauritxresult' +export * from './transactiondetails' diff --git a/tauri-wallet/src/types/rust/mixnode.ts b/tauri-wallet/src/types/rust/mixnode.ts new file mode 100644 index 0000000000..5fd3bc2b62 --- /dev/null +++ b/tauri-wallet/src/types/rust/mixnode.ts @@ -0,0 +1,9 @@ +export interface MixNode { + host: string; + mix_port: number; + verloc_port: number; + http_api_port: number; + sphinx_key: string; + identity_key: string; + version: string; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/operation.ts b/tauri-wallet/src/types/rust/operation.ts new file mode 100644 index 0000000000..f22f63b183 --- /dev/null +++ b/tauri-wallet/src/types/rust/operation.ts @@ -0,0 +1,15 @@ +export type Operation = + | "Upload" + | "Init" + | "Migrate" + | "ChangeAdmin" + | "Send" + | "BondMixnode" + | "UnbondMixnode" + | "DelegateToMixnode" + | "UndelegateFromMixnode" + | "BondGateway" + | "UnbondGateway" + | "DelegateToGateway" + | "UndelegateFromGateway" + | "UpdateStateParams"; \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/stateparams.ts b/tauri-wallet/src/types/rust/stateparams.ts new file mode 100644 index 0000000000..f0c18aa83e --- /dev/null +++ b/tauri-wallet/src/types/rust/stateparams.ts @@ -0,0 +1,10 @@ +export interface TauriStateParams { + epoch_length: number; + minimum_mixnode_bond: string; + minimum_gateway_bond: string; + mixnode_bond_reward_rate: string; + gateway_bond_reward_rate: string; + mixnode_delegation_reward_rate: string; + gateway_delegation_reward_rate: string; + mixnode_active_set_size: number; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/tauritxresult.ts b/tauri-wallet/src/types/rust/tauritxresult.ts new file mode 100644 index 0000000000..92d812300f --- /dev/null +++ b/tauri-wallet/src/types/rust/tauritxresult.ts @@ -0,0 +1,9 @@ +import { TransactionDetails } from "./transactiondetails"; + +export interface TauriTxResult { + code: number; + gas_wanted: number; + gas_used: number; + block_height: number; + details: TransactionDetails; +} \ No newline at end of file diff --git a/tauri-wallet/src/types/rust/transactiondetails.ts b/tauri-wallet/src/types/rust/transactiondetails.ts new file mode 100644 index 0000000000..f24b695511 --- /dev/null +++ b/tauri-wallet/src/types/rust/transactiondetails.ts @@ -0,0 +1,7 @@ +import { Coin } from "./coin"; + +export interface TransactionDetails { + from_address: string; + to_address: string; + amount: Coin; +} \ No newline at end of file diff --git a/tauri-wallet/src/utils/index.ts b/tauri-wallet/src/utils/index.ts new file mode 100644 index 0000000000..d07271ad0c --- /dev/null +++ b/tauri-wallet/src/utils/index.ts @@ -0,0 +1,98 @@ +import { invoke } from '@tauri-apps/api' +import bs58 from 'bs58' +import { minor, valid } from 'semver' +import { getBalance, majorToMinor } from '../requests' +import { Coin } from '../types' + +export const validateKey = (key: string): boolean => { + // it must be a valid base58 key + try { + const bytes = bs58.decode(key) + // of length 32 + return bytes.length === 32 + } catch (e) { + console.log(e) + return false + } +} + +export const validateAmount = async ( + amount: string, + minimum: string +): Promise => { + // tests basic coin value requirements, like no more than 6 decimal places, value lower than total supply, etc + if (!Number(amount)) { + return false + } + + try { + const minorValueStr: Coin = await invoke('major_to_minor', { + amount, + }) + + if (!basicRawCoinValueValidation(minorValueStr.amount)) { + return false + } + + const minorValue = parseInt(minorValueStr.amount) + + return minorValue >= parseInt(minimum) + } catch (e) { + console.log(e) + return false + } + + // this conversion seems really iffy but I'm not sure how to better approach it +} + +export const basicRawCoinValueValidation = (rawAmount: string): boolean => { + const amountFloat = parseFloat(rawAmount) + + // it cannot have more than 6 decimal places + if (amountFloat !== parseInt(amountFloat.toFixed(6))) { + return false + } + + // it cannot be larger than the total supply + if (amountFloat > 1_000_000_000_000_000) { + return false + } + + // it can't be lower than one micro coin + return amountFloat >= 0.000001 +} + +export const isValidHostname = (value: string) => { + // regex for ipv4 and ipv6 and hhostname- source http://jsfiddle.net/DanielD/8S4nq/ + const hostnameRegex = + /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))|(^\s*((?=.{1,255}$)(?=.*[A-Za-z].*)[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*)\s*$)/ + + return hostnameRegex.test(value) +} + +export const validateVersion = (version: string): boolean => { + try { + const minorVersion = minor(version) + const validVersion = valid(version) + return validVersion !== null && minorVersion >= 11 + } catch (e) { + return false + } +} + +export const validateLocation = (location: string): boolean => { + // right now only perform the stupid check of whether the user copy-pasted the tooltip... (with or without brackets) + return !location.trim().includes('physical location of your node') +} + +export const validateRawPort = (rawPort: number): boolean => + !isNaN(rawPort) && rawPort >= 1 && rawPort <= 65535 + +export const truncate = (text: string, trim: number) => + text.substring(0, trim) + '...' + +export const checkHasEnoughFunds = async (allocationValue: string) => { + const minorValue = await majorToMinor(allocationValue) + const walletValue = await getBalance() + return !(+walletValue.coin.amount - +minorValue.amount < 0) +} diff --git a/tauri-wallet/tsconfig.json b/tauri-wallet/tsconfig.json new file mode 100644 index 0000000000..70a9da64af --- /dev/null +++ b/tauri-wallet/tsconfig.json @@ -0,0 +1,75 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + "jsx": "react" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */, + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + "typeRoots": [ + "../node_modules/@types", + "src/types", + "./" + ] /* List of folders to include type definitions from. */, + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "exclude": ["node_modules", "dist"] +} diff --git a/tauri-wallet/webpack.config.js b/tauri-wallet/webpack.config.js new file mode 100644 index 0000000000..41b65dee5a --- /dev/null +++ b/tauri-wallet/webpack.config.js @@ -0,0 +1,45 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FaviconsWebpackPlugin = require('favicons-webpack-plugin') +var path = require('path') + +module.exports = { + mode: 'development', + entry: path.resolve(__dirname, '/src/index'), + devServer: { + port: 9000, + compress: true, + historyApiFallback: true, + hot: true, + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.resolve(__dirname, 'public/index.html'), + filename: 'index.html', + }), + new FaviconsWebpackPlugin(path.resolve(__dirname, 'public/favicon.ico')), + ], + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + exclude: /node_modules/, + use: ['babel-loader'], + }, + { + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(png|jpe?g|gif|svg)$/i, + use: [ + { + loader: 'file-loader', + }, + ], + }, + ], + }, + resolve: { + extensions: ['*', '.js', '.jsx', '.ts', '.tsx'], + }, +} diff --git a/tauri-wallet/yarn.lock b/tauri-wallet/yarn.lock new file mode 100644 index 0000000000..d2fed23292 --- /dev/null +++ b/tauri-wallet/yarn.lock @@ -0,0 +1,6964 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz" + integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-module-transforms" "^7.15.0" + "@babel/helpers" "^7.14.8" + "@babel/parser" "^7.15.0" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz" + integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== + dependencies: + "@babel/types" "^7.15.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz" + integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz" + integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz" + integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-split-export-declaration" "^7.14.5" + +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz" + integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz" + integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== + dependencies: + "@babel/types" "^7.15.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz" + integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-simple-access" "^7.14.8" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz" + integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-wrap-function" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz" + integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/helper-simple-access@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz" + integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== + dependencies: + "@babel/types" "^7.14.8" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz" + integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helpers@^7.14.8": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz" + integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.5", "@babel/parser@^7.15.0": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz" + integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz" + integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz" + integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz" + integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.14.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.14.5": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz" + integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz" + integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz" + integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig== + dependencies: + "@babel/helper-module-transforms" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.8" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz" + integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== + dependencies: + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + +"@babel/plugin-transform-parameters@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz" + integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.14.5" + +"@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" + +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz" + integrity sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.0.tgz" + integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.9" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.9" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.0" + "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.15.0" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + +"@babel/preset-typescript@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz" + integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz" + integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.0" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.15.0" + "@babel/types" "^7.15.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.14.9", "@babel/types@^7.15.0", "@babel/types@^7.4.4": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz" + integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@hookform/resolvers@^2.8.0": + version "2.8.0" + resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.0.tgz" + integrity sha512-ALlr0Bg6zDHdRsdqkwfWGPMnIxP4hqMRPvFDHp7lWXQeA7rKykto3cWqQQh1s0PzX043RHwMB6OHVPMwFJqwxg== + +"@material-ui/core@^4.12.3": + version "4.12.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/lab@^4.0.0-alpha.60": + version "4.0.0-alpha.60" + resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz" + integrity sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.4": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz" + integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz" + integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@sindresorhus/is@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz" + integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tauri-apps/api@^1.0.0-beta.6": + version "1.0.0-beta.6" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-beta.6.tgz" + integrity sha512-RQ3AI6Fb8LAbP/r6M2r1rEbJLEGBu0BjwcjDbyFD/L/m97kugEep+VQjHATAS7nUAU1X6LmftswZo0JPMX1PzQ== + +"@tauri-apps/cli@^1.0.0-beta.9": + version "1.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-beta.9.tgz" + integrity sha512-L/fr+iX658blVO2I6ewhRbaoGyB11asd8WrRBG5tpnF5i80igYAUt5XoJNURGspax4blEW0mKPEfnyQ02zJYRQ== + dependencies: + "@tauri-apps/toml" "2.2.4" + chalk "4.1.2" + cross-env "7.0.3" + cross-spawn "7.0.3" + fs-extra "10.0.0" + global-agent "3.0.0" + got "11.8.2" + imagemin "8.0.1" + imagemin-optipng "8.0.0" + imagemin-zopfli "7.0.0" + inquirer "8.1.2" + is-png "3.0.0" + minimist "1.2.5" + ms "2.1.3" + png2icons "2.0.1" + read-chunk "3.2.0" + semver "7.3.5" + sharp "0.28.3" + update-notifier "5.1.0" + +"@tauri-apps/toml@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/toml/-/toml-2.2.4.tgz" + integrity sha512-NJV/pdgJObDlDWi5+MTHZ2qyNvdL0dlHqQ72nzQYXWbW1LHMPXgCJYl0pLqL1XxxLtxtInYbtVCGVAcwhGxdkw== + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@types/bs58@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz" + integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== + dependencies: + base-x "^3.0.6" + +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz" + integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/favicons@5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@types/favicons/-/favicons-5.5.0.tgz" + integrity sha512-s76OlRaBfqtGu2ZBobnZv2NETfqsQUVfKKlOkKNGo4ArBsqiblodKsnQ3j29hCCgmpQacEfLxealV96za+tzVQ== + dependencies: + "@types/node" "*" + +"@types/history@*": + version "4.7.9" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== + +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/keyv@*": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.2.tgz" + integrity sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.165": + version "4.14.172" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz" + integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== + +"@types/node@*": + version "16.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz" + integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/qrcode.react@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@types/qrcode.react/-/qrcode.react-1.0.2.tgz" + integrity sha512-I9Oq5Cjlkgy3Tw7krCnCXLw2/zMhizkTere49OOcta23tkvH0xBTP0yInimTh0gstLRtb8Ki9NZVujE5UI6ffQ== + dependencies: + "@types/react" "*" + +"@types/react-dom@^17.0.9": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + dependencies: + "@types/react" "*" + +"@types/react-router-dom@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.8.tgz" + integrity sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.16" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.16.tgz" + integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/react-transition-group@^4.2.0": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.2.tgz" + integrity sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "17.0.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.19.tgz" + integrity sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.8": + version "7.3.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.8.tgz" + integrity sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz" + integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ== + +"@webpack-cli/info@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz" + integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz" + integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-import-assertions@^1.7.6: + version "1.7.6" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz" + integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== + +acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz" + 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" + 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" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-regex@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz" + integrity sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arch@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +archive-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz" + integrity sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA= + dependencies: + file-type "^4.2.0" + +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" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +author-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz" + integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= + +babel-loader@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz" + integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" + +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2, base-x@^3.0.6: + version "3.0.8" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bin-build@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz" + integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA== + dependencies: + decompress "^4.0.0" + download "^6.2.2" + execa "^0.7.0" + p-map-series "^1.0.0" + tempfile "^2.0.0" + +bin-check@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz" + integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA== + dependencies: + execa "^0.7.0" + executable "^4.1.0" + +bin-version-check@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz" + integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ== + dependencies: + bin-version "^3.0.0" + semver "^5.6.0" + semver-truncate "^1.1.2" + +bin-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.1.0.tgz" + integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ== + dependencies: + execa "^1.0.0" + find-versions "^3.0.0" + +bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz" + integrity sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q== + dependencies: + bin-check "^4.1.0" + bin-version-check "^4.0.0" + download "^7.1.0" + import-lazy "^3.1.0" + os-filter-obj "^2.0.0" + pify "^4.0.1" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boolean@^3.0.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.3.tgz" + integrity sha512-zLOKuqi6MHj/MrY+E9JATy2ojKP3WED4W1yHXe8PSw6+6o34YYJXCwBUC/EEilN8Gq6zgveHBKX2zldtBkviGQ== + +boxen@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz" + integrity sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.0" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.16.7: + version "4.16.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz" + integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== + dependencies: + caniuse-lite "^1.0.30001251" + colorette "^1.3.0" + electron-to-chromium "^1.3.811" + escalade "^3.1.1" + node-releases "^1.1.75" + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +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" + 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" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001251: + version "1.0.30001251" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz" + integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A== + +caw@^2.0.0, caw@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz" + integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== + dependencies: + get-proxy "^2.0.0" + isurl "^1.0.0-alpha5" + tunnel-agent "^0.6.0" + url-to-options "^1.0.1" + +chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz" + 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: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz" + 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" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@1.0.2, clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clsx@^1.0.4, clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +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" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz" + integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== + +commander@^2.20.0, commander@^2.8.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz" + 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" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +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" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz" + integrity sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ= + +content-disposition@0.5.3, content-disposition@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +core-js-compat@^3.14.0, core-js-compat@^3.16.0: + version "3.16.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.2.tgz" + integrity sha512-4lUshXtBXsdmp8cDWh6KKiHUg40AjiuPD3bOWkNVsr1xkAhpUqCjaZ8lB1bKx9Gb5fXcbRbFJ4f4qpRIRTuJqQ== + dependencies: + browserslist "^4.16.7" + semver "7.0.0" + +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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@7.0.3, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz" + 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: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz" + 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.2.0.tgz" + integrity sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + semver "^7.3.5" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^2.5.2: + version "2.6.17" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz" + integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== + +csstype@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz" + 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" + 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" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.0.0, decompress@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +default-gateway@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/del/-/del-6.0.0.tgz" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +download@^6.2.2: + version "6.2.5" + resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz" + integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA== + dependencies: + caw "^2.0.0" + content-disposition "^0.5.2" + decompress "^4.0.0" + ext-name "^5.0.0" + file-type "5.2.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^7.0.0" + make-dir "^1.0.0" + p-event "^1.0.0" + pify "^3.0.0" + +download@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz" + integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ== + dependencies: + archive-type "^4.0.0" + caw "^2.0.1" + content-disposition "^0.5.2" + decompress "^4.2.0" + ext-name "^5.0.0" + file-type "^8.1.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^8.3.1" + make-dir "^1.2.0" + p-event "^2.1.0" + pify "^3.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.811: + version "1.3.812" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.812.tgz" + integrity sha512-7KiUHsKAWtSrjVoTSzxQ0nPLr/a+qoxNZwkwd9LkylTOgOXSVXkQbpIVT0WAUQcI5gXq3SwOTCrK+WfINHOXQg== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.8.0: + version "5.8.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz" + integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz" + integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz" + 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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz" + 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" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +exec-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz" + integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA== + dependencies: + execa "^0.7.0" + p-finally "^1.0.0" + pify "^3.0.0" + rimraf "^2.5.4" + tempfile "^2.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz" + 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" + 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" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +executable@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext-list@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz" + integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== + dependencies: + mime-db "^1.28.0" + +ext-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz" + integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== + dependencies: + ext-list "^2.0.0" + sort-keys-length "^1.0.0" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz" + integrity sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg== + dependencies: + reusify "^1.0.4" + +favicons-webpack-plugin@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz" + integrity sha512-D/A+Ze0x57+YZBU69hK/lR3NI636qQnKduWyQm0THGl1y3jt16whPHHsi8yjsuXvetv84Eh/I/yYJbAMC2iQxg== + dependencies: + "@types/favicons" "5.5.0" + find-root "^1.1.0" + parse-author "^2.0.0" + parse5 "^6.0.1" + optionalDependencies: + html-webpack-plugin ">=5.0.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-type@5.2.0, file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^16.5.3: + version "16.5.3" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz" + integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== + dependencies: + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.2.4" + token-types "^4.1.1" + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz" + integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + +file-type@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz" + integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz" + integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz" + 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@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + +follow-redirects@^1.0.0: + version "1.14.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz" + integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz" + 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" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-proxy@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz" + integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== + dependencies: + npm-conf "^1.1.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@3.0.0, get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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-agent@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.1: + version "11.0.4" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^12.0.0: + version "12.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.0.1.tgz" + integrity sha512-AofdCGi+crQ1uN9+nMbTnvC4XGNPJN9hRiPf+A76lUZIZoWoj4Z9iyUQGge7xCGKgR/7ejB36qoIlLoDBc7fYw== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.8" + merge2 "^1.4.1" + slash "^4.0.0" + +got@11.8.2: + version "11.8.2" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz" + integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz" + 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" + +got@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz" + 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" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +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" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +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" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz" + integrity sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + html-minifier-terser "^5.0.1" + lodash "^4.17.21" + pretty-error "^3.0.4" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz" + 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-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +imagemin-optipng@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz" + integrity sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A== + dependencies: + exec-buffer "^3.0.0" + is-png "^2.0.0" + optipng-bin "^7.0.0" + +imagemin-zopfli@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/imagemin-zopfli/-/imagemin-zopfli-7.0.0.tgz" + integrity sha512-nmffj58rVb0O3AlCZLBBVKGyZ5MYPZZfKxUhvA7bwPGougHl/F7EUKSse9jkgXjdvtJYG2ojJeh5N67mYgBM9g== + dependencies: + exec-buffer "^3.0.0" + is-png "^2.0.0" + zopflipng-bin "^6.0.0" + +imagemin@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-8.0.1.tgz" + integrity sha512-Q/QaPi+5HuwbZNtQRqUVk6hKacI6z9iWiCSQBisAv7uBynZwO7t1svkryKl7+iSQbkU/6t9DWnHz04cFs2WY7w== + dependencies: + file-type "^16.5.3" + globby "^12.0.0" + graceful-fs "^4.2.8" + junk "^3.1.0" + p-pipe "^4.0.0" + replace-ext "^2.0.0" + slash "^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" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-lazy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz" + integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz" + 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.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz" + integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.3.0" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz" + integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== + dependencies: + default-gateway "^6.0.0" + ipaddr.js "^1.9.1" + is-ip "^3.1.0" + p-event "^4.2.0" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz" + integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +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" + 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" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0, 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" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +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" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-png@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-3.0.0.tgz" + integrity sha512-waa2qEuqgLjjYT14KOUQqAEIRRIv7ttkzPVctY/qv+IAKnzXf+JAPKQas50RgO0ECPDUG/iB1zQmwpyB9kkZtQ== + +is-png@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz" + integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== + +is-regex@^1.0.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +jest-worker@^27.0.2: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz" + integrity sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"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" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + 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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +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" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jss-plugin-camel-case@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz" + integrity sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.7.1" + +jss-plugin-default-unit@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz" + integrity sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.7.1" + +jss-plugin-global@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz" + integrity sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.7.1" + +jss-plugin-nested@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz" + integrity sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.7.1" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz" + integrity sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.7.1" + +jss-plugin-rule-value-function@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz" + integrity sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.7.1" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz" + integrity sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.7.1" + +jss@10.7.1, jss@^10.5.1: + version "10.7.1" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.7.1.tgz" + integrity sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logalot@^2.0.0, logalot@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz" + integrity sha1-X46MkNME7fElMJUaVVSruMXj9VI= + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +longest@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.1.0, loose-envify@^1.2.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" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz" + integrity sha1-IfYArBwwlcPG5JfuZyce4ISB/p4= + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^1.0.0, make-dir@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + +memfs@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.2.3.tgz" + integrity sha512-vDKa1icg0KDNzcOPBPAduFFb3YL+pLbQ/3hW7rRgUKpoliTAkPmVV7r/3qJ6YqKyIXEDhzsdSvLlEh137AfWUA== + dependencies: + fs-monkey "1.0.3" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.49.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.5, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoclone@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" + integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== + +nanoid@^3.1.23: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-abi@^2.21.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz" + integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg== + dependencies: + semver "^5.4.1" + +node-addon-api@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-releases@^1.1.75: + version "1.1.75" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz" + integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + 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@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-conf@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +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" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz" + 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" + +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + dependencies: + boolbase "^1.0.0" + +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" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +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" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +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" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz" + 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" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.2.1" + resolved "https://registry.npmjs.org/open/-/open-8.2.1.tgz" + integrity sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optipng-bin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-7.0.0.tgz" + integrity sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.0" + logalot "^2.0.0" + +ora@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-filter-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz" + integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg== + dependencies: + arch "^2.1.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-event@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz" + integrity sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU= + dependencies: + p-timeout "^1.1.1" + +p-event@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz" + integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== + dependencies: + p-timeout "^2.0.1" + +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= + dependencies: + p-reduce "^1.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-pipe@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-4.0.0.tgz" + integrity sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w== + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +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" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parse-author@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz" + integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= + dependencies: + author-regex "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz" + 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" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +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" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +peek-readable@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.0.1.tgz" + integrity sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz" + 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" + 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" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +png2icons@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/png2icons/-/png2icons-2.0.1.tgz" + integrity sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA== + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@^8.2.15: + version "8.3.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz" + integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +prebuild-install@^6.1.2: + version "6.1.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +pretty-error@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-3.0.4.tgz" + integrity sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.6" + +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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prop-types@^15.6.0, 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" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-expr@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz" + integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +qr.js@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz" + integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8= + +qrcode.react@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.1.tgz" + integrity sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg== + dependencies: + loose-envify "^1.4.0" + prop-types "^15.6.0" + qr.js "0.0.0" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz" + 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" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.7, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz" + 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-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-boundary@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.3.tgz" + integrity sha512-A+F9HHy9fvt9t8SNDlonq01prnU8AmkjvGKV4kk8seB9kU3xMEO8J/PQlLVmoOIDODl5U2kufSBs4vrWIqhsAA== + dependencies: + "@babel/runtime" "^7.12.5" + +react-hook-form@^7.14.2: + version "7.14.2" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.14.2.tgz" + integrity sha512-32uvgKkaE/0vOncfnJdwQhfahhocPpcb5c7F4j9Eq7dOnqS2Hg8h70Bmt6KXb6veLSWJultc1+ik9QSfqXFmLA== + +react-is@^16.6.0, react-is@^16.7.0, "react-is@^16.8.0 || ^17.0.0", react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-transition-group@^4.4.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-chunk@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz" + integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== + dependencies: + pify "^4.0.1" + with-open-file "^0.1.6" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + 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" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +renderkid@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-2.0.0.tgz" + integrity sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-alpn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.0.tgz" + integrity sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@1.0.2, responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.2.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz" + integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== + dependencies: + tslib "~2.1.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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +seek-bzip@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz" + integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== + dependencies: + commander "^2.8.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +semver-truncate@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz" + integrity sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g= + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.5, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz" + 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" + 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@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +sharp@0.28.3: + version "0.28.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.28.3.tgz" + integrity sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA== + dependencies: + color "^3.1.3" + detect-libc "^1.0.3" + node-addon-api "^3.2.0" + prebuild-install "^6.1.2" + semver "^7.3.5" + simple-get "^3.1.0" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3, simple-get@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz" + integrity sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg= + dependencies: + sort-keys "^1.0.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz" + integrity sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM= + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +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" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz" + 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": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz" + 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-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz" + 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" + 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" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz" + integrity sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg== + dependencies: + ansi-regex "^6.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +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" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +strtok3@^6.2.4: + version "6.2.4" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.2.4.tgz" + integrity sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^4.0.1" + +style-loader@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.2.1.tgz" + integrity sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz" + 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" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz" + integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +terser-webpack-plugin@^5.1.3: + version "5.1.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz" + integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== + dependencies: + jest-worker "^27.0.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.0" + +terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +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" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +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" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +token-types@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.1.1.tgz" + integrity sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +unbzip2-stream@^1.0.9: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +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" + 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" + 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.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +update-notifier@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +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" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +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" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +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" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +watchpack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz" + integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webpack-cli@^4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz" + integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.0.4" + "@webpack-cli/info" "^1.3.0" + "@webpack-cli/serve" "^1.5.2" + colorette "^1.2.1" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz" + integrity sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw== + dependencies: + colorette "^1.2.2" + mem "^8.1.1" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^3.0.0" + +webpack-dev-server@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.0.tgz" + integrity sha512-PnnoCHuLKxH3vYff2EbORntD0Pd+MKclDIO8AcKsDVRToqY9/oeIwwUs5alA2B5OPgXJhaDNkBJAmb0OaWZFJA== + dependencies: + ansi-html "^0.0.7" + bonjour "^3.5.0" + chokidar "^3.5.1" + colorette "^1.2.2" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + internal-ip "^6.2.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^3.1.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.0.0" + ws "^8.1.0" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz" + integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw== + +webpack@^5.50.0: + version "5.51.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.51.1.tgz" + integrity sha512-xsn3lwqEKoFvqn4JQggPSRxE4dhsRcysWTqYABAZlmavcoTmwlOb9b1N36Inbt/eIispSkuHa80/FJkDTPos1A== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.0" + es-module-lexer "^0.7.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.2.0" + webpack-sources "^3.2.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + 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" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +with-open-file@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz" + integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA== + dependencies: + p-finally "^1.0.0" + p-try "^2.1.0" + pify "^4.0.1" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^8.1.0: + version "8.2.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz" + integrity sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yup@^0.32.9: + version "0.32.9" + resolved "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz" + integrity sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg== + dependencies: + "@babel/runtime" "^7.10.5" + "@types/lodash" "^4.14.165" + lodash "^4.17.20" + lodash-es "^4.17.15" + nanoclone "^0.2.1" + property-expr "^2.0.4" + toposort "^2.0.2" + +zopflipng-bin@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/zopflipng-bin/-/zopflipng-bin-6.0.1.tgz" + integrity sha512-+aybvXv/xafL6I67uSH5yLHrSy4/OaSOV9tniw4yZFIHpINXUcctVHE/WzHxOONrL2GHzJ8Fd4iDrNyaS6TVbg== + dependencies: + bin-build "^3.0.0" + bin-wrapper "^4.0.1" + logalot "^2.1.0" diff --git a/validator-api/Cargo.toml b/validator-api/Cargo.toml index a69d25e179..099f0c0a38 100644 --- a/validator-api/Cargo.toml +++ b/validator-api/Cargo.toml @@ -28,25 +28,26 @@ rocket = { version = "0.5.0-rc.1", features = ["json"] } serde = "1.0" serde_json = "1.0" tokio = { version = "1.4", features = ["rt-multi-thread", "macros", "signal", "time"] } -rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "dfd3662c49e2f6fc37df35091cb94d82f7fb5915" } +rocket_cors = { git="https://github.com/lawliet89/rocket_cors", rev="dfd3662c49e2f6fc37df35091cb94d82f7fb5915" } url = "2.2" - +thiserror = "1" +time = { version = "0.3", features = ["serde-human-readable", "parsing"]} anyhow = "1" getset = "0.1.1" -rocket_sync_db_pools = { version = "0.1.0-rc.1", default-features = false } -sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate", "time"] } +rocket_sync_db_pools = {version = "0.1.0-rc.1", default-features = false} +sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate"]} ## internal config = { path = "../common/config" } -crypto = { path = "../common/crypto" } -gateway-client = { path = "../common/client-libs/gateway-client" } -mixnet-contract = { path = "../common/mixnet-contract" } -nymsphinx = { path = "../common/nymsphinx" } -topology = { path = "../common/topology" } -validator-client = { path = "../common/client-libs/validator-client", features = ["nymd-client"] } -version-checker = { path = "../common/version-checker" } +crypto = { path="../common/crypto" } +gateway-client = { path="../common/client-libs/gateway-client" } +mixnet-contract = { path="../common/mixnet-contract" } +nymsphinx = { path="../common/nymsphinx" } +topology = { path="../common/topology" } +validator-client = { path="../common/client-libs/validator-client", features = ["nymd-client"] } +version-checker = { path="../common/version-checker" } coconut-interface = { path = "../common/coconut-interface" } credentials = { path = "../common/credentials" } diff --git a/validator-api/build.rs b/validator-api/build.rs index 506d7ad7e9..a46399c281 100644 --- a/validator-api/build.rs +++ b/validator-api/build.rs @@ -4,9 +4,9 @@ use std::env; #[tokio::main] async fn main() { let out_dir = env::var("OUT_DIR").unwrap(); - let database_path = format!("sqlite://{}/validator-api-example.sqlite", out_dir); + let database_path = format!("{}/validator-api-example.sqlite", out_dir); - let mut conn = SqliteConnection::connect(&*format!("{}?mode=rwc", database_path)) + let mut conn = SqliteConnection::connect(&*format!("sqlite://{}?mode=rwc", database_path)) .await .expect("Failed to create SQLx database connection"); @@ -15,5 +15,11 @@ async fn main() { .await .expect("Failed to perform SQLx migrations"); - println!("cargo:rustc-env=DATABASE_URL={}", &database_path); + #[cfg(target_family = "unix")] + println!("cargo:rustc-env=DATABASE_URL=sqlite://{}", &database_path); + + #[cfg(target_family = "windows")] + // for some strange reason we need to add a leading `/` to the windows path even though it's + // not a valid windows path... but hey, it works... + println!("cargo:rustc-env=DATABASE_URL=sqlite:///{}", &database_path); } diff --git a/validator-api/migrations/20210824120000_rewarding_data.sql b/validator-api/migrations/20210824120000_rewarding_data.sql new file mode 100644 index 0000000000..f1163f66ac --- /dev/null +++ b/validator-api/migrations/20210824120000_rewarding_data.sql @@ -0,0 +1,74 @@ +-- table to write information about any rewarding that has already begun +-- in case the process crashes during the procedure. +-- this would prevent people from somehow purposely crashing it and getting multiple rewards +-- per epoch +CREATE TABLE epoch_rewarding +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + epoch_timestamp INTEGER NOT NULL, + finished BOOLEAN NOT NULL +); + +-- for each epoch there shall be a summary +CREATE TABLE rewarding_report +( + epoch_rewarding_id INTEGER NOT NULL, + + eligible_mixnodes INTEGER NOT NULL, + eligible_gateways INTEGER NOT NULL, + + possibly_unrewarded_mixnodes INTEGER NOT NULL, + possibly_unrewarded_gateways INTEGER NOT NULL, + + FOREIGN KEY (epoch_rewarding_id) REFERENCES epoch_rewarding (id) +); + +-- containing possibly many (ideally zero!) failed reward entries +-- (this refers to a reward chunk) +CREATE TABLE failed_mixnode_reward_chunk +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + error_message VARCHAR NOT NULL, + + reward_summary_id INTEGER NOT NULL, + + FOREIGN KEY (reward_summary_id) REFERENCES epoch_rewarding (id) +); + + +CREATE TABLE failed_gateway_reward_chunk +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + error_message VARCHAR NOT NULL, + + reward_summary_id INTEGER NOT NULL, + + FOREIGN KEY (reward_summary_id) REFERENCES epoch_rewarding (id) +); + + +-- and each such failed_mixnode_reward_chunk contain mixnodes that might have been unrewarded +-- (but we don't know for sure - at least in typescript we could have gotten a timeout yet the tx still was executed) +-- this table only exists because sqlite has no arrays +CREATE TABLE possibly_unrewarded_mixnode +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + identity VARCHAR NOT NULL, + uptime INTEGER NOT NULL, + + failed_mixnode_reward_chunk_id INTEGER NOT NULL, + + FOREIGN KEY (failed_mixnode_reward_chunk_id) REFERENCES failed_mixnode_reward_chunk (id) +); + + +CREATE TABLE possibly_unrewarded_gateway +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + identity VARCHAR NOT NULL, + uptime INTEGER NOT NULL, + + failed_gateway_reward_chunk_id INTEGER NOT NULL, + + FOREIGN KEY (failed_gateway_reward_chunk_id) REFERENCES failed_gateway_reward_chunk (id) +) \ No newline at end of file diff --git a/validator-api/sqlx-data.json b/validator-api/sqlx-data.json deleted file mode 100644 index 3dd9a07a32..0000000000 --- a/validator-api/sqlx-data.json +++ /dev/null @@ -1,505 +0,0 @@ -{ - "db": "SQLite", - "000bae8722e573327cbd660fc3df5c96d0b6d0f56a872e486557bbbe7e423638": { - "query": "\n SELECT date, ipv4_uptime, ipv6_uptime\n FROM gateway_historical_uptime\n JOIN gateway_details\n ON gateway_historical_uptime.gateway_details_id = gateway_details.id\n WHERE gateway_details.identity = ?\n ORDER BY date ASC\n ", - "describe": { - "columns": [ - { - "name": "date", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "ipv4_uptime", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "ipv6_uptime", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - } - }, - "01de0a1f0b7c432dfdcad2cc2dedd2c1fa2c9618a0166207a1920e3b25d2b7e7": { - "query": "DELETE FROM mixnode_ipv4_status WHERE timestamp < ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - } - }, - "20b7eee88b4bfb196d0dbbbef19d789d9ffd0790349b7ae6bea6b536123be3b3": { - "query": "INSERT INTO mixnode_historical_uptime(mixnode_details_id, date, ipv4_uptime, ipv6_uptime) VALUES (?, ?, ?, ?)", - "describe": { - "columns": [], - "parameters": { - "Right": 4 - }, - "nullable": [] - } - }, - "21671ecfb386373f57a260385b6ca5ae0eead07b371805a5b1d37ae0092625f9": { - "query": "SELECT owner FROM mixnode_details WHERE identity = ?", - "describe": { - "columns": [ - { - "name": "owner", - "ordinal": 0, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - } - }, - "26a6cec333e3187d1bee9a583529b4126cb12d711771c5276e9598ccaa0a144d": { - "query": "\n INSERT INTO mixnode_ipv4_status (mixnode_details_id, up, timestamp) VALUES (?, ?, ?);\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - } - }, - "2a29b2ccfab79d5e3646591dbd7800e26c222f1a5c1fc600dcd13ad67e133e68": { - "query": "DELETE FROM mixnode_ipv6_status WHERE timestamp < ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - } - }, - "32bb50f08facfb033a0eeb61b74ce546bd36263f364fe0dfebcd0c9ac8818af6": { - "query": "SELECT owner FROM gateway_details WHERE identity = ?", - "describe": { - "columns": [ - { - "name": "owner", - "ordinal": 0, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - } - }, - "3ee79b29c8df08c3e40fcafb26d82d7dbb13a093df4134be05dac6d96442be75": { - "query": "\n SELECT timestamp, up\n FROM mixnode_ipv6_status\n WHERE mixnode_details_id=? AND timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "452451398ef5ae0cc43a7d6bcfdffefbd2b1b67cd429f0a649c365c20ea65ad0": { - "query": "\n SELECT timestamp, up\n FROM gateway_ipv4_status\n WHERE gateway_details_id=? AND timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "49b59f0fcede59a095a47be3acb9035f441d6d533443ae73f85c553b346be356": { - "query": "\n SELECT DISTINCT identity, owner, id\n FROM mixnode_details\n JOIN mixnode_ipv4_status\n ON mixnode_details.id = mixnode_ipv4_status.mixnode_details_id\n WHERE EXISTS (\n SELECT 1 FROM mixnode_ipv4_status WHERE timestamp > ?\n )\n ", - "describe": { - "columns": [ - { - "name": "identity", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "owner", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "id", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - } - }, - "4c32c31247672549621c5b817625228f1a777919ae711d0d29a192494183e9d3": { - "query": "DELETE FROM gateway_ipv6_status WHERE timestamp < ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - } - }, - "573944d1f6d79d139da359e6499e1cad07f1d9017f00cfa03d9918b8c5955fb2": { - "query": "\n INSERT INTO gateway_ipv6_status (gateway_details_id, up, timestamp) VALUES (?, ?, ?);\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - } - }, - "76c9645a1d79ce4294bff73e0fb60d211490bd810687f8e7d9963d05e7970cee": { - "query": "DELETE FROM gateway_ipv4_status WHERE timestamp < ?", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - } - }, - "786cf93daf23b03a5e6ffcf15f03013375be1f94a43aa8b614c9240d7dee6da4": { - "query": "\n INSERT OR IGNORE INTO gateway_details(identity, owner) VALUES (?, ?);\n SELECT id FROM gateway_details WHERE identity = ?;\n ", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - false - ] - } - }, - "7b37a1a850def3f82ab64c4825af256ef79a6e8a7edad122d4770be8bc84e32a": { - "query": "\n SELECT DISTINCT identity, owner, id\n FROM gateway_details\n JOIN gateway_ipv4_status\n ON gateway_details.id = gateway_ipv4_status.gateway_details_id\n WHERE EXISTS (\n SELECT 1 FROM gateway_ipv4_status WHERE timestamp > ?\n )\n ", - "describe": { - "columns": [ - { - "name": "identity", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "owner", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "id", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - } - }, - "8395b08fa17d904217b19c5d03ab4d66dd0a0f648487d81ae09b1f926111d614": { - "query": "\n SELECT timestamp, up\n FROM mixnode_ipv4_status\n JOIN mixnode_details\n ON mixnode_ipv4_status.mixnode_details_id = mixnode_details.id\n WHERE mixnode_details.identity=? AND mixnode_ipv4_status.timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "9214cdd2b78eae6fce99f25dd65dde6bee2a55792763e63ca49f1e9498c5eb81": { - "query": "\n SELECT timestamp, up\n FROM mixnode_ipv4_status\n WHERE mixnode_details_id=? AND timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "95ba8a44df5f91da83655a994e56c7ff79d7c2e4f5c01e0402c2f868e7cb54cd": { - "query": "\n INSERT INTO gateway_ipv4_status (gateway_details_id, up, timestamp) VALUES (?, ?, ?);\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - } - }, - "96bf94cf7b81a527718b74bd456587f00f12827c72792eff9346e0b1683feede": { - "query": "\n SELECT date, ipv4_uptime, ipv6_uptime\n FROM mixnode_historical_uptime\n JOIN mixnode_details\n ON mixnode_historical_uptime.mixnode_details_id = mixnode_details.id\n WHERE mixnode_details.identity = ?\n ORDER BY date ASC\n ", - "describe": { - "columns": [ - { - "name": "date", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "ipv4_uptime", - "ordinal": 1, - "type_info": "Int64" - }, - { - "name": "ipv6_uptime", - "ordinal": 2, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - } - }, - "ba7d4f4134902f6ccec1973c9acfc5052539d35911ba238607ce8ca6111f219d": { - "query": "\n INSERT OR IGNORE INTO mixnode_details(identity, owner) VALUES (?, ?);\n SELECT id FROM mixnode_details WHERE identity = ?;\n ", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int64" - } - ], - "parameters": { - "Right": 3 - }, - "nullable": [ - false - ] - } - }, - "bcd2069178c3f006a640983a1bc8d8d0293d163044f30b859b8878a96787333b": { - "query": "\n SELECT timestamp, up\n FROM gateway_ipv4_status\n JOIN gateway_details\n ON gateway_ipv4_status.gateway_details_id = gateway_details.id\n WHERE gateway_details.identity=? AND gateway_ipv4_status.timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "bed01502a7770069c0ad5f6bc13cab7f08ea219d71f4ab3e594cde5809e6f4be": { - "query": "\n INSERT INTO mixnode_ipv6_status (mixnode_details_id, up, timestamp) VALUES (?, ?, ?);\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - } - }, - "bfc4a0aec14ac76da012f011afb8ff637666b67d8585f2cbb681520a93f3b472": { - "query": "\n SELECT timestamp, up\n FROM mixnode_ipv6_status\n JOIN mixnode_details\n ON mixnode_ipv6_status.mixnode_details_id = mixnode_details.id\n WHERE mixnode_details.identity=? AND mixnode_ipv6_status.timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "d10fd4560017ab9229567ab3419e4fe6912f61aa4c17ffd87e3f724ec8518023": { - "query": "\n SELECT timestamp, up\n FROM gateway_ipv6_status\n JOIN gateway_details\n ON gateway_ipv6_status.gateway_details_id = gateway_details.id\n WHERE gateway_details.identity=? AND gateway_ipv6_status.timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - }, - "e55db4def70689c061d0e07115a21068431575afd2be8afafce1a7fb13507e7e": { - "query": "SELECT EXISTS (SELECT 1 FROM mixnode_historical_uptime WHERE date = ?) AS 'exists'", - "describe": { - "columns": [ - { - "name": "exists", - "ordinal": 0, - "type_info": "Int" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - } - }, - "e72d78b175ee7265caad12555d6c72dbf036a842b8136d94373c78905d19b111": { - "query": "INSERT INTO gateway_historical_uptime(gateway_details_id, date, ipv4_uptime, ipv6_uptime) VALUES (?, ?, ?, ?)", - "describe": { - "columns": [], - "parameters": { - "Right": 4 - }, - "nullable": [] - } - }, - "f384fdebb41a03b626b39de62a8fe53ebba0c02500a91442af168394910c40db": { - "query": "\n SELECT timestamp, up\n FROM gateway_ipv6_status\n WHERE gateway_details_id=? AND timestamp > ?;\n ", - "describe": { - "columns": [ - { - "name": "timestamp", - "ordinal": 0, - "type_info": "Int64" - }, - { - "name": "up", - "ordinal": 1, - "type_info": "Bool" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - } - } -} \ No newline at end of file diff --git a/validator-api/src/cache/mod.rs b/validator-api/src/cache/mod.rs index 093bec70e5..16d94c1132 100644 --- a/validator-api/src/cache/mod.rs +++ b/validator-api/src/cache/mod.rs @@ -138,6 +138,18 @@ impl ValidatorCache { pub fn initialised(&self) -> bool { self.inner.initialised.load(Ordering::Relaxed) } + + pub(crate) async fn wait_for_initial_values(&self) { + let initialisation_backoff = Duration::from_secs(5); + loop { + if self.initialised() { + break; + } else { + debug!("Validator cache hasn't been initialised yet - waiting for {:?} before trying again", initialisation_backoff); + tokio::time::sleep(initialisation_backoff).await; + } + } + } } impl ValidatorCacheInner { diff --git a/validator-api/src/config/mod.rs b/validator-api/src/config/mod.rs index 3de2c395eb..285eb6b6c6 100644 --- a/validator-api/src/config/mod.rs +++ b/validator-api/src/config/mod.rs @@ -3,11 +3,15 @@ use crate::config::template::config_template; use coconut_interface::{Base58, KeyPair}; -use config::defaults::{default_api_endpoints, DEFAULT_MIXNET_CONTRACT_ADDRESS}; +use config::defaults::{ + default_api_endpoints, DEFAULT_EPOCH_LENGTH, DEFAULT_FIRST_EPOCH_START, + DEFAULT_MIXNET_CONTRACT_ADDRESS, +}; use config::NymConfig; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; use std::time::Duration; +use time::OffsetDateTime; use url::Url; mod template; @@ -23,6 +27,7 @@ const DEFAULT_GATEWAY_RESPONSE_TIMEOUT: Duration = Duration::from_millis(1_500); const DEFAULT_GATEWAY_CONNECTION_TIMEOUT: Duration = Duration::from_millis(2_500); const DEFAULT_CACHE_INTERVAL: Duration = Duration::from_secs(60); +const DEFAULT_MONITOR_THRESHOLD: u8 = 60; #[derive(Debug, Default, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] @@ -38,6 +43,9 @@ pub struct Config { #[serde(default)] topology_cacher: TopologyCacher, + + #[serde(default)] + rewarding: Rewarding, } impl NymConfig for Config { @@ -66,16 +74,13 @@ impl NymConfig for Config { } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] +#[serde(deny_unknown_fields, default)] pub struct Base { local_validator: Url, /// Address of the validator contract managing the network mixnet_contract_address: String, - /// Mnemonic (currently of the network monitor) used for rewarding - mnemonic: String, - // Avoid breaking derives for now keypair_bs58: String, } @@ -87,14 +92,13 @@ impl Default for Base { .parse() .expect("default local validator is malformed!"), mixnet_contract_address: DEFAULT_MIXNET_CONTRACT_ADDRESS.to_string(), - mnemonic: String::default(), keypair_bs58: String::default(), } } } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] +#[serde(deny_unknown_fields, default)] pub struct NetworkMonitor { /// Specifies whether network monitoring service is enabled in this process. enabled: bool, @@ -175,7 +179,7 @@ impl Default for NetworkMonitor { } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] +#[serde(deny_unknown_fields, default)] pub struct NodeStatusAPI { /// Path to the database file containing uptime statuses for all mixnodes and gateways. database_path: PathBuf, @@ -196,7 +200,7 @@ impl Default for NodeStatusAPI { } #[derive(Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] +#[serde(deny_unknown_fields, default)] pub struct TopologyCacher { #[serde(with = "humantime_serde")] caching_interval: Duration, @@ -210,6 +214,41 @@ impl Default for TopologyCacher { } } +#[derive(Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields, default)] +pub struct Rewarding { + /// Specifies whether rewarding service is enabled in this process. + enabled: bool, + + /// Mnemonic (currently of the network monitor) used for rewarding + mnemonic: String, + + /// Datetime of the first rewarding epoch of the current length used for referencing + /// starting time of any subsequent epoch. + first_rewarding_epoch: OffsetDateTime, + + /// Current length of the epoch. If modified `first_rewarding_epoch` should also get changed. + #[serde(with = "humantime_serde")] + epoch_length: Duration, + + /// Specifies the minimum percentage of monitor test run data present in order to + /// distribute rewards for given epoch. + /// Note, only values in range 0-100 are valid + minimum_epoch_monitor_threshold: u8, +} + +impl Default for Rewarding { + fn default() -> Self { + Rewarding { + enabled: false, + mnemonic: String::default(), + first_rewarding_epoch: DEFAULT_FIRST_EPOCH_START, + epoch_length: DEFAULT_EPOCH_LENGTH, + minimum_epoch_monitor_threshold: DEFAULT_MONITOR_THRESHOLD, + } + } +} + impl Config { pub fn new() -> Self { Config::default() @@ -219,12 +258,17 @@ impl Config { KeyPair::try_from_bs58(self.base.keypair_bs58.clone()).unwrap() } - pub fn enabled_network_monitor(mut self, enabled: bool) -> Self { + pub fn with_network_monitor_enabled(mut self, enabled: bool) -> Self { self.network_monitor.enabled = enabled; self } - pub fn detailed_network_monitor_report(mut self, detailed: bool) -> Self { + pub fn with_rewarding_enabled(mut self, enabled: bool) -> Self { + self.rewarding.enabled = enabled; + self + } + + pub fn with_detailed_network_monitor_report(mut self, detailed: bool) -> Self { self.network_monitor.print_detailed_report = detailed; self } @@ -250,7 +294,7 @@ impl Config { } pub fn with_mnemonic>(mut self, mnemonic: S) -> Self { - self.base.mnemonic = mnemonic.into(); + self.rewarding.mnemonic = mnemonic.into(); self } @@ -264,10 +308,29 @@ impl Config { self } + pub fn with_first_rewarding_epoch(mut self, first_epoch: OffsetDateTime) -> Self { + self.rewarding.first_rewarding_epoch = first_epoch; + self + } + + pub fn with_epoch_length(mut self, epoch_length: Duration) -> Self { + self.rewarding.epoch_length = epoch_length; + self + } + + pub fn with_minimum_epoch_monitor_threshold(mut self, threshold: u8) -> Self { + self.rewarding.minimum_epoch_monitor_threshold = threshold; + self + } + pub fn get_network_monitor_enabled(&self) -> bool { self.network_monitor.enabled } + pub fn get_rewarding_enabled(&self) -> bool { + self.rewarding.enabled + } + pub fn get_detailed_report(&self) -> bool { self.network_monitor.print_detailed_report } @@ -289,7 +352,7 @@ impl Config { } pub fn get_mnemonic(&self) -> String { - self.base.mnemonic.clone() + self.rewarding.mnemonic.clone() } pub fn get_network_monitor_run_interval(&self) -> Duration { @@ -331,4 +394,16 @@ impl Config { pub fn get_all_validator_api_endpoints(&self) -> Vec { self.network_monitor.all_validator_apis.clone() } + + pub fn get_first_rewarding_epoch(&self) -> OffsetDateTime { + self.rewarding.first_rewarding_epoch + } + + pub fn get_epoch_length(&self) -> Duration { + self.rewarding.epoch_length + } + + pub fn get_minimum_epoch_monitor_threshold(&self) -> u8 { + self.rewarding.minimum_epoch_monitor_threshold + } } diff --git a/validator-api/src/config/template.rs b/validator-api/src/config/template.rs index 3b190f91f2..87ad939301 100644 --- a/validator-api/src/config/template.rs +++ b/validator-api/src/config/template.rs @@ -72,5 +72,27 @@ packet_delivery_timeout = '{{ network_monitor.packet_delivery_timeout }}' # Path to the database file containing uptime statuses for all mixnodes and gateways. database_path = '{{ node_status_api.database_path }}' +##### rewarding config options ##### + +[rewarding] + +# Specifies whether rewarding service is enabled in this process. +enabled = {{ rewarding.enabled }} + +# Mnemonic (currently of the network monitor) used for rewarding +mnemonic = '{{ rewarding.mnemonic }}' + +# Datetime of the first rewarding epoch of the current length used for referencing +# starting time of any subsequent epoch. +first_rewarding_epoch = '{{ rewarding.first_rewarding_epoch }}' + +# Current length of the epoch. If modified `first_rewarding_epoch` should also get changed. +epoch_length = '{{ rewarding.epoch_length }}' + +# Specifies the minimum percentage of monitor test run data present in order to +# distribute rewards for given epoch. +# Note, only values in range 0-100 are valid +minimum_epoch_monitor_threshold = {{ rewarding.minimum_epoch_monitor_threshold }} + "# } diff --git a/validator-api/src/main.rs b/validator-api/src/main.rs index ef765dc209..737f688d85 100644 --- a/validator-api/src/main.rs +++ b/validator-api/src/main.rs @@ -9,21 +9,27 @@ use crate::config::Config; use crate::network_monitor::tested_network::good_topology::parse_topology_file; use crate::network_monitor::NetworkMonitorBuilder; use crate::nymd_client::Client; +use crate::rewarding::epoch::Epoch; +use crate::rewarding::Rewarder; use crate::storage::NodeStatusStorage; use ::config::{defaults::DEFAULT_VALIDATOR_API_PORT, NymConfig}; use anyhow::Result; use cache::ValidatorCache; use clap::{App, Arg, ArgMatches}; use coconut::InternalSignRequest; -use log::info; +use log::{info, warn}; use rocket::fairing::AdHoc; use rocket::http::Method; use rocket::{Ignite, Rocket}; use rocket_cors::{AllowedHeaders, AllowedOrigins, Cors}; use std::process; use std::sync::Arc; +use std::time::Duration; +use time::format_description::well_known::Rfc3339; +use time::OffsetDateTime; use tokio::sync::Notify; use url::Url; +use validator_client::nymd::SigningNymdClient; pub(crate) mod cache; mod coconut; @@ -31,9 +37,11 @@ pub(crate) mod config; mod network_monitor; mod node_status_api; pub(crate) mod nymd_client; +mod rewarding; pub(crate) mod storage; const MONITORING_ENABLED: &str = "enable-monitor"; +const REWARDING_ENABLED: &str = "enable-rewarding"; const V4_TOPOLOGY_ARG: &str = "v4-topology-filepath"; const V6_TOPOLOGY_ARG: &str = "v6-topology-filepath"; const API_VALIDATORS_ARG: &str = "api-validators"; @@ -44,6 +52,10 @@ const WRITE_CONFIG_ARG: &str = "save-config"; const KEYPAIR_ARG: &str = "keypair"; const NYMD_VALIDATOR_ARG: &str = "nymd-validator"; +const EPOCH_LENGTH_ARG: &str = "epoch-length"; +const FIRST_REWARDING_EPOCH_ARG: &str = "first-epoch"; +const REWARDING_MONITOR_THRESHOLD_ARG: &str = "monitor-threshold"; + pub(crate) const PENALISE_OUTDATED: bool = false; fn parse_validators(raw: &str) -> Vec { @@ -58,23 +70,33 @@ fn parse_validators(raw: &str) -> Vec { } fn parse_args<'a>() -> ArgMatches<'a> { - App::new("Nym Network Monitor") + App::new("Nym Validator API") .author("Nymtech") .arg( Arg::with_name(MONITORING_ENABLED) .help("specifies whether a network monitoring is enabled on this API") .long(MONITORING_ENABLED) + .short("m") + ) + .arg( + Arg::with_name(REWARDING_ENABLED) + .help("specifies whether a network rewarding is enabled on this API") + .long(REWARDING_ENABLED) + .short("r") + .requires(MONITORING_ENABLED) ) .arg( Arg::with_name(V4_TOPOLOGY_ARG) .help("location of .json file containing IPv4 'good' network topology") .long(V4_TOPOLOGY_ARG) + .requires(MONITORING_ENABLED) ) .arg( Arg::with_name(V6_TOPOLOGY_ARG) .help("location of .json file containing IPv6 'good' network topology") .long(V6_TOPOLOGY_ARG) .takes_value(true) + .requires(MONITORING_ENABLED) ) .arg( Arg::with_name(NYMD_VALIDATOR_ARG) @@ -96,22 +118,49 @@ fn parse_args<'a>() -> ArgMatches<'a> { .arg(Arg::with_name(MNEMONIC_ARG) .long(MNEMONIC_ARG) .help("Mnemonic of the network monitor used for rewarding operators") - .takes_value(true), + .takes_value(true) + .requires(REWARDING_ENABLED), ) .arg( Arg::with_name(DETAILED_REPORT_ARG) .help("specifies whether a detailed report should be printed after each run") .long(DETAILED_REPORT_ARG) + .requires(MONITORING_ENABLED) ) .arg( Arg::with_name(WRITE_CONFIG_ARG) .help("specifies whether a config file based on provided arguments should be saved to a file") .long(WRITE_CONFIG_ARG) + .short("w") ) - .arg(Arg::with_name(KEYPAIR_ARG) - .help("Path to the secret key file") - .takes_value(true) - .long(KEYPAIR_ARG)) + .arg( + Arg::with_name(KEYPAIR_ARG) + .help("Path to the secret key file") + .takes_value(true) + .long(KEYPAIR_ARG) + ) + .arg( + Arg::with_name(FIRST_REWARDING_EPOCH_ARG) + .help("Datetime specifying beginning of the first rewarding epoch of this length. It must be a valid rfc3339 datetime.") + .takes_value(true) + .long(FIRST_REWARDING_EPOCH_ARG) + .requires(REWARDING_ENABLED) + ) + .arg( + Arg::with_name(EPOCH_LENGTH_ARG) + .help("Length of the current rewarding epoch in hours") + .takes_value(true) + .long(EPOCH_LENGTH_ARG) + .requires(REWARDING_ENABLED) + ) + .arg( + Arg::with_name(REWARDING_MONITOR_THRESHOLD_ARG) + .help("Specifies the minimum percentage of monitor test run data present in order to distribute rewards for given epoch.") + .takes_value(true) + .long(REWARDING_MONITOR_THRESHOLD_ARG) + .requires(REWARDING_ENABLED) + ) + .get_matches() } @@ -148,7 +197,11 @@ fn setup_logging() { fn override_config(mut config: Config, matches: &ArgMatches) -> Config { if matches.is_present(MONITORING_ENABLED) { - config = config.enabled_network_monitor(true) + config = config.with_network_monitor_enabled(true) + } + + if matches.is_present(REWARDING_ENABLED) { + config = config.with_rewarding_enabled(true) } if let Some(v4_topology_path) = matches.value_of(V4_TOPOLOGY_ARG) { @@ -182,8 +235,34 @@ fn override_config(mut config: Config, matches: &ArgMatches) -> Config { config = config.with_mnemonic(mnemonic) } + if let Some(rewarding_epoch_datetime) = matches.value_of(FIRST_REWARDING_EPOCH_ARG) { + let first_epoch = OffsetDateTime::parse(rewarding_epoch_datetime, &Rfc3339) + .expect("Provided first epoch is not a valid rfc3339 datetime!"); + config = config.with_first_rewarding_epoch(first_epoch) + } + + if let Some(epoch_length) = matches + .value_of(EPOCH_LENGTH_ARG) + .map(|len| len.parse::()) + { + let epoch_length = epoch_length.expect("Provided epoch length is not a number!"); + config = config.with_epoch_length(Duration::from_secs(epoch_length * 60 * 60)); + } + + if let Some(monitor_threshold) = matches + .value_of(REWARDING_MONITOR_THRESHOLD_ARG) + .map(|t| t.parse::()) + { + let monitor_threshold = + monitor_threshold.expect("Provided monitor threshold is not a number!"); + if monitor_threshold > 100 { + panic!("Provided monitor threshold is greater than 100!"); + } + config = config.with_minimum_epoch_monitor_threshold(monitor_threshold) + } + if matches.is_present(DETAILED_REPORT_ARG) { - config = config.detailed_network_monitor_report(true) + config = config.with_detailed_network_monitor_report(true) } if let Some(keypair_path) = matches.value_of(KEYPAIR_ARG) { let keypair_bs58 = std::fs::read_to_string(keypair_path) @@ -254,6 +333,45 @@ fn setup_network_monitor<'a>( )) } +fn expected_monitor_test_runs(config: &Config) -> usize { + let epoch_length = config.get_epoch_length(); + let test_delay = config.get_network_monitor_run_interval(); + + // this is just a rough estimate. In real world there will be slightly fewer test runs + // as they are not instantaneous and hence do not happen exactly every test_delay + (epoch_length.as_secs() / test_delay.as_secs()) as usize +} + +fn setup_rewarder( + config: &Config, + rocket: &Rocket, + nymd_client: &Client, +) -> Option { + if config.get_rewarding_enabled() && config.get_network_monitor_enabled() { + // get instances of managed states + let node_status_storage = rocket.state::().unwrap().clone(); + let validator_cache = rocket.state::().unwrap().clone(); + + let first_epoch = Epoch::new( + config.get_first_rewarding_epoch(), + config.get_epoch_length(), + ); + Some(Rewarder::new( + nymd_client.clone(), + validator_cache, + node_status_storage, + first_epoch, + expected_monitor_test_runs(config), + config.get_minimum_epoch_monitor_threshold(), + )) + } else if config.get_rewarding_enabled() { + warn!("Cannot enable rewarding with the network monitor being disabled"); + None + } else { + None + } +} + async fn setup_rocket(config: &Config, liftoff_notify: Arc) -> Result> { // let's build our rocket! let rocket_config = rocket::config::Config { @@ -290,12 +408,13 @@ async fn main() -> Result<()> { let config = match Config::load_from_file(None) { Ok(cfg) => cfg, Err(_) => { + let config_path = Config::default_config_file_path(None) + .into_os_string() + .into_string() + .unwrap(); warn!( - "Configuration file could not be found at {}. Using the default values.", - Config::default_config_file_path(None) - .into_os_string() - .into_string() - .unwrap() + "Could not load the configuration file from {}. Either the file did not exist or was malformed. Using the default values instead", + config_path ); Config::new() } @@ -303,6 +422,10 @@ async fn main() -> Result<()> { let matches = parse_args(); let config = override_config(config, &matches); + // if we just wanted to write data to the config, exit + if matches.is_present(WRITE_CONFIG_ARG) { + return Ok(()); + } let liftoff_notify = Arc::new(Notify::new()); // let's build our rocket! @@ -316,13 +439,20 @@ async fn main() -> Result<()> { if config.get_network_monitor_enabled() { let nymd_client = Client::new_signing(&config); let validator_cache_refresher = ValidatorCacheRefresher::new( - nymd_client, + nymd_client.clone(), config.get_caching_interval(), - validator_cache, + validator_cache.clone(), ); // spawn our cacher tokio::spawn(async move { validator_cache_refresher.run().await }); + + if let Some(rewarder) = setup_rewarder(&config, &rocket, &nymd_client) { + info!("Periodic rewarding is starting..."); + tokio::spawn(async move { rewarder.run().await }); + } else { + info!("Periodic rewarding is disabled."); + } } else { let nymd_client = Client::new_query(&config); let validator_cache_refresher = ValidatorCacheRefresher::new( diff --git a/validator-api/src/network_monitor/monitor/preparer.rs b/validator-api/src/network_monitor/monitor/preparer.rs index 96b434b532..1a4fb63f99 100644 --- a/validator-api/src/network_monitor/monitor/preparer.rs +++ b/validator-api/src/network_monitor/monitor/preparer.rs @@ -168,18 +168,31 @@ impl PacketPreparer { } pub(crate) async fn wait_for_validator_cache_initial_values(&self) { - let initialisation_backoff = Duration::from_secs(10); + // wait for the cache to get initialised + self.validator_cache.wait_for_initial_values().await; + + // now wait for our "good" topology to be online + info!("Waiting for 'good' topology to be online"); + let initialisation_backoff = Duration::from_secs(30); loop { - if self.validator_cache.initialised() { + let gateways = self.validator_cache.gateways().await; + let mixnodes = self.validator_cache.mixnodes().await; + if self + .tested_network + .is_online(&mixnodes.into_inner(), &gateways.into_inner()) + { break; } else { - debug!("Validator cache hasn't been initialised yet - waiting for {:?} before trying again", initialisation_backoff); + info!( + "Our 'good' topology is still not offline. Going to check again in {:?}", + initialisation_backoff + ); tokio::time::sleep(initialisation_backoff).await; } } } - async fn get_network_nodes(&mut self) -> (Vec, Vec) { + async fn get_network_nodes(&self) -> (Vec, Vec) { info!(target: "Monitor", "Obtaining network topology..."); let mixnodes = self.validator_cache.mixnodes().await.into_inner(); diff --git a/validator-api/src/network_monitor/monitor/sender.rs b/validator-api/src/network_monitor/monitor/sender.rs index 34b568b226..7c36dda326 100644 --- a/validator-api/src/network_monitor/monitor/sender.rs +++ b/validator-api/src/network_monitor/monitor/sender.rs @@ -81,6 +81,8 @@ pub(crate) struct PacketSender { // behaviour is unlikely. active_gateway_clients: HashMap<[u8; PUBLIC_KEY_LENGTH], GatewayClient>, + // I guess that will be required later on if credentials are got per gateway + // aggregated_verification_key: Arc, fresh_gateway_client_data: Arc, gateway_connection_timeout: Duration, max_concurrent_clients: usize, diff --git a/validator-api/src/network_monitor/tested_network/mod.rs b/validator-api/src/network_monitor/tested_network/mod.rs index d89d715cfd..6f04b6b3bb 100644 --- a/validator-api/src/network_monitor/tested_network/mod.rs +++ b/validator-api/src/network_monitor/tested_network/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::network_monitor::test_packet::IpVersion; +use mixnet_contract::{GatewayBond, MixNodeBond}; use topology::{gateway, mix, NymTopology}; pub(crate) mod good_topology; @@ -68,4 +69,40 @@ impl TestedNetwork { pub(crate) fn v6_topology(&self) -> &NymTopology { &self.good_v6_topology } + + /// Given slices of bonded mixnodes and gateways, checks whether all 'good' nodes are present + /// in the lists. + /// + /// # Arguments + /// + /// * `bonded_mixnodes`: slice of currently bonded mixnodes + /// * `bonded_gateways`: slice of currently bonded gateways + pub(crate) fn is_online( + &self, + bonded_mixnodes: &[MixNodeBond], + bonded_gateways: &[GatewayBond], + ) -> bool { + // while technically this is not the most optimal way of checking all nodes as we have to + // go through entire slice multiple times, we only do it every 30s before monitor startup + // so it's not really that bad + for layer_mixes in self.good_v4_topology.mixes().values() { + for mix in layer_mixes { + if !bonded_mixnodes.iter().any(|bonded| { + bonded.mix_node.identity_key == mix.identity_key.to_base58_string() + }) { + return false; + } + } + } + + for gateway in self.good_v4_topology.gateways() { + if !bonded_gateways.iter().any(|bonded| { + bonded.gateway.identity_key == gateway.identity_key.to_base58_string() + }) { + return false; + } + } + + true + } } diff --git a/validator-api/src/node_status_api/mod.rs b/validator-api/src/node_status_api/mod.rs index 91fe9bbb83..99daeeae48 100644 --- a/validator-api/src/node_status_api/mod.rs +++ b/validator-api/src/node_status_api/mod.rs @@ -26,9 +26,6 @@ pub(crate) fn stage(database_path: PathBuf) -> AdHoc { routes::gateway_report, routes::mixnode_uptime_history, routes::gateway_uptime_history, - routes::mixnodes_full_report, - routes::gateways_full_report, - routes::rewarding_chores, ], ) }) diff --git a/validator-api/src/node_status_api/models.rs b/validator-api/src/node_status_api/models.rs index 5f57e17b43..d39d8239b0 100644 --- a/validator-api/src/node_status_api/models.rs +++ b/validator-api/src/node_status_api/models.rs @@ -7,17 +7,17 @@ use rocket::http::{ContentType, Status}; use rocket::response::{self, Responder, Response}; use rocket::Request; use serde::{Deserialize, Serialize}; -use sqlx::types::time::OffsetDateTime; use std::convert::TryFrom; use std::fmt::{self, Display, Formatter}; use std::io::Cursor; +use time::OffsetDateTime; // todo: put into some error enum #[derive(Debug)] pub struct InvalidUptime; // value in range 0-100 -#[derive(Clone, Serialize, Deserialize, Debug)] +#[derive(Clone, Copy, Serialize, Deserialize, Debug)] pub struct Uptime(u8); impl Uptime { @@ -76,17 +76,17 @@ impl TryFrom for Uptime { #[derive(Clone, Serialize, Deserialize, Debug)] pub struct MixnodeStatusReport { - identity: String, - owner: String, + pub(crate) identity: String, + pub(crate) owner: String, - most_recent_ipv4: bool, - most_recent_ipv6: bool, + pub(crate) most_recent_ipv4: bool, + pub(crate) most_recent_ipv6: bool, - last_hour_ipv4: Uptime, - last_hour_ipv6: Uptime, + pub(crate) last_hour_ipv4: Uptime, + pub(crate) last_hour_ipv6: Uptime, - last_day_ipv4: Uptime, - last_day_ipv6: Uptime, + pub(crate) last_day_ipv4: Uptime, + pub(crate) last_day_ipv6: Uptime, } impl MixnodeStatusReport { @@ -122,17 +122,17 @@ impl MixnodeStatusReport { #[derive(Clone, Serialize, Deserialize, Debug)] pub struct GatewayStatusReport { - identity: String, - owner: String, + pub(crate) identity: String, + pub(crate) owner: String, - most_recent_ipv4: bool, - most_recent_ipv6: bool, + pub(crate) most_recent_ipv4: bool, + pub(crate) most_recent_ipv6: bool, - last_hour_ipv4: Uptime, - last_hour_ipv6: Uptime, + pub(crate) last_hour_ipv4: Uptime, + pub(crate) last_hour_ipv6: Uptime, - last_day_ipv4: Uptime, - last_day_ipv6: Uptime, + pub(crate) last_day_ipv4: Uptime, + pub(crate) last_day_ipv6: Uptime, } impl GatewayStatusReport { diff --git a/validator-api/src/node_status_api/routes.rs b/validator-api/src/node_status_api/routes.rs index 63ca4d572e..e32f4fba75 100644 --- a/validator-api/src/node_status_api/routes.rs +++ b/validator-api/src/node_status_api/routes.rs @@ -1,7 +1,6 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::node_status_api::local_guard::LocalRequest; use crate::node_status_api::models::{ ErrorResponse, GatewayStatusReport, GatewayUptimeHistory, MixnodeStatusReport, MixnodeUptimeHistory, @@ -11,22 +10,6 @@ use rocket::http::Status; use rocket::serde::json::Json; use rocket::State; -#[get("/daily-chores")] -pub(crate) async fn rewarding_chores( - _local_request: LocalRequest, - storage: &State, -) -> Result<&'static str, ErrorResponse> { - if storage - .daily_chores() - .await - .map_err(|err| ErrorResponse::new(err, Status::InternalServerError))? - { - Ok("Updated historical uptimes and purged old reports.") - } else { - Ok("The historical uptimes were already updated at some point today - nothing was done now.") - } -} - #[get("/mixnode//report")] pub(crate) async fn mixnode_report( storage: &State, @@ -74,25 +57,3 @@ pub(crate) async fn gateway_uptime_history( .map(Json) .map_err(|err| ErrorResponse::new(err, Status::NotFound)) } - -#[get("/mixnodes/all/report")] -pub(crate) async fn mixnodes_full_report( - storage: &State, -) -> Result>, ErrorResponse> { - storage - .get_all_mixnode_reports() - .await - .map(Json) - .map_err(|err| ErrorResponse::new(err, Status::InternalServerError)) -} - -#[get("/gateways/all/report")] -pub(crate) async fn gateways_full_report( - storage: &State, -) -> Result>, ErrorResponse> { - storage - .get_all_gateway_reports() - .await - .map(Json) - .map_err(|err| ErrorResponse::new(err, Status::InternalServerError)) -} diff --git a/validator-api/src/node_status_api/utils.rs b/validator-api/src/node_status_api/utils.rs index 08cff22f95..d9a6bcc72b 100644 --- a/validator-api/src/node_status_api/utils.rs +++ b/validator-api/src/node_status_api/utils.rs @@ -5,15 +5,13 @@ use crate::node_status_api::models::Uptime; use crate::node_status_api::{FIFTEEN_MINUTES, ONE_HOUR}; use crate::storage::models::NodeStatus; use log::warn; -use sqlx::types::time::OffsetDateTime; use std::cmp::min; +use time::OffsetDateTime; // A temporary helper struct used to produce reports for active nodes. pub(crate) struct ActiveNodeDayStatuses { pub(crate) identity: String, pub(crate) owner: String, - pub(crate) node_id: i64, - pub(crate) ipv4_statuses: Vec, pub(crate) ipv6_statuses: Vec, } diff --git a/validator-api/src/nymd_client.rs b/validator-api/src/nymd_client.rs index 4d5561c20e..2a76d854ff 100644 --- a/validator-api/src/nymd_client.rs +++ b/validator-api/src/nymd_client.rs @@ -2,19 +2,32 @@ // SPDX-License-Identifier: Apache-2.0 use crate::config::Config; +use crate::rewarding::{ + error::RewardingError, GatewayToReward, MixnodeToReward, GATEWAY_REWARD_OP_BASE_GAS_LIMIT, + MIXNODE_REWARD_OP_BASE_GAS_LIMIT, PER_GATEWAY_DELEGATION_GAS_INCREASE, + PER_MIXNODE_DELEGATION_GAS_INCREASE, REWARDING_GAS_LIMIT_MULTIPLIER, +}; use config::defaults::DEFAULT_VALIDATOR_API_PORT; -use mixnet_contract::{GatewayBond, MixNodeBond}; +use mixnet_contract::{Delegation, ExecuteMsg, GatewayBond, IdentityKey, MixNodeBond}; use std::sync::Arc; use tokio::sync::RwLock; -use validator_client::nymd::{CosmWasmClient, QueryNymdClient, SigningNymdClient}; +use validator_client::nymd::{ + CosmWasmClient, Fee, QueryNymdClient, SigningCosmWasmClient, SigningNymdClient, TendermintTime, +}; use validator_client::ValidatorClientError; -#[derive(Clone)] pub(crate) struct Client(Arc>>); +impl Clone for Client { + fn clone(&self) -> Self { + Client(Arc::clone(&self.0)) + } +} + impl Client { pub(crate) fn new_query(config: &Config) -> Self { // the api address is irrelevant here as **WE ARE THE API** + // and we won't be talking on the socket here. let api_url = format!("http://localhost:{}", DEFAULT_VALIDATOR_API_PORT) .parse() .unwrap(); @@ -36,6 +49,7 @@ impl Client { impl Client { pub(crate) fn new_signing(config: &Config) -> Self { // the api address is irrelevant here as **WE ARE THE API** + // and we won't be talking on the socket here. let api_url = format!("http://localhost:{}", DEFAULT_VALIDATOR_API_PORT) .parse() .unwrap(); @@ -59,6 +73,25 @@ impl Client { } impl Client { + // a helper function for the future to obtain the current block timestamp + #[allow(dead_code)] + pub(crate) async fn current_block_timestamp( + &self, + ) -> Result + where + C: CosmWasmClient + Sync, + { + let time = self + .0 + .read() + .await + .nymd + .get_current_block_timestamp() + .await?; + + Ok(time) + } + pub(crate) async fn get_mixnodes(&self) -> Result, ValidatorClientError> where C: CosmWasmClient + Sync, @@ -73,8 +106,133 @@ impl Client { self.0.read().await.get_all_nymd_gateways().await } - #[allow(dead_code)] - pub(crate) async fn some_rewarding_stuff_here(&self) { - todo!() + pub(crate) async fn get_mixnode_delegations( + &self, + identity: IdentityKey, + ) -> Result, ValidatorClientError> + where + C: CosmWasmClient + Sync, + { + self.0 + .read() + .await + .get_all_nymd_mixnode_delegations(identity) + .await + } + + pub(crate) async fn get_gateway_delegations( + &self, + identity: IdentityKey, + ) -> Result, ValidatorClientError> + where + C: CosmWasmClient + Sync, + { + self.0 + .read() + .await + .get_all_nymd_gateway_delegations(identity) + .await + } + + async fn estimate_mixnode_reward_fees(&self, nodes: usize, total_delegations: usize) -> Fee { + let base_gas_limit = MIXNODE_REWARD_OP_BASE_GAS_LIMIT * nodes as u64 + + PER_MIXNODE_DELEGATION_GAS_INCREASE * total_delegations as u64; + + let total_gas_limit = (base_gas_limit as f64 * REWARDING_GAS_LIMIT_MULTIPLIER) as u64; + + self.0 + .read() + .await + .nymd + .calculate_custom_fee(total_gas_limit) + } + + async fn estimate_gateway_reward_fees(&self, nodes: usize, total_delegations: usize) -> Fee { + let base_gas_limit = GATEWAY_REWARD_OP_BASE_GAS_LIMIT * nodes as u64 + + PER_GATEWAY_DELEGATION_GAS_INCREASE * total_delegations as u64; + + let total_gas_limit = (base_gas_limit as f64 * REWARDING_GAS_LIMIT_MULTIPLIER) as u64; + + self.0 + .read() + .await + .nymd + .calculate_custom_fee(total_gas_limit) + } + + pub(crate) async fn reward_mixnodes( + &self, + nodes: &[MixnodeToReward], + ) -> Result<(), RewardingError> + where + C: SigningCosmWasmClient + Sync, + { + let total_delegations = nodes.iter().map(|node| node.total_delegations).sum(); + let fee = self + .estimate_mixnode_reward_fees(nodes.len(), total_delegations) + .await; + let msgs: Vec<(ExecuteMsg, _)> = nodes + .iter() + .map(Into::into) + .zip(std::iter::repeat(Vec::new())) + .collect(); + + let memo = format!("rewarding {} mixnodes", msgs.len()); + + let contract = self + .0 + .read() + .await + .get_mixnet_contract_address() + .ok_or(RewardingError::UnspecifiedContractAddress)?; + + // technically we don't require a write lock here, however, we really don't want to be executing + // multiple blocks concurrently as one of them WILL fail due to incorrect sequence number + self.0 + .write() + .await + .nymd + .execute_multiple(&contract, msgs, fee, memo) + .await?; + + Ok(()) + } + + pub(crate) async fn reward_gateways( + &self, + nodes: &[GatewayToReward], + ) -> Result<(), RewardingError> + where + C: SigningCosmWasmClient + Sync, + { + let total_delegations = nodes.iter().map(|node| node.total_delegations).sum(); + let fee = self + .estimate_gateway_reward_fees(nodes.len(), total_delegations) + .await; + let msgs: Vec<(ExecuteMsg, _)> = nodes + .iter() + .map(Into::into) + .zip(std::iter::repeat(Vec::new())) + .collect(); + + let memo = format!("rewarding {} gateways", msgs.len()); + + let contract = self + .0 + .read() + .await + .get_mixnet_contract_address() + .ok_or(RewardingError::UnspecifiedContractAddress)?; + + // technically we don't require a write lock here, however, we really don't want to be executing + // multiple blocks concurrently as one of them WILL fail due to incorrect sequence number + self.0 + .write() + .await + .nymd + .execute_multiple(&contract, msgs, fee, memo) + .await?; + + Ok(()) } } diff --git a/validator-api/src/rewarding/epoch.rs b/validator-api/src/rewarding/epoch.rs new file mode 100644 index 0000000000..5bba761647 --- /dev/null +++ b/validator-api/src/rewarding/epoch.rs @@ -0,0 +1,219 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::storage::UnixTimestamp; +use config::defaults::{DEFAULT_EPOCH_LENGTH, DEFAULT_FIRST_EPOCH_START}; +use std::fmt::{Display, Formatter}; +use std::time::Duration; +use time::OffsetDateTime; + +// TODO: perhaps this should be moved to a commons crate? +// And become representation of system epoch? +/// Representation of rewarding epoch. +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub struct Epoch { + start: OffsetDateTime, + length: Duration, +} + +impl Epoch { + /// Creates new epoch instance. + pub const fn new(start: OffsetDateTime, length: Duration) -> Self { + Epoch { start, length } + } + + /// Returns the next epoch. + pub fn next_epoch(&self) -> Self { + Epoch { + start: self.end(), + length: self.length, + } + } + + /// Returns the last epoch. + pub fn previous_epoch(&self) -> Self { + Epoch { + start: self.start - self.length, + length: self.length, + } + } + + /// Determines whether the provided datetime is contained within the epoch + /// + /// # Arguments + /// + /// * `datetime`: specified datetime + pub fn contains(&self, datetime: OffsetDateTime) -> bool { + self.start <= datetime && datetime <= self.end() + } + + /// Returns new instance of [Epoch] such that the provided datetime would be within + /// its duration. + /// + /// # Arguments + /// + /// * `now`: current datetime + pub fn current(&self, now: OffsetDateTime) -> Self { + let mut candidate = *self; + + if now > self.start { + loop { + if candidate.contains(now) { + return candidate; + } + candidate = candidate.next_epoch(); + } + } else { + loop { + if candidate.contains(now) { + return candidate; + } + candidate = candidate.previous_epoch(); + } + } + } + + /// Returns the starting datetime of this epoch. + pub const fn start(&self) -> OffsetDateTime { + self.start + } + + /// Returns the length of this epoch. + pub const fn length(&self) -> Duration { + self.length + } + + /// Returns the ending datetime of this epoch. + pub fn end(&self) -> OffsetDateTime { + self.start + self.length + } + + /// Returns the unix timestamp of the start of this epoch. + pub const fn start_unix_timestamp(&self) -> UnixTimestamp { + self.start().unix_timestamp() + } + + /// Returns the unix timestamp of the end of this epoch. + pub fn end_unix_timestamp(&self) -> UnixTimestamp { + self.end().unix_timestamp() + } +} + +impl Display for Epoch { + fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { + let length = self.length(); + let hours = length.as_secs_f32() / 3600.0; + write!( + f, + "Epoch: {} - {} ({:.1} hours)", + self.start(), + self.end(), + hours + ) + } +} + +impl Default for Epoch { + fn default() -> Self { + Epoch { + start: DEFAULT_FIRST_EPOCH_START, + length: DEFAULT_EPOCH_LENGTH, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn previous_epoch() { + let epoch = Epoch { + start: time::macros::datetime!(2021-08-23 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + let expected = Epoch { + start: time::macros::datetime!(2021-08-22 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + + assert_eq!(expected, epoch.previous_epoch()) + } + + #[test] + fn next_epoch() { + let epoch = Epoch { + start: time::macros::datetime!(2021-08-23 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + let expected = Epoch { + start: time::macros::datetime!(2021-08-24 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + + assert_eq!(expected, epoch.next_epoch()) + } + + #[test] + fn checking_for_datetime_inclusion() { + let epoch = Epoch { + start: time::macros::datetime!(2021-08-23 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + + // it must contain its own boundaries + assert!(epoch.contains(epoch.start)); + assert!(epoch.contains(epoch.end())); + + let in_the_midle = epoch.start + Duration::from_secs(epoch.length.as_secs() / 2); + assert!(epoch.contains(in_the_midle)); + + assert!(!epoch.contains(epoch.next_epoch().end())); + assert!(!epoch.contains(epoch.previous_epoch().start())); + } + + #[test] + fn determining_current_epoch() { + let first_epoch = Epoch { + start: time::macros::datetime!(2021-08-23 12:00 UTC), + length: Duration::from_secs(24 * 60 * 60), + }; + + // epoch just before + let fake_now = first_epoch.start - Duration::from_secs(123); + assert_eq!(first_epoch.previous_epoch(), first_epoch.current(fake_now)); + + // this epoch (start boundary) + assert_eq!(first_epoch, first_epoch.current(first_epoch.start)); + + // this epoch (in the middle) + let fake_now = first_epoch.start + Duration::from_secs(123); + assert_eq!(first_epoch, first_epoch.current(fake_now)); + + // this epoch (end boundary) + assert_eq!(first_epoch, first_epoch.current(first_epoch.end())); + + // next epoch + let fake_now = first_epoch.end() + Duration::from_secs(123); + assert_eq!(first_epoch.next_epoch(), first_epoch.current(fake_now)); + + // few epochs in the past + let fake_now = + first_epoch.start() - first_epoch.length - first_epoch.length - first_epoch.length; + assert_eq!( + first_epoch + .previous_epoch() + .previous_epoch() + .previous_epoch(), + first_epoch.current(fake_now) + ); + + // few epochs in the future + let fake_now = + first_epoch.end() + first_epoch.length + first_epoch.length + first_epoch.length; + assert_eq!( + first_epoch.next_epoch().next_epoch().next_epoch(), + first_epoch.current(fake_now) + ); + } +} diff --git a/validator-api/src/rewarding/error.rs b/validator-api/src/rewarding/error.rs new file mode 100644 index 0000000000..e4c10dcff1 --- /dev/null +++ b/validator-api/src/rewarding/error.rs @@ -0,0 +1,47 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::node_status_api::models::NodeStatusApiError; +use thiserror::Error; +use validator_client::nymd::error::NymdError; +use validator_client::ValidatorClientError; + +#[derive(Debug, Error)] +pub(crate) enum RewardingError { + #[error("Could not distribute rewards as the contract address was unspecified")] + UnspecifiedContractAddress, + + #[error("There were no mixnodes to reward (network is dead)")] + NoMixnodesToReward, + + #[error("There were no gateways to reward (network is dead)")] + NoGatewaysToReward, + + #[error("Failed to execute the smart contract - {0}")] + ContractExecutionFailure(NymdError), + + // The inner error should be modified at some point... + #[error("We run into storage issues - {0}")] + StorageError(NodeStatusApiError), + + #[error("Failed to query the smart contract - {0}")] + ValidatorClientError(ValidatorClientError), +} + +impl From for RewardingError { + fn from(err: NymdError) -> Self { + RewardingError::ContractExecutionFailure(err) + } +} + +impl From for RewardingError { + fn from(err: NodeStatusApiError) -> Self { + RewardingError::StorageError(err) + } +} + +impl From for RewardingError { + fn from(err: ValidatorClientError) -> Self { + RewardingError::ValidatorClientError(err) + } +} diff --git a/validator-api/src/rewarding/mod.rs b/validator-api/src/rewarding/mod.rs new file mode 100644 index 0000000000..4e0d6cd210 --- /dev/null +++ b/validator-api/src/rewarding/mod.rs @@ -0,0 +1,871 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::cache::ValidatorCache; +use crate::node_status_api::models::{GatewayStatusReport, MixnodeStatusReport, Uptime}; +use crate::node_status_api::ONE_DAY; +use crate::nymd_client::Client; +use crate::rewarding::epoch::Epoch; +use crate::rewarding::error::RewardingError; +use crate::storage::models::{ + FailedGatewayRewardChunk, FailedMixnodeRewardChunk, PossiblyUnrewardedGateway, + PossiblyUnrewardedMixnode, RewardingReport, +}; +use crate::storage::NodeStatusStorage; +use log::{error, info}; +use mixnet_contract::{ExecuteMsg, IdentityKey}; +use rand::{thread_rng, Rng}; +use std::collections::HashMap; +use std::convert::{TryFrom, TryInto}; +use std::time::Duration; +use time::OffsetDateTime; +use tokio::time::sleep; +use validator_client::nymd::SigningNymdClient; + +pub(crate) mod epoch; +pub(crate) mod error; + +// the actual base cost is around 125_000, but let's give ourselves a bit of safety net in case +// we introduce some tiny contract changes that would bump that value up +pub(crate) const MIXNODE_REWARD_OP_BASE_GAS_LIMIT: u64 = 150_000; +pub(crate) const GATEWAY_REWARD_OP_BASE_GAS_LIMIT: u64 = 150_000; + +// For each delegation reward we perform a read and a write is being executed, +// which are the most costly parts involved in process. Both of them are ~1000 sdk gas in cost. +// However, experimentally it looks like first delegation adds total of additional ~3000 of sdk gas +// cost and each subsequent about ~2500. +// Therefore, since base cost is not tuned to the bare minimum, let's treat all of delegations as extra +// 2750 of sdk gas. +pub(crate) const PER_MIXNODE_DELEGATION_GAS_INCREASE: u64 = 2750; +pub(crate) const PER_GATEWAY_DELEGATION_GAS_INCREASE: u64 = 2750; + +// Another safety net in case of contract changes, +// the calculated total gas limit is going to get multiplied by that value. +pub(crate) const REWARDING_GAS_LIMIT_MULTIPLIER: f64 = 1.05; + +pub(crate) const MAX_TO_REWARD_AT_ONCE: usize = 50; + +pub(crate) const REWARDING_TIME_VARIANCE: f32 = 0.05; // 5% (so for example +/-1.2h for 24h epoch) + +#[derive(Debug, Clone)] +pub(crate) struct MixnodeToReward { + pub(crate) identity: IdentityKey, + pub(crate) uptime: Uptime, + + /// Total number of individual addresses that have delegated to this particular node + pub(crate) total_delegations: usize, +} + +#[derive(Debug, Clone)] +pub(crate) struct GatewayToReward { + pub(crate) identity: IdentityKey, + pub(crate) uptime: Uptime, + + /// Total number of individual addresses that have delegated to this particular gateway + pub(crate) total_delegations: usize, +} + +pub(crate) struct FailedMixnodeRewardChunkDetails { + possibly_unrewarded: Vec, + error_message: String, +} + +pub(crate) struct FailedGatewayRewardChunkDetails { + possibly_unrewarded: Vec, + error_message: String, +} + +#[derive(Default)] +pub(crate) struct FailureData { + mixnodes: Option>, + gateways: Option>, +} + +impl<'a> From<&'a MixnodeToReward> for ExecuteMsg { + fn from(node: &MixnodeToReward) -> Self { + ExecuteMsg::RewardMixnode { + identity: node.identity.clone(), + uptime: node.uptime.u8() as u32, + } + } +} + +impl<'a> From<&'a GatewayToReward> for ExecuteMsg { + fn from(node: &GatewayToReward) -> Self { + ExecuteMsg::RewardGateway { + identity: node.identity.clone(), + uptime: node.uptime.u8() as u32, + } + } +} + +pub(crate) struct Rewarder { + nymd_client: Client, + validator_cache: ValidatorCache, + storage: NodeStatusStorage, + + /// The first epoch of the current length. + first_epoch: Epoch, + + /// Ideal world, expected number of network monitor test runs per epoch. + /// In reality it will be slightly lower due to network delays, but it's good enough + /// for estimations regarding percentage of available data for reward distribution. + expected_epoch_monitor_runs: usize, + + /// Minimum percentage of network monitor test runs reports required in order to distribute + /// rewards. + minimum_epoch_monitor_threshold: u8, +} + +impl Rewarder { + pub(crate) fn new( + nymd_client: Client, + validator_cache: ValidatorCache, + storage: NodeStatusStorage, + first_epoch: Epoch, + expected_epoch_monitor_runs: usize, + minimum_epoch_monitor_threshold: u8, + ) -> Self { + Rewarder { + nymd_client, + validator_cache, + storage, + first_epoch, + expected_epoch_monitor_runs, + minimum_epoch_monitor_threshold, + } + } + + /// Obtains the current number of delegators that have delegated their stake towards this particular mixnode. + /// + /// # Arguments + /// + /// * `identity`: identity key of the mixnode + async fn get_mixnode_delegators_count( + &self, + identity: IdentityKey, + ) -> Result { + Ok(self + .nymd_client + .get_mixnode_delegations(identity) + .await? + .len()) + } + + /// Obtains the current number of delegators that have delegated their stake towards this particular gateway. + /// + /// # Arguments + /// + /// * `identity`: identity key of the gateway + async fn get_gateway_delegators_count( + &self, + identity: IdentityKey, + ) -> Result { + Ok(self + .nymd_client + .get_gateway_delegations(identity) + .await? + .len()) + } + + /// Queries the smart contract in order to obtain the current list of bonded mixnodes and then + /// for each mixnode determines how many delegators it has. + async fn produce_mixnode_delegators_map( + &self, + ) -> Result, RewardingError> { + // Technically we could optimise it by creating a concurrent stream and executing multiple + // queries concurrently. + // + // I've actually tested that approach and for 5300 nodes running it all sequentially was taking around 19s + // while running it with 20 concurrent queries was taking around 4.5s. + // Note that the results were a bit biased as I was testing it against remote validator + // while in real world this would be making only local requests. + // During the test my average ping times to the machine were around 2.6ms. + // So I guess the network latency was 2.6ms * 5300 = 13.78s in total in the sequential case. + // + // HOWEVER, even if the method was taking that long in real world, + // in the grand scheme of things it makes absolutely no difference. If the rewards + // distribution is delayed by 15s, it changes nothing as the process itself is not + // instantaneous. + let mut map = HashMap::new(); + + let bonded_mixnodes = self.validator_cache.mixnodes().await.into_inner(); + for mix in bonded_mixnodes.into_iter() { + let delegator_count = self + .get_mixnode_delegators_count(mix.mix_node.identity_key.clone()) + .await?; + map.insert(mix.mix_node.identity_key, delegator_count); + } + + Ok(map) + } + + /// Queries the smart contract in order to obtain the current list of bonded gateways and then + /// for each gateway determines how many delegators it has. + async fn produce_gateway_delegators_map( + &self, + ) -> Result, RewardingError> { + // look at comments in `produce_mixnode_delegators_map` for some optimisation elaboration + let mut map = HashMap::new(); + + let bonded_gateways = self.validator_cache.gateways().await.into_inner(); + for gateway in bonded_gateways.into_iter() { + let delegator_count = self + .get_gateway_delegators_count(gateway.gateway.identity_key.clone()) + .await?; + map.insert(gateway.gateway.identity_key, delegator_count); + } + + Ok(map) + } + + /// Calculates the absolute uptime of given node that is then passed as one of the arguments + /// in the smart contract to determine the actual reward value. + /// + /// Currently both ipv4 and ipv6 uptimes carry the same weight in the calculation. + /// + /// # Arguments + /// + /// * `ipv4_uptime`: ipv4 uptime of the node in the last epoch. + /// * `ipv6_uptime`: ipv6 uptime of the node in the last epoch. + fn calculate_absolute_uptime(&self, ipv4_uptime: Uptime, ipv6_uptime: Uptime) -> Uptime { + // just take average of ipv4 and ipv6 uptimes using equal weights + let abs = ((ipv4_uptime.u8() as f32 + ipv6_uptime.u8() as f32) / 2.0).round(); + Uptime::try_from(abs as i64).unwrap() + } + + /// Given the list of mixnodes that were tested in the last epoch, tries to determine the + /// subset that are eligible for any rewards. + /// + /// As of right now, it is a rather straightforward process. It is only checked whether the node + /// is currently bonded and has uptime > 0. + /// Unlike the typescript rewards script, it currently does not look at the verloc data nor + /// whether the non-mixing ports are open. + /// + /// The method also obtains the number of delegators towards the node in order to more accurately + /// approximate the required gas fees when distributing the rewards. + /// + /// # Arguments + /// + /// * `active_mixnodes`: list of the nodes that were tested at least once by the network monitor + /// in the last epoch. + async fn determine_eligible_mixnodes( + &self, + active_mixnodes: &[MixnodeStatusReport], + ) -> Result, RewardingError> { + // Currently we don't have as many 'features' as in the typescript reward script, + // such as we don't check ports or verloc data anymore. However, that's fine as + // it's a good price to pay for being able to move rewarding to rust + // and the lack of port data / verloc data will eventually be balanced out anyway + // by people hesitating to delegate to nodes without them and thus those nodes disappearing + // from the active set (once introduced) + let mixnode_delegators = self.produce_mixnode_delegators_map().await?; + + // 1. go through all active mixnodes + // 2. filter out nodes that are currently not bonded (as `mixnode_delegators` was obtained by + // querying the validator) + // 3. determine uptime and attach delegators count + let eligible_nodes = active_mixnodes + .iter() + .filter_map(|mix| { + mixnode_delegators + .get(&mix.identity) + .map(|&total_delegations| MixnodeToReward { + identity: mix.identity.clone(), + uptime: self + .calculate_absolute_uptime(mix.last_day_ipv4, mix.last_day_ipv6), + total_delegations, + }) + }) + .filter(|node| node.uptime.u8() > 0) + .collect(); + + Ok(eligible_nodes) + } + + /// Given the list of gateways that were tested in the last epoch, tries to determine the + /// subset that are eligible for any rewards. + /// + /// As of right now, it is a rather straightforward process. It is only checked whether the node + /// is currently bonded and has uptime > 0. + /// Unlike the typescript rewards script, it currently does not look at the non-mixing ports are open. + /// + /// The method also obtains the number of delegators towards the node in order to more accurately + /// approximate the required gas fees when distributing the rewards. + /// + /// # Arguments + /// + /// * `active_gateways`: list of the nodes that were tested at least once by the network monitor + /// in the last epoch. + async fn determine_eligible_gateways( + &self, + active_gateways: &[GatewayStatusReport], + ) -> Result, RewardingError> { + let gateway_delegators = self.produce_gateway_delegators_map().await?; + + let eligible_nodes = active_gateways + .iter() + .filter_map(|gateway| { + gateway_delegators + .get(&gateway.identity) + .map(|&total_delegations| GatewayToReward { + identity: gateway.identity.clone(), + uptime: self.calculate_absolute_uptime( + gateway.last_day_ipv4, + gateway.last_day_ipv6, + ), + total_delegations, + }) + }) + .filter(|node| node.uptime.u8() > 0) + .collect(); + + Ok(eligible_nodes) + } + + /// Obtains the lists of all mixnodes and gateways that were tested at least a single time + /// by the network monitor in the specified epoch. + /// + /// # Arguments + /// + /// * `epoch`: the specified epoch. + async fn get_active_nodes( + &self, + epoch: Epoch, + ) -> Result<(Vec, Vec), RewardingError> { + let active_mixnodes = self + .storage + .get_all_active_mixnode_reports_in_interval( + epoch.start_unix_timestamp(), + epoch.end_unix_timestamp(), + ) + .await?; + + let active_gateways = self + .storage + .get_all_active_gateway_reports_in_interval( + epoch.start_unix_timestamp(), + epoch.end_unix_timestamp(), + ) + .await?; + + Ok((active_mixnodes, active_gateways)) + } + + /// Using the list of mixnodes eligible for rewards, chunks it into pre-defined sized-chunks + /// and gives out the rewards by calling the smart contract. + /// + /// Returns an optional vector containing list of chunks that experienced a smart contract + /// execution error during reward distribution. However, it does not necessarily imply they + /// were not rewarded. There are some edge cases where we time out waiting for block to be included + /// yet the transactions went through. + /// + /// Only returns errors for problems originating from before smart contract was called, i.e. + /// we know for sure not a single node has been rewarded. + /// + /// # Arguments + /// + /// * `eligible_mixnodes`: list of the nodes that are eligible to receive non-zero rewards. + async fn distribute_rewards_to_mixnodes( + &self, + eligible_mixnodes: &[MixnodeToReward], + ) -> Option> { + let mut failed_chunks = Vec::new(); + + for (i, mix_chunk) in eligible_mixnodes.chunks(MAX_TO_REWARD_AT_ONCE).enumerate() { + if let Err(err) = self.nymd_client.reward_mixnodes(mix_chunk).await { + error!("failed to reward mixnodes... - {}", err); + failed_chunks.push(FailedMixnodeRewardChunkDetails { + possibly_unrewarded: mix_chunk.to_vec(), + error_message: err.to_string(), + }) + } + let rewarded = i * MAX_TO_REWARD_AT_ONCE + mix_chunk.len(); + let percentage = rewarded as f32 * 100.0 / eligible_mixnodes.len() as f32; + info!( + "Rewarded {} / {} mixnodes\t{:.2}%", + rewarded, + eligible_mixnodes.len(), + percentage + ); + } + + if failed_chunks.is_empty() { + None + } else { + Some(failed_chunks) + } + } + + /// Using the list of gateways eligible for rewards, chunks it into pre-defined sized-chunks + /// and gives out the rewards by calling the smart contract. + /// + /// Returns an optional vector containing list of chunks that experienced a smart contract + /// execution error during reward distribution. However, it does not necessarily imply they + /// were not rewarded. There are some edge cases where we time out waiting for block to be included + /// yet the transactions went through. + /// + /// Only returns errors for problems originating from before smart contract was called, i.e. + /// we know for sure not a single node has been rewarded. + /// + /// # Arguments + /// + /// * `eligible_gateways`: list of the nodes that are eligible to receive non-zero rewards. + async fn distribute_rewards_to_gateways( + &self, + eligible_gateways: &[GatewayToReward], + ) -> Option> { + let mut failed_chunks = Vec::new(); + + for (i, gateway_chunk) in eligible_gateways.chunks(MAX_TO_REWARD_AT_ONCE).enumerate() { + if let Err(err) = self.nymd_client.reward_gateways(gateway_chunk).await { + error!("failed to reward gateways... - {}", err); + failed_chunks.push(FailedGatewayRewardChunkDetails { + possibly_unrewarded: gateway_chunk.to_vec(), + error_message: err.to_string(), + }) + } + + let rewarded = i * MAX_TO_REWARD_AT_ONCE + gateway_chunk.len(); + let percentage = rewarded as f32 * 100.0 / eligible_gateways.len() as f32; + info!( + "Rewarded {} / {} gateways\t{:.2}%", + rewarded, + eligible_gateways.len(), + percentage + ); + } + + if failed_chunks.is_empty() { + None + } else { + Some(failed_chunks) + } + } + + /// Using the list of active mixnode and gateways, determine which of them are eligible for + /// rewarding and distribute the rewards. + /// + /// # Arguments + /// + /// * `epoch_rewarding_id`: id of the current epoch rewarding. + /// + /// * `active_mixnodes`: list of the nodes that were tested at least once by the network monitor + /// in the last epoch. + /// + /// * `active_gateways`: list of the nodes that were tested at least once by the network monitor + /// in the last epoch. + async fn distribute_rewards( + &self, + epoch_rewarding_id: i64, + active_mixnodes: &[MixnodeStatusReport], + active_gateways: &[GatewayStatusReport], + ) -> Result<(RewardingReport, Option), RewardingError> { + let mut failure_data = FailureData::default(); + + let eligible_mixnodes = self.determine_eligible_mixnodes(active_mixnodes).await?; + if eligible_mixnodes.is_empty() { + return Err(RewardingError::NoMixnodesToReward); + } + + let eligible_gateways = self.determine_eligible_gateways(active_gateways).await?; + if eligible_gateways.is_empty() { + return Err(RewardingError::NoGatewaysToReward); + } + + failure_data.mixnodes = self + .distribute_rewards_to_mixnodes(&eligible_mixnodes) + .await; + + failure_data.gateways = self + .distribute_rewards_to_gateways(&eligible_gateways) + .await; + + let report = RewardingReport { + epoch_rewarding_id, + eligible_mixnodes: eligible_mixnodes.len() as i64, + eligible_gateways: eligible_gateways.len() as i64, + possibly_unrewarded_mixnodes: failure_data + .mixnodes + .as_ref() + .map(|chunks| { + chunks + .iter() + .map(|chunk| chunk.possibly_unrewarded.len()) + .sum::() as i64 + }) + .unwrap_or_default(), + possibly_unrewarded_gateways: failure_data + .gateways + .as_ref() + .map(|chunks| { + chunks + .iter() + .map(|chunk| chunk.possibly_unrewarded.len()) + .sum::() as i64 + }) + .unwrap_or_default(), + }; + + if failure_data.mixnodes.is_none() && failure_data.gateways.is_none() { + Ok((report, None)) + } else { + Ok((report, Some(failure_data))) + } + } + + /// Saves information about possibly failed rewarding for future manual inspection. + /// + /// Currently there is no automated recovery mechanism. + /// + /// # Arguments + /// + /// * `failure_data`: information regarding nodes that might have not received reward this epoch. + /// + /// * `epoch_rewarding_id`: id of the current epoch rewarding. + async fn save_failure_information( + &self, + failure_data: FailureData, + epoch_rewarding_id: i64, + ) -> Result<(), RewardingError> { + if let Some(failed_mixnode_chunks) = failure_data.mixnodes { + for failed_chunk in failed_mixnode_chunks.into_iter() { + // save the chunk + let chunk_id = self + .storage + .insert_failed_mixnode_reward_chunk(FailedMixnodeRewardChunk { + epoch_rewarding_id, + error_message: failed_chunk.error_message, + }) + .await?; + + // and then all associated nodes + for node in failed_chunk.possibly_unrewarded.into_iter() { + self.storage + .insert_possibly_unrewarded_mixnode(PossiblyUnrewardedMixnode { + chunk_id, + identity: node.identity, + uptime: node.uptime.u8(), + }) + .await?; + } + } + } + + if let Some(failed_gateway_chunks) = failure_data.gateways { + for failed_chunk in failed_gateway_chunks.into_iter() { + // save the chunk + let chunk_id = self + .storage + .insert_failed_gateway_reward_chunk(FailedGatewayRewardChunk { + epoch_rewarding_id, + error_message: failed_chunk.error_message, + }) + .await?; + + // and then all associated nodes + for node in failed_chunk.possibly_unrewarded.into_iter() { + self.storage + .insert_possibly_unrewarded_gateway(PossiblyUnrewardedGateway { + chunk_id, + identity: node.identity, + uptime: node.uptime.u8(), + }) + .await?; + } + } + } + + Ok(()) + } + + /// Determines random positive or negative time variance that should be added to the rewarding + /// distribution time so that all validators would not attempt to hit the smart contract + /// at exactly the same time. + fn epoch_variance(&self) -> (bool, Duration) { + let mut rng = thread_rng(); + + let abs_variance_secs = REWARDING_TIME_VARIANCE * self.first_epoch.length().as_secs_f32(); + let variance = Duration::from_secs(rng.gen_range(0, abs_variance_secs as u64)); + let sign = rng.gen_bool(0.5); + + (sign, variance) + } + + /// Determines whether this validator has already distributed rewards for the specified epoch + /// so that it wouldn't accidentally attempt to do it again. + /// + /// # Arguments + /// + /// * `epoch`: epoch to check + async fn check_if_rewarding_happened_at_epoch( + &self, + epoch: Epoch, + ) -> Result { + if let Some(entry) = self + .storage + .get_epoch_rewarding_entry(epoch.start_unix_timestamp()) + .await? + { + // log error if the attempt wasn't finished. This error implies the process has crashed + // during the rewards distribution + if !entry.finished { + error!( + "It seems that we haven't successfully finished distributing rewards at {}", + epoch + ) + } + + Ok(true) + } else { + Ok(false) + } + } + + /// Determines whether the specified epoch is eligible for rewards, i.e. it was not rewarded + /// before and we have enough network monitor test data to distribute the rewards based on them. + /// + /// # Arguments + /// + /// * `epoch`: epoch to check + async fn check_epoch_eligibility(&self, epoch: Epoch) -> Result { + if self.check_if_rewarding_happened_at_epoch(epoch).await? + || !self.check_for_monitor_data(epoch).await? + { + Ok(false) + } else { + // we haven't sent rewards during the epoch and we have enough monitor test data + Ok(true) + } + } + + /// Determines the next epoch during which the rewards should get distributed. + /// + /// # Arguments + /// + /// * `now`: current datetime + async fn next_rewarding_epoch(&self, now: OffsetDateTime) -> Result { + // edge case handling for when we decide to change first epoch to be at some time in the future + // (i.e. epoch length transition) + // we don't have to perform checks here as it's impossible to distribute rewards for epochs + // in the future + if self.first_epoch.start() > now { + return Ok(self.first_epoch); + } + + let current_epoch = self.first_epoch.current(now); + // check previous epoch in case we had a tiny hiccup + // example: + // epochs start at 12:00pm and last for 24h (ignore variance) + // validator-api crashed at 11:59am before distributing rewards + // and restarted at 12:01 - it has all the data required to distribute the rewards + // for the previous epoch. + let previous_epoch = current_epoch.previous_epoch(); + if self.check_epoch_eligibility(previous_epoch).await? { + return Ok(previous_epoch); + } + + // check if rewards weren't already given out for the current epoch + // (it can happen for negative variance if the process crashed) + // note that if the epoch ends at say 12:00 and it's 11:59 and we just started, + // we might end up skipping this epoch regardless + if !self + .check_if_rewarding_happened_at_epoch(current_epoch) + .await? + { + return Ok(current_epoch); + } + + // if we have given rewards for the previous and the current epoch, + // wait until the next one + Ok(current_epoch.next_epoch()) + } + + /// Given datetime of the rewarding epoch datetime, determine time until it ends and add (or remove) + /// a little bit of time variance from it in order to prevent all validators distributing + /// the rewards at exactly the same time instant. + /// + /// # Arguments + /// + /// * `rewarding_epoch`: the rewarding epoch + fn determine_delay_until_next_rewarding(&self, rewarding_epoch: Epoch) -> Option { + let now = OffsetDateTime::now_utc(); + if now > rewarding_epoch.end() { + return None; + } + + // we have a positive duration so we can't fail the conversion + let until_epoch_end: Duration = (rewarding_epoch.end() - now).try_into().unwrap(); + + // add a bit of variance to the start time + let (sign, variance) = self.epoch_variance(); + if sign { + Some(until_epoch_end + variance) + } else { + until_epoch_end.checked_sub(variance) + } + } + + /// Distribute rewards to all eligible mixnodes and gateways on the network. + /// + /// # Arguments + /// + /// * `epoch`: current rewarding epoch + async fn perform_rewarding(&self, epoch: Epoch) -> Result<(), RewardingError> { + info!( + "Starting mixnode and gateway rewarding for epoch {} ...", + epoch + ); + + // get nodes that were active during the epoch + let (active_mixnodes, active_gateways) = self.get_active_nodes(epoch).await?; + + // insert information about beginning the procedure (so that if we crash during it, + // we wouldn't attempt to possibly double reward operators) + let epoch_rewarding_id = self + .storage + .insert_started_epoch_rewarding(epoch.start_unix_timestamp()) + .await?; + + let (report, failure_data) = self + .distribute_rewards(epoch_rewarding_id, &active_mixnodes, &active_gateways) + .await?; + + self.storage + .finish_rewarding_epoch_and_insert_report(report) + .await?; + + if let Some(failure_data) = failure_data { + if let Err(err) = self + .save_failure_information(failure_data, epoch_rewarding_id) + .await + { + error!("failed to save information about rewarding failures!"); + // TODO: should we just terminate the process here? + return Err(err); + } + } + + // TODO: again, this assumes 24h epochs. + let epoch_iso_8601 = epoch.start().date().to_string(); + let two_days_ago = (epoch.start() - 2 * ONE_DAY).unix_timestamp(); + + // NOTE: this works under assumption that epochs are 24h in length. + // If this changes then the historical uptime updates should be performed + // on a timer in another task + if self + .storage + .check_if_historical_uptimes_exist_for_date(&epoch_iso_8601) + .await? + { + error!("We have already updated uptimes for all nodes this day. If you're seeing this warning, it's likely rewards were given out twice this day!") + } else { + info!( + "Updating historical daily uptimes of all nodes and purging old status reports..." + ); + self.storage + .update_historical_uptimes(&epoch_iso_8601, &active_mixnodes, &active_gateways) + .await?; + self.storage.purge_old_statuses(two_days_ago).await?; + } + + Ok(()) + } + + /// Checks whether there is enough network monitor test run data to distribute rewards + /// for the specified epoch. + /// + /// # Arguments + /// + /// * `epoch`: epoch to check + async fn check_for_monitor_data(&self, epoch: Epoch) -> Result { + let since = epoch.start_unix_timestamp(); + let until = epoch.end_unix_timestamp(); + + let monitor_runs = self.storage.get_monitor_runs_count(since, until).await?; + + // check if we have more than threshold percentage of monitor runs for the epoch + let available = monitor_runs as f32 * 100.0 / self.expected_epoch_monitor_runs as f32; + Ok(available >= self.minimum_epoch_monitor_threshold as f32) + } + + /// Waits until the next epoch starts + /// + /// # Arguments + /// + /// * `current_epoch`: current epoch that we want to wait out + async fn wait_until_next_epoch(&self, current_epoch: Epoch) { + let now = OffsetDateTime::now_utc(); + let until_end = current_epoch.end() - now; + + // otherwise it means the epoch is already over and the next one has begun + if until_end.is_positive() { + // we know for sure that the duration here is positive so conversion can't fail + sleep(until_end.try_into().unwrap()).await; + } + } + + pub(crate) async fn run(&self) { + // whatever happens, we shouldn't do anything until the cache is initialised + self.validator_cache.wait_for_initial_values().await; + + loop { + // Just a reference for anyone wanting to modify the code to use blockchain timestamps. + // This method is now available: + // let current_block_timestamp = self.nymd_client.current_block_timestamp().await.unwrap(); + // and if you look at the source of that, you can easily use block height instead if preferred. + + let now = OffsetDateTime::now_utc(); + // if we haven't rewarded anyone for the previous epoch, get the start of the previous epoch + // otherwise get the start of the current epoch + // (remember, we will be rewarding at the END of the selected epoch) + let next_rewarding_epoch = match self.next_rewarding_epoch(now).await { + Ok(next_rewarding_epoch) => next_rewarding_epoch, + Err(err) => { + // I'm not entirely sure whether this is recoverable, because failure implies database errors + error!("We failed to determine time until next reward cycle ({}). Going to wait for the epoch length until next attempt", err); + sleep(self.first_epoch.length()).await; + continue; + } + }; + + // wait's until the start of the *next* epoch, e.g. end of the current chosen epoch + // (it could be none, for example if we are distributing overdue rewards for the previous epoch) + // plus add a bit of variance + if let Some(remaining_time) = + self.determine_delay_until_next_rewarding(next_rewarding_epoch) + { + info!("Next rewarding epoch is {}", next_rewarding_epoch); + info!( + "Rewards distribution will happen at {}. ({:?} left)", + now + remaining_time, + remaining_time + ); + sleep(remaining_time).await; + } else { + info!( + "Starting reward distribution for epoch {} immediately!", + next_rewarding_epoch + ); + } + + // it's time to distribute rewards, however, first let's see if we have enough data to go through with it + // (consider the case of rewards being distributed every 24h at 12:00pm and validator-api + // starting for the very first time at 11:00am. It's not going to have enough data for + // rewards for the *current* epoch, but we couldn't have known that at startup) + match self.check_for_monitor_data(next_rewarding_epoch).await { + Err(_) | Ok(false) => { + warn!("We do not have sufficient monitor data to perform rewarding in this epoch ({})", next_rewarding_epoch); + self.wait_until_next_epoch(next_rewarding_epoch).await; + continue; + } + _ => (), + } + + if let Err(err) = self.perform_rewarding(next_rewarding_epoch).await { + // TODO: should we just terminate the process here instead? + error!("Failed to distribute rewards! - {}", err) + } + } + } +} diff --git a/validator-api/src/storage/manager.rs b/validator-api/src/storage/manager.rs index 3e18786a2a..28758f3594 100644 --- a/validator-api/src/storage/manager.rs +++ b/validator-api/src/storage/manager.rs @@ -4,19 +4,48 @@ use crate::network_monitor::monitor::summary_producer::NodeResult; use crate::node_status_api::models::{HistoricalUptime, Uptime}; use crate::node_status_api::utils::ActiveNodeDayStatuses; -use crate::storage::models::{ActiveNode, NodeStatus}; +use crate::storage::models::{ + ActiveNode, EpochRewarding, FailedGatewayRewardChunk, FailedMixnodeRewardChunk, NodeStatus, + PossiblyUnrewardedGateway, PossiblyUnrewardedMixnode, RewardingReport, +}; use crate::storage::UnixTimestamp; use std::convert::TryFrom; #[derive(Clone)] pub(crate) struct StorageManager { - pub(super) connection_pool: sqlx::SqlitePool, + pub(crate) connection_pool: sqlx::SqlitePool, } // all SQL goes here impl StorageManager { + /// Tries to obtain row id of given mixnode given its identity + pub(super) async fn get_mixnode_id(&self, identity: &str) -> Result, sqlx::Error> { + let id = sqlx::query!( + "SELECT id FROM mixnode_details WHERE identity = ?", + identity + ) + .fetch_optional(&self.connection_pool) + .await? + .map(|row| row.id); + + Ok(id) + } + + /// Tries to obtain row id of given gateway given its identity + pub(super) async fn get_gateway_id(&self, identity: &str) -> Result, sqlx::Error> { + let id = sqlx::query!( + "SELECT id FROM gateway_details WHERE identity = ?", + identity + ) + .fetch_optional(&self.connection_pool) + .await? + .map(|row| row.id); + + Ok(id) + } + /// Tries to obtain owner value of given mixnode given its identity - pub(crate) async fn get_mixnode_owner( + pub(super) async fn get_mixnode_owner( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -32,7 +61,7 @@ impl StorageManager { } /// Tries to obtain owner value of given gateway given its identity - pub(crate) async fn get_gateway_owner( + pub(super) async fn get_gateway_owner( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -49,7 +78,7 @@ impl StorageManager { /// Gets all ipv4 statuses for mixnode with particular identity that were inserted /// into the database after the specified unix timestamp. - pub(crate) async fn get_mixnode_ipv4_statuses_since( + pub(super) async fn get_mixnode_ipv4_statuses_since( &self, identity: &str, timestamp: UnixTimestamp, @@ -72,7 +101,7 @@ impl StorageManager { /// Gets all ipv6 statuses for mixnode with particular identity that were inserted /// into the database after the specified unix timestamp. - pub(crate) async fn get_mixnode_ipv6_statuses_since( + pub(super) async fn get_mixnode_ipv6_statuses_since( &self, identity: &str, timestamp: UnixTimestamp, @@ -95,7 +124,7 @@ impl StorageManager { /// Gets all ipv4 statuses for gateway with particular identity that were inserted /// into the database after the specified unix timestamp. - pub(crate) async fn get_gateway_ipv4_statuses_since( + pub(super) async fn get_gateway_ipv4_statuses_since( &self, identity: &str, timestamp: UnixTimestamp, @@ -118,7 +147,7 @@ impl StorageManager { /// Gets all ipv6 statuses for gateway with particular identity that were inserted /// into the database after the specified unix timestamp. - pub(crate) async fn get_gateway_ipv6_statuses_since( + pub(super) async fn get_gateway_ipv6_statuses_since( &self, identity: &str, timestamp: UnixTimestamp, @@ -140,7 +169,7 @@ impl StorageManager { } /// Gets the historical daily uptime associated with the particular mixnode - pub(crate) async fn get_mixnode_historical_uptimes( + pub(super) async fn get_mixnode_historical_uptimes( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -180,7 +209,7 @@ impl StorageManager { } /// Gets the historical daily uptime associated with the particular gateway - pub(crate) async fn get_gateway_historical_uptimes( + pub(super) async fn get_gateway_historical_uptimes( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -220,91 +249,119 @@ impl StorageManager { } /// Gets all ipv4 statuses for mixnode with particular id that were inserted - /// into the database after the specified unix timestamp. - pub(crate) async fn get_mixnode_ipv4_statuses_since_by_id( + /// into the database within the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_mixnode_ipv4_statuses_by_id( &self, id: i64, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { sqlx::query_as!( NodeStatus, r#" SELECT timestamp, up FROM mixnode_ipv4_status - WHERE mixnode_details_id=? AND timestamp > ?; + WHERE mixnode_details_id=? AND timestamp > ? AND timestamp < ?; "#, id, - timestamp + since, + until, ) .fetch_all(&self.connection_pool) .await } /// Gets all ipv6 statuses for mixnode with particular id that were inserted - /// into the database after the specified unix timestamp. - pub(crate) async fn get_mixnode_ipv6_statuses_since_by_id( + /// into the database within the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_mixnode_ipv6_statuses_by_id( &self, id: i64, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { sqlx::query_as!( NodeStatus, r#" SELECT timestamp, up FROM mixnode_ipv6_status - WHERE mixnode_details_id=? AND timestamp > ?; + WHERE mixnode_details_id=? AND timestamp > ? AND timestamp < ?; "#, id, - timestamp + since, + until, ) .fetch_all(&self.connection_pool) .await } /// Gets all ipv4 statuses for gateway with particular id that were inserted - /// into the database after the specified unix timestamp. - pub(crate) async fn get_gateway_ipv4_statuses_since_by_id( + /// into the database within the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_gateway_ipv4_statuses_by_id( &self, id: i64, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { sqlx::query_as!( NodeStatus, r#" SELECT timestamp, up FROM gateway_ipv4_status - WHERE gateway_details_id=? AND timestamp > ?; + WHERE gateway_details_id=? AND timestamp > ? AND timestamp < ?; "#, id, - timestamp + since, + until, ) .fetch_all(&self.connection_pool) .await } /// Gets all ipv6 statuses for gateway with particular id that were inserted - /// into the database after the specified unix timestamp. - pub(crate) async fn get_gateway_ipv6_statuses_since_by_id( + /// into the database within the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_gateway_ipv6_statuses_by_id( &self, id: i64, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { sqlx::query_as!( NodeStatus, r#" SELECT timestamp, up FROM gateway_ipv6_status - WHERE gateway_details_id=? AND timestamp > ?; + WHERE gateway_details_id=? AND timestamp > ? AND timestamp < ?; "#, id, - timestamp + since, + until, ) .fetch_all(&self.connection_pool) .await } /// Tries to submit mixnode [`NodeResult`] from the network monitor to the database. - pub(crate) async fn submit_mixnode_statuses( + pub(super) async fn submit_mixnode_statuses( &self, timestamp: UnixTimestamp, mixnode_results: Vec, @@ -356,7 +413,7 @@ impl StorageManager { } /// Tries to submit gateway [`NodeResult`] from the network monitor to the database. - pub(crate) async fn submit_gateway_statuses( + pub(super) async fn submit_gateway_statuses( &self, timestamp: UnixTimestamp, gateway_results: Vec, @@ -412,7 +469,7 @@ impl StorageManager { } /// Checks whether there are already any historical uptimes with this particular date. - pub(crate) async fn check_for_historical_uptime_existence( + pub(super) async fn check_for_historical_uptime_existence( &self, today_iso_8601: &str, ) -> Result { @@ -426,7 +483,7 @@ impl StorageManager { } /// Creates new entry for mixnode historical uptime - pub(crate) async fn insert_mixnode_historical_uptime( + pub(super) async fn insert_mixnode_historical_uptime( &self, node_id: i64, date: &str, @@ -443,8 +500,8 @@ impl StorageManager { Ok(()) } - /// Creates new entry for gatewy historical uptime - pub(crate) async fn insert_gateway_historical_uptime( + /// Creates new entry for gateway historical uptime + pub(super) async fn insert_gateway_historical_uptime( &self, node_id: i64, date: &str, @@ -466,7 +523,7 @@ impl StorageManager { /// # Arguments /// /// * `timestamp`: unix timestamp at which the monitor test run has occurred - pub(crate) async fn insert_monitor_run( + pub(super) async fn insert_monitor_run( &self, timestamp: UnixTimestamp, ) -> Result<(), sqlx::Error> { @@ -482,7 +539,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(crate) async fn get_monitor_runs_count( + pub(super) async fn get_monitor_runs_count( &self, since: UnixTimestamp, until: UnixTimestamp, @@ -498,7 +555,13 @@ impl StorageManager { Ok(count) } - pub(crate) async fn purge_old_mixnode_ipv4_statuses( + /// Removes all ipv4 statuses for all mixnodes that are older than the + /// provided timestamp. This method is indirectly called at every reward cycle. + /// + /// # Arguments + /// + /// * `until`: timestamp specifying the purge cutoff. + pub(super) async fn purge_old_mixnode_ipv4_statuses( &self, timestamp: UnixTimestamp, ) -> Result<(), sqlx::Error> { @@ -511,7 +574,13 @@ impl StorageManager { Ok(()) } - pub(crate) async fn purge_old_mixnode_ipv6_statuses( + /// Removes all ipv6 statuses for all mixnodes that are older than the + /// provided timestamp. This method is indirectly called at every reward cycle. + /// + /// # Arguments + /// + /// * `until`: timestamp specifying the purge cutoff. + pub(super) async fn purge_old_mixnode_ipv6_statuses( &self, timestamp: UnixTimestamp, ) -> Result<(), sqlx::Error> { @@ -524,7 +593,13 @@ impl StorageManager { Ok(()) } - pub(crate) async fn purge_old_gateway_ipv4_statuses( + /// Removes all ipv4 statuses for all gateways that are older than the + /// provided timestamp. This method is indirectly called at every reward cycle. + /// + /// # Arguments + /// + /// * `until`: timestamp specifying the purge cutoff. + pub(super) async fn purge_old_gateway_ipv4_statuses( &self, timestamp: UnixTimestamp, ) -> Result<(), sqlx::Error> { @@ -537,7 +612,13 @@ impl StorageManager { Ok(()) } - pub(crate) async fn purge_old_gateway_ipv6_statuses( + /// Removes all ipv6 statuses for all gateways that are older than the + /// provided timestamp. This method is indirectly called at every reward cycle. + /// + /// # Arguments + /// + /// * `until`: timestamp specifying the purge cutoff. + pub(super) async fn purge_old_gateway_ipv6_statuses( &self, timestamp: UnixTimestamp, ) -> Result<(), sqlx::Error> { @@ -550,17 +631,17 @@ impl StorageManager { Ok(()) } - // #################################################################################################### - // ALL THE METHODS BELOW ARE TEMPORARY AND WILL BE REMOVED ONCE PAYMENTS ARE DONE INSIDE VALIDATOR API - // #################################################################################################### - - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually /// Returns public key, owner and id of all mixnodes that have had any ipv4 statuses submitted - /// since provided timestamp. - pub(crate) async fn get_all_active_mixnodes( + /// within the provided time interval. + /// + /// # Arguments + /// + /// * `since`: indicates the lower bound timestamp for deciding whether given mixnode is active + /// * `until`: indicates the upper bound timestamp for deciding whether given mixnode is active + pub(super) async fn get_all_active_mixnodes_in_interval( &self, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { // find mixnode details of all nodes that have had at least 1 ipv4 status since the provided // timestamp @@ -574,22 +655,27 @@ impl StorageManager { JOIN mixnode_ipv4_status ON mixnode_details.id = mixnode_ipv4_status.mixnode_details_id WHERE EXISTS ( - SELECT 1 FROM mixnode_ipv4_status WHERE timestamp > ? + SELECT 1 FROM mixnode_ipv4_status WHERE timestamp > ? AND timestamp < ? ) "#, - timestamp + since, + until ) .fetch_all(&self.connection_pool) .await } - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually /// Returns public key, owner and id of all gateways that have had any ipv4 statuses submitted - /// since provided timestamp. - pub(crate) async fn get_all_active_gateways( + /// within the provided time interval. + /// + /// # Arguments + /// + /// * `since`: indicates the lower bound timestamp for deciding whether given gateway is active + /// * `until`: indicates the upper bound timestamp for deciding whether given gateway is active + pub(super) async fn get_all_active_gateways_in_interval( &self, - timestamp: UnixTimestamp, + since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { sqlx::query_as!( ActiveNode, @@ -599,38 +685,235 @@ impl StorageManager { JOIN gateway_ipv4_status ON gateway_details.id = gateway_ipv4_status.gateway_details_id WHERE EXISTS ( - SELECT 1 FROM gateway_ipv4_status WHERE timestamp > ? + SELECT 1 FROM gateway_ipv4_status WHERE timestamp > ? AND timestamp < ? ) "#, - timestamp + since, + until, ) .fetch_all(&self.connection_pool) .await } - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually - // TODO: should that live on the 'Inner' struct or should it rather exist on the actual storage struct - // since technically it doesn't touch any SQL directly - pub(crate) async fn get_all_active_mixnodes_statuses( + /// Inserts information about starting new epoch rewarding into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `epoch_timestamp`: Unix timestamp of this rewarding epoch. + pub(super) async fn insert_new_epoch_rewarding( + &self, + epoch_timestamp: UnixTimestamp, + ) -> Result { + let res = sqlx::query!( + r#" + INSERT INTO epoch_rewarding (epoch_timestamp, finished) + VALUES (?, 0) + "#, + epoch_timestamp + ) + .execute(&self.connection_pool) + .await?; + + Ok(res.last_insert_rowid()) + } + + /// Sets the `finished` field on the epoch rewarding to true. + /// + /// # Arguments + /// + /// * `id`: id of the entry we want to update. + pub(super) async fn update_finished_epoch_rewarding(&self, id: i64) -> Result<(), sqlx::Error> { + sqlx::query!( + r#" + UPDATE epoch_rewarding + SET finished = 1 + WHERE id = ? + "#, + id + ) + .execute(&self.connection_pool) + .await?; + + Ok(()) + } + + // /// Tries to obtain the most recent epoch rewarding entry currently stored. + // /// + // /// Returns None if no data exists. + // pub(super) async fn get_most_recent_epoch_rewarding_entry( + // &self, + // ) -> Result, sqlx::Error> { + // sqlx::query_as!( + // EpochRewarding, + // r#" + // SELECT * FROM epoch_rewarding + // ORDER BY epoch_timestamp DESC + // LIMIT 1 + // "#, + // ) + // .fetch_optional(&self.connection_pool) + // .await + // } + + /// Tries to obtain the epoch rewarding entry that has the provided timestamp. + /// + /// Returns None if no data exists. + /// + /// # Arguments + /// + /// * `epoch_timestamp`: Unix timestamp of this rewarding epoch. + pub(super) async fn get_epoch_rewarding_entry( + &self, + epoch_timestamp: UnixTimestamp, + ) -> Result, sqlx::Error> { + sqlx::query_as!( + EpochRewarding, + r#" + SELECT * FROM epoch_rewarding + WHERE epoch_timestamp = ? + "#, + epoch_timestamp + ) + .fetch_optional(&self.connection_pool) + .await + } + + /// Inserts new rewarding report into the database. + /// + /// # Arguments + /// + /// * `report`: report to insert into the database + pub(super) async fn insert_rewarding_report( + &self, + report: RewardingReport, + ) -> Result<(), sqlx::Error> { + sqlx::query!( + r#" + INSERT INTO rewarding_report + (epoch_rewarding_id, eligible_mixnodes, eligible_gateways, possibly_unrewarded_mixnodes, possibly_unrewarded_gateways) + VALUES (?, ?, ?, ?, ?); + "#, + report.epoch_rewarding_id, + report.eligible_mixnodes, + report.eligible_gateways, + report.possibly_unrewarded_mixnodes, + report.possibly_unrewarded_gateways, + ) + .execute(&self.connection_pool) + .await?; + Ok(()) + } + + /// Inserts new failed mixnode reward chunk information into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `failed_chunk`: chunk information to insert. + pub(super) async fn insert_failed_mixnode_reward_chunk( + &self, + failed_chunk: FailedMixnodeRewardChunk, + ) -> Result { + let res = sqlx::query!( + r#" + INSERT INTO failed_mixnode_reward_chunk (error_message, reward_summary_id) VALUES (?, ?) + "#, + failed_chunk.error_message, + failed_chunk.epoch_rewarding_id, + ).execute(&self.connection_pool).await?; + + Ok(res.last_insert_rowid()) + } + + /// Inserts new failed gateway reward chunk information into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `failed_chunk`: chunk information to insert. + pub(super) async fn insert_failed_gateway_reward_chunk( + &self, + failed_chunk: FailedGatewayRewardChunk, + ) -> Result { + let res = sqlx::query!( + r#" + INSERT INTO failed_gateway_reward_chunk (error_message, reward_summary_id) VALUES (?, ?) + "#, + failed_chunk.error_message, + failed_chunk.epoch_rewarding_id, + ).execute(&self.connection_pool).await?; + + Ok(res.last_insert_rowid()) + } + + /// Inserts information into the database about a mixnode that might have been unfairly unrewarded this epoch. + /// + /// # Arguments + /// + /// * `mixnode`: mixnode information to insert. + pub(super) async fn insert_possibly_unrewarded_mixnode( + &self, + mixnode: PossiblyUnrewardedMixnode, + ) -> Result<(), sqlx::Error> { + sqlx::query!( + r#" + INSERT INTO possibly_unrewarded_mixnode (identity, uptime, failed_mixnode_reward_chunk_id) VALUES (?, ?, ?) + "#, + mixnode.identity, + mixnode.uptime, + mixnode.chunk_id + ).execute(&self.connection_pool).await?; + Ok(()) + } + + /// Inserts information into the database about a gateway that might have been unfairly unrewarded this epoch. + /// + /// # Arguments + /// + /// * `gateway`: mixnode information to insert. + pub(super) async fn insert_possibly_unrewarded_gateway( + &self, + gateway: PossiblyUnrewardedGateway, + ) -> Result<(), sqlx::Error> { + sqlx::query!( + r#" + INSERT INTO possibly_unrewarded_gateway (identity, uptime, failed_gateway_reward_chunk_id) VALUES (?, ?, ?) + "#, + gateway.identity, + gateway.uptime, + gateway.chunk_id + ).execute(&self.connection_pool).await?; + Ok(()) + } + + /// Obtains all statuses of active mixnodes from the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_all_active_mixnodes_statuses_in_interval( &self, since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { - let active_nodes = self.get_all_active_mixnodes(since).await?; + let active_nodes = self + .get_all_active_mixnodes_in_interval(since, until) + .await?; let mut active_day_statuses = Vec::with_capacity(active_nodes.len()); for active_node in active_nodes.into_iter() { let ipv4_statuses = self - .get_mixnode_ipv4_statuses_since_by_id(active_node.id, since) + .get_mixnode_ipv4_statuses_by_id(active_node.id, since, until) .await?; let ipv6_statuses = self - .get_mixnode_ipv6_statuses_since_by_id(active_node.id, since) + .get_mixnode_ipv6_statuses_by_id(active_node.id, since, until) .await?; let statuses = ActiveNodeDayStatuses { identity: active_node.identity, owner: active_node.owner, - node_id: active_node.id, ipv4_statuses, ipv6_statuses, }; @@ -641,29 +924,33 @@ impl StorageManager { Ok(active_day_statuses) } - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually - // TODO: should that live on the 'Inner' struct or should it rather exist on the actual storage struct - // since technically it doesn't touch any SQL directly - pub(crate) async fn get_all_active_gateways_statuses( + /// Obtains all statuses of active gateways from the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `until`: unix timestamp indicating the upper bound interval of the selection. + pub(super) async fn get_all_active_gateways_statuses_in_interval( &self, since: UnixTimestamp, + until: UnixTimestamp, ) -> Result, sqlx::Error> { - let active_nodes = self.get_all_active_gateways(since).await?; + let active_nodes = self + .get_all_active_gateways_in_interval(since, until) + .await?; let mut active_day_statuses = Vec::with_capacity(active_nodes.len()); for active_node in active_nodes.into_iter() { let ipv4_statuses = self - .get_gateway_ipv4_statuses_since_by_id(active_node.id, since) + .get_gateway_ipv4_statuses_by_id(active_node.id, since, until) .await?; let ipv6_statuses = self - .get_gateway_ipv6_statuses_since_by_id(active_node.id, since) + .get_gateway_ipv6_statuses_by_id(active_node.id, since, until) .await?; let statuses = ActiveNodeDayStatuses { identity: active_node.identity, owner: active_node.owner, - node_id: active_node.id, ipv4_statuses, ipv6_statuses, }; diff --git a/validator-api/src/storage/mod.rs b/validator-api/src/storage/mod.rs index 2256e94999..fd394a1ce7 100644 --- a/validator-api/src/storage/mod.rs +++ b/validator-api/src/storage/mod.rs @@ -4,22 +4,25 @@ use crate::network_monitor::monitor::summary_producer::NodeResult; use crate::node_status_api::models::{ GatewayStatusReport, GatewayUptimeHistory, MixnodeStatusReport, MixnodeUptimeHistory, - NodeStatusApiError, Uptime, + NodeStatusApiError, }; use crate::node_status_api::{ONE_DAY, ONE_HOUR}; use crate::storage::manager::StorageManager; -use crate::storage::models::NodeStatus; +use crate::storage::models::{ + EpochRewarding, FailedGatewayRewardChunk, FailedMixnodeRewardChunk, NodeStatus, + PossiblyUnrewardedGateway, PossiblyUnrewardedMixnode, RewardingReport, +}; use rocket::fairing::{self, AdHoc}; use rocket::{Build, Rocket}; -use sqlx::types::time::OffsetDateTime; use sqlx::ConnectOptions; use std::path::PathBuf; +use time::OffsetDateTime; pub(crate) mod manager; pub(crate) mod models; // A type alias to be more explicit about type of timestamp used. -type UnixTimestamp = i64; +pub(crate) type UnixTimestamp = i64; // note that clone here is fine as upon cloning the same underlying pool will be used #[derive(Clone)] @@ -294,32 +297,38 @@ impl NodeStatusStorage { )) } - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually - pub(crate) async fn get_all_mixnode_reports( + /// Obtain status reports of mixnodes that were active in the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `end`: unix timestamp indicating the upper bound interval of the selection. + // NOTE: even though the arguments would suggest this function is generic in regards to + // epoch length, the constructed reports still assume the epochs are 24h in length. + pub(crate) async fn get_all_active_mixnode_reports_in_interval( &self, + start: UnixTimestamp, + end: UnixTimestamp, ) -> Result, NodeStatusApiError> { - let now = OffsetDateTime::now_utc(); - let day_ago = (now - ONE_DAY).unix_timestamp(); - let hour_ago = (now - ONE_HOUR).unix_timestamp(); + if (end - start) as u64 != ONE_DAY.as_secs() { + warn!("Our current epoch length breaks the 24h length assumption") + } + + let hour_ago = end - ONE_HOUR.as_secs() as i64; // determine the number of runs the mixnodes should have been online for - let last_hour_runs_count = self - .get_monitor_runs_count(hour_ago, now.unix_timestamp()) - .await?; - let last_day_runs_count = self - .get_monitor_runs_count(day_ago, now.unix_timestamp()) - .await?; + let last_hour_runs_count = self.get_monitor_runs_count(hour_ago, end).await?; + let last_day_runs_count = self.get_monitor_runs_count(start, end).await?; let reports = self .manager - .get_all_active_mixnodes_statuses(day_ago) + .get_all_active_mixnodes_statuses_in_interval(start, end) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)? .into_iter() .map(|statuses| { MixnodeStatusReport::construct_from_last_day_reports( - now, + OffsetDateTime::from_unix_timestamp(end).unwrap(), statuses.identity, statuses.owner, statuses.ipv4_statuses, @@ -333,32 +342,38 @@ impl NodeStatusStorage { Ok(reports) } - // NOTE: this method will go away once we move payments into the validator-api - // it just helps us to get rid of having to query for reports of each node individually - pub(crate) async fn get_all_gateway_reports( + /// Obtain status reports of gateways that were active in the specified time interval. + /// + /// # Arguments + /// + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `end`: unix timestamp indicating the upper bound interval of the selection. + // NOTE: even though the arguments would suggest this function is generic in regards to + // epoch length, the constructed reports still assume the epochs are 24h in length. + pub(crate) async fn get_all_active_gateway_reports_in_interval( &self, + start: UnixTimestamp, + end: UnixTimestamp, ) -> Result, NodeStatusApiError> { - let now = OffsetDateTime::now_utc(); - let day_ago = (now - ONE_DAY).unix_timestamp(); - let hour_ago = (now - ONE_HOUR).unix_timestamp(); + if (end - start) as u64 != ONE_DAY.as_secs() { + warn!("Our current epoch length breaks the 24h length assumption") + } - // determine the number of runs the gateways should have been online for - let last_hour_runs_count = self - .get_monitor_runs_count(hour_ago, now.unix_timestamp()) - .await?; - let last_day_runs_count = self - .get_monitor_runs_count(day_ago, now.unix_timestamp()) - .await?; + let hour_ago = end - ONE_HOUR.as_secs() as i64; + + // determine the number of runs the mixnodes should have been online for + let last_hour_runs_count = self.get_monitor_runs_count(hour_ago, end).await?; + let last_day_runs_count = self.get_monitor_runs_count(start, end).await?; let reports = self .manager - .get_all_active_gateways_statuses(day_ago) + .get_all_active_gateways_statuses_in_interval(start, end) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)? .into_iter() .map(|statuses| { GatewayStatusReport::construct_from_last_day_reports( - now, + OffsetDateTime::from_unix_timestamp(end).unwrap(), statuses.identity, statuses.owner, statuses.ipv4_statuses, @@ -428,87 +443,79 @@ impl NodeStatusStorage { Ok(run_count as usize) } - // Called on timer/reward script - async fn update_historical_uptimes( + /// Given lists of reports of all active mixnodes and gateways, inserts the data into the + /// historical uptime tables. + /// + /// This method is called at every reward cycle. Note that currently to work as expected, it + /// assumes a 24h epoch period. If this assumption is broken, this method should be called + /// on an independent timer. + /// + /// # Arguments + /// + /// * `today_iso_8601`: today's date expressed in ISO 8601, i.e. YYYY-MM-DD + /// * `mixnode_reports`: slice of reports for all active mixnodes + /// * `gateway_reports`: slice of reports for all active gateways + pub(crate) async fn update_historical_uptimes( &self, today_iso_8601: &str, + mixnode_reports: &[MixnodeStatusReport], + gateway_reports: &[GatewayStatusReport], ) -> Result<(), NodeStatusApiError> { - let now = OffsetDateTime::now_utc(); - let day_ago = (now - ONE_DAY).unix_timestamp(); - - // get statuses for all active mixnodes... - let active_mixnodes_statuses = self - .manager - .get_all_active_mixnodes_statuses(day_ago) - .await - .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; + for report in mixnode_reports { + // if this ever fails, we have a super weird error because we just constructed report for that node + // and we never delete node data! + let node_id = match self + .manager + .get_mixnode_id(&report.identity) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError)? + { + Some(node_id) => node_id, + None => { + error!( + "Somehow we failed to grab id of mixnode {} from the database!", + &report.identity + ); + continue; + } + }; - for statuses in active_mixnodes_statuses.into_iter() { - let ipv4_day_up = statuses - .ipv4_statuses - .iter() - .filter(|status| status.up) - .count(); - let ipv6_day_up = statuses - .ipv6_statuses - .iter() - .filter(|status| status.up) - .count(); - - // calculate their uptimes for the last 24h - let ipv4_uptime = Uptime::from_ratio(ipv4_day_up, statuses.ipv4_statuses.len()) - .unwrap() - .u8(); - let ipv6_uptime = Uptime::from_ratio(ipv6_day_up, statuses.ipv6_statuses.len()) - .unwrap() - .u8(); - - // and insert into the database self.manager .insert_mixnode_historical_uptime( - statuses.node_id, + node_id, today_iso_8601, - ipv4_uptime, - ipv6_uptime, + report.last_day_ipv4.u8(), + report.last_day_ipv4.u8(), ) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; } - // get statuses for all active gateways... - let active_gateways_statuses = self - .manager - .get_all_active_gateways_statuses(day_ago) - .await - .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; + for report in gateway_reports { + // if this ever fails, we have a super weird error because we just constructed report for that node + // and we never delete node data! + let node_id = match self + .manager + .get_gateway_id(&report.identity) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError)? + { + Some(node_id) => node_id, + None => { + error!( + "Somehow we failed to grab id of gateway {} from the database!", + &report.identity + ); + continue; + } + }; - for statuses in active_gateways_statuses.into_iter() { - let ipv4_day_up = statuses - .ipv4_statuses - .iter() - .filter(|status| status.up) - .count(); - let ipv6_day_up = statuses - .ipv6_statuses - .iter() - .filter(|status| status.up) - .count(); - - // calculate their uptimes for the last 24h - let ipv4_uptime = Uptime::from_ratio(ipv4_day_up, statuses.ipv4_statuses.len()) - .unwrap() - .u8(); - let ipv6_uptime = Uptime::from_ratio(ipv6_day_up, statuses.ipv6_statuses.len()) - .unwrap() - .u8(); - - // and insert into the database self.manager .insert_gateway_historical_uptime( - statuses.node_id, + node_id, today_iso_8601, - ipv4_uptime, - ipv6_uptime, + report.last_day_ipv4.u8(), + report.last_day_ipv4.u8(), ) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; @@ -517,7 +524,7 @@ impl NodeStatusStorage { Ok(()) } - async fn check_if_historical_uptimes_exist_for_date( + pub(crate) async fn check_if_historical_uptimes_exist_for_date( &self, date_iso_8601: &str, ) -> Result { @@ -527,45 +534,163 @@ impl NodeStatusStorage { .map_err(|_| NodeStatusApiError::InternalDatabaseError) } - // Called on timer/reward script - async fn purge_old_statuses(&self) -> Result<(), NodeStatusApiError> { - let now = OffsetDateTime::now_utc(); - let two_days_ago = (now - 2 * ONE_DAY).unix_timestamp(); - + /// Removes all ipv4 and ipv6 statuses for all mixnodes and gateways that are older than the + /// provided timestamp. This method is called at every reward cycle. + /// + /// # Arguments + /// + /// * `until`: timestamp specifying the purge cutoff. + pub(crate) async fn purge_old_statuses( + &self, + until: UnixTimestamp, + ) -> Result<(), NodeStatusApiError> { self.manager - .purge_old_mixnode_ipv4_statuses(two_days_ago) + .purge_old_mixnode_ipv4_statuses(until) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; self.manager - .purge_old_mixnode_ipv6_statuses(two_days_ago) + .purge_old_mixnode_ipv6_statuses(until) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; self.manager - .purge_old_gateway_ipv4_statuses(two_days_ago) + .purge_old_gateway_ipv4_statuses(until) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; self.manager - .purge_old_gateway_ipv6_statuses(two_days_ago) + .purge_old_gateway_ipv6_statuses(until) .await .map_err(|_| NodeStatusApiError::InternalDatabaseError) } - pub(crate) async fn daily_chores(&self) -> Result { - let today_iso_8601 = OffsetDateTime::now_utc().date().to_string(); - - // if we have already performed the update for today's date, don't do anything - if self - .check_if_historical_uptimes_exist_for_date(&today_iso_8601) - .await? - { - Ok(false) - } else { - info!( - "Updating historical daily uptimes of all nodes and purging old status reports..." - ); - self.update_historical_uptimes(&today_iso_8601).await?; - self.purge_old_statuses().await?; - Ok(true) - } + //////////////////////////////////////////////////////////////////////// + // TODO: Should all of the below really return a "NodeStatusApi" Errors? + //////////////////////////////////////////////////////////////////////// + + /// Inserts information about starting new epoch rewarding into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `epoch_timestamp`: Unix timestamp of this rewarding epoch. + pub(crate) async fn insert_started_epoch_rewarding( + &self, + epoch_timestamp: UnixTimestamp, + ) -> Result { + self.manager + .insert_new_epoch_rewarding(epoch_timestamp) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + // /// Tries to obtain the most recent epoch rewarding entry currently stored. + // /// + // /// Returns None if no data exists. + // pub(crate) async fn get_most_recent_epoch_rewarding_entry( + // &self, + // ) -> Result, NodeStatusApiError> { + // self.manager + // .get_most_recent_epoch_rewarding_entry() + // .await + // .map_err(|_| NodeStatusApiError::InternalDatabaseError) + // } + + /// Tries to obtain the epoch rewarding entry that has the provided timestamp. + /// + /// Returns None if no data exists. + /// + /// # Arguments + /// + /// * `epoch_timestamp`: Unix timestamp of this rewarding epoch. + pub(super) async fn get_epoch_rewarding_entry( + &self, + epoch_timestamp: UnixTimestamp, + ) -> Result, NodeStatusApiError> { + self.manager + .get_epoch_rewarding_entry(epoch_timestamp) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + /// Sets the `finished` field on the epoch rewarding to true and inserts the rewarding report into + /// the database. + /// + /// # Arguments + /// + /// * `report`: report to insert into the database + pub(crate) async fn finish_rewarding_epoch_and_insert_report( + &self, + report: RewardingReport, + ) -> Result<(), NodeStatusApiError> { + self.manager + .update_finished_epoch_rewarding(report.epoch_rewarding_id) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError)?; + + self.manager + .insert_rewarding_report(report) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + /// Inserts new failed mixnode reward chunk information into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `failed_chunk`: chunk information to insert. + pub(crate) async fn insert_failed_mixnode_reward_chunk( + &self, + failed_chunk: FailedMixnodeRewardChunk, + ) -> Result { + self.manager + .insert_failed_mixnode_reward_chunk(failed_chunk) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + /// Inserts new failed gateway reward chunk information into the database. + /// Returns id of the newly created entry. + /// + /// # Arguments + /// + /// * `failed_chunk`: chunk information to insert. + pub(crate) async fn insert_failed_gateway_reward_chunk( + &self, + failed_chunk: FailedGatewayRewardChunk, + ) -> Result { + self.manager + .insert_failed_gateway_reward_chunk(failed_chunk) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + /// Inserts information into the database about a mixnode that might have been unfairly unrewarded this epoch. + /// + /// # Arguments + /// + /// * `mixnode`: mixnode information to insert. + pub(crate) async fn insert_possibly_unrewarded_mixnode( + &self, + mixnode: PossiblyUnrewardedMixnode, + ) -> Result<(), NodeStatusApiError> { + self.manager + .insert_possibly_unrewarded_mixnode(mixnode) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) + } + + /// Inserts information into the database about a gateway that might have been unfairly unrewarded this epoch. + /// + /// # Arguments + /// + /// * `gateway`: mixnode information to insert. + pub(crate) async fn insert_possibly_unrewarded_gateway( + &self, + gateway: PossiblyUnrewardedGateway, + ) -> Result<(), NodeStatusApiError> { + self.manager + .insert_possibly_unrewarded_gateway(gateway) + .await + .map_err(|_| NodeStatusApiError::InternalDatabaseError) } } diff --git a/validator-api/src/storage/models.rs b/validator-api/src/storage/models.rs index a83a3ad66f..8c878ca85d 100644 --- a/validator-api/src/storage/models.rs +++ b/validator-api/src/storage/models.rs @@ -1,9 +1,11 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::storage::UnixTimestamp; + // Internally used struct to catch results from the database to calculate uptimes for given mixnode/gateway pub(crate) struct NodeStatus { - pub(crate) timestamp: i64, + pub(crate) timestamp: UnixTimestamp, pub(crate) up: bool, } @@ -13,3 +15,48 @@ pub(crate) struct ActiveNode { pub(crate) identity: String, pub(crate) owner: String, } + +pub(crate) struct EpochRewarding { + #[allow(dead_code)] + pub(crate) id: i64, + #[allow(dead_code)] + pub(crate) epoch_timestamp: i64, + pub(crate) finished: bool, +} + +pub(crate) struct RewardingReport { + // references particular epoch_rewarding + pub(crate) epoch_rewarding_id: i64, + + pub(crate) eligible_mixnodes: i64, + pub(crate) eligible_gateways: i64, + + pub(crate) possibly_unrewarded_mixnodes: i64, + pub(crate) possibly_unrewarded_gateways: i64, +} + +pub(crate) struct FailedMixnodeRewardChunk { + // references particular epoch_rewarding (there can be multiple chunks in a rewarding epoch) + pub(crate) epoch_rewarding_id: i64, + pub(crate) error_message: String, +} + +pub(crate) struct PossiblyUnrewardedMixnode { + // references particular FailedMixnodeRewardChunk (there can be multiple nodes in a chunk) + pub(crate) chunk_id: i64, + pub(crate) identity: String, + pub(crate) uptime: u8, +} + +pub(crate) struct FailedGatewayRewardChunk { + // references particular epoch_rewarding (there can be multiple chunks in a rewarding epoch) + pub(crate) epoch_rewarding_id: i64, + pub(crate) error_message: String, +} + +pub(crate) struct PossiblyUnrewardedGateway { + // references particular FailedGatewayRewardChunk (there can be multiple nodes in a chunk) + pub(crate) chunk_id: i64, + pub(crate) identity: String, + pub(crate) uptime: u8, +} diff --git a/wallet-web/pages/_app.tsx b/wallet-web/pages/_app.tsx index 0cce398e52..9d95f386d9 100644 --- a/wallet-web/pages/_app.tsx +++ b/wallet-web/pages/_app.tsx @@ -5,7 +5,6 @@ import CssBaseline from '@material-ui/core/CssBaseline' import { theme } from '../lib/theme' import type { AppProps } from 'next/app' import { ValidatorClientContext } from '../contexts/ValidatorClient' -import { AppAlert } from '../components/AppAlert' // TODO: should it perhaps be pulled from some config or also user provided? export const BONDING_CONTRACT_ADDRESS: string = 'punk10pyejy66429refv3g35g2t7am0was7yalwrzen' @@ -24,7 +23,6 @@ export default function Application(props: AppProps) { const { Component, pageProps } = props const [client, setClient] = useState(null) - const [showAlert, setShowAlert] = useState(true) React.useEffect(() => { const jssStyles = document.querySelector('#jss-server-side')

f&Sge|g=d@YG`=vyWe;Fn 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%0Ac5SfSh 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