Commit d1fd5894 authored by tom's avatar tom

Merge branch 'main' of github.com:blockscout/frontend into token/add-to-custom-wallet

parents 1929d165 271e351c
...@@ -10,9 +10,10 @@ NEXT_PUBLIC_AUTH_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_AUTH_URL__ ...@@ -10,9 +10,10 @@ NEXT_PUBLIC_AUTH_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_AUTH_URL__
NEXT_PUBLIC_NETWORK_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_NAME__ NEXT_PUBLIC_NETWORK_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_NAME__
NEXT_PUBLIC_NETWORK_SHORT_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_SHORT_NAME__ NEXT_PUBLIC_NETWORK_SHORT_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_SHORT_NAME__
NEXT_PUBLIC_NETWORK_LOGO=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_LOGO__ NEXT_PUBLIC_NETWORK_LOGO=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_LOGO__
NEXT_PUBLIC_NETWORK_SMALL_LOGO=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_SMALL_LOGO__ NEXT_PUBLIC_NETWORK_LOGO_DARK=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_LOGO_DARK__
NEXT_PUBLIC_NETWORK_ICON=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ICON__
NEXT_PUBLIC_NETWORK_ICON_DARK=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ICON_DARK__
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME__ NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME__
NEXT_PUBLIC_NETWORK_TYPE=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_TYPE__
NEXT_PUBLIC_NETWORK_ID=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ID__ NEXT_PUBLIC_NETWORK_ID=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_ID__
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_CURRENCY_NAME__ NEXT_PUBLIC_NETWORK_CURRENCY_NAME=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_CURRENCY_NAME__
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL__ NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL__
...@@ -31,11 +32,12 @@ NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=__PLACEHOLDER_FOR_NEXT_PUBLIC_FOOTER_TELEGRAM_L ...@@ -31,11 +32,12 @@ NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=__PLACEHOLDER_FOR_NEXT_PUBLIC_FOOTER_TELEGRAM_L
NEXT_PUBLIC_FOOTER_STAKING_LINK=__PLACEHOLDER_FOR_NEXT_PUBLIC_FOOTER_STAKING_LINK__ NEXT_PUBLIC_FOOTER_STAKING_LINK=__PLACEHOLDER_FOR_NEXT_PUBLIC_FOOTER_STAKING_LINK__
NEXT_PUBLIC_FEATURED_NETWORKS=__PLACEHOLDER_FOR_NEXT_PUBLIC_FEATURED_NETWORKS__ NEXT_PUBLIC_FEATURED_NETWORKS=__PLACEHOLDER_FOR_NEXT_PUBLIC_FEATURED_NETWORKS__
NEXT_PUBLIC_NETWORK_EXPLORERS=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_EXPLORERS__ NEXT_PUBLIC_NETWORK_EXPLORERS=__PLACEHOLDER_FOR_NEXT_PUBLIC_NETWORK_EXPLORERS__
NEXT_PUBLIC_MARKETPLACE_APP_LIST=__PLACEHOLDER_FOR_NEXT_PUBLIC_MARKETPLACE_APP_LIST__ NEXT_PUBLIC_MARKETPLACE_CONFIG_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_MARKETPLACE_CONFIG_URL__
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=__PLACEHOLDER_FOR_NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM__ NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=__PLACEHOLDER_FOR_NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM__
NEXT_PUBLIC_LOGOUT_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_LOGOUT_URL__ NEXT_PUBLIC_LOGOUT_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_LOGOUT_URL__
NEXT_PUBLIC_LOGOUT_RETURN_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_LOGOUT_RETURN_URL__ NEXT_PUBLIC_LOGOUT_RETURN_URL=__PLACEHOLDER_FOR_NEXT_PUBLIC_LOGOUT_RETURN_URL__
NEXT_PUBLIC_HOMEPAGE_CHARTS=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_CHARTS__ NEXT_PUBLIC_HOMEPAGE_CHARTS=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_CHARTS__
NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR__
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT__ NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT__
NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER__ NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER__
NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME__ NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME=__PLACEHOLDER_FOR_NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME__
......
...@@ -365,6 +365,7 @@ ...@@ -365,6 +365,7 @@
"options": [ "options": [
"", "",
"--update-snapshots", "--update-snapshots",
"--ui",
], ],
"default": "" "default": ""
}, },
......
/* eslint-disable no-restricted-properties */ /* eslint-disable no-restricted-properties */
import type { AppItemOverview } from 'types/client/apps';
import type { WalletType } from 'types/client/wallets'; import type { WalletType } from 'types/client/wallets';
import type { FeaturedNetwork, NetworkExplorer, PreDefinedNetwork } from 'types/networks'; import type { NetworkExplorer } from 'types/networks';
import type { ChainIndicatorId } from 'ui/home/indicators/types'; import type { ChainIndicatorId } from 'ui/home/indicators/types';
import { SUPPORTED_WALLETS } from 'lib/web3/wallets'; import { SUPPORTED_WALLETS } from 'lib/web3/wallets';
...@@ -67,9 +66,14 @@ const config = Object.freeze({ ...@@ -67,9 +66,14 @@ const config = Object.freeze({
env, env,
isDev, isDev,
network: { network: {
type: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_TYPE) as PreDefinedNetwork | undefined, logo: {
logo: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_LOGO), 'default': getEnvValue(process.env.NEXT_PUBLIC_NETWORK_LOGO),
smallLogo: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_SMALL_LOGO), dark: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_LOGO_DARK),
},
icon: {
'default': getEnvValue(process.env.NEXT_PUBLIC_NETWORK_ICON),
dark: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_ICON_DARK),
},
name: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_NAME), name: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_NAME),
id: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_ID), id: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_ID),
shortName: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_SHORT_NAME), shortName: getEnvValue(process.env.NEXT_PUBLIC_NETWORK_SHORT_NAME),
...@@ -91,10 +95,10 @@ const config = Object.freeze({ ...@@ -91,10 +95,10 @@ const config = Object.freeze({
telegram: getEnvValue(process.env.NEXT_PUBLIC_FOOTER_TELEGRAM_LINK), telegram: getEnvValue(process.env.NEXT_PUBLIC_FOOTER_TELEGRAM_LINK),
staking: getEnvValue(process.env.NEXT_PUBLIC_FOOTER_STAKING_LINK), staking: getEnvValue(process.env.NEXT_PUBLIC_FOOTER_STAKING_LINK),
}, },
featuredNetworks: parseEnvJson<Array<FeaturedNetwork>>(getEnvValue(process.env.NEXT_PUBLIC_FEATURED_NETWORKS)) || [], featuredNetworks: getEnvValue(process.env.NEXT_PUBLIC_FEATURED_NETWORKS),
blockScoutVersion: getEnvValue(process.env.NEXT_PUBLIC_BLOCKSCOUT_VERSION), blockScoutVersion: getEnvValue(process.env.NEXT_PUBLIC_BLOCKSCOUT_VERSION),
isAccountSupported: getEnvValue(process.env.NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED) === 'true', isAccountSupported: getEnvValue(process.env.NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED) === 'true',
marketplaceAppList: parseEnvJson<Array<AppItemOverview>>(getEnvValue(process.env.NEXT_PUBLIC_MARKETPLACE_APP_LIST)) || [], marketplaceConfigUrl: getEnvValue(process.env.NEXT_PUBLIC_MARKETPLACE_CONFIG_URL),
marketplaceSubmitForm: getEnvValue(process.env.NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM), marketplaceSubmitForm: getEnvValue(process.env.NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM),
protocol: appSchema, protocol: appSchema,
host: appHost, host: appHost,
...@@ -130,8 +134,11 @@ const config = Object.freeze({ ...@@ -130,8 +134,11 @@ const config = Object.freeze({
}, },
homepage: { homepage: {
charts: parseEnvJson<Array<ChainIndicatorId>>(getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_CHARTS)) || [], charts: parseEnvJson<Array<ChainIndicatorId>>(getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_CHARTS)) || [],
plateGradient: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT) || plate: {
gradient: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT) ||
'radial-gradient(103.03% 103.03% at 0% 0%, rgba(183, 148, 244, 0.8) 0%, rgba(0, 163, 196, 0.8) 100%)', 'radial-gradient(103.03% 103.03% at 0% 0%, rgba(183, 148, 244, 0.8) 0%, rgba(0, 163, 196, 0.8) 100%)',
textColor: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR) || 'white',
},
showGasTracker: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER) === 'false' ? false : true, showGasTracker: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER) === 'false' ? false : true,
showAvgBlockTime: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME) === 'false' ? false : true, showAvgBlockTime: getEnvValue(process.env.NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME) === 'false' ? false : true,
}, },
......
...@@ -11,7 +11,6 @@ NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout ...@@ -11,7 +11,6 @@ NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout
NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom
NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
# api config # api config
NEXT_PUBLIC_API_HOST=blockscout.com NEXT_PUBLIC_API_HOST=blockscout.com
NEXT_PUBLIC_STATS_API_HOST=https://stats-test.aws-k8s.blockscout.com NEXT_PUBLIC_STATS_API_HOST=https://stats-test.aws-k8s.blockscout.com
......
# ui config # ui config
NEXT_PUBLIC_FEATURED_NETWORKS=[{'title':'Ethereum','url':'https://blockscout.com/eth/mainnet','group':'mainnets','type':'eth_mainnet'},{'title':'Ethereum Classic','url':'https://blockscout.com/etx/mainnet','group':'mainnets','type':'etc_mainnet'},{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets','type':'xdai_mainnet'},{'title':'Astar (EVM)','url':'https://blockscout.com/astar','group':'mainnets','type':'astar'},{'title':'Shiden (EVM)','url':'https://blockscout.com/shiden','group':'mainnets','type':'astar'},{'title':'Klaytn Mainnet (Cypress)','url':'https://klaytn-mainnet.aws-k8s.blockscout.com/','group':'mainnets','type':'klaytn'},{'title':'Goerli','url':'https://blockscout.com/eth/goerli/','group':'testnets','type':'goerli'},{'title':'Optimism Goerli','url':'https://blockscout.com/optimism/goerli/','group':'testnets','type':'optimism_goerli'},{'title':'Optimism Bedrock Alpha','url':'https://blockscout.com/optimism/bedrock-alpha','group':'testnets','type':'optimism_bedrock_alpha'},{'title':'Gnosis Chiado','url':'https://blockscout.com/gnosis/chiado/','group':'testnets','type':'gnosis_chiado'},{'title':'Shibuya (EVM)','url':'https://blockscout.com/shibuya','group':'testnets','type':'shibuya'},{'title':'Optimism Opcraft','url':'https://blockscout.com/optimism/opcraft','group':'other','type':'optimism_opcraft'},{'title':'Optimism on Gnosis Chain','url':'https://blockscout.com/xdai/optimism','group':'other','type':'optimism_gnosis'},{'title':'ARTIS-Σ1','url':'https://blockscout.com/artis/sigma1','group':'other','type':'artis_sigma1'},{'title':'LUKSO L14','url':'https://blockscout.com/lukso/l14','group':'other','type':'lukso_l14'},{'title':'POA','url':'https://blockscout.com/poa/core','group':'other','type':'poa_core'},{'title':'POA Sokol','url':'https://blockscout.com/poa/sokol','group':'other','type':'poa_sokol'}] NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}] NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}]
NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c180997e969a2837da15e349d NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c180997e969a2837da15e349d
...@@ -7,7 +7,8 @@ NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c18099 ...@@ -7,7 +7,8 @@ NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0xf7d4972356e6ae44ae948d0cf19ef2beaf0e574c18099
NEXT_PUBLIC_NETWORK_NAME=Goerli NEXT_PUBLIC_NETWORK_NAME=Goerli
NEXT_PUBLIC_NETWORK_SHORT_NAME=Goerli NEXT_PUBLIC_NETWORK_SHORT_NAME=Goerli
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=ethereum NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=ethereum
NEXT_PUBLIC_NETWORK_TYPE=goerli NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-logos/goerli.svg
NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-icons/goerli.svg
NEXT_PUBLIC_NETWORK_ID=5 NEXT_PUBLIC_NETWORK_ID=5
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH
...@@ -16,8 +17,8 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 ...@@ -16,8 +17,8 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation
NEXT_PUBLIC_NETWORK_RPC_URL=https://rpc.ankr.com/eth_goerli NEXT_PUBLIC_NETWORK_RPC_URL=https://rpc.ankr.com/eth_goerli
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/eth-goerli.json
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST=[{'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'},{'author': 'Revoke','id':'revoke.cash','title':'Revoke.cash','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FVBMGyUFnd6CScjfK7CYQ%252Frevoke_sing.png%3Falt%3Dmedia%26token%3D9ab94986-7ab1-41c8-bf7e-d9ce11d23182','categories':['security','tools'],'shortDescription': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','site': 'https://revoke.cash/about','description': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','url':'https://revoke.cash/'},{'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrZkUTIUCG7Zx8BW6Em34%252FAave.png%3Falt%3Dmedia%26token%3D249797a4-4c1e-4372-9cd2-3e48e05e5f30','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'},{'author':'LooksRare','id':'looksrare','external':true,'title':'LooksRare','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FeAI4gy3qPMt68mZOZHAx%252FLooksRare.png%3Falt%3Dmedia%26token%3D44c01439-ae09-40aa-b904-3a9ce5b2e002','categories':['tools'],'shortDescription': 'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','site':'https://docs.looksrare.org/about/welcome-to-looksrare','description':'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','url': 'https://goerli.looksrare.org/'},{'author':'zkSync Bridge','id':'zksync-bridge','external':true,'title':'zkSync Bridge','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrtQsaAz9BjGBc35tVAnq%252FzkSync.png%3Falt%3Dmedia%26token%3D5c18171c-8ccf-4a88-8f44-680cbf238115','categories':['security','tools'],'shortDescription':'zkSync 2.0 Goerli Bridge','site':'https://v2-docs.zksync.io/dev/','description':'zkSync 2.0 Goerli Bridge','url':'https://portal.zksync.io/bridge'},{'author':'dYdX','id':'dydx','external':true,'title':'dYdX','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FCrOglR72wpi0UhEscwe4%252Fdxdy.png%3Falt%3Dmedia%26token%3D8811909e-93e3-487c-9614-dffce37223e9','categories': ['security','tools'],'shortDescription':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','site':'https://help.dydx.exchange/en/articles/3047379-introduction-and-overview','description':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','url':'https://trade.stage.dydx.exchange/portfolio/overview'},{'author':'MetalSwap','id':'metalswap','title':'MetalSwap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252F8xqldTvxb6avrwVVc3rS%252FMetalSwap.png%3Falt%3Dmedia%26token%3D92d2db99-853a-487d-8d8c-8cdeaeaaf014','categories':['security','tools'],'shortDescription':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','site':'https://docs.metalswap.finance/','description':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','url':'https://demo.metalswap.finance/'},{'author':'FaucetDao','id':'faucetdao','title':'FaucetDao','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252Ffnnt3ZNZhzRwqMM5YYjD%252FPlaceholder.png%3Falt%3Dmedia%26token%3D507571bb-d76f-4d96-a35e-2b278608f7ca','categories':['tools'],'shortDescription':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','site':'https://linktr.ee/faucet_dao','description':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','url':'https://www.faucetdao.shop/swap?chain=goerli'},{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FJc0QAyeaBmFIL97tSmGv%252FUniswap.png%3Falt%3Dmedia%26token%3D5d25d796-c273-4e22-92fa-ff85206bec76','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}]
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs'] NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs']
NEXT_PUBLIC_IS_TESTNET=true NEXT_PUBLIC_IS_TESTNET=true
......
# ui config # ui config
NEXT_PUBLIC_FEATURED_NETWORKS=[{'title':'Göerli','url':'https://eth-goerli.blockscout.com/','group':'testnets','type':'goerli'},{'title':'Base Göerli','url':'https://l2-goerli.blockscout.com/','group':'testnets','type':'base_goerli'}] NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/base-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS= NEXT_PUBLIC_NETWORK_EXPLORERS=
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=linear-gradient(136.9deg,rgb(107 94 236) 1.5%,rgb(0 82 255) 56.84%,rgb(82 62 231) 98.54%) NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=linear-gradient(136.9deg,rgb(107 94 236) 1.5%,rgb(0 82 255) 56.84%,rgb(82 62 231) 98.54%)
NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0x4a0ed8ddf751a7cb5297f827699117b0f6d21a0b2907594d300dc9fed75c7e62 NEXT_PUBLIC_GRAPHIQL_TRANSACTION=0x4a0ed8ddf751a7cb5297f827699117b0f6d21a0b2907594d300dc9fed75c7e62
...@@ -9,7 +9,8 @@ NEXT_PUBLIC_WEB3_DEFAULT_WALLET=coinbase ...@@ -9,7 +9,8 @@ NEXT_PUBLIC_WEB3_DEFAULT_WALLET=coinbase
NEXT_PUBLIC_NETWORK_NAME=Base Göerli NEXT_PUBLIC_NETWORK_NAME=Base Göerli
NEXT_PUBLIC_NETWORK_SHORT_NAME=Base NEXT_PUBLIC_NETWORK_SHORT_NAME=Base
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=optimism NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=optimism
NEXT_PUBLIC_NETWORK_TYPE=base_goerli NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-logos/base.svg
NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-icons/base.svg
NEXT_PUBLIC_NETWORK_ID=420 NEXT_PUBLIC_NETWORK_ID=420
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH
...@@ -18,8 +19,8 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS= ...@@ -18,8 +19,8 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation
NEXT_PUBLIC_NETWORK_RPC_URL=https://goerli.optimism.io NEXT_PUBLIC_NETWORK_RPC_URL=https://goerli.optimism.io
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/base-goerli.json
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST=[{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FT8RR0UqqvH6wAVfaaM4f%252FUniswap.png%3Falt%3Dmedia%26token%3D797851a0-2d80-4f7b-8d80-f9ba664c0b3d','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}, {'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FaNQY8jHNue30P2caV79v%252FAave.png%3Falt%3Dmedia%26token%3Dda9ea09b-a5d8-4bf1-bdfe-41837eebdd03','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'}, {'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'}]
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs'] NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs']
NEXT_PUBLIC_IS_TESTNET=true NEXT_PUBLIC_IS_TESTNET=true
......
...@@ -11,19 +11,15 @@ NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=https://t.me/poa_network ...@@ -11,19 +11,15 @@ NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=https://t.me/poa_network
NEXT_PUBLIC_FOOTER_STAKING_LINK=https://duneanalytics.com/maxaleks/xdai-staking NEXT_PUBLIC_FOOTER_STAKING_LINK=https://duneanalytics.com/maxaleks/xdai-staking
NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout
NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom
NEXT_PUBLIC_FEATURED_NETWORKS=[{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets','type':'xdai_mainnet'},{'title':'Optimism on Gnosis Chain','url':'https://blockscout.com/xdai/optimism','group':'mainnets','type':'xdai_optimism'},{'title':'Arbitrum on xDai','url':'https://blockscout.com/xdai/aox','group':'mainnets'},{'title':'Ethereum','url':'https://blockscout.com/eth/mainnet','group':'mainnets','type':'eth_mainnet'},{'title':'Ethereum Classic','url':'https://blockscout.com/etx/mainnet','group':'mainnets','type':'etc_mainnet'},{'title':'POA','url':'https://blockscout.com/poa/core','group':'mainnets','type':'poa_core'},{'title':'RSK','url':'https://blockscout.com/rsk/mainnet','group':'mainnets','type':'rsk_mainnet'},{'title':'Gnosis Chain Testnet','url':'https://blockscout.com/xdai/testnet','group':'testnets','type':'xdai_testnet'},{'title':'POA Sokol','url':'https://blockscout.com/poa/sokol','group':'testnets','type':'poa_sokol'},{'title':'ARTIS Σ1','url':'https://blockscout.com/artis/sigma1','group':'other','type':'artis_sigma1'},{'title':'LUKSO L14','url':'https://blockscout.com/lukso/l14','group':'other','type':'lukso_l14'},{'title':'Astar','url':'https://blockscout.com/astar','group':'other','type':'astar'}] NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/transaction','address':'/ethereum/poa/core/address'}}] NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/transaction','address':'/ethereum/poa/core/address'}}]
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs','coin_price','market_cup'] NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs','coin_price','market_cup']
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=radial-gradient(at 12% 37%, hsla(324,73%,67%,1) 0px, transparent 50%), radial-gradient(at 62% 14%, hsla(256,87%,73%,1) 0px, transparent 50%), radial-gradient(at 84% 80%, hsla(128,75%,73%,1) 0px, transparent 50%), radial-gradient(at 57% 46%, hsla(285,63%,72%,1) 0px, transparent 50%), radial-gradient(at 37% 30%, hsla(174,70%,61%,1) 0px, transparent 50%), radial-gradient(at 15% 86%, hsla(350,65%,70%,1) 0px, transparent 50%), radial-gradient(at 67% 57%, hsla(14,95%,76%,1) 0px, transparent 50%)
#NEXT_PUBLIC_NETWORK_LOGO=https://placekitten.com/300/60
#NEXT_PUBLIC_NETWORK_SMALL_LOGO=https://placekitten.com/300/300
NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
# network config # network config
NEXT_PUBLIC_NETWORK_NAME=POA NEXT_PUBLIC_NETWORK_NAME=POA
NEXT_PUBLIC_NETWORK_SHORT_NAME=POA NEXT_PUBLIC_NETWORK_SHORT_NAME=POA
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=poa NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=poa
NEXT_PUBLIC_NETWORK_TYPE=poa_core
NEXT_PUBLIC_NETWORK_ID=99 NEXT_PUBLIC_NETWORK_ID=99
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=POA NEXT_PUBLIC_NETWORK_CURRENCY_NAME=POA
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=POA NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=POA
...@@ -32,7 +28,6 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=0x029a799563238d0e75e20be2f4bda0ea68d00172 ...@@ -32,7 +28,6 @@ NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=0x029a799563238d0e75e20be2f4bda0ea68d00172
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST=[{'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'},{'author': 'Revoke','id':'revoke.cash','title':'Revoke.cash','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FVBMGyUFnd6CScjfK7CYQ%252Frevoke_sing.png%3Falt%3Dmedia%26token%3D9ab94986-7ab1-41c8-bf7e-d9ce11d23182','categories':['security','tools'],'shortDescription': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','site': 'https://revoke.cash/about','description': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','url':'https://revoke.cash/'},{'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrZkUTIUCG7Zx8BW6Em34%252FAave.png%3Falt%3Dmedia%26token%3D249797a4-4c1e-4372-9cd2-3e48e05e5f30','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'},{'author':'LooksRare','id':'looksrare','external':true,'title':'LooksRare','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FeAI4gy3qPMt68mZOZHAx%252FLooksRare.png%3Falt%3Dmedia%26token%3D44c01439-ae09-40aa-b904-3a9ce5b2e002','categories':['tools'],'shortDescription': 'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','site':'https://docs.looksrare.org/about/welcome-to-looksrare','description':'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','url': 'https://goerli.looksrare.org/'},{'author':'zkSync Bridge','id':'zksync-bridge','external':true,'title':'zkSync Bridge','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrtQsaAz9BjGBc35tVAnq%252FzkSync.png%3Falt%3Dmedia%26token%3D5c18171c-8ccf-4a88-8f44-680cbf238115','categories':['security','tools'],'shortDescription':'zkSync 2.0 Goerli Bridge','site':'https://v2-docs.zksync.io/dev/','description':'zkSync 2.0 Goerli Bridge','url':'https://portal.zksync.io/bridge'},{'author':'dYdX','id':'dydx','external':true,'title':'dYdX','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FCrOglR72wpi0UhEscwe4%252Fdxdy.png%3Falt%3Dmedia%26token%3D8811909e-93e3-487c-9614-dffce37223e9','categories': ['security','tools'],'shortDescription':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','site':'https://help.dydx.exchange/en/articles/3047379-introduction-and-overview','description':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','url':'https://trade.stage.dydx.exchange/portfolio/overview'},{'author':'MetalSwap','id':'metalswap','title':'MetalSwap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252F8xqldTvxb6avrwVVc3rS%252FMetalSwap.png%3Falt%3Dmedia%26token%3D92d2db99-853a-487d-8d8c-8cdeaeaaf014','categories':['security','tools'],'shortDescription':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','site':'https://docs.metalswap.finance/','description':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','url':'https://demo.metalswap.finance/'},{'author':'FaucetDao','id':'faucetdao','title':'FaucetDao','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252Ffnnt3ZNZhzRwqMM5YYjD%252FPlaceholder.png%3Falt%3Dmedia%26token%3D507571bb-d76f-4d96-a35e-2b278608f7ca','categories':['tools'],'shortDescription':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','site':'https://linktr.ee/faucet_dao','description':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','url':'https://www.faucetdao.shop/swap?chain=goerli'},{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FJc0QAyeaBmFIL97tSmGv%252FUniswap.png%3Falt%3Dmedia%26token%3D5d25d796-c273-4e22-92fa-ff85206bec76','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}]
NEXT_PUBLIC_NETWORK_RPC_URL=https://core.poa.network NEXT_PUBLIC_NETWORK_RPC_URL=https://core.poa.network
# api config # api config
......
# ui config # ui config
NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=https://t.me/poa_network NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=https://t.me/poa_network
NEXT_PUBLIC_FOOTER_STAKING_LINK=https://duneanalytics.com/maxaleks/xdai-staking NEXT_PUBLIC_FOOTER_STAKING_LINK=https://duneanalytics.com/maxaleks/xdai-staking
NEXT_PUBLIC_FEATURED_NETWORKS=[{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets','type':'xdai_mainnet'},{'title':'Optimism on Gnosis Chain','url':'https://blockscout.com/xdai/optimism','group':'mainnets','type':'xdai_optimism'},{'title':'Arbitrum on xDai','url':'https://blockscout.com/xdai/aox','group':'mainnets'},{'title':'Ethereum','url':'https://blockscout.com/eth/mainnet','group':'mainnets','type':'eth_mainnet'},{'title':'Ethereum Classic','url':'https://blockscout.com/etx/mainnet','group':'mainnets','type':'etc_mainnet'},{'title':'POA','url':'https://blockscout.com/poa/core','group':'mainnets','type':'poa_core'},{'title':'RSK','url':'https://blockscout.com/rsk/mainnet','group':'mainnets','type':'rsk_mainnet'},{'title':'Gnosis Chain Testnet','url':'https://blockscout.com/xdai/testnet','group':'testnets','type':'xdai_testnet'},{'title':'POA Sokol','url':'https://blockscout.com/poa/sokol','group':'testnets','type':'poa_sokol'},{'title':'ARTIS Σ1','url':'https://blockscout.com/artis/sigma1','group':'other','type':'artis_sigma1'},{'title':'LUKSO L14','url':'https://blockscout.com/lukso/l14','group':'other','type':'lukso_l14'},{'title':'Astar','url':'https://blockscout.com/astar','group':'other','type':'astar'}] NEXT_PUBLIC_FEATURED_NETWORKS=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/transaction','address':'/ethereum/poa/core/address'}}] NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/transaction','address':'/ethereum/poa/core/address'}}]
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs','coin_price','market_cup'] NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs','coin_price','market_cup']
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT=radial-gradient(at 12% 37%, hsla(324,73%,67%,1) 0px, transparent 50%), radial-gradient(at 62% 14%, hsla(256,87%,73%,1) 0px, transparent 50%), radial-gradient(at 84% 80%, hsla(128,75%,73%,1) 0px, transparent 50%), radial-gradient(at 57% 46%, hsla(285,63%,72%,1) 0px, transparent 50%), radial-gradient(at 37% 30%, hsla(174,70%,61%,1) 0px, transparent 50%), radial-gradient(at 15% 86%, hsla(350,65%,70%,1) 0px, transparent 50%), radial-gradient(at 67% 57%, hsla(14,95%,76%,1) 0px, transparent 50%) #NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT='linear-gradient(136.9deg, #235643 1.5%, #16191E 77.77%)'
#NEXT_PUBLIC_NETWORK_LOGO=https://placekitten.com/300/60 #NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR='#DCFE76'
#NEXT_PUBLIC_NETWORK_SMALL_LOGO=https://placekitten.com/300/300 NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-logos/poa.svg
NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/network-icons/poa.svg
# network config # network config
NEXT_PUBLIC_NETWORK_NAME=POA NEXT_PUBLIC_NETWORK_NAME=POA
NEXT_PUBLIC_NETWORK_SHORT_NAME=POA NEXT_PUBLIC_NETWORK_SHORT_NAME=POA
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=poa NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=poa
NEXT_PUBLIC_NETWORK_TYPE=poa_core
NEXT_PUBLIC_NETWORK_ID=99 NEXT_PUBLIC_NETWORK_ID=99
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=POA NEXT_PUBLIC_NETWORK_CURRENCY_NAME=POA
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=POA NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=POA
...@@ -22,7 +22,6 @@ NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true ...@@ -22,7 +22,6 @@ NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation
NEXT_PUBLIC_NETWORK_RPC_URL=https://core.poa.network NEXT_PUBLIC_NETWORK_RPC_URL=https://core.poa.network
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST=[{'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'},{'author': 'Revoke','id':'revoke.cash','title':'Revoke.cash','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FVBMGyUFnd6CScjfK7CYQ%252Frevoke_sing.png%3Falt%3Dmedia%26token%3D9ab94986-7ab1-41c8-bf7e-d9ce11d23182','categories':['security','tools'],'shortDescription': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','site': 'https://revoke.cash/about','description': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','url':'https://revoke.cash/'},{'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrZkUTIUCG7Zx8BW6Em34%252FAave.png%3Falt%3Dmedia%26token%3D249797a4-4c1e-4372-9cd2-3e48e05e5f30','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'},{'author':'LooksRare','id':'looksrare','external':true,'title':'LooksRare','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FeAI4gy3qPMt68mZOZHAx%252FLooksRare.png%3Falt%3Dmedia%26token%3D44c01439-ae09-40aa-b904-3a9ce5b2e002','categories':['tools'],'shortDescription': 'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','site':'https://docs.looksrare.org/about/welcome-to-looksrare','description':'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','url': 'https://goerli.looksrare.org/'},{'author':'zkSync Bridge','id':'zksync-bridge','external':true,'title':'zkSync Bridge','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrtQsaAz9BjGBc35tVAnq%252FzkSync.png%3Falt%3Dmedia%26token%3D5c18171c-8ccf-4a88-8f44-680cbf238115','categories':['security','tools'],'shortDescription':'zkSync 2.0 Goerli Bridge','site':'https://v2-docs.zksync.io/dev/','description':'zkSync 2.0 Goerli Bridge','url':'https://portal.zksync.io/bridge'},{'author':'dYdX','id':'dydx','external':true,'title':'dYdX','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FCrOglR72wpi0UhEscwe4%252Fdxdy.png%3Falt%3Dmedia%26token%3D8811909e-93e3-487c-9614-dffce37223e9','categories': ['security','tools'],'shortDescription':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','site':'https://help.dydx.exchange/en/articles/3047379-introduction-and-overview','description':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','url':'https://trade.stage.dydx.exchange/portfolio/overview'},{'author':'MetalSwap','id':'metalswap','title':'MetalSwap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252F8xqldTvxb6avrwVVc3rS%252FMetalSwap.png%3Falt%3Dmedia%26token%3D92d2db99-853a-487d-8d8c-8cdeaeaaf014','categories':['security','tools'],'shortDescription':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','site':'https://docs.metalswap.finance/','description':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','url':'https://demo.metalswap.finance/'},{'author':'FaucetDao','id':'faucetdao','title':'FaucetDao','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252Ffnnt3ZNZhzRwqMM5YYjD%252FPlaceholder.png%3Falt%3Dmedia%26token%3D507571bb-d76f-4d96-a35e-2b278608f7ca','categories':['tools'],'shortDescription':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','site':'https://linktr.ee/faucet_dao','description':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','url':'https://www.faucetdao.shop/swap?chain=goerli'},{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FJc0QAyeaBmFIL97tSmGv%252FUniswap.png%3Falt%3Dmedia%26token%3D5d25d796-c273-4e22-92fa-ff85206bec76','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}]
# api config # api config
NEXT_PUBLIC_API_BASE_PATH=/poa/core NEXT_PUBLIC_API_BASE_PATH=/poa/core
...@@ -9,15 +9,37 @@ NEXT_PUBLIC_APP_ENV=testing ...@@ -9,15 +9,37 @@ NEXT_PUBLIC_APP_ENV=testing
NEXT_PUBLIC_BLOCKSCOUT_VERSION=v4.1.7-beta NEXT_PUBLIC_BLOCKSCOUT_VERSION=v4.1.7-beta
NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout NEXT_PUBLIC_FOOTER_GITHUB_LINK=https://github.com/blockscout/blockscout
NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom NEXT_PUBLIC_FOOTER_TWITTER_LINK=https://www.twitter.com/blockscoutcom
NEXT_PUBLIC_FOOTER_TELEGRAM_LINK=https://t.me/poa_network
NEXT_PUBLIC_FOOTER_STAKING_LINK=https://duneanalytics.com/maxaleks/xdai-staking
NEXT_PUBLIC_NETWORK_EXPLORERS=[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/transaction','address':'/ethereum/poa/core/address'}}]
NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs','coin_price','market_cup']
NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME=true NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME=true
NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER=true NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER=true
NEXT_PUBLIC_FEATURED_NETWORKS=
NEXT_PUBLIC_NETWORK_LOGO= NEXT_PUBLIC_NETWORK_LOGO=
NEXT_PUBLIC_NETWORK_SMALL_LOGO= NEXT_PUBLIC_NETWORK_LOGO_DARK=
NEXT_PUBLIC_NETWORK_RPC_URL=https://core.poa.network NEXT_PUBLIC_NETWORK_ICON=
NEXT_PUBLIC_NETWORK_ICON_DARK=
NEXT_PUBLIC_NETWORK_RPC_URL=https://localhost:1111
NEXT_PUBLIC_IS_TESTNET=true NEXT_PUBLIC_IS_TESTNET=true
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL=https://localhost:3000/marketplace-config.json
NEXT_PUBLIC_IS_L2_NETWORK=false NEXT_PUBLIC_IS_L2_NETWORK=false
# network config
NEXT_PUBLIC_NETWORK_NAME=Blockscout
NEXT_PUBLIC_NETWORK_SHORT_NAME=Blockscout
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME=ethereum
NEXT_PUBLIC_NETWORK_ID=1
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18
NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS=
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED=true
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=validation
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://localhost:3000/marketplace-submit-form
# api config # api config
NEXT_PUBLIC_API_HOST=blockscout.com NEXT_PUBLIC_API_HOST=https://localhost:3003
NEXT_PUBLIC_STATS_API_HOST=https://stats-test.aws-k8s.blockscout.com NEXT_PUBLIC_STATS_API_HOST=https://localhost:3004
NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY=xxx NEXT_PUBLIC_RE_CAPTCHA_APP_SITE_KEY=xxx
NEXT_PUBLIC_API_BASE_PATH=/
...@@ -317,10 +317,10 @@ frontend: ...@@ -317,10 +317,10 @@ frontend:
- "/accounts" - "/accounts"
- "/visualize" - "/visualize"
- "/api-docs" - "/api-docs"
- "/output-roots" - "/l2-output-roots"
- "/txn-batches" - "/l2-txn-batches"
- "/withdrawals" - "/l2-withdrawals"
- "/deposits" - "/l2-deposits"
resources: resources:
limits: limits:
memory: memory:
...@@ -349,8 +349,6 @@ frontend: ...@@ -349,8 +349,6 @@ frontend:
_default: Base _default: Base
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME: NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME:
_default: optimism _default: optimism
NEXT_PUBLIC_NETWORK_TYPE:
_default: base_goerli
NEXT_PUBLIC_NETWORK_ID: NEXT_PUBLIC_NETWORK_ID:
_default: 420 _default: 420
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: NEXT_PUBLIC_NETWORK_CURRENCY_NAME:
...@@ -363,8 +361,12 @@ frontend: ...@@ -363,8 +361,12 @@ frontend:
_default: validation _default: validation
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED: NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED:
_default: 'true' _default: 'true'
NEXT_PUBLIC_NETWORK_LOGO:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/base.svg
NEXT_PUBLIC_NETWORK_ICON:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/base.svg
NEXT_PUBLIC_FEATURED_NETWORKS: NEXT_PUBLIC_FEATURED_NETWORKS:
_default: "[{'title':'Göerli','url':'https://eth-goerli.blockscout.com/','group':'testnets','type':'goerli'},{'title':'Base Göerli','url':'https://l2-goerli.blockscout.com/','group':'testnets','type':'base_goerli'}]" _default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/featured-networks/base-goerli.json
NEXT_PUBLIC_API_HOST: NEXT_PUBLIC_API_HOST:
_default: blockscout-optimism-goerli.test.aws-k8s.blockscout.com _default: blockscout-optimism-goerli.test.aws-k8s.blockscout.com
NEXT_PUBLIC_APP_HOST: NEXT_PUBLIC_APP_HOST:
...@@ -373,8 +375,6 @@ frontend: ...@@ -373,8 +375,6 @@ frontend:
_default: / _default: /
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM: NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM:
_default: https://airtable.com/shrqUAcjgGJ4jU88C _default: https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST:
_default: "[{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FT8RR0UqqvH6wAVfaaM4f%252FUniswap.png%3Falt%3Dmedia%26token%3D797851a0-2d80-4f7b-8d80-f9ba664c0b3d','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}, {'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FaNQY8jHNue30P2caV79v%252FAave.png%3Falt%3Dmedia%26token%3Dda9ea09b-a5d8-4bf1-bdfe-41837eebdd03','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'}, {'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'}]"
NEXT_PUBLIC_LOGOUT_URL: NEXT_PUBLIC_LOGOUT_URL:
_default: https://blockscoutcom.us.auth0.com/v2/logout _default: https://blockscoutcom.us.auth0.com/v2/logout
NEXT_PUBLIC_LOGOUT_RETURN_URL: NEXT_PUBLIC_LOGOUT_RETURN_URL:
...@@ -383,6 +383,8 @@ frontend: ...@@ -383,6 +383,8 @@ frontend:
_default: https://stats-optimism-goerli.test.aws-k8s.blockscout.com _default: https://stats-optimism-goerli.test.aws-k8s.blockscout.com
NEXT_PUBLIC_API_SPEC_URL: NEXT_PUBLIC_API_SPEC_URL:
_default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml _default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/base-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS: NEXT_PUBLIC_NETWORK_EXPLORERS:
_default: '' _default: ''
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT: NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT:
...@@ -441,14 +443,14 @@ allowance: ...@@ -441,14 +443,14 @@ allowance:
resources: resources:
limits: limits:
memory: memory:
_default: "0.3Gi" _default: 768Mi
cpu: cpu:
_default: "0.2" _default: 500m
requests: requests:
memory: memory:
_default: "0.3Gi" _default: 384Mi
cpu: cpu:
_default: "0.2" _default: 250m
# node label # node label
nodeSelector: nodeSelector:
......
...@@ -52,9 +52,9 @@ blockscout: ...@@ -52,9 +52,9 @@ blockscout:
_default: "3" _default: "3"
requests: requests:
memory: memory:
_default: "4Gi" _default: "2Gi"
cpu: cpu:
_default: "3" _default: "2"
# node label # node label
nodeSelector: nodeSelector:
enabled: true enabled: true
...@@ -176,7 +176,7 @@ postgres: ...@@ -176,7 +176,7 @@ postgres:
memory: memory:
_default: "8Gi" _default: "8Gi"
cpu: cpu:
_default: "2" _default: "1"
# node label # node label
nodeSelector: nodeSelector:
enabled: true enabled: true
...@@ -295,18 +295,18 @@ frontend: ...@@ -295,18 +295,18 @@ frontend:
resources: resources:
limits: limits:
memory: memory:
_default: "0.3Gi" _default: 768Mi
cpu: cpu:
_default: "0.5" _default: 500m
requests: requests:
memory: memory:
_default: "0.3Gi" _default: 384Mi
cpu: cpu:
_default: "0.5" _default: 250m
environment: environment:
# ui config # ui config
NEXT_PUBLIC_FEATURED_NETWORKS: NEXT_PUBLIC_FEATURED_NETWORKS:
_default: "[{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets','type':'xdai_mainnet'},{'title':'Optimism on Gnosis Chain','url':'https://blockscout.com/xdai/optimism','group':'mainnets','type':'xdai_optimism'},{'title':'Arbitrum on xDai','url':'https://blockscout.com/xdai/aox','group':'mainnets'},{'title':'Ethereum','url':'https://blockscout.com/eth/mainnet','group':'mainnets','type':'eth_mainnet'},{'title':'Ethereum Classic','url':'https://blockscout.com/etx/mainnet','group':'mainnets','type':'etc_mainnet'},{'title':'POA','url':'https://blockscout.com/poa/core','group':'mainnets','type':'poa_core'},{'title':'RSK','url':'https://blockscout.com/rsk/mainnet','group':'mainnets','type':'rsk_mainnet'},{'title':'Gnosis Chain Testnet','url':'https://blockscout.com/xdai/testnet','group':'testnets','type':'xdai_testnet'},{'title':'POA Sokol','url':'https://blockscout.com/poa/sokol','group':'testnets','type':'poa_sokol'},{'title':'ARTIS Σ1','url':'https://blockscout.com/artis/sigma1','group':'other','type':'artis_sigma1'},{'title':'LUKSO L14','url':'https://blockscout.com/lukso/l14','group':'other','type':'lukso_l14'},{'title':'Astar','url':'https://blockscout.com/astar','group':'other','type':'astar'}]" _default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS: NEXT_PUBLIC_NETWORK_EXPLORERS:
_default: "[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}]" _default: "[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}]"
# network config # network config
...@@ -316,8 +316,10 @@ frontend: ...@@ -316,8 +316,10 @@ frontend:
_default: Goerli _default: Goerli
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME: NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME:
_default: ethereum _default: ethereum
NEXT_PUBLIC_NETWORK_TYPE: NEXT_PUBLIC_NETWORK_LOGO:
_default: goerli _default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/goerli.svg
NEXT_PUBLIC_NETWORK_ICON:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/goerli.svg
NEXT_PUBLIC_NETWORK_ID: NEXT_PUBLIC_NETWORK_ID:
_default: 5 _default: 5
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: NEXT_PUBLIC_NETWORK_CURRENCY_NAME:
...@@ -334,8 +336,6 @@ frontend: ...@@ -334,8 +336,6 @@ frontend:
_default: validation _default: validation
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM: NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM:
_default: https://airtable.com/shrqUAcjgGJ4jU88C _default: https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST:
_default: "[{'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker-main.test.aws-k8s.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker-main.test.aws-k8s.blockscout.com/'},{'author': 'Revoke','id':'revoke.cash','title':'Revoke.cash','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FVBMGyUFnd6CScjfK7CYQ%252Frevoke_sing.png%3Falt%3Dmedia%26token%3D9ab94986-7ab1-41c8-bf7e-d9ce11d23182','categories':['security','tools'],'shortDescription': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','site': 'https://revoke.cash/about','description': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','url':'https://revoke.cash/'},{'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrZkUTIUCG7Zx8BW6Em34%252FAave.png%3Falt%3Dmedia%26token%3D249797a4-4c1e-4372-9cd2-3e48e05e5f30','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'},{'author':'LooksRare','id':'looksrare','external':true,'title':'LooksRare','logo': 'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FeAI4gy3qPMt68mZOZHAx%252FLooksRare.png%3Falt%3Dmedia%26token%3D44c01439-ae09-40aa-b904-3a9ce5b2e002','categories':['tools'],'shortDescription': 'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','site':'https://docs.looksrare.org/about/welcome-to-looksrare','description':'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','url': 'https://goerli.looksrare.org/'},{'author':'zkSync Bridge','id':'zksync-bridge','external':true,'title':'zkSync Bridge','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrtQsaAz9BjGBc35tVAnq%252FzkSync.png%3Falt%3Dmedia%26token%3D5c18171c-8ccf-4a88-8f44-680cbf238115','categories':['security','tools'],'shortDescription':'zkSync 2.0 Goerli Bridge','site':'https://v2-docs.zksync.io/dev/','description':'zkSync 2.0 Goerli Bridge','url':'https://portal.zksync.io/bridge'},{'author':'dYdX','id':'dydx','external':true,'title':'dYdX','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FCrOglR72wpi0UhEscwe4%252Fdxdy.png%3Falt%3Dmedia%26token%3D8811909e-93e3-487c-9614-dffce37223e9','categories': ['security','tools'],'shortDescription':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','site':'https://help.dydx.exchange/en/articles/3047379-introduction-and-overview','description':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','url':'https://trade.stage.dydx.exchange/portfolio/overview'},{'author':'MetalSwap','id':'metalswap','title':'MetalSwap','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252F8xqldTvxb6avrwVVc3rS%252FMetalSwap.png%3Falt%3Dmedia%26token%3D92d2db99-853a-487d-8d8c-8cdeaeaaf014','categories':['security','tools'],'shortDescription':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','site':'https://docs.metalswap.finance/','description':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','url':'https://demo.metalswap.finance/'},{'author':'FaucetDao','id':'faucetdao','title':'FaucetDao','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252Ffnnt3ZNZhzRwqMM5YYjD%252FPlaceholder.png%3Falt%3Dmedia%26token%3D507571bb-d76f-4d96-a35e-2b278608f7ca','categories':['tools'],'shortDescription':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','site':'https://linktr.ee/faucet_dao','description':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','url':'https://www.faucetdao.shop/swap?chain=goerli'},{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FJc0QAyeaBmFIL97tSmGv%252FUniswap.png%3Falt%3Dmedia%26token%3D5d25d796-c273-4e22-92fa-ff85206bec76','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}]"
# api config # api config
NEXT_PUBLIC_API_BASE_PATH: NEXT_PUBLIC_API_BASE_PATH:
_default: / _default: /
...@@ -367,6 +367,8 @@ frontend: ...@@ -367,6 +367,8 @@ frontend:
_default: "['daily_txs','coin_price','market_cup']" _default: "['daily_txs','coin_price','market_cup']"
NEXT_PUBLIC_API_SPEC_URL: NEXT_PUBLIC_API_SPEC_URL:
_default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml _default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/eth-goerli.json
NEXT_PUBLIC_IS_TESTNET: NEXT_PUBLIC_IS_TESTNET:
_default: true _default: true
NEXT_PUBLIC_GRAPHIQL_TRANSACTION: NEXT_PUBLIC_GRAPHIQL_TRANSACTION:
......
...@@ -40,22 +40,22 @@ frontend: ...@@ -40,22 +40,22 @@ frontend:
- "/csv-export" - "/csv-export"
- "/verified-contracts" - "/verified-contracts"
- "/graphiql" - "/graphiql"
- "/output-roots" - "/l2-output-roots"
- "/txn-batches" - "/l2-txn-batches"
- "/withdrawals" - "/l2-withdrawals"
- "/deposits" - "/l2-deposits"
resources: resources:
limits: limits:
memory: memory:
_default: "1Gi" _default: 768Mi
cpu: cpu:
_default: "0.5" _default: "1"
requests: requests:
memory: memory:
_default: "1Gi" _default: 384Mi
cpu: cpu:
_default: "0.5" _default: 250m
environment: environment:
NEXT_PUBLIC_BLOCKSCOUT_VERSION: NEXT_PUBLIC_BLOCKSCOUT_VERSION:
_default: v5.1.0-beta _default: v5.1.0-beta
...@@ -73,8 +73,6 @@ frontend: ...@@ -73,8 +73,6 @@ frontend:
_default: Base _default: Base
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME: NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME:
_default: optimism _default: optimism
NEXT_PUBLIC_NETWORK_TYPE:
_default: base_goerli
NEXT_PUBLIC_NETWORK_ID: NEXT_PUBLIC_NETWORK_ID:
_default: 420 _default: 420
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: NEXT_PUBLIC_NETWORK_CURRENCY_NAME:
...@@ -87,8 +85,12 @@ frontend: ...@@ -87,8 +85,12 @@ frontend:
_default: validation _default: validation
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED: NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED:
_default: 'true' _default: 'true'
NEXT_PUBLIC_NETWORK_LOGO:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/base.svg
NEXT_PUBLIC_NETWORK_ICON:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/base.svg
NEXT_PUBLIC_FEATURED_NETWORKS: NEXT_PUBLIC_FEATURED_NETWORKS:
_default: "[{'title':'Göerli','url':'https://eth-goerli.blockscout.com/','group':'testnets','type':'goerli'},{'title':'Base Göerli','url':'https://l2-goerli.blockscout.com/','group':'testnets','type':'base_goerli'}]" _default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/base-goerli.json
NEXT_PUBLIC_API_HOST: NEXT_PUBLIC_API_HOST:
_default: blockscout-optimism-goerli.test.aws-k8s.blockscout.com _default: blockscout-optimism-goerli.test.aws-k8s.blockscout.com
review: blockscout-optimism-goerli.test.aws-k8s.blockscout.com review: blockscout-optimism-goerli.test.aws-k8s.blockscout.com
...@@ -98,8 +100,6 @@ frontend: ...@@ -98,8 +100,6 @@ frontend:
_default: / _default: /
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM: NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM:
_default: https://airtable.com/shrqUAcjgGJ4jU88C _default: https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST:
_default: "[{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FT8RR0UqqvH6wAVfaaM4f%252FUniswap.png%3Falt%3Dmedia%26token%3D797851a0-2d80-4f7b-8d80-f9ba664c0b3d','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}, {'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=288,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FaNQY8jHNue30P2caV79v%252FAave.png%3Falt%3Dmedia%26token%3Dda9ea09b-a5d8-4bf1-bdfe-41837eebdd03','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'}, {'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'}]"
NEXT_PUBLIC_LOGOUT_URL: NEXT_PUBLIC_LOGOUT_URL:
_default: https://blockscoutcom.us.auth0.com/v2/logout _default: https://blockscoutcom.us.auth0.com/v2/logout
NEXT_PUBLIC_LOGOUT_RETURN_URL: NEXT_PUBLIC_LOGOUT_RETURN_URL:
...@@ -109,6 +109,8 @@ frontend: ...@@ -109,6 +109,8 @@ frontend:
_default: https://stats-optimism-goerli.test.aws-k8s.blockscout.com _default: https://stats-optimism-goerli.test.aws-k8s.blockscout.com
NEXT_PUBLIC_API_SPEC_URL: NEXT_PUBLIC_API_SPEC_URL:
_default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml _default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/base-goerli.json
NEXT_PUBLIC_NETWORK_EXPLORERS: NEXT_PUBLIC_NETWORK_EXPLORERS:
_default: '' _default: ''
NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT: NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT:
......
...@@ -43,14 +43,14 @@ frontend: ...@@ -43,14 +43,14 @@ frontend:
resources: resources:
limits: limits:
memory: memory:
_default: "2Gi" _default: 768Mi
cpu: cpu:
_default: "1" _default: "1"
requests: requests:
memory: memory:
_default: "2Gi" _default: 384Mi
cpu: cpu:
_default: "1" _default: 250m
environment: environment:
NEXT_PUBLIC_BLOCKSCOUT_VERSION: NEXT_PUBLIC_BLOCKSCOUT_VERSION:
_default: v5.1.2-beta _default: v5.1.2-beta
...@@ -72,8 +72,10 @@ frontend: ...@@ -72,8 +72,10 @@ frontend:
_default: Goerli _default: Goerli
NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME: NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME:
_default: ethereum _default: ethereum
NEXT_PUBLIC_NETWORK_TYPE: NEXT_PUBLIC_NETWORK_LOGO:
_default: goerli _default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/goerli.svg
NEXT_PUBLIC_NETWORK_ICON:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/goerli.svg
NEXT_PUBLIC_NETWORK_ID: NEXT_PUBLIC_NETWORK_ID:
_default: 5 _default: 5
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: NEXT_PUBLIC_NETWORK_CURRENCY_NAME:
...@@ -87,7 +89,7 @@ frontend: ...@@ -87,7 +89,7 @@ frontend:
NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED: NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED:
_default: 'true' _default: 'true'
NEXT_PUBLIC_FEATURED_NETWORKS: NEXT_PUBLIC_FEATURED_NETWORKS:
_default: "[{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets','type':'xdai_mainnet'},{'title':'Optimism on Gnosis Chain','url':'https://blockscout.com/xdai/optimism','group':'mainnets','type':'xdai_optimism'},{'title':'Arbitrum on xDai','url':'https://blockscout.com/xdai/aox','group':'mainnets'},{'title':'Ethereum','url':'https://blockscout.com/eth/mainnet','group':'mainnets','type':'eth_mainnet'},{'title':'Ethereum Classic','url':'https://blockscout.com/etx/mainnet','group':'mainnets','type':'etc_mainnet'},{'title':'POA','url':'https://blockscout.com/poa/core','group':'mainnets','type':'poa_core'},{'title':'RSK','url':'https://blockscout.com/rsk/mainnet','group':'mainnets','type':'rsk_mainnet'},{'title':'Gnosis Chain Testnet','url':'https://blockscout.com/xdai/testnet','group':'testnets','type':'xdai_testnet'},{'title':'POA Sokol','url':'https://blockscout.com/poa/sokol','group':'testnets','type':'poa_sokol'},{'title':'ARTIS Σ1','url':'https://blockscout.com/artis/sigma1','group':'other','type':'artis_sigma1'},{'title':'LUKSO L14','url':'https://blockscout.com/lukso/l14','group':'other','type':'lukso_l14'},{'title':'Astar','url':'https://blockscout.com/astar','group':'other','type':'astar'}]" _default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/featured-networks/eth-goerli.json
NEXT_PUBLIC_API_HOST: NEXT_PUBLIC_API_HOST:
_default: blockscout.com _default: blockscout.com
review: blockscout-main.test.aws-k8s.blockscout.com review: blockscout-main.test.aws-k8s.blockscout.com
...@@ -101,8 +103,6 @@ frontend: ...@@ -101,8 +103,6 @@ frontend:
_default: / _default: /
NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM: NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM:
_default: https://airtable.com/shrqUAcjgGJ4jU88C _default: https://airtable.com/shrqUAcjgGJ4jU88C
NEXT_PUBLIC_MARKETPLACE_APP_LIST:
_default: "[{'author': 'Blockscout','id':'token-approval-tracker','title':'Token Approval Tracker','logo':'https://approval-tracker.apps.blockscout.com/icon-192.png','categories':['security','tools'],'shortDescription':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','site':'https://docs.blockscout.com/for-users/blockscout-apps/token-approval-tracker','description':'Token Approval Tracker shows all approvals for any ERC20-compliant tokens and NFTs and lets to revoke them or adjust the approved amount.','url':'https://approval-tracker.apps.blockscout.com/'},{'author': 'Revoke','id':'revoke.cash','title':'Revoke.cash','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FVBMGyUFnd6CScjfK7CYQ%252Frevoke_sing.png%3Falt%3Dmedia%26token%3D9ab94986-7ab1-41c8-bf7e-d9ce11d23182','categories':['security','tools'],'shortDescription': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','site': 'https://revoke.cash/about','description': 'Revoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.','url':'https://revoke.cash/'},{'author':'Aave','id': 'aave','title': 'Aave','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrZkUTIUCG7Zx8BW6Em34%252FAave.png%3Falt%3Dmedia%26token%3D249797a4-4c1e-4372-9cd2-3e48e05e5f30','categories':['tools'],'shortDescription':'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','site': 'https://docs.aave.com/faq/','description': 'Aave is a decentralised non-custodial liquidity market protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market to earn a passive income, while borrowers are able to borrow in an overcollateralised (perpetually) or undercollateralised (one-block liquidity) fashion.','url': 'https://staging.aave.com/'},{'author':'LooksRare','id':'looksrare','external':true,'title':'LooksRare','logo': 'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FeAI4gy3qPMt68mZOZHAx%252FLooksRare.png%3Falt%3Dmedia%26token%3D44c01439-ae09-40aa-b904-3a9ce5b2e002','categories':['tools'],'shortDescription': 'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','site':'https://docs.looksrare.org/about/welcome-to-looksrare','description':'LooksRare is the web3 NFT Marketplace where traders and collectors have earned over $1.3 Billion in rewards.','url': 'https://goerli.looksrare.org/'},{'author':'zkSync Bridge','id':'zksync-bridge','external':true,'title':'zkSync Bridge','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FrtQsaAz9BjGBc35tVAnq%252FzkSync.png%3Falt%3Dmedia%26token%3D5c18171c-8ccf-4a88-8f44-680cbf238115','categories':['security','tools'],'shortDescription':'zkSync 2.0 Goerli Bridge','site':'https://v2-docs.zksync.io/dev/','description':'zkSync 2.0 Goerli Bridge','url':'https://portal.zksync.io/bridge'},{'author':'dYdX','id':'dydx','external':true,'title':'dYdX','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FCrOglR72wpi0UhEscwe4%252Fdxdy.png%3Falt%3Dmedia%26token%3D8811909e-93e3-487c-9614-dffce37223e9','categories': ['security','tools'],'shortDescription':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','site':'https://help.dydx.exchange/en/articles/3047379-introduction-and-overview','description':'dYdX is a leading decentralized exchange that currently supports perpetual trading. dYdX runs on smart contracts on the Ethereum blockchain, and allows users to trade with no intermediaries.','url':'https://trade.stage.dydx.exchange/portfolio/overview'},{'author':'MetalSwap','id':'metalswap','title':'MetalSwap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252F8xqldTvxb6avrwVVc3rS%252FMetalSwap.png%3Falt%3Dmedia%26token%3D92d2db99-853a-487d-8d8c-8cdeaeaaf014','categories':['security','tools'],'shortDescription':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','site':'https://docs.metalswap.finance/','description':'MetalSwap is a decentralised platform that enables hedging swaps in financial markets with the aim of providing a hedge for commodity traders and an investment opportunity for those who contribute to the shared liquidity of the project.','url':'https://demo.metalswap.finance/'},{'author':'FaucetDao','id':'faucetdao','title':'FaucetDao','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252Ffnnt3ZNZhzRwqMM5YYjD%252FPlaceholder.png%3Falt%3Dmedia%26token%3D507571bb-d76f-4d96-a35e-2b278608f7ca','categories':['tools'],'shortDescription':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','site':'https://linktr.ee/faucet_dao','description':'FaucetDao is a decentralised community fund providing liquidity and support to early-stage well vetted blockchain projects.','url':'https://www.faucetdao.shop/swap?chain=goerli'},{'author':'Uniswap','id':'uniswap','title':'Uniswap','logo':'https://www.gitbook.com/cdn-cgi/image/width=32,dpr=2.200000047683716,format=auto/https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-Lq1XoWGmy8zggj_u2fM%252Fuploads%252FJc0QAyeaBmFIL97tSmGv%252FUniswap.png%3Falt%3Dmedia%26token%3D5d25d796-c273-4e22-92fa-ff85206bec76','categories':['tools'],'shortDescription':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','site':'https://docs.uniswap.org/','description':'Uniswap is a cryptocurrency exchange which uses a decentralized network protocol.','url':'https://app.uniswap.org/swap'}]"
NEXT_PUBLIC_LOGOUT_URL: NEXT_PUBLIC_LOGOUT_URL:
_default: https://blockscoutcom.us.auth0.com/v2/logout _default: https://blockscoutcom.us.auth0.com/v2/logout
NEXT_PUBLIC_LOGOUT_RETURN_URL: NEXT_PUBLIC_LOGOUT_RETURN_URL:
...@@ -118,6 +118,8 @@ frontend: ...@@ -118,6 +118,8 @@ frontend:
_default: "[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}]" _default: "[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/ethereum/goerli/transaction','address':'/ethereum/ethereum/goerli/address'}},{'title':'Etherscan','baseUrl':'https://goerli.etherscan.io/','paths':{'tx':'/tx','address':'/address'}}]"
NEXT_PUBLIC_API_SPEC_URL: NEXT_PUBLIC_API_SPEC_URL:
_default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml _default: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
NEXT_PUBLIC_MARKETPLACE_CONFIG_URL:
_default: https://raw.githubusercontent.com/blockscout/frontend-configs/dev/configs/marketplace/eth-goerli.json
NEXT_PUBLIC_IS_TESTNET: NEXT_PUBLIC_IS_TESTNET:
_default: true _default: true
NEXT_PUBLIC_GRAPHIQL_TRANSACTION: NEXT_PUBLIC_GRAPHIQL_TRANSACTION:
......
...@@ -10,7 +10,6 @@ The app instance could be customized by passing following variables to NodeJS en ...@@ -10,7 +10,6 @@ The app instance could be customized by passing following variables to NodeJS en
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |
| NEXT_PUBLIC_NETWORK_NAME | `string` | Displayed name of the network | yes | - | `Gnosis Chain` | | NEXT_PUBLIC_NETWORK_NAME | `string` | Displayed name of the network | yes | - | `Gnosis Chain` |
| NEXT_PUBLIC_NETWORK_SHORT_NAME | `string` | Used for SEO attributes (page title and description) | - | - | `OoG` | | NEXT_PUBLIC_NETWORK_SHORT_NAME | `string` | Used for SEO attributes (page title and description) | - | - | `OoG` |
| NEXT_PUBLIC_NETWORK_TYPE | `string` | Network type (used for matching pre-defined assets, e.g network logo and icon, which are stored in the project). See all possible values here | - | - | `xdai_mainnet` |
| NEXT_PUBLIC_NETWORK_ID | `number` | Chain id, see [https://chainlist.org](https://chainlist.org) for the reference | yes | - | `99` | | NEXT_PUBLIC_NETWORK_ID | `number` | Chain id, see [https://chainlist.org](https://chainlist.org) for the reference | yes | - | `99` |
| NEXT_PUBLIC_NETWORK_RPC_URL | `string` | Chain server RPC url, see [https://chainlist.org](https://chainlist.org) for the reference. If not provided, some functionality of the explorer, related to smart contracts interaction and third-party apps integration, will be unavailable | - | - | `https://core.poa.network` | | NEXT_PUBLIC_NETWORK_RPC_URL | `string` | Chain server RPC url, see [https://chainlist.org](https://chainlist.org) for the reference. If not provided, some functionality of the explorer, related to smart contracts interaction and third-party apps integration, will be unavailable | - | - | `https://core.poa.network` |
| NEXT_PUBLIC_NETWORK_CURRENCY_NAME | `string` | Network currency name | - | - | `Ether` | | NEXT_PUBLIC_NETWORK_CURRENCY_NAME | `string` | Network currency name | - | - | `Ether` |
...@@ -18,8 +17,10 @@ The app instance could be customized by passing following variables to NodeJS en ...@@ -18,8 +17,10 @@ The app instance could be customized by passing following variables to NodeJS en
| NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS | `string` | Network currency decimals | - | `18` | `6` | | NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS | `string` | Network currency decimals | - | `18` | `6` |
| NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS | `string` | Address of network's native token | - | - | `0x029a799563238d0e75e20be2f4bda0ea68d00172` | | NEXT_PUBLIC_NETWORK_TOKEN_ADDRESS | `string` | Address of network's native token | - | - | `0x029a799563238d0e75e20be2f4bda0ea68d00172` |
| NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME | `string` | Network name for constructing url of token logos according to template `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${assetsNamePath}/assets/${tokenAddress}/logo.png`. It should match network name in TrustWallet assets repo, see the full list [here](https://github.com/trustwallet/assets/tree/master/blockchains) | - | - | `ethereum` | | NEXT_PUBLIC_NETWORK_ASSETS_PATHNAME | `string` | Network name for constructing url of token logos according to template `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${assetsNamePath}/assets/${tokenAddress}/logo.png`. It should match network name in TrustWallet assets repo, see the full list [here](https://github.com/trustwallet/assets/tree/master/blockchains) | - | - | `ethereum` |
| NEXT_PUBLIC_NETWORK_LOGO | `string` | Network logo; if not provided, will fallback to logo predefined in the project; if the project doesn't have logo for such network then the common placeholder will be shown; *Note* that logo height should be 20px and width less than 120px | - | - | `https://placekitten.com/240/40` | | NEXT_PUBLIC_NETWORK_LOGO | `string` | Network logo; if not provided, placeholder will be shown; *Note* the logo height should be 20px and width less than 120px | - | - | `https://placekitten.com/240/40` |
| NEXT_PUBLIC_NETWORK_SMALL_LOGO | `string` | Small version of network logo; if not provided, will fallback to logo predefined in the project; if the project doesn't have logo for such network then the common placeholder will be shown; *Note* that logo should have square format (e.g 60px by 60px) | - | - | `https://placekitten.com/60/60` | | NEXT_PUBLIC_NETWORK_LOGO_DARK | `string` | Network logo for dark color mode; if not provided, **inverted** regular logo will be used instead | - | - | `https://placekitten.com/240/40` |
| NEXT_PUBLIC_NETWORK_ICON | `string` | Network icon; used as a replacement for regular network logo when nav bar is collapsed; if not provided, placeholder will be shown; *Note* the icon size should be at least 60px by 60px | - | - | `https://placekitten.com/60/60` |
| NEXT_PUBLIC_NETWORK_ICON_DARK | `string` | Network icon for dark color mode; if not provided, **inverted** regular icon will be used instead | - | - | `https://placekitten.com/60/60` |
| NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED | `boolean` | Set to true if network has account feature | - | `false` | `true` | | NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED | `boolean` | Set to true if network has account feature | - | `false` | `true` |
| NEXT_PUBLIC_IS_TESTNET | `boolean`| Set to true if network is testnet | - | `false` | `true` | | NEXT_PUBLIC_IS_TESTNET | `boolean`| Set to true if network is testnet | - | `false` | `true` |
...@@ -27,13 +28,13 @@ The app instance could be customized by passing following variables to NodeJS en ...@@ -27,13 +28,13 @@ The app instance could be customized by passing following variables to NodeJS en
| Variable | Type| Description | Is required | Default value | Example value | | Variable | Type| Description | Is required | Default value | Example value |
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |
| NEXT_PUBLIC_FEATURED_NETWORKS | `Array<FeaturedNetwork>` where `FeaturedNetwork` can have following [properties](#featured-network-configuration-properties) | Configuration of featured networks that will be shown in the network menu | - | - | `[{'title':'Gnosis Chain','url':'https://blockscout.com/xdai/mainnet','group':'mainnets'}]` | | NEXT_PUBLIC_FEATURED_NETWORKS | `string` | URL of configuration file (`.json` format only) which contains list of featured networks that will be shown in the network menu. See [below](#featured-network-configuration-properties) list of available properties for particular network | - | - | `https://example.com/featured_networks_config.json` |
| NEXT_PUBLIC_BLOCKSCOUT_VERSION | `string` | Current running version of Blockscout (used to display link to release in the footer) | - | - | `v.5.1.0-beta` | NEXT_PUBLIC_BLOCKSCOUT_VERSION | `string` | Current running version of Blockscout (used to display link to release in the footer) | - | - | `v.5.1.0-beta`
| NEXT_PUBLIC_FOOTER_GITHUB_LINK | `string` | Link to Github in the footer | - | - | `https://github.com/blockscout/blockscout` | | NEXT_PUBLIC_FOOTER_GITHUB_LINK | `string` | Link to Github in the footer | - | - | `https://github.com/blockscout/blockscout` |
| NEXT_PUBLIC_FOOTER_TWITTER_LINK | `string` | Link to Twitter in the footer | - | - | `https://www.twitter.com/blockscoutcom` | | NEXT_PUBLIC_FOOTER_TWITTER_LINK | `string` | Link to Twitter in the footer | - | - | `https://www.twitter.com/blockscoutcom` |
| NEXT_PUBLIC_FOOTER_TELEGRAM_LINK | `string` | Link to Telegram in the footer | - | - | `https://t.me/poa_network` | | NEXT_PUBLIC_FOOTER_TELEGRAM_LINK | `string` | Link to Telegram in the footer | - | - | `https://t.me/poa_network` |
| NEXT_PUBLIC_FOOTER_STAKING_LINK | `string` | Link to staking dashboard in the footer | - | - | `https://duneanalytics.com/maxaleks/xdai-staking` | | NEXT_PUBLIC_FOOTER_STAKING_LINK | `string` | Link to staking dashboard in the footer | - | - | `https://duneanalytics.com/maxaleks/xdai-staking` |
| NEXT_PUBLIC_MARKETPLACE_APP_LIST | `Array<MarketplaceApp>` where `MarketplaceApp` can have following [properties](#marketplace-app-configuration-properties) | List of apps that will be shown on the marketplace page | - | - | `[{'author': 'Bob', 'id': 'app', 'external': true, 'title': 'The App', 'logo': 'https://foo.app/icon.png', 'categories': ['security'], 'shortDescription': 'Awesome app', 'site': 'https://foo.app', 'description': 'The best app', 'url': 'https://foo.app/launch'}]` | | NEXT_PUBLIC_MARKETPLACE_CONFIG_URL | `string` | URL of configuration file (`.json` format only) which contains list of apps that will be shown on the marketplace page. See [below](#marketplace-app-configuration-properties) list of available properties for an app | - | - | `https://example.com/marketplace_config.json` |
| NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM | `string` | Link to form where authors can submit their dapps to the marketplace | - | - | `https://airtable.com/shrqUAcjgGJ4jU88C` | | NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM | `string` | Link to form where authors can submit their dapps to the marketplace | - | - | `https://airtable.com/shrqUAcjgGJ4jU88C` |
| NEXT_PUBLIC_NETWORK_EXPLORERS | `Array<NetworkExplorer>` where `NetworkExplorer` can have following [properties](#network-explorer-configuration-properties) | Used to build up links to transactions, blocks, addresses in other chain explorers. | - | - | `[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/tx'}}]` | | NEXT_PUBLIC_NETWORK_EXPLORERS | `Array<NetworkExplorer>` where `NetworkExplorer` can have following [properties](#network-explorer-configuration-properties) | Used to build up links to transactions, blocks, addresses in other chain explorers. | - | - | `[{'title':'Anyblock','baseUrl':'https://explorer.anyblock.tools','paths':{'tx':'/ethereum/poa/core/tx'}}]` |
| NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE | `validation` or `mining` | Verification type in the network | - | `mining` | `validation` | | NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE | `validation` or `mining` | Verification type in the network | - | `mining` | `validation` |
...@@ -41,6 +42,7 @@ The app instance could be customized by passing following variables to NodeJS en ...@@ -41,6 +42,7 @@ The app instance could be customized by passing following variables to NodeJS en
| NEXT_PUBLIC_LOGOUT_URL | `string` | Account logout url. Required if account is supported for the app instance. | - | - | `https://blockscoutcom.us.auth0.com/v2/logout` | | NEXT_PUBLIC_LOGOUT_URL | `string` | Account logout url. Required if account is supported for the app instance. | - | - | `https://blockscoutcom.us.auth0.com/v2/logout` |
| NEXT_PUBLIC_LOGOUT_RETURN_URL | `string` | Account logout return url. Required if account is supported for the app instance. | - | - | `https://blockscout.com/poa/core/auth/logout` | | NEXT_PUBLIC_LOGOUT_RETURN_URL | `string` | Account logout return url. Required if account is supported for the app instance. | - | - | `https://blockscout.com/poa/core/auth/logout` |
| NEXT_PUBLIC_HOMEPAGE_CHARTS | `Array<'daily_txs' \| 'coin_price' \| 'market_cup'>` | List of charts displayed on the home page | - | - | `['daily_txs','coin_price','market_cup']` | | NEXT_PUBLIC_HOMEPAGE_CHARTS | `Array<'daily_txs' \| 'coin_price' \| 'market_cup'>` | List of charts displayed on the home page | - | - | `['daily_txs','coin_price','market_cup']` |
| NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR | `string` | Text color of the hero plate on the homepage | `#FFFFFF` | `'#DCFE76'` |
| NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT | `string` | Gradient value for hero plate on the homepage | - | `radial-gradient(103.03% 103.03% at 0% 0%, rgba(183, 148, 244, 0.8) 0%, rgba(0, 163, 196, 0.8) 100%)` | `radial-gradient(at 15% 86%, hsla(350,65%,70%,1) 0px, transparent 50%), radial-gradient(at 72% 57%, hsla(14,95%,76%,1) 0px, transparent 50%)` | | NEXT_PUBLIC_HOMEPAGE_PLATE_GRADIENT | `string` | Gradient value for hero plate on the homepage | - | `radial-gradient(103.03% 103.03% at 0% 0%, rgba(183, 148, 244, 0.8) 0%, rgba(0, 163, 196, 0.8) 100%)` | `radial-gradient(at 15% 86%, hsla(350,65%,70%,1) 0px, transparent 50%), radial-gradient(at 72% 57%, hsla(14,95%,76%,1) 0px, transparent 50%)` |
| NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER | `boolean` | Set to false if network doesn't have gas tracker | - | `true` | `false` | | NEXT_PUBLIC_HOMEPAGE_SHOW_GAS_TRACKER | `boolean` | Set to false if network doesn't have gas tracker | - | `true` | `false` |
| NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME | `boolean` | Set to false if average block time is useless for the network | - | `true` | `false` | | NEXT_PUBLIC_HOMEPAGE_SHOW_AVG_BLOCK_TIME | `boolean` | Set to false if average block time is useless for the network | - | `true` | `false` |
...@@ -89,9 +91,9 @@ For each application, you need to specify the `MarketplaceCategoryId` to which i ...@@ -89,9 +91,9 @@ For each application, you need to specify the `MarketplaceCategoryId` to which i
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |
| title | `string` | Displayed name of the network | yes | - | `Gnosis Chain` | | title | `string` | Displayed name of the network | yes | - | `Gnosis Chain` |
| url | `string` | Network explorer main page url | yes | - | `https://blockscout.com/xdai/mainnet` | | url | `string` | Network explorer main page url | yes | - | `https://blockscout.com/xdai/mainnet` |
| group | `mainnets \| testnets \| other` | Indicates in which tab network appears in the menu | yes | - | `mainnets` | | group | `Mainnets \| Testnets \| Other` | Indicates in which tab network appears in the menu | yes | - | `Mainnets` |
| icon | `string` | Network icon; if not provided, will fallback to icon predefined in the project; if the project doesn't have icon for such network then the common placeholder will be shown; *Note* that icon size should be at least 30px by 30px | - | - | `https://placekitten.com/60/60` | | icon | `string` | Network icon; if not provided, the common placeholder will be shown; *Note* that icon size should be at least 60px by 60px | - | - | `https://placekitten.com/60/60` |
| type | `string` | Network type (used for matching pre-defined network icon, which is stored in the project). See all possible values here | - | - | `xdai_mainnet` | | isActive | `boolean` | Pass `true` if item should be shonw as active in the menu | - | - | `true` |
### Network explorer configuration properties ### Network explorer configuration properties
......
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.461 4H4v5.176h8.461V4ZM26 4h-8.462v5.176H26V4Zm0 12.51h-5.077v4.313h-3.385V26H26v-9.49Zm-16.923 0H4V26h8.461v-5.177H9.077V16.51Z" fill="#48A9A6"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path d="m4 15.793 7.071-6.472M4 15.793l7.857 4.921M4 15.793 8.15 5.415M4 15.793l6.226 8.716m.845-15.188L19.358 5m-8.287 4.321-2.92-3.906M19.358 5l2.076 8.643M19.358 5 26 13.302M19.358 5l-11.207.415m13.283 8.228v10.036m0-10.036L26 13.302m-4.566 10.377-9.577-2.965m9.577 2.965-11.208.83m11.208-.83L26 13.302m-14.143 7.412-1.63 3.795m7.471-13.283h-5.396l3.32 3.321-3.32 3.736h5.396" stroke="#129C6B" stroke-width="1.4" stroke-linejoin="round"/>
</svg>
<svg viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.978 26C21.066 26 26 21.075 26 15S21.066 4 14.978 4C9.29 4 4.608 8.3 4.02 13.821h14.502v2.161H4C4.498 21.597 9.223 26 14.978 26Z" fill="#2151F5"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<rect x="4" y="4" width="22" height="22" rx="11" fill="#328332"/>
<path opacity=".6" d="M10.325 15.703c1.714.91 3.503 1.862 4.884 2.6l4.843-2.6a2325.737 2325.737 0 0 1-4.843 7.175c-1.632-2.396-3.433-5.039-4.884-7.175Zm.187-.72 4.702-2.508 4.641 2.49-4.638 2.513-4.706-2.494Zm4.697-3.313-4.884 2.571 4.863-7.119 4.864 7.135-4.843-2.586Z" fill="#fff"/>
<path opacity=".7" d="m15.209 18.303 4.843-2.6c-1.753 2.605-4.843 7.175-4.843 7.175v-4.575Zm.005-5.829 4.641 2.492-4.638 2.512-.003-5.004Zm-.005-.803-.021-4.549 4.864 7.135-4.843-2.586Z" fill="#fff"/>
<path opacity=".7" d="m10.512 14.984 4.703.386 4.64-.402-4.638 2.512-4.705-2.496Z" fill="#fff"/>
<path d="m15.214 15.37 4.642-.402-4.639 2.512-.003-2.11Z" fill="#fff"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<rect x="4" y="4" width="22" height="22" rx="11" fill="#627EEA"/>
<path d="M15.224 12.912V6.998c-.01 0-.015.004-.022.009a.07.07 0 0 1-.049.016c-.186.364-.384.715-.585 1.072l-.24.426c-.378.66-.755 1.345-1.133 2.03-.202.372-.41.743-.619 1.115-.204.364-.409.73-.608 1.094a87.06 87.06 0 0 1-.578 1.028c-.194.343-.389.686-.578 1.028-.034.063-.07.119-.104.175a4.41 4.41 0 0 0-.108.18h.024c.014.016.02.013.027.007.005-.003.01-.006.02-.006a8.69 8.69 0 0 0 .26-.127c.088-.045.176-.09.259-.127.225-.121.428-.219.63-.316l.03-.014.779-.381.637-.305.778-.38c.166-.1.345-.183.517-.263l.144-.067c.085-.04.164-.079.243-.118.075-.037.149-.074.229-.111.024 0 .047-.025.047-.05Zm-.021 10.153c.005.002.011.002.021.002V19.08c0-.025 0-.051-.024-.051a5.308 5.308 0 0 0-.188-.114c-.065-.038-.13-.076-.189-.114a68.01 68.01 0 0 0-1.099-.705c-.375-.237-.75-.474-1.119-.717a140.9 140.9 0 0 0-.967-.61c-.324-.202-.649-.405-.967-.608-.012 0-.018-.007-.024-.013-.006-.006-.011-.012-.023-.012 0 .012.006.018.011.025.006.006.012.012.012.025l.354.533c.285.453.58.895.873 1.333.166.25.332.5.495.749l1.416 2.132.674 1.02c.237.36.474.72.718 1.087.014.015.02.021.026.024Z" fill="#fff"/>
<path d="M15.22 6.933v8.292h4.62l-4.62-8.292Zm-4.62 8.195 4.62-2.217v5.206l-4.62-2.989Zm4.62 3.953v3.953l4.53-6.749-4.53 2.796Z" fill="#C0CBF6"/>
<path d="M15.22 18.117v-5.206l4.62 2.314-4.62 2.892Z" fill="#8197EE"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.809 9.496c.034.03.062.054.088.079.276.268.55.538.83.803.064.06.064.1.019.168-.587.888-.8 1.861-.605 2.892.263 1.383 1.068 2.391 2.383 2.998.776.36 1.6.451 2.447.326a4.14 4.14 0 0 0 1.588-.578c.08-.05.125-.044.19.02.715.703 1.435 1.401 2.149 2.104.078.078.12.087.204.004.816-.797 1.639-1.589 2.455-2.386.09-.088.146-.103.264-.034.713.415 1.491.582 2.322.544 1.65-.074 3.158-1.191 3.67-2.724.387-1.161.243-2.263-.388-3.311-.041-.069-.045-.11.018-.17.23-.214.454-.435.68-.653.021-.02.045-.038.067-.058a10.323 10.323 0 0 1-1.13 13.055c-4.03 4.223-10.68 4.551-15.12.927-4.51-3.68-5.046-9.723-2.131-14.006Z" fill="#276749"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.566 8.13C18.24 3.846 11.203 4.21 7.45 7.96c.022.023.043.049.066.071 2.48 2.407 4.961 4.814 7.44 7.222.07.068.11.06.173-.003.32-.314.643-.626.967-.937 2.091-2.012 4.183-4.025 6.276-6.036.056-.054.126-.095.195-.147Zm-7.53 8.643L5.968 7.961c.022-.028.04-.055.061-.078C7.12 6.71 8.387 5.763 9.865 5.089a11.91 11.91 0 0 1 2.518-.828 12.308 12.308 0 0 1 3.046-.25A12.06 12.06 0 0 1 19.725 5c1.645.711 3.034 1.75 4.212 3.063.069.076.03.11-.023.16l-4.397 4.237-4.386 4.228c-.027.026-.055.05-.095.086Zm-3.899-2.061c-.614.545-1.979.67-2.883-.204-.906-.877-.782-2.174-.187-2.849l3.07 3.053Zm7.943-.21c1.027-.999 2.05-1.993 3.074-2.986.433.469.634 1.666-.115 2.548-.833.981-2.208.976-2.96.438Z" fill="#276749"/>
</svg>
<svg viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.822 15.052h-6.9v2.731h3.19l-.01 3.433c-.123.132-.269.24-.43.319-.21.108-.43.197-.656.267a5.653 5.653 0 0 1-1.656.247 3.012 3.012 0 0 1-2.715-1.424 7.746 7.746 0 0 1-.9-4.064v-2.6a9.44 9.44 0 0 1 .265-2.36 5.76 5.76 0 0 1 .715-1.71c.267-.427.63-.785 1.06-1.047.4-.237.858-.36 1.323-.357a2.922 2.922 0 0 1 2.191.735c.526.615.84 1.383.895 2.191h3.627a8.472 8.472 0 0 0-.615-2.458 5.315 5.315 0 0 0-1.304-1.857 5.626 5.626 0 0 0-2.047-1.164 9.016 9.016 0 0 0-2.84-.4 6.71 6.71 0 0 0-2.774.572A6.354 6.354 0 0 0 2.016 7.77a7.927 7.927 0 0 0-1.483 2.659 10.954 10.954 0 0 0-.532 3.557v2.575a11.475 11.475 0 0 0 .51 3.557c.3.97.793 1.871 1.45 2.646a6.251 6.251 0 0 0 2.264 1.65 7.406 7.406 0 0 0 2.966.573c.765.005 1.529-.07 2.278-.221a10.497 10.497 0 0 0 1.914-.58 7.636 7.636 0 0 0 1.477-.8 5.2 5.2 0 0 0 .98-.87l-.018-7.464Zm2.66 2.783c-.01.97.143 1.935.451 2.855.281.837.73 1.61 1.317 2.269a5.985 5.985 0 0 0 2.133 1.5 7.278 7.278 0 0 0 2.88.54 7.194 7.194 0 0 0 2.86-.54 5.935 5.935 0 0 0 2.118-1.5 6.602 6.602 0 0 0 1.311-2.27c.308-.92.46-1.884.45-2.854v-.274a8.673 8.673 0 0 0-.45-2.84 6.532 6.532 0 0 0-1.317-2.27 6.078 6.078 0 0 0-2.125-1.508 7.812 7.812 0 0 0-5.74 0 6.082 6.082 0 0 0-2.12 1.508 6.516 6.516 0 0 0-1.317 2.27 8.647 8.647 0 0 0-.45 2.84v.274Zm3.681-.273a7.394 7.394 0 0 1 .174-1.625c.1-.478.284-.936.541-1.352a2.633 2.633 0 0 1 2.357-1.26c.495-.016.984.1 1.418.337.387.224.712.542.947.923.253.417.435.874.535 1.352a7.4 7.4 0 0 1 .173 1.625v.273a7.613 7.613 0 0 1-.172 1.659c-.1.478-.281.935-.537 1.352a2.622 2.622 0 0 1-2.337 1.255 2.818 2.818 0 0 1-1.424-.338 2.759 2.759 0 0 1-.96-.917 4.143 4.143 0 0 1-.541-1.352 7.6 7.6 0 0 1-.174-1.659v-.274.001Zm-1.747-10.3c.086.196.212.37.37.514.167.147.36.262.57.338.472.164.985.164 1.456 0 .21-.076.404-.19.57-.338.16-.143.285-.318.37-.514a1.594 1.594 0 0 0 0-1.274 1.562 1.562 0 0 0-.37-.52 1.7 1.7 0 0 0-.57-.344 2.206 2.206 0 0 0-1.456 0 1.7 1.7 0 0 0-.57.345 1.562 1.562 0 0 0-.502 1.157c0 .219.045.436.133.637v-.001Zm6.357.013c.086.197.212.374.37.52a1.7 1.7 0 0 0 .57.345c.47.165.984.165 1.456 0a1.7 1.7 0 0 0 .57-.345c.157-.146.283-.323.37-.52.089-.205.134-.427.132-.65a1.561 1.561 0 0 0-.503-1.151 1.761 1.761 0 0 0-.57-.338 2.206 2.206 0 0 0-1.456 0c-.21.075-.403.19-.57.338a1.546 1.546 0 0 0-.503 1.151c-.002.224.043.446.134.65Z" fill="currentColor"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.809 9.496c.034.03.062.054.088.079.276.268.55.538.83.803.064.06.064.1.019.168-.587.888-.8 1.861-.605 2.892.263 1.383 1.068 2.391 2.383 2.998.776.36 1.6.451 2.447.326a4.14 4.14 0 0 0 1.588-.578c.08-.05.125-.044.19.02.715.703 1.435 1.401 2.149 2.104.078.078.12.087.204.004.816-.797 1.639-1.589 2.455-2.386.09-.088.146-.103.264-.034.713.415 1.491.582 2.322.544 1.65-.074 3.158-1.191 3.67-2.724.387-1.161.243-2.263-.388-3.311-.041-.069-.045-.11.018-.17.23-.214.454-.435.68-.653.021-.02.045-.038.067-.058a10.323 10.323 0 0 1-1.13 13.055c-4.03 4.223-10.68 4.551-15.12.927-4.51-3.68-5.046-9.723-2.131-14.006Z" fill="#DD6B20"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.566 8.13C18.24 3.846 11.203 4.21 7.45 7.96c.022.023.043.049.066.071 2.48 2.407 4.961 4.814 7.44 7.222.07.068.11.06.173-.003.32-.314.643-.626.967-.937 2.091-2.012 4.183-4.025 6.276-6.036.056-.054.126-.095.195-.147Zm-7.53 8.643L5.968 7.961c.022-.028.04-.055.061-.078C7.12 6.71 8.387 5.763 9.865 5.089a11.91 11.91 0 0 1 2.518-.828 12.308 12.308 0 0 1 3.046-.25A12.06 12.06 0 0 1 19.725 5c1.645.711 3.034 1.75 4.212 3.063.069.076.03.11-.023.16l-4.397 4.237-4.386 4.228c-.027.026-.055.05-.095.086Zm-3.899-2.061c-.614.545-1.979.67-2.883-.204-.906-.877-.782-2.174-.187-2.849l3.07 3.053Zm7.943-.21c1.027-.999 2.05-1.993 3.074-2.986.433.469.634 1.666-.115 2.548-.833.981-2.208.976-2.96.438Z" fill="#DD6B20"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 12a2 2 0 0 1 2-2h15.753a2 2 0 0 1 1.92 1.436L26 19.35H14.45l-.825-3.85H4V12Zm0 5.35v-.75h8.8l.55 2.75H6a2 2 0 0 1-2-2Zm4.4-6.25H5.65l1.1 3.3H9.5l-1.1-3.3Zm4.4 0h-2.75l1.1 3.3h2.75l-1.1-3.3Zm6.05 5.5h1.336l.314 1.1h-1.336l-.314-1.1Zm5.186 0H22.7l.314 1.1h1.336l-.314-1.1Zm-7.386-5.5h5.5l1.65 4.95h-5.5l-1.65-4.95Z" fill="#38B2AC"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.502 13.858v1.071a.5.5 0 0 1-.5.5h-3.806a.5.5 0 0 1-.5-.5V6.048c0-.027.021-.048.048-.048h5.634a3.929 3.929 0 1 1 0 7.858h-.876ZM9.07 15.32a.5.5 0 0 1 .848 0l4.994 7.986a.5.5 0 0 1-.424.765H4.501a.5.5 0 0 1-.424-.765L9.07 15.32Zm11.638 9.537c2.875 0 5.206-2.287 5.206-5.107 0-2.821-2.331-5.108-5.206-5.108-2.876 0-5.206 2.287-5.206 5.108 0 2.82 2.33 5.107 5.206 5.107Z" fill="#5B2DA4"/>
</svg>
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.214 7.4c.749 0 1.288-.574 1.288-1.2S15.962 5 15.214 5s-1.288.574-1.288 1.2.54 1.2 1.288 1.2Zm.534.94a2.282 2.282 0 0 0 1.483-1.1l3.964 2.2a2.131 2.131 0 0 0-.25 1.785l-3.741 2.078c-.33-.64-.847-1.115-1.456-1.299V8.34Zm-1.144 3.667V8.321a2.28 2.28 0 0 1-1.402-1.073L9.239 9.449c.334.525.43 1.171.244 1.776l3.691 2.05c.328-.623.835-1.084 1.43-1.268Zm-1.78 2.343-3.93-2.182a2.319 2.319 0 0 1-1.154.589v4.486c.454.088.88.308 1.209.643l3.913-2.173a3.727 3.727 0 0 1-.039-1.363Zm.45 2.404-3.77 2.093a2.133 2.133 0 0 1-.271 1.714l3.964 2.2a2.28 2.28 0 0 1 1.407-1.082v-3.833c-.537-.166-1.003-.558-1.33-1.092Zm2.475 4.906c.645.149 1.184.56 1.488 1.11l3.963-2.2a2.133 2.133 0 0 1-.276-1.721l-3.82-2.12c-.329.55-.806.954-1.356 1.121v3.811Zm1.759-5.98 3.972 2.206c.33-.335.754-.554 1.208-.643v-4.486a2.32 2.32 0 0 1-1.153-.589l-3.99 2.215a3.765 3.765 0 0 1-.037 1.297Zm-.006-9.48v.004l4.49 2.493.004-.002c1.094-.608 2.494-.247 3.125.805.632 1.052.257 2.398-.837 3.005-.17.095-.348.166-.528.214v4.562c.18.048.358.12.528.214 1.095.607 1.47 1.953.838 3.005-.63 1.05-2.026 1.411-3.119.809l-4.5 2.5c-.007 1.21-1.029 2.191-2.29 2.191-1.263 0-2.288-.985-2.288-2.2v-.003l-4.49-2.494-.004.002c-1.094.608-2.493.247-3.125-.805-.632-1.052-.257-2.398.837-3.005.17-.095.348-.166.528-.214v-4.562a2.345 2.345 0 0 1-.527-.214c-1.095-.607-1.47-1.953-.838-3.005.632-1.052 2.031-1.413 3.125-.805l.016.008 4.478-2.488V6.2c0-1.215 1.025-2.2 2.288-2.2 1.264 0 2.288.985 2.288 2.2ZM15.214 25c.749 0 1.288-.574 1.288-1.2s-.54-1.2-1.288-1.2-1.288.574-1.288 1.2.54 1.2 1.288 1.2ZM8.396 11.215c.338-.563.15-1.314-.478-1.663-.628-.348-1.399-.13-1.737.433-.338.563-.15 1.315.478 1.663.628.348 1.399.13 1.737-.433Zm15.851 8.8c.338-.563.15-1.314-.477-1.663-.628-.348-1.399-.13-1.737.433-.338.563-.15 1.314.478 1.663.628.348 1.399.13 1.736-.433ZM6.66 18.352c.628-.348 1.398-.13 1.736.433.339.563.15 1.314-.477 1.663-.628.348-1.399.13-1.737-.433-.338-.563-.15-1.314.478-1.663Zm15.852-8.8c.628-.348 1.398-.13 1.736.433.338.563.15 1.314-.478 1.663-.627.348-1.398.13-1.736-.433-.338-.563-.15-1.315.478-1.663ZM14.605 15v1.738c-.433-.288-.826-.895-.826-1.811 0-1.33.826-2.007 1.402-2.007.577 0 1.403.677 1.403 2.007 0 .923-.399 1.532-.835 1.818V15h-1.144Z" fill="#27AA8B"/>
</svg>
<svg viewBox="0 0 87 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.017 8.474a.652.652 0 0 1 .103.292.517.517 0 0 1-.052.263L17.75 18.6v.046a.573.573 0 0 1-.13.137.856.856 0 0 1-.166.074h-.085l-10.445 1h-.057a.568.568 0 0 1-.24-.057.57.57 0 0 1-.164-.148l-6.4-8.263v-.069A.538.538 0 0 1 0 11.114h.051a.573.573 0 0 1 0-.194.08.08 0 0 0 0-.034.046.046 0 0 0 0-.029l4.24-9.525a.571.571 0 0 1 .142-.189l.086-.034a.603.603 0 0 1 .222-.075L15.174 0h.08a.46.46 0 0 1 .273.08.514.514 0 0 1 .171.12.07.07 0 0 1 0 .029l6.32 8.245Zm-5.55-5.36 1.294 5.11h2.632l-3.926-5.11ZM9.214 15.326l7.532 2.189V8.863l-1.874-7.429-7.641 4.28L1.533 11l7.68 4.326ZM7.123 4.474l5.458-3.068-6.843.68 1.385 2.388Zm-.93.67L4.867 2.856l-2.65 5.96 3.932-3.64.046-.034Zm-3.447 7.85 4.092 5.292 1.361-2.223-5.453-3.068Zm11.556 4.995-5.066-1.474-1.259 2.108 6.325-.634Zm3.584-8.623V15.6l2.786-6.234h-2.786ZM13.322 6a.57.57 0 0 1 0 1.143h-3.34l2.07 2.492a.573.573 0 0 1 0 .731l-2.07 2.492h3.34a.57.57 0 0 1 0 1.142H8.764a.573.573 0 0 1-.439-.937L10.872 10 8.325 6.938A.573.573 0 0 1 8.764 6h4.558Zm49.305-2.009-2.389-1.058v9.095h2.389V3.99Zm-30.26-1.235L29.87 3.835l-2.092 8.193h2.424l.557-2.265.436-2.016 1.171-4.991Zm3.976 9.272h2.625L34.241 0l-1.954 1.145 4.056 10.883Zm20.322-9.539h9.519V.42h-9.52v2.07Zm13.964 9.539h2.391V.42h-2.39v11.607Zm9.676-8.688c-.227-.514-.942-1.717-1.273-2.07-.506.282-1.184 1.15-1.184 2.636 0 1.893.68 2.583 2.563 3.061l2.18.566c1.603.425 1.69.672 1.69 1.132a2.136 2.136 0 0 1-.056.4c-.068.25-.273.671-1.081.939a6.102 6.102 0 0 1-1.635.236c-1.08 0-2.79-.194-3.487-.354v1.93c.628.229 2.18.406 3.295.406.333 0 .75-.015 1.153-.05.24-.008 1.812-.089 2.926-.89l.024-.018a.867.867 0 0 0 .082-.065 2.64 2.64 0 0 0 .74-.887l.015-.034.008-.018c.234-.451.402-1.052.402-1.861 0-1.823-.715-2.496-3.19-3.15l-1.884-.477c-1.259-.337-1.36-.55-1.36-1.062.006-.127.03-.252.07-.371l.002.001Zm2.822-1.134v.001c-1.255 0-2.197.16-2.824.425.104-.567.54-1.822.854-2.212.65-.125 1.309-.19 1.97-.195 1.046 0 2.32.142 2.93.283v1.946a23.339 23.339 0 0 0-2.93-.248ZM50.113 12.06l-1.349-3.716c-.406.027-.82.026-1.225.025h-2.166v3.687H42.98V2.909l2.393.976v2.5h1.817c.873 0 1.939-.125 2.288-.337.401-.249.646-.905.646-1.614 0-1.276-.611-1.931-2.603-1.931H44.36l-1.991-.284V.429h5.365c3.878 0 4.804 1.523 4.804 4.077 0 .887-.323 2.475-1.482 3.28l1.828 4.271-2.77.004Zm-19.321 4.85c-.298-.533-.784-.8-1.459-.8-.282 0-.53.05-.743.152a1.18 1.18 0 0 0-.492.409.99.99 0 0 0-.171.56c0 .294.104.522.314.686.21.164.566.29 1.07.378.388.068.659.152.812.251.152.1.228.233.228.4a.513.513 0 0 1-.263.461c-.175.109-.412.163-.709.163-.301 0-.552-.062-.752-.186a1.173 1.173 0 0 1-.455-.523l-.394.32c.14.248.346.446.615.595.268.149.593.223.975.223.29 0 .545-.045.766-.134a1.16 1.16 0 0 0 .512-.378c.12-.162.18-.35.18-.563 0-.298-.104-.53-.312-.698-.207-.168-.561-.293-1.06-.377a3.323 3.323 0 0 1-.627-.158.77.77 0 0 1-.323-.208.466.466 0 0 1-.097-.303c0-.187.083-.34.249-.46.166-.12.393-.181.683-.181.275 0 .49.053.65.157.157.105.294.283.408.535l.395-.32Zm1.505 3.032h.458v-3.775h-.458v3.775Zm5.275 0v-1.905h-1.619v.43h1.201v.13c0 .314-.104.554-.311.721-.208.168-.476.252-.804.252-.415 0-.734-.132-.955-.397-.221-.265-.332-.638-.332-1.118a1.9 1.9 0 0 1 .16-.81c.107-.226.257-.401.45-.523.192-.122.416-.183.671-.183.267 0 .495.057.684.172a.974.974 0 0 1 .409.491l.417-.228a1.524 1.524 0 0 0-.586-.652c-.242-.141-.55-.212-.924-.212-.35 0-.658.08-.923.237a1.614 1.614 0 0 0-.618.678c-.146.294-.22.637-.22 1.03 0 .396.072.74.215 1.032.142.291.346.516.609.675.263.158.572.237.926.237.282 0 .523-.049.724-.146.2-.097.355-.237.466-.42l.017.509h.343Zm4.794 0h.435v-3.775h-.704l-.823 2.3-.292.937h-.011l-.286-.943-.83-2.294h-.703v3.775h.435v-2.374l-.052-.995h.006l1.24 3.369h.39l1.24-3.369h.006l-.051.995v2.374Zm2.592-1.047h1.71l.4 1.047h.487l-1.464-3.775h-.544l-1.47 3.775h.481l.4-1.047Zm1.035-1.767.51 1.338h-1.379l.515-1.355.166-.51h.011l.177.527Zm8.285 2.814h.434v-3.775h-.703l-.824 2.3-.291.937h-.012l-.286-.943-.829-2.294h-.703v3.775h.434v-2.374l-.051-.995h.006l1.24 3.369h.39l1.24-3.369h.006l-.051.995v2.374Zm2.592-1.047h1.71l.4 1.047h.487l-1.465-3.775h-.543l-1.47 3.775h.48l.401-1.047Zm1.035-1.767.51 1.338h-1.38l.516-1.355.166-.51h.01l.178.527Zm2.838 2.814h.458v-3.775h-.458v3.775Zm4.6 0h.566v-3.775h-.434v2.665l.023.607h-.006l-.406-.755-1.573-2.517h-.566v3.775h.434v-2.665l-.022-.606h.005l.4.743 1.58 2.528Zm4.709 0h.566v-3.775h-.435v2.665l.023.607H70.2l-.406-.755-1.573-2.517h-.566v3.775h.435v-2.665l-.023-.606h.006l.4.743 1.579 2.528Zm5.045 0v-.43h-2.276v-1.269h1.704v-.429h-1.704v-1.218h2.19v-.429h-2.647v3.775h2.733Zm2.764-3.346h1.316v-.429h-3.089v.43h1.316v3.345h.457v-3.346Z" fill="#129C6B"/>
</svg>
<svg viewBox="0 0 63 20" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path fill="url(#astar_svg__a)" d="M0 0h62.025v20H0z"/>
<defs>
<pattern id="astar_svg__a" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#astar_svg__b" transform="matrix(.00136 0 0 .00422 -.31 -.363)"/>
</pattern>
<image id="astar_svg__b" width="1188" height="408" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABKQAAAGYCAYAAAB8ozqhAAAAAXNSR0IArs4c6QAAIABJREFUeF7svQt4JGd55/t/v25d5mK7x8Zjjy8zErYBYxM0CXcD1hAgmATQZJOcZJOzaE6Sc2ADWAokxNllR5M8hGQDkQw2ZskmEicXQwjMJM9h4SSclWBjLjEg+RI7QLAENtjYxpLtGV276zvPV1Vf9VfV1a2W1F3d0vz1PDNqdVfX5VfV1dW/ft//J+APCZAACZAACZAACZAACZAACZAACZAACZAACWRIQDJcFhdFAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAqCQ4kFAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQKQEKqUxxc2EkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIUUjwGSIAESIAESIAESIAESIAESIAESIAESIAEMiVAIZUpbi6MBEiABEiABEiABEiABEiABEiABEiABEiAQorHAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQKYEKKQyxc2FkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJUEjxGCABEiABEiABEiABEiABEiABEiABEiABEsiUAIVUpri5MBIgARIgARIgARIgARIgARIgARIgARIgAQopHgMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKZEqCQyhQ3F0YCJEACJEACJEACJEACJEACJEACJEACJEAhxWOABEiABEiABEiABEiABEiABEiABEiABEggUwIUUpni5sJIgARIgARIgARIgARIgARIgARIgARIgAQopHgMkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJZEqAQipT3FwYCZAACZAACZAACZAACZAACZAACZAACZAAhRSPARIgARIgARIgARIgARIgARIgARIgARIggUwJUEhlipsLIwESIAESIAESIAESIAESIAESIAESIAESoJDiMUACJEACJEACJEACJEACJEACJEACJEACJJApAQqpTHFzYSRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRSPAZIgARIgARIgARIgARIgARIgARIgARIgAQyJUAhlSluLowESIAESIAESIAESIAESIAESIAESIAESIBCiscACZAACZAACZAACZAACZAACZAACZAACZBApgQopDLFzYWRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlQSPEYIAESIAESIAESIAESIAESIAESIAESIAESyJQAhVSmuLkwEiABEiABEiABEiABEiABEiABEiABEiABCikeAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAApkSoJDKFDcXRgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQCHFY4AESIAESIAESIAESIAESIAESIAESIAESCBTAhRSmeLmwkiABEiABEiABEiABEiABEiABEiABEiABCikeAyQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlkSoBCKlPcXBgJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkACFFI8BEiABEiABEiABEiABEiABEiABEiABEiCBTAlQSGWKmwsjARIgARIgARIgARIgARIgARIgARIgARKgkOIxQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkCkBCqlMcXNhJEACJEACJEACJEACJEACJEACJEACJEACFFI8BkiABEiABEiABEiABEiABEiABEiABEiABDIlQCGVKW4ujARIgARIgARIgARIgARIgARIgARIgARIgEKKxwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECmBCikMsXNhZEACZAACZAACZAACZAACZAACZAACZAACVBI8RggARIgARIgARIgARIgARIgARIgARIgARLIlACFVKa4uTASIAESIAESIAESIAESIAESIAESIAESIAEKKR4DJEACJEACJEACJEACJEACJEACJEACJEACmRKgkMoUNxdGAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAIcVjgARIgARIgARIgARIgARIgARIgARIgARIIFMCFFKZ4ubCSIAESIAESIAESIAESIAESIAESIAESIAEKKR4DJAACZAACZAACZAACZAACZAACZAACZAACWRKgEIqU9xcGAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAIUUjwESIAESIAESIAESIAESIAESIAESIAESIIFMCVBIZYqbCyMBEiABEiABEiABEiABEiABEiABEiABEqCQ4jFAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQKQEKqUxxc2EkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIUUjwGSIAESIAESIAESIAESIAESIAESIAESIAEMiVAIZUpbi6MBEiABEiABEiABEiABEiABEiABEiABEiAQorHAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQKYEKKQyxc2FkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJUEjxGCABEiABEiABEiABEiABEiABEiABEiABEsiUAIVUpri5MBIgARIgARIgARIgARIgARIgARIgARIgAQopHgMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKZEqCQyhQ3F0YCJEACJEACJEACJEACJEACJEACJEACJEAhxWOABEiABEiABEiABEiABEiABEiABEiABEggUwIUUpni5sJIgARIgARIgARIgARIgARIgARIgARIgAQopHgMkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJZEqAQipT3FwYCZAACZAACZAACZAACZAACZAACZAACZAAhRSPARIgARIgARIgARIgARIgARIgARIgARIggUwJUEhlipsLIwESIAESIAESIAESIAESIAESIAESIAESoJDiMUACJEACJEACJEACJEACJEACJEACJEACJJApAQqpTHFzYSRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRSPAZIgARIgARIgARIgARIgARIgARIgARIgAQyJUAhlSluLowESIAESIAESIAESIAESIAESIAESIAESIBCiscACZAACZAACZAACZAACZAACZAACZAACZBApgQopDLFzYWRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlQSPEYIAESIAESIAESIAESIAESIAESIAESIAESyJQAhVSmuLkwEiABEiABEiABEiABEiABEiABEiABEiABCikeAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAApkSoJDKFDcXRgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQCHFY4AESIAESIAESIAESIAESIAESIAESIAESCBTAhRSmeLmwkiABEiABEiABEiABEiABEiABEiABEiABCikeAyQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlkSoBCKlPcXBgJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkACFFI8BEiABEiABEiABEiABEiABEiABEiABEiCBTAlQSGWKmwsjARIgARIgARIgARIgARIgARIgARIgARKgkOIxQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkCkBCqlMcXNhJEACJEACJEACJEACJEACJEACJEACJEACFFI8BkiABEiABEiABEiABEiABEiABEiABEiABDIlQCGVKW4ujARIgARIgARIgARIgARIgARIgARIgARIgEKKxwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECmBCikMsXNhZEACWxrAiMnC/nicp/ZBtGlPi1SgAJE5DwA/v2wZ1UVbqn5O3mfO53oORF8179L6QWBnjG3l/PFGQwfW9jWvLjyJEACJEACJEACJEACJEACJFCFAIUUDw0SIAEScAmMTBbyueU+T5f6lNYFrfX1oksFaK8P8ABt/pUArcuiSYyUcsSTPbPa+5KPuY9bOZU2DzNTwYwGFkT0FwSyIJCZZSxTVvGoJQESIAESIAESIAESIAES2NYEKKS29e7jypMACWyJgC+f8n1QxX5ofb2G1yOe12PFk/YFVCCfJBJRHiIxZWVS+LuJUirYzLjomtNd3XOysvQFnP+MmdXHfzDFiqotHQ18MgmQAAmQAAmQAAmQAAmQQIYEKKQyhM1FkQAJtJjA+6Z7cljrB7zrobX53RNUPHkQGPEUVkCFlVA68XcgpZxpoCtEUcZSKr78zs45rK5NaXhfyJXU1PLwL821mDgXTwIkQAIkQAIkQAIkQAIkQAKpBCikeGCQAAnsaAK5P7pvQHTRVD8NQJern8pVTmURJVFLXlAZpY1wSkgo8SumrJSKt+35IJvVvtfZCTlvX1lAnbcP0tkZVE25LYGLp6EXzwTT7do9hzNPn8odvOILi6+88tSO3tHcOBIgARIgARIgARIgARIggW1FgEJqW+0uriwJkMC6BEZnC7m1NSOf3gRo89tpsQtlkhVPyd/JSintIWjbi/+Liasq2VGbqpTavQdi/l1wEbAnvL17j387kE5+plTsX7Qcc78NUq8O6ZQAf9dRwqmFXmFg+roHEycgARIgARIgARIgARIgARJoFgEKqWaR5XxJgASyI+BLqNyAh9KbVFAJ5UioeBteuTIqeb9TKeU8X5uKKF9KxaulAillHktUKDk5T+tKqXP3Qc7fD7lgP+QZ+4GORMWT8U9GMsUk1JallN0vlFPZHaFcEgmQAAmQAAmQAAmQAAmQQIIAhRQPCRIggW1LIPf+Hw54nn6zoDjgiqaogsnmQtnWu0gihYIpejyRDaVLQYg5PCRzpNxqqWCasG2vnkqpjk7IRZcCF13miyiYNrzkSHwpfzdRStl9PwHg7xYPCtv6tu2rgStOAiRAAiRAAiRAAiRAAtuLAIXU9tpfXFsSIIHR+R7leTdCe4PQXqGyGiqoaCpLKadaylY+uW14sba9eEtfXEoFo+1F4iscdU/cYPMUKSVWQu2/DLL/0njrXVj91CZSyhxbc9D4mOdhYrlXGIjOVxsJkAAJkAAJkAAJkAAJkEDTCFBINQ0tZ0wCJNBIArnRpwY84EbRpf7YSHde2EqXrHaKpJQRVGaa8HeFjLIteSniygaYJ3OkEn/7J9JkttO+/cAlvZBLeuNB59F0Yetd+0kpu9tOKcHNpy+XqUbuR86LBEiABEiABEiABEiABEiABOxHKJIgARIggbYlkPvg0qDW3nF4ZoS8xKh3tuLJqyKT1quUCkPLbSVUudoqEX4eZUo5I+y51VLQvo/yR9g70At55rWACSOvFUDuhpS3r5QyWzUnwIkzB8W09fGHBEiABEiABEiABEiABEiABBpCgBVSDcHImZAACTSUwKguKLU6BOBGQDtteWHbXGLUO7+NzlRK2YyoRGterH0v8ZifEWXElf97HRGVMuKev8xcB+TyZ0Ed6AV2hSKqIow8FFYVGVFtXylld60vpjhCX0OPdM6MBEiABEiABEiABEiABM5aAhRSZ+2u54aTQBsSMCIKy0MQuRGCQlBiZDrukqLIqZTyZZRty6sMJ7eZT6mZUja0PBRN0TSunHJH7LMizIor7UH2H4JceRjo6Khszdt5UsrsjQVo3NzpYWyhVxba8CjiKpEACZAACZAACZAACZAACWwDAhRS22AncRVJYMcTGJ0vKHQPAXIjgIL1UFEfXLXWvEgQGSll2/bCvChXJLnCKQoxD6qtdCzU3FRKVcuUctv1PMj5F0F6fgzYtRv+UHlO5VMspHxnSilfTAkwzFa+Hf/q5AaSAAmQAAmQAAmQAAmQQFMIUEg1BStnSgIkUC+B3AeWBrXgOIAeX+zYH3vT/DZ5TWmVSvb+ioynRAWVU/GUVilltFQQeh5UWMUzpRwRZR7v6II88/mQ856RyIg6K6WU2VvMmKr3YOd0JEACJEACJEACJEACJEACFR/5iIQESIAEsiXwx0v9IjIK0X3RKHVmDdKklC+MbEaU05aXliWVvK9mpVQgoXQsoNxKqZRKqQsPQi65Esh3BKtZUf101kops4emcoITHJUv25cRl0YCJEACJEACJEACJEAC25UAK6S2657jepPAdiXwvqUeyelRKAwEmxBInHWlVKxCylZA2eqlpKxy7nfb+pxKKr9SKqyISrbtVVRKdXRCLn8ucM75la15lFLJI3Gis4Rh5ktt1xco15sESIAESIAESIAESIAEsiFAIZUNZy6FBEjAFBT90ZkRHQWWBy6qbikV5UhVqZRKGwHPrZZyHw9lVLk1rxRmSTnztu17hf2QA1cB+XyiRc8ZNY9SKnl8L2iNE0uHZIwHPgmQAAmQAAmQAAmQAAmQAAmkEaCQ4nFBAiTQfALve7pflBoF0Be15LkZUf4arFMp5bftlauaolwpOwKf/5iTHRXdn5InZeeDUpQXpZOtfUpB9j8T2HdRsMo1/rF9L/0QMm18SmH4zGUy0/yDjEsgARIgARIgARIgARIgARLYTgQopLbT3uK6ksB2IzAyX1DdHcc1ZKhcDeXkRG1USlnJ5FcvufLJyZWqt1LKGV3PVEoFbXthbpSRUZddC+zaE4koSqktHHwaJxYPycgW5sCnkgAJkAAJkAAJkAAJkAAJ7DACFFI7bIdyc0igbQi893SfKJwEpCeSUe4Zx4aXb0RKVYy0l8iSimRUslIqbMXz3Aor5zbCzCnz/M5uyKVXA7mOQEY57XiUUls4ujRmJIdjrJbaAkM+lQRIgARIgARIgARIgAR2EAEKqR20M7kpJNAuBNR7nzZZUceTGVH++m1FStmqKF8gJSqkjEyKhFPi8dhjtrrKkVBWdO0+F3JhL5DLhZVRYdo6pVTDDi2tMcxsqYbh5IxIgARIgARIgARIgARIYNsSoJDatruOK04CbUjgffM94nWcDLKiwvVLBJdvSUqZJ1dUSTnte0ZUxaqgEvlRyQopdwS+PQXgGYdS8qIopRp9pJlsqa4SjnIkvkaT5fxIgARIgARIgARIgARIYPsQoJDaPvuKa0oC7U3g958aEJFxAIX1gsu3JKVMZZTNe0rLkaqVIRWrlHLa/XYXgAsur5EXRSnVhINvQQmOnr5cppowb86SBEiABEiABEiABEiABEigzQlQSLX5DuLqkcB2IKB+7+lRLdhQcPmmpVTFaHpOoLkvq8JWPFv95P9OZkjZaTSw6zxg36UVo+hV5kW1kZRaPgO9fBp44ofQK4vAyiKkVIRefApQKviXi/8W52/ZtRuyew/Q0QHsPQfoyPt/+/flw3ZF06aYxQ8Dz7OgzGWQAAmQAAmQAAmQAAmQQNsRoJBqu13CFSKBbURgZL4gKmeCy/s3E1y+KSmFsLIpbaS9tGwpty3P3Hbb9rrPBQqXBMDN2TDxr22k1NLTwCNz0E88An36CWB5MZROuUhARcIpVUaZ6STIxjIjCBo5lRNA5aL7fIGVU5Du7kBMnXMOZM9eoLs7iwPyVGcJx9jClwVqLoMESIAESIAESIAESIAE2oMAhVR77AeuBQlsPwIjp/tEvJMQ9ERGpyI3ykie8M5GZkr5VVIpweaxfCkjrhLVUlZmmem69wLnXhyGrDvr2C5SavEpeA/cBfzoB9BPPxGIpEg2hYLJF0phJZQVTe594WPl54XSKVY9Fc7DraByH+/oCMTU3nMgu/cGAqwZPxyFrxlUOU8SIAESIAESIAESIAESaFsCFFJtu2u4YiTQxgRGnhoUYBSCgr+WWwwuj89jfYklVjz51U7J4PJSmDGVGIXPrZTKdQD7wsyoaP3rkFLWxRjJZiZvwuh7+sH7oL8zA/3k40FVkxFMTtVTTC757XlpUireshd/Tg5iqqMqpJQzH1MpFVZMxdr/jPTacw5kr6mc2t2MA5S5Us2gynmSAAmQAAmQAAmQAAmQQBsSoJBqw53CVSKBtiYw8uSQaF9GBSaqQZVPG5JS0IikVCwrygiqRKaUXyVl2/xKgMoD511SrvSJrX8NKZVzxVsozRolpYor0A/MQH9nGiiuBLvfl1Hl6qdYJZQvqRyp5EipQD4lJFYiT8pvzUu29rnPsZVVvpRKEWL+c/MQkz+1a3cwTQN/BDh25qBMNHCWnBUJkAAJkAAJkAAJkAAJkECbEaCQarMdwtUhgXYmoI4/Oa6BwWgdWyalTGGUl5BSbqWUE1oey5ACcO5+IN9ZbiUMvVpZiKVIqXxQDeU/YvLR7XMaUCmlv/VVX0ZhbSUu92JCqpwVFcmkZHh5KKV80WRlU2rLXllmxVoAo4oop4XPFVc2Y8rOX5y2QRuS3sB2PgHGzhyU4XZ+PXDdSIAESIAESIAESIAESIAENk+AQmrz7PhMEjh7CIzMF1RJmZH0AhnlnjlaJaXCkfPEDSmPtfIlK6U8YO/5QMcuR/w4G1KtUsrIKPPP/HiAGCEVy5naXPue/uED0P/yRWD5qbLgctkmqqO0UjOi1EKQJZWbQQ5PBuIpdx5yqg/i31/wb1dUTKWMvJeUVVEVVbx1zxdgTpVULDzdLF/C9kDzu3sXpKu7kTlTE4sH5djZ80LjlpIACZAACZAACZAACZDA2UOAQurs2dfcUhLYHAEzkl5RJiHoC2RUIqQ8kigZt+9FbXimUsoJMDclTHFJtQDBKew+fwC5jkJFi6HdHlcGWclmMqLsIHMmmsr8M5tZMSLfBqRUaQX6rn8EHnkgLrbiom9KcvIFLfmZUld+BmNvndvIzut+38keryPfp3NyvSjVD6X6gpY/I5vCVkAnIyqQTG64efWg81i2lG0dtDlXVlB1dkE6E1VoG9mA+LQTnSUMcwS+zQPkM0mABEiABEiABEiABEigHQlQSLXjXuE6kUC7ELAyClZGhSvWDlLKhpmHv/1MKac9T8ObUiXcXHrPJadkbPmkCAai0qhk7lWalDIyalcomkw0lYl2ckTUZqSUfvQB6Lv/MWrPs94LggVATgH4u9KfDZvfDf3pvu2zPSUv149c/s2SEyOoKtv63JypCkEVVElFMsqd1lRGudVc0e0cpKPDz5ra8o/GTKeHI5RSWybJGZAACZAACZAACZAACZBA2xCgkGqbXcEVIYE2I2Bk1BomAemrbNFrk0op26IXVkgJvIVupW9fLBX/K2464FcV5UaXBrXIuE83MkBO22EkpxLte7tNaHiYGbVoRdzmpZS+5x+hv39/MKNwUVowpUR/rPTn78wswLv7tsker1OOQ+UG4yPtha15FaPvBS15VkZFuVPuKHwmT8r8nSKnxFRP5ZOJ8Js41imlNgGNTyEBEiABEiABEiABEiCB9iVAIdW++4ZrRgKtI2Bk1KqRUQhllNOO5wiVlrfvlYXUgnjezd4KxjCybyECN7rUo0SmARSi++qRUt0StOqZvKhFDZRqjL63XvueGUHvzk8DTz1WrrCCTHiCmzExPNOynTw+WehUnUPI5W6EUiZ7yq90irXkhaPsJVv6ohwpV0q5VVKhmPJllHv/VjeWUmqrBPl8EiABEiABEiABEiABEmgbAhRSbbMruCIk0CYERuYLWIGfGRWdIJLB5e0ipaAXRHs3e53FMQw7IipEKWNLkwLpj1V4xc1UfGQ781iHAOeEW74MYFlXVlYlJFTV9r3Tj8EzMqq44rs7DUzpnAy3VEQlD7Px6UJn52ogpnJ+KDrEjPAXCzKvninlT+fnUiXkkx++Hrbz2cqpRhzilFKNoMh5kAAJkAAJkAAJkAAJkEDLCVBItXwXcAVIoI0IGBm1pCehJAwwdwbUay8ptSDAzV7naqqIMkTVBxeHoGXUp+tmRMVwJ06BJjeqYOSKAGsAnrYyKqXdbz0pdfpxeF8LZBSAOS0yjL9sfD5Uw46ek9OFziKGoNSNyKmC25pXHmUvPgJfZTVVXEDFKqSq7oNNbAGl1Cag8SkkQAIkQAIkQAIkQAIk0F4EKKTaa39wbUigdQSG5gvo0qmj6bVTpZSIHvM6106kVURZeOd9eGHfU8XuBwTaadWrdrpz7j9PgE4AJsTcNP6Z377Qcn/X0b5nKqN8GbUKgYx5XTiBieFyK+EW9nL3g7pfdaLfu89DaU2uh5FoJr5J6zkofBfQMwq5meUjsqGR+aJVMmIKHaOSU4N+u52THxUfic8+ZqunnKqqsDJK3EypRgqpYGVPLR6Uo1tAyaeSAAmQAAmQAAmQAAmQAAm0kACFVAvhc9Ek0FYE3v2jcUAG4wKmLF9aL6XUlIYcw0271hUt8sHFk4AMGJEUO8klpYjJiDIT6DAzyggpc9+TOhxVLxF0Hsmp6lIKpx+D/vqnzUh6C1rpY7j9XVseNa/j74uDOqfeJNADUhCoXoHqBryHNLxHtC+k3BEAw9tzENMiqG5eu042nFXV8Zl7+5TOGzEVjMoX5knFpFQydyqRKRW07OWCCrXGCymzNyYWD8qxtnodcWVIgARIgARIgARIgARIgATqIkAhVRcmTkQCO5yAkVFaBtcbTa9FUmpOQ4bxu3vqEzsfWuoX+BlYUWlTcFMHssmKkUhGBRVGuND8ZzKjAMy7rXobkFJGRn3DVEYtz2jJHcXHh9eVZ7WOrI6TpSEofSMEPYFkCg2b6Sp8piB/QODNa5Qe0EE1V0XAeri5CnMi+sTydfkNj+bX/dlvDWqVGxUbfB6JKSupnCoqI59CKeW387kVUs17CVFKNY8t50wCJEACJEACJEACJEACTSNAIdU0tJwxCWwTAr/9oxFoHI8EjntWiFrVWlMpJYIxb3XtRGzkvHWwyi3L04COMrBsjVS8UiocQS+cl5jKqF0Cf9A+U3FkZFXZZ8Wre6q17608Bf3PtwNrq1N6TY7i1OZb9PKfXOvXSsaVEVEV1U+OlLpIkOsRYBUoPeBBL9WQUoGsmvFEHdtoxVRhcrawVJRxyclAvEIqDDJ3JVSyaqqRgeZV9r0Ax84clA3Ltm3yCuVqkgAJkAAJkAAJkAAJkMCOJEAhtSN3KzeKBOok8FuPDwIyHk1dZ3B58yulZE5rfQzvOWeqzi0JJrt1aVA0xuOZT2WzlHrC6xLI+UGrnn7O7LThAAAgAElEQVRCA2eSMsr+XaNSqrgCPf1pyOnHJrxPvnNLLWT5T6yNQEkgCG2nWw0pJXuB/DXKL54q3l+XlDLTnli+LjeyIbYALpucfd1j0nF7uVrKGX3PH5VP4Aegx3KnTKVUJm81RxcPSn1VdBvdcE5PAiRAAiRAAiRAAiRAAiTQcAKZfEpo+FpzhiRAAlsn8FuP9kHnJs24cpWteonwpQwrpURjzPOKG6qKsjDk1sVZQIL2trKHiv1RcdK7SPmdZaZVTz/ihQVVTkaUOx9XrDjL0Pd8BvLoAxPep7Ymo3IfL46LIGiddP75i61XSt3jQZsRAqu179n7lUytrMhRHJENha371VK5XWG1lGnXc6VUuX3PHaUvIyG1IApHzly28bysrb+YOAcSIAESIAESIAESIAESIIGNEqCQ2igxTk8CO4GAGVEvV5oNZFRCvkQCJnMptaAFx/CeczdX5WKqo0QH1V5p2+QYqujEt0cAG2T+kAcYkeNuf0xG2ccSlVIPzgDf/uKE96l3bakyKnd7cVxQKaPqrZRSFwnyVwr0YlApVTNTqiyrZlZW1ZGNSilDovuORwd1ToJsKT87qjzanqmSigmpMJ4rg5fOXGcJhxd6NybZMlgvLoIESIAESIAESIAESIAESCBBgEKKhwQJnI0E3vmjaWjdV64karWU0jNae0cxsm/TIeDy4cVZP/zbSqSqbWLBtvpVUZeoQNwsaODxMDiqWkZUTE6FE5kQ8ztvn9GfetfhrRxG+b9YG9GmTe+7M9DfugOYfxjo6oZc/lzI814F7C3U1b6nDgryl4dB59+qOvpe4OsaIKX23PFoXzGfH5ec6nOzpfxAc9u2Z0basxVeW4FU53M1MLV0UI7UOTknIwESIAESIAESIAESIAESaBEBCqkWgediSaBlBIYeG4WSoWj5Ke148ceaWyklkAlv5NwtVRfhtqVBgQ6yo9yzWi0ptU8guwUoAXigBOgaGVExGRXSKa1C3/mJOX3m6cNbCjD/i7V+vbY6qb/018D89wGvCHhmpcKR/rq6oV79q8C+A3VJqVyfQm4PUPqOhmckW0Wrn5NN1QApVZieLyhPblsU9YumSiqojHJG21PlEHZ/XbL40TixeEg2nJGVxapxGSRAAiRAAiRAAiRAAiRAAgEBCikeCSRwNhEYenwAok8Gr/40AZNtpZQWOYaRc7c8OprcFlZHudVN0eY522lHz+sQ4GIVOJ8fesC8rY6qX0rJt7+wXHp45qX45G/PbPoQGteFnJRm9Zf/qoAnHw5kVMkIqRQpdcPb6qqUkm4g9wIFKQHFaS8QbnVIKS2YWL0ut2kxuOvrp4f8Fj4/3FwBeRX8NkHnbkVWVlIKYMj5pg9MPpEESIAESIAESIAESIAEmk+AQqr5jLkEEmgPAkMP9wD56ViIeeuk1IJWfovexkbRSyNpqqNMdpQvPZxqrmpnN+Oe9iugS4BVAN8uBWY+WSkWu8/5w0y38H3kvvbXb137+//8ka3s3Pz42oj37S8dx/emQwkVyqg0KXX+AagbfiNqtasVdG5a98w/PKb9SqmoZS7eqleuuLL3KwyvvCw3ttlt2j19ZkDncuPIqUJUJRXOuwVSasEr4fByr2y6DXSzHPg8EiABEiABEiABEiABEiCB9QlQSK3PiFOQwI4goN7x6DQEfV4y8DtrKaUxo/P6GEb2bb6yyNkj8tHFSWj0l9v1akgpI6M6AFyaCyqHTJC5qY6yT6lTSsn0Jz9XmviVG7Z0YJjqqCcenNX3/I9CUBGV+JcipeTHXhVkSrmSJ230vQ4g36eAbsC7T0M/VbeUWpCcOrz80s1LnD33rvZ5gkmoXMHkSFWMFliWX1vCV8+TmSdVDyVOQwIkQAIkQAIkQAIkQAKtIUAh1RruXCoJZEqg4+2PjkL0kAfxo5JaKKWMjDqCkX0LDQHw0dN9opURbTHxEetGjp3lBLhQgM6wOuqbxXA1AiNVV6XUD/5lwfvmF3u3khtlFqr+dG0E93/+uKm2ShVSae17Jk/qTe8COrvXlVJm1D11lUA/baSUF+dTs1JKplZerrYUCt59/1KPSOdJiAqC851/mVdKMU+qIS81zoQESIAESIAESIAESIAEGk2AQqrRRDk/EmgzAt1ve7gfkEkjoXwZ1Top1VgZZaTOR86MayWDlUIqkZFl90legAMqqI560FRHhaLGf7w+KSVajpaGu05tdTer9z80q7851SNGPOmUCilbMZWolEpWSfmrbc7kKZVS+Rea1kSgdK8HLCakXTUp5U/mHVl+RceW2ikLs7qwsqInIdJyKSUKh89cJg2pyNvqfufzSYAESIAESIAESIAESIAEAgIUUjwSSGAHEygMzRbW1rqnPUiPrYxqiZQCTulOmDa9xlRGmX02Pl+Qtc5ZCApRdpSVLNHZLXGKe4YJ2wawBuD+kpMbZQ+C2lJKC6b0UPeWqof8JX10tU8euHMa8w/61VEbklKdXRVVUtWklDqk/Cwp/bhGaVbHw8Uto2QFU3D/zMrLc4e3+tJoGymlMdPp4chCrzTu+NsqHD6fBEiABEiABEiABEiABM5yAhRSZ/kBwM3f2QTOfesPRj3BkBaJVUZlKaUUMOH9wb5Nj95WdQ999PSgiIRh5k6geZQD5Ugmc9NUEJmR9aLqKDuyXjhddDasLqU86F4M79pySLb64x8M6bk7R+GtRe16G5FS8pKfhTzzcEUbXkWlVIcg/9JgWLviNzxTHheXUi6rRFudeFuvkjLLbRcpJcDYmYMyvLNf8dw6EiABEiABEiABEiABEtg+BCikts++4pqSwIYIFN7yYL8WNalNA5YALZJSp/C+fUc3tOJ1TiwfOTONHPrKrWphCJQdbc+dj3FP+5zsqPvD7KiKgHdHYlVkSuGEN7xrpM7VqzmZ+t2vjeunfzgYZEdtXErJMw5CfvL/SM2FSkqp3LMV5CKB96CG98MwwD2lXc9fYafCTJRMrbxsa1lSFkLbSCm27jXi8OU8SIAESIAESIAESIAESKAhBCikGoKRMyGB9iJQGJwt5Lo6pj2RHl9GtUJKacxglzQuwNxFfNtSj+S82UhGqfBU5ucohbeTZ7eLlF8hhEc84IfmRvhTl5SSBU+WejHcmJZDGfr8JLxiP3QprJDauJRSPz0E7C2sK6XkGYLcNQK9JCg54ebW25lqOVdEubc11OG16xqTvdQWUkpjZvGQbLkVsb1e7VwbEiABEiABEiABEiABEtieBCiktud+41qTQE0C+//PB0c8yHGbG9UCKdU8GWW2/E9PDwlk1JcnRkZZqRIFeydObXsF6IYpEwPuLQZte+4k60upE947G1MdZVZf3jk1Da/Uh9IaNiul5AVvgPQ8v+roeW6lVP66IDurdK8O8rP8lXDa98K/LRNfUgU/E6vX5RrWbtkmUurE4iFpSKUbT0MkQAIkQAIkQAIkQAIkQAKbJ0AhtXl2fCYJtCWBi98y26NL+VkroVogpWawIkcw1phqojTI8t9OT0OFo7cZIWVFlDvSnGucLlCA1sATGvieM7JeXVJKLehc46qjfPfzW/+kg3a9EjYrpeSiKyAv/fmqQsoNOs89WyAHBPr7Gt6jida8ZBB8PINrYeVluX2NPNBDKTULkUJydERforlysZELLs9rwSvh8HKvbDkLrDmrx7mSAAmQAAmQAAmQAAmQwNlBgELq7NjP3MqziMCBX/3eJAT9ngkyD9v1MpRSC9DqCP5430zTkJt2PRW260UiKiGlfOsT/mdG1SsIYGKjvlUClkyglA2IWr9SSrQ+4f3WnoZW1Mi7vxIKqS1IqVwe8vqhypDy5Kh5Bs0BgXqOAE/BH23P/3FDzN2/I3bBNFrro6svy59q5P7cc6/u8/J6soVS6tTiQWlKtlkjOXFeJEACJEACJEACJEACJLCTCVBI7eS9y2076whc/quzAxrqpElI8kPMM5dS6nBTZZTZo7ecHpIOGfWrouw/27rnVkrZvV8w1VEIRNQ3S06rXn1SSuelISPruQej3PS1aXjFvqBKavNSSl7xH4DC/vWl1C4Eo+15QOmeINg8mRtl/V1MVpnjyLTtvbRxbXuWQ/f9ul/El1LpowU2uVJKCY6cvlymzrqTBDeYBEiABEiABEiABEiABNqEAIVUm+wIrgYJNILAoWNzplWvJxhRL2sppY/hj58x0YjtqDUP+cjTJyEy4GdHxYRUmCfl5kiZNr3zVZAZZVr1ngjDzKMzX20pJUpPeO/a07AMJbtd8p9mglDzSEhtTkrJ814DXH5NPA8qbQQ9AfIvU5BuwPu2hl4O18Rtz6scVTCYSDC38pJcbzP2a/f9elBEj7dISs0tHpSmbFczWHGeJEACJEACJEACJEACJLDTCFBI7bQ9yu05awk8c3B2xBMcj4+ol5mUGsP7LxjOAr7cdlqXRZQjpZLte6YEaA+AvN+3CNyTCDNfT0oZoed5R3DTOQ2volHvuXdce8XBuJDahJQ6+GOQq18ZVRjFMpgSYko9V/zWPTwCeI85VVKBdLLyKep0DGWU/8tT6vDaixoz2l7yGNl9f2lciwy2QkoJcOzMQWm6RM3idcFlkAAJkAAJkAAJkAAJkMB2I0Ahtd32GNeXBFII9AzOFnJaz2qRQuWIes2WUjKDD1xwOJMd86Gn+yUnk/F2vaSUclrAbLueqYz6rmnXC0958eDu0MgYa+X803pO/26hKRU0uffcP6hRMlIqbNlzf28g6Py8iyAvOFoOdXdHzktmSR0UqGcJ5EnAezAUUgkZZSVUrH0v2LHDKy/JjTVrH+/6V28aQF8LpNRCZwm9C72y0Kxt43xJgARIgARIgARIgARIgATSCVBI8cgggR1A4Fn/4TsjGnLcl1FOblT0d/Pa9xbg5XqbOaKeu3vUh54e0UqOx4SUXxmVHGkvPLXtzwFrGnigBDxp2/WslNKBf7ISyrT3ibkvkFKivRPeey5saJh5tC0j9/coLbOmQmpLUqpzF+RlvxxUODkjDKZVSsn5AvXjAqwC+t8Swea+mDIzKd/vFpBpjYnVlzQ+R8ry6L5f94hoI6UKmUspjROLh6Q5+3kHnFu4CSRAAiRAAiRAAiRAAiTQLAIUUs0iy/mSQEYE+gZnC0slb1YLCrF2vXCEvaZKKSVH8YFnNHQEtlrY5INPT0JJf2WgeUJKmTPbXgG6wvyou9bCtjQrnFwR5adtlWWMua09M7pcL0YOzDVrN6oT356GV/KDzbcipeT6Xw1kUh1SKvdq5U9auk9HxWL+9kUVY85bgpijKfqZW3lxc3Kk7BJ236cHtOiTQdh6pkHnrJJq1kHO+ZIACZAACZAACZAACZBADQIUUjw8SGCbE3juL//buBYMplZGNVNKAWMYuzCT3Ci7i+Tmp3QQZp6oiHKDzM1t82PCzM3tH5WCdj2/8smRT1F1lBdVRTktezP6xGVNbUNUvzc7BF0chVfy2/Y2K6Xk8BuAvefXJaVyL1fAbkDPBsHmtoPRNU9xU2VcVdDet/KiXNPfL3b/S2lcK5MnlbGUYpXUNj8LcvVJgARIgARIgARIgAS2I4Gmf8DYjlC4ziSwXQj0/eL9PcVcftZXLSLp7XrNkVIzQP5IVq16/v4YfbpfRJsKqaCix/iRRFWQL6D8Hw1cLEDRtOutAQuhiArb8RJZUcH00WOmOkqG8d5DTctM8ldxZLagcjBte4WtSCm59tXAeReFwea1K6XUCxVkH6AfAvSZQDS5rXnl4959wM5ajiy/UBoe8O6+1grTurDSpach6MlYSrFKaruc9LieJEACJEACJEACJEACO4YAhdSO2ZXckLORQN+//+aI52dH+XUsmUmpksJhjO2fyZT5B54cEiWjQbueFS+2tStsuTMZUIbELgDnAFjzgHvW4hVQUVaUrZYyT7Ete0G1lBbvMP7gWU3fPvXe747A844Ho+1tslLqmS+E7H9mNNJerfY99TyBXCLA44D3RDnYvKqUMjs4fHCvyK8/8QL5783e59336H7J6clASGVYKcUqqWbvWs6fBEiABEiABEiABEiABGIEKKR4QJDANiVgsqNkZXXWgxS0hDIqAykFwYnVD16UeQi0ev9T41ohbOcyUsoGcIdh5FEOlAdcIEAewEIJmC2WW/XcEHPTvudWTPmP+ZJqTv/Rc5oyul7aoabe+9AsvLWezUopOfAcyGXXOELKkTiJoHN1pUCuFGAe8B53gs2td6p4R3Dv0CdWX5jLZL/vurc0CiVDGUspVklt03MhV7s+As8ZnO1Bsdhj3jOgpM8/45lzhMZ5JVH+3+a9RIssaOi7grmqYBp4U+akmi8WZ+YmejkqZX3IORUJkAAJkAAJkMA6BCikeIiQwDYl8IJfvH/EgzruyyiT9JOFlALmlm+9ODNZ4+4a+a8LppWrzx8Jz1ZC2dv+mczJiLo4+JSF7xaB+WJlhVQkr9xWveC2aD3hfeDaY5kdFu99qE8B0/DW/CypjVZKycXPAi65Ooh+iv2rbN9TPQL1HAHOAN4jcSFlttfHWEVKdQg+c+Yn1M9kwcVv3et0W/eyqZTSGsNLh6S5rZpZAOQyznoCpp27pHL9nqjrAd2jRfr9OtCwhTv4HYzKGrs/vC+SU+F7S2zaYJopDZnzBHdB6ZnHP3J5U9t5z/odSgAkQAIkQAIksEMJUEjt0B3Lzdr5BF74C/86b0bWC7KjspFSIjhy+pYDLfngIX/wuLFFoXQJ5ZP92w/eDtvu8hq4yIyu5wH3rgKl8P5YNZRt0bOPldv3NLxj+JPDE1keQbn3PTyovdL4pqTU7gLkqpcFeVDrSCm5QJB7kUkoB7zvVwop66PMbMwx5X9S9X/8D61Tay9QR7Li4rfuKbd1LxMpNbd4UFoiXLPimvVy3td3sifvqUHPVNqYhStzrgrC3szfngpu+4eaCqbxH/enC56goWfe98+vzmw0z6wZNWp5fb/0zQFoeZNWMPKpx4yTWVU8WSEVThMIqIScSkqrqtMEywEwpUW+4MGbWmimoHrXY/3w0B9xi7ID7T2JOyoed4jXeiw8JpP7J/aUDc17A+tlT8bVDo7wdVP12Fl3u9JZeTftyaQKNnW9R1f7lCoNBI9V2YB1tkuUzJV+ozPT9+9GvX43Mp/Oz5ZGYohcLjVuRw/FptFzy9flU5l136n74XnByMZph0zyfqX868OcYOHMtdL02IONMOO0JEAC7UuAQqp99w3XjASqEnjJz98/qAXjscqoJkspLXri6Q9fml3lkLv1Iw/3S04mKyqjbKWTWzF1jgB7ASx5wLfWwo+6rpSyAedmAfHsKPO3llwvxg7PZX34qfc9PA6vNLhhKbXrPMgVL46qo2pJKSOk5MUCtRoKqSrvANZrWUIBC1lY/Qm1L0suXfd4J5XCQGrllyPfYtu83gexdTZAgGNnDsqO/0CT1X58/zWnxrVSg27GXVmUxAdiCISIwIuqeILHtcaxP7zzJ7lPUnaaqYTKa7nRExnQEkqoOiqh/Nf2etVSCWmVrKjyRXXtaU55ov4u17l8amGsgW1+v/nYCCDHIxzJ81iy1DP1cf+cFp7aHLAV0ybuiI/3UDkqRNVlhULd3YebXu9w3d3nN2he+nf2tOxzgRpbGYfowdhOqcUzNipH+CzBsbNCSH2uZE6VZVR13o5eGu70SqZWXpb+ZVP3V0sjWuR49B7rvGxi78v2/sR6CDAHhTnR+gsQNeMJZpavlsyvr7J6v+NySIAENkegZW88m1tdPosESMAQeNnP3TftCfrMh7WMpNSCaHV44SMHWnMhMfKDAWjvpCRb9SIhZSucNHChAjoAPF4CHg6FlF8d5X8EA7QzrX1+uXpqTn/oJS2rkFF/+MgoSsWhDUmp3edBel4Qa9erJqXkGQJ5iUBWAf2Dcqh52qsqklIhOvNr9SfM0IbZ/XRP6x7k9aw4WVjNDjo3lWBLByWzSrDsaGa/pNG+k4VSUc1qkUJZZoTCKZRPtirHjhLqyipb/dm1mts3MnOEuUXOLnyJacnT6riGNl9O+CKvnpY8/yy4XiVUlfmlPrdOsQXgFDQ+9vRtl2y90q2ZQsr9wO3fbqCQSgqUjYiy5HqlyJiKdmt33esUOy0TUqO6oGRl3j/EawnFdYSht9axD8Oy488VHZ8rBUWJ7rdH6922MjU5HWRq5eV1CKmNLs++fJKyTDAD6Cml1MfOPItVVNm/M3OJJNB+BDL9cNF+m881IoHtR+DlP3dPv9Zq0pdRQQBt06WUFjnxxEcubV0p/3+eHYGW46ZCSiQUSr6cMlc8TnaU+Uh2aS7Mj1oDniqlVEg57XoVbXw4pT983dFWHhVB+15xFF6xUG+mlFz9k4n8qOrte+pnFCQHeLM6qsKPOvPcDbfdkc59Kz+erZAyi+6+p+RXQ2QppbwSepd7+S3uVl8HH3jeyUFoNR6reIrl3dkKm7BSylbcxGXVxB/c+erUysyhl0z2jH3lSGsk+VbhbPL5RkRpjeNaY7CeljwjVKIz3roiKn3aWCXUBuZnPiyniLI5LfhYZ757bGFs3+bEQVJIVUikxB1bEj8JKbWVCqm6JJKz7nVKpOhQ2kiVVGza8ka1Skip0WUziMXoukKqhjDUIqf0b3Skv3+P6sJOElWbElIhu8hTRmJqfSEVudn1pFdCWlVUVsXklP/HHASndAk3s3Jqk28KfBoJ7AACFFI7YCdyE84uAtf/7L3jnsigr2UykFIeZK60unZ4oZUjK/32t0/CtG75FzseokqpZMtehwYOmPwoDfzrWpAj5VdFVZFQ0Uh7ZsZ+s9AJ7yNHWife7KH83of6RPSolIr99UgpueqVFUKqWqZUJKS+G2ioZIdbJKeciCn/jUIDz9mlnn3X1fKtLF9xJuB8KadnRVDIUEpNLB6U1rSnZgm3ycv6k2tOTWtTyem34YXtd1GFjr0vlBZuu14kpPzRQ49Wy48aetnUOFTuY2P/9IqW5No1GV/F7F/6c/cNeaKOA9ofWTVNSEUSaJ12u1SZVX+geXogenhFGVVg1a7GWtBaTnV3dA5vWEytJ6SiT88hwi2LnXqqpMJpai5ri217VSTSpoRUTOyU171lQmpseRZAT1lIbVzMSY12PXVbcVxBf6z41o4dca7o+GzJvMzKLaP2tit8XDnk3L9lIZWQTutVacUquSrWL5ShQQbmhKfxseWrZEfso6zfH7g8EtjOBCiktvPe47qfdQT6B6YLkI75cmVUBlIK+thjf3qwtfkt77p/EtD9QTVUUBUVfZdv7jPCyfw22VEFAZY94DuJ/Ci3Xc+fTaKySmtorY/gv7+mbS6Gcu/93qDWpeMoFXtqjb4nV1wXckmOtFdZKaXekAsqpL5nXz7lSqnoBWWQlh92oiK8I8uHs7+g33WXHtKiR33Jlk373sLiQck0L2unncxGn3vStBQbIRWKk1BAOULKPpYuq/znLbz3a6+puh9+86VfmPdETo196ZU7Wh6a8/5KvuskgP7qIipttLx0aZWcR2oFVFJ41QhI36IEWxAlNy+rzjHUWzFVl5CKGZfK0UOjq99kyVPKSKONbNtLmVfstR99et+ETNtIhVQ7CSkTZi7edKVYq0fyRftvwXtbZ9Vzhfrw2jxETnlvze+Ic0VVIVWHLIoJokDertuyFzneZPvdppbnijTn9VcWbKd0DsOsUt5pVwXcHhKoToBCikcHCWwjAq8auHtQi4xHwb9+u14TpRRk7uE/O9iyTKVo1wzdMw/RBV+T2Bwp/zrKlUoAzOXoXgF+VAR+WCwPE+dXSKVUSyWqp3RJ92LihrZrAcr//rf7vZJ+M7Q3YFr5tFdEUDkV/JNDPwGofF1SSr0xFFIPhheFoXkyY5m5QsoqO3u3Qa3QGiFl1qX7Lm8Wgp6spBTDzbd2Yhy75uS4BgZ92eTLDCtM0sRU+Txmg83DgJSx3//aa4bT1uQ3XzI5CFHj/vSdpX1jUzszY+plP39vn3hiWrTDHK5AMgUSKCUPqmamU1xa+a/x9YLNU6aJ2gA3IK2So/0lJZho78hyvSO4NlpIJdyVf7y5V8eNFFJtniPVigopNeqGmbsiztkJsf2ROCME+2fCe1tnqmzKfXhlQEMZobvgreR7d0LrnhFSURW0e7ymVUolJNKGhZQZQMCO4luHgIpeP9Yn1qzkShVSwajBwInFK6T1Fetbeyvks0mABOogQCFVByROQgLtQuDVb7prWovqs5ksza6U0lqOff/PW1wdZeC/fTqo2bH5Uf4OCeSUk3oStOuZQPMfrAFPhvlRUaC5F2/dc2VU2NKnJ36m/c+JI/f2oej1KJT6fCFVLAKXXnscHV3xUaPcC1N7MSmAelMopL6fOKp94RRydTLg/XvCv3PmQ2MLKqR8IXW3HoTW47ZcK4NKqVOLB6WleWLtct7Z6HqYMHNZxawWFMrterVa8xxZ5eRIlQSH/+DO16YOHf7OF0+d1MofWQ5ay/DYl185ttH1bPfpX/Hv7hvQ0EbsFapKoK1nOqW2/tUcUS+ZRVWH2IoEWpVKK8np3uWxOgfNMELKzxRMignn77orjeqpwskwR8qt3FpPlDUhkypzIWXCzLFivmwoxPZm3fsv2DdKy5Hi29Ord+XDaycFQcu/aL0jRuGLhNQmBFGlXFqnQioUUtHhliaYaqxHHTlSqeHs4SEwY1oxz/Qy/Lzd36+4fiSwFQLt/+FrK1vH55LADiLwuoHpHs9Ts7a9JQMpNffgn/e0QXXUdAErxfmoOiompYKqp0hKHcoF9mRuLWjbqxxFz8mUMo+HtsU/E+oZ/bE3Ha44ZMbnC8h395n7VdHrt4/rolzvfyAys/HQB41C1AXoDuTn5qq7HzYUotZAEZmBp58E9ILySjNFXVzAb+9L/SCedkirW1cDZeRexCeElL0I9YVUHvDMKHvJT3RWStmWRndwQr8z0jtSbJGQ8qXUTLlKKotKKYabb8EasqMAACAASURBVO4E+sHnnhz0jEhxq6PEvEw2kCMFmfv9r7829fwz1D9ZyC/LfDCgg18lNDf2pVe2/ly1OVypz3rFz947CGC8LKKqjKJXRfBsNojcFVHxVjwbQO9UZdXIiKoQaOtIq5UPXVz/9Wg9Qso/H1apsKkQPVts29uQRGrjHCkjd39nT/37oQHHe250yYTzB180uD8bYSoy572tM/31b4RX19q881434/3Hjsr3+QZsS5az8IWUO4pdogoquh6ocn88R6pOIVVt1Dz7eqqxDpW5Ve4IgeUcKXe9nUquBQGGz/RKa6MjstzBXBYJnGUEMn3jOcvYcnNJoKEEbnjDXaOeYMhvPgsDgpsppSA4Nvfnva2/AHjLl/vhYbJiNL3y2FGBlDKB5maEPc8DvhXmR7lh5slwc7t37FXP3s4Z/ZpXnFCe6tNaPx9F0x4mfcEnXh11/Pk9Ll4YshTIqHIclXvb7Sa008U+CAUXYbEvgrUXa8WDV5zT3tqceGtfkKKeK+VWZzBybYWoUres+uX79Uip3EBYIfVDGxTlvA3Y9r1IRDlhUgaB12IhNa0HIeUqqWZLKa0xvHRIdlzlTUNPTCkz+9DVfzvt+ZWctl2vdo5UJKqctj4tOPF7X/up1HaNd710cghaRt0MKig5slPCzfsH7u3TCqYs1Gl1dPOgqsip8FNfRRtejfynqJWuVhtgsj2wxnpVtBLWDja3HcFTy7dcfKTu43IzQiopoWJXv1sUUtG8qwiwCtmSuCNVxtQp0xqWSRUsT9+UrZBSo8smO6pvS0JKy5j3js7U1t7crauD2he75QPA0/owfqOz7i986j4uM5ywQkjVIYWqyB5jhqZWXqFSX3/dXy6NaFWuRqxd7eRcgyTklCOXytcp0TQ12vbsF2tmLRXGzhyS1P2cIXouigRIoAkEKKSaAJWzJIFmEHj9T8/MaoWe4ENe06XU3AMTve1RcfBr/6sf2psMmIaj5UU5Us7oebsBuVCARQ94qFjZnufulByA3QrYvw+4YB9w/rlA116go9sRT8bAhJ/EklLKvz+UVOsJqaSkqiWl/EyoUkJKrVXcp0vFKdHFGSmtfqFUKs2oK68zIxTFR9yxV/iJSil1NAdlCske1U5wefhW4FREqRQppUqta9kzm+ePuIdgxD3butdUKaUxs3hItv236c04H1Wb563PPdlX0t60Xx3lZNyl50jZqptwWicAXUpe78hMep7bb7140sy/zw1M18DETgg37x+Y7oF0mDD4MDOqdli5f1ZMttBVjLCXUt0Usg6eX1/4+eZH9ate3eULLC0Ty7deVH/YdN1CKmGhNlKFU4dESjqt8ifttGB05xXTMIkUbl/V7UpUzSZwxN4zwj8yFVImzBxpYeaO2HDfx9yTjrPNnpKqgkk+vDopGv3x6mGZ2O7h5pkLKXuo1VuJFfuCLDG4ij0O6xVS7vSCicVDHAE3y/d0LosEsiBAIZUFZS6DBLZI4PWvn+5TgumgMiqUUU2UUlrpE/82cUV7hEkOTgZCygkzj8SU7ZEzZ7J9ApwDyFOeE2gefvNmBNS5ncBF+4AD5wPn7wO6zZB8ZccVFVy51UymEqqqlKpSHWVb9GKiylQa+T1L5Z/o7GsrpcyybFB5UkqZ+xNiqrQG6CJ0qQi55FpgdxjBsU6llPrZoEIKjzkh5n4RWPgp1mHiZ0r5zi+olFLiHVl+Xvaj7Lkvn+6vl0Zgv7F1ZFuzMqXYtrexk9ctz/3UuKdhBl8oZxP5YiqtXc/KlPJjYfXnzImv/1SqCPydl0z2eNrPpyrP08qVHRBufuToPdMaVrZVtsfVJZDWkUx+O18dlUuRqHLmV1EBZWVWnWIrOKUkBZk+sXzLgfrfb6yQSgqWTVcahU/coNjZtJBaL/vJfW+oQyLVzNLyn19ntZXZLxlWSPlh5tCmNTX42dz+m/He3pX+pcFtSz3Kyzlf1kQL2Pbh5h3/Iwg131Sukz3cy0Jo/QqpjQqphHTaUI6Ucw0Tq6wq308ptbG3ZU5NAm1PgEKq7XcRV5AEgDfeMD2qlduu11wptarUvrmJ3oW2YP/LnxuCyGiUIWXkiC+nzI8T1nSBCkbYm/cg8x7QKcCFu4HLLwIu2w/sOa+8OUH6Qjmt2818skVXkVBypVSiVS9ZHVXzb0dKJb49DK7ENcQIKV0ESvFR9NwR9WK3S0VobYTUNcBuZ8TrGlJK/bscYCqkfhSGmNvEcj8jyqmUCjm4lVL+KHutFlLTugdamxDcchCqvTA3Bi12v5NNYadxHw9S3Gv+sG1vPULxx2959t/OayUFW8np5kjZFuPYiHtWVDnVURr62Mg3bkhtF373iydHNfSQna+7HGhs63DzVw3cM6IFx2OyKJQ3hvL6lVDp08Seu2ERFcireJ5UfTlSZn2DZTtJf6nVWLr+EfbMDH0hhePlT+POMVghNeqXMRsSO8koqA1JpPbNkcpMSI3OFxR2GVlUDjOvKgRrCEPRw97bulPbqtUtq0MQjPpHR2Q2gmNFRB8rvbWz9ZEEGzu9RlNvSUiFPMq5Tuu07EnYsueKLPcaw76nRpwT78MVy0tUc9sVSc7HjTRILE+D7fSbPHT4NBJoSwIUUm25W7hSJBAnMHDDN0wLR5jJYtv1mialJv71L66ov32i2Tvr338m/PDhmiJ/uJxwyUZQCXAgB+xVQLEL6DkI2X8+sGuvdT3ltYwFdodSyun8i4LJbQZU1K4XVjjVyo+y1VX+NHZ6681si1/i4tqehf0qpCLEyCgrpcxvI6nc+6IqquAxv0LqsmuBXYX0b8LdC/FOQL0xB+QBPR9UPyWroPyvXRM8fCnlT1tquZAyO7L76yUT9jyYiZRi217dr/Bbn/OpQX9UuERbcbkiRqL8u7J0qWzX017XvpGZI6lC/N0v+p+mOqrHrcByqq/mbt6m4eamVU8h71d+BWe2tDa72u171QPJN96St/lR/YL1DkSUMwZqtbZCc39+AyPsbUVIuR+Yk7fXq1oKLEb8tZCMnnLPtVXlSjiLrbTt1ZJuFdu1kba97Cqkch9YGtRKxmNANyGkvKLXi+Fdc2knKXXrqhFePeHLyYIPfivMeG/ZvuHmkZBqSNB4A4SUPe6Sosq5P3p5pE6TkiNVS4CZXahw5PTlEg0OU/cbFSckARJoOwIUUm23S7hCJBAnMPC66R4l3mzwoSspoRovpbTWh+/762e1T+DnL/7dCDzzbbhjSeyVjfmdB3BBF3D4cmD/gSALKn7pGZdSdjb+J6ZQHNkqIbdSKpJLNrQ8USlV8Xg04l5YuBVOHws+t+HoKVLKBJqH4imSUq58SoqqsIpKe0XIpc9zWvZSKgJCXiZjS65XQbXD0yEkI5qigrOgAqyalDJDay8/r/UXgN136n4oPZkmpJqRKdVZwr6FXmmPisE2PkF++DmfnPQg/W4FVJAjFc+KcjPwXFkV5k6d+i/feN3RtM383RdO9nniBa3LKZVV5qUm2zTc/CcH7j4JyEAgldYRSFWm8U9psedWDz+PLSf80JiWEVVvQHr6qH7Vs6vcMPWlWzcwwp5Z1w1VSCUMTS3psQmJFHvKRqqktiKkKqRTwoylbkfK+0LFG6UJNTdlxs3/UX9iwsx1X5rkS38DTxkUVnBKv70r9VyBW00+FUxgevnHFYbm7Xobh5s3REhFsqhOIRVOX9F+F80nWfnkXIjVqHbypzIzrSKzaozQt9BZQi/fm5v/euUSSKDZBDJ542n2RnD+JLCTCfzcT319SIsedT/YxYPNGyqlZu79q6vaK8T5Fz41Ai3Hg4sWZ0+bUPKrLgauuBS44MJyq5Y7nb3GMZ++zHOdoqrots118n87o+lVhJU7FU6+ZHJCzdNa9WwlVckJRrfPsT0w7rrqeG6U375X7V8op0x1lJlGLvuxsELKXgCmSym5UJWF1BknP8t82xhxCKVU+RNj5ALzbSKkzFZ2f80zbXs9WUgpAY6dOcghp2udZ297zu09WpsKH1MFVR5Vz0qOmESKqmfCaV3BpHHsv8ykt+v9zov/v3E4+VSx5ZQrcCZuvuOV7VPhWceb02vMqHo2CL6WkEq026VXUa3XHhdJqylP9IyIetLz9IzK64Wib/fLP0XTTqXQF5wZ5fmeRkGLEY7BNJttIQy+EwhOzh4wtXTrgfpH2DMLbpaQSr7HJP+uq0LKeVJNwVWPRNrkvFK3o42E1OjpPqVzgSzagpgTyLHSO9Lb7tQtq6MQDMUO6ISQgmzfcHNfSNn9vK7scVro0p5jRtl7ZY1R9mzLXvjcGoIowG04p8ildXOkNi6kzNJOLR6UdClZx7mXk5AACbQHAQqp9tgPXAsSqErgF15750ktMuB/+HKqDZoipZQM3/1XV7XXMPeukDKU9ncBV10KXHEI6N4VcEtmB9mLolBA+Se6alLKbU9zpVRqHpQrpRJCKlYJZaulEhIrOTJflJ1gpnOFlLm9FmRKxf4F99v7THWUqaqSy56fEmpe+QFE9psKqZzPSxshZbnYlrz1pJQnR4ptUCFlVrv7ztII3GwLexHs/G5g0PnE4kGO7FPrNP2RZ39i1IMKsp3cwPFEdVRtWYWF90y/3glDiy/xphd+fl6LGCnihHKHbYBWkJgPZx2lfWNT6S1/7fhW85o33T2uYYPgUyqknPa9qq10qS1+sUqrBYg6pUV/7N6/vGpLbS4XD872qFyuTwTXe4AZ7bDfF491h6nH1mti8dYDGxOIkZCyn5ATe9W9sq2QENWmTVSt2skqpFL8vLrpCqm6WgTtG9k6o/ZtdF7ObCOBYN8OMqiQUqNLvlgOlp0AXH9114JX6uzFcHrlqrpldR5mNFb3J3ksKCx4S/mq82jHc4Vdp00JKbvfHfET4K8lpLRpeQzaHs1P3FkH9ymvXyucJ2YwBsCcF4JRcBPLW1dIpaxfPaHtSti6187HKteNBOohQCFVDyVOQwItJPCLr73TNHMFMqrJUkp3de6baZcwc8vcCCmljuPSPcA1VwL7LwQ6OsoSygZTq0TJd2Sg7HVRGEhu/vR7e+KZ6LFR9sJR5fzprJiKRs+rIqKiqqkwO8rvS3KndTKo7DyjC3J3hL34SHviCKhARFlxtQZfSJkKqav6yxd/9qIumnf5wlB6FOSFKgg1X3QqpBwp51dK+X+HlVJ2lEEN/MpuOTDRK4+08OUQLbr7y7oH+fRwc7dqqkFSamHxoFQVJe3Ao9Xr8JFn/40ZTqBQbvEKs6Gcaij/saoj7vkljBP/eeanU+XETS/6/IBoGDlfbgF0KqvsOTJoB1TDH7rj5e0l1qvsoP6B6UKHzs2nypzUQPMN50gtQPTN6Owca9a5vWdwtrDYmevXwPWAMm2HPfXmSHnQw0u3XrKxfTX0WD8UwpNeCtiKwQqcO9YbyGDdx+MTxP5a97nJdU08Yb3nV71iV2EYYI2zwHrzDh/3bjqn/tEON3PSMWHm2oSZ60AW1SWknDe1MoMJ7x1dqeeK3IdWBrTIyUiI2PVMkZOC7Rlu3vGZ8ih7EcakBHL/dmXPBoTUZnbxnmnd5wH9Wukb/SpmZ9nRLkhWUdmN2Ex1FTC3eFB6N7OufA4JkEB7EKCQao/9wLUggVQCv/LqO/tLoieDD2FNllKQU9/4xLPbq/T55FIPvv2dcTxjdz8uOhBcdFvx5N8OxZK5z/y4F93u2S1WKRWKqSg3yREzCRkTE1JuYLmbH1Vx282OSsqrMETdyq1or9sKqXL1kyuffCnlBp2XgkqpSEg9y3w2S3zDH110lkHINQrmn18htZIi5MLt9zOlwjB3P14rlFLFayzo9njBdv2zNy2Cvmpte9Gw2A0YfU8UDp+5TNonW609doG/Fh+96m8GPYEfZp42kl5ajlTlKHzmkFNH3jNzQ2r1zu++4B9PQsR80AzGHfArsWyWVFBxU56nmvvgHS/fFh9QXvOGuwehYCqkovwnw3TjOVLlvCZbRQXBKa+r81izRFS1Q/DCX3+oTyu82a/6iiRleoufmOqGWw5sqWKrjV4KXJV1CPhh5oJEmHmNKqnoofj7mwiOlt7edSptceqWVTP/sAIrMYUrpQL5sS3DzesSUq6EqnI7wFG9QmqrB3T3PbofWh+HoH/9aqdN5UhZ38W2+q3uLD6fBFpIgEKqhfC5aBJYj8CvvPqrIxpyvFwZ1TwpBaWP3fnxq9tjGGQjojzvOJQMIiehiAqFk3EivmAQv9InJiPSpJRt1Qvb0fzB+dwQc/OcWJi5HSEvFFdRlZQGojwoRzRZuRT9ts9zKqKi6qpE8Lk9AEwNnK180mvlUfX8lrxSOPqeK6VK/jSBkFqDPOtIfFjrim9GgzsiIWUqpIyQisRT4rYXBp17OkAV2FC0nZD6ih6C0qNRK4D9djXl91YrpbTmMNPVzlcfvepvJj3TthVWQMXlUFkapeVIOWJq7j/N/HSqRBrpmywU88X5soSKty+XxVS5lc+IjrF/ekXbi47XvmnmpIYa8CVUrVymGiPWRQNjxkeym/jGx5+9sVa49d6QNvH4BW95aNCDerOGDo6PWAunKXZd3rcw1ssBAzbBdjs+Rb1/eRpK+7lk0U9dVVIxIbXgvaMrvWJ1VBdUx5oZXS+swKohpEJJ43n6MH6jc1t92RAJKUc0xbKdXAGV0j4XfVnTZCFl6e++Ww+URI+rtHY+98uzKuu6bm4VR8PdjqcDrjMJlN8GyIIESKB9CfzvP/nPk8GFvNuu1xwptbLavW/mVGs/GHTfvtSzJt7xUl4G/Qsmk1dgxZMVUVZC2b9T86P89p/yjnXDzM0soxa1UCxZKRXlRq0jpaLA8oRgcsPOzzdlSEZKJcVWQoD5yy4BT68BT9t2PVMpZfOiytlSQaaUfSwUUioPeeZLg21Nfvsb3RdwlBflID0CdCQqpJL5V6GEUuG6WylVvMbYwfb5MW17WgVtexlIKYanpux6E2ae89RsuWUurFyqkiMVSKV46LkR7tBq7Hfvfv1w2tH1nhf+w6DWElRgRVlRjuiqGHHPzEVN3HzHy1suZNZ7tfzUG+/SGx3drmqOVCStZOLrn2i9jHK3vfAfH+rzPLkREpzbg1OwWjj94YvZCrveQbJTHjdh5l5uOjY4SSBE4luYfJdx39eC6ce8d3Smnityt64Oau1UYK07L3+GE95b821/rnAhpQop+35fQ0BF1wnONNLECqnYOWBaF1Y6/NFxAyFpvziKbjvSMbEN0SGQ3DZn/zJLaqecKLgdZyOBtvpwcTbuAG4zCdQi8OZXfUWnt+s1VkqVBKe++snntqxdrzA+X1jx8se9XTLk5QQlJfCMeDL+wwooWyll/k5r27PDBiezMnwZ5eRHhTLKl1JGuJgfU8FkftxqqLRQ8y4AnQLsFvgVN10S/DOz6RZgV3g7XGR00bXeYW5GyyuG/0prwGIR+NFqcN8Ta8DyGvT8GrBShDwWtPXZdj10nwO57HB8VJsq7XvqSB7YHwqpVUeMJdsOncopI6X8OKl/fQDel2andK50DH94w9x6m5TV411f8cwHHL9tr8lSijlSKTv1T6/6+KiGDPnuNdFCF4j0eAB5tbY+SK73ppn04+o9L/iHSY1gdLdy9VUotsJlxpcTnB9VR7Gtw81fNzDdrz01WV9lVNDOUnNav20Rc1//xHPatl2x8JaHe0ylhGnh0VqmTt+2wRH2sjqxcDkNJ6A+sOSH9yf9Un1CyloLwPPkMIbTK5rk1rWTorVfcZj6/lsht3wxsu3CzSuElPV6FZLH4VC1+qh5LXvJg6hgpFSnngScVnu7a+2+SdmGqkKqfFiYWxx8pOGvWs6QBLIhQCGVDWcuhQQ2TODX+r/cXxIxrTBhEHBSQjVOSnkiw1/+2+duLFh2w1uU/oTCnz054il1o5eTgpcHSjmBpwSlPGDklN+eZyWUf9tp4TNnsKiFzxmJyExnW/VsNZSVUk6AdySl3NY1I2c64MslMfLJSKbw70haVTtzGsnzI6cy6wkPWNXplUsRDtMKWAJyReDcoBXP/7evFAipSFatRdJKTDXV6TVoI6cWC8C5z4tffFeplFKvzQPnJ4RUmniLVUxpiAfobz4AfccDwbZ05E94nWoMI60fyaz7yyW/rdXmiTVTSnkl9C73StvIuAa9BLc0mz+96uMmkDsY+S6SQ24FVHrekyurIDLzO3f9zOG0FRnp+2xPKZebtaP3BdVE6ZVSKa2CbR1ufsMb7hryBKPVJJPhsX71VDzkvK1ar2scWXvf9nC/1rrvzEYDzbd0tPLJLSMwOl8QLwgzrxBSyVECU6uaIvMw593YlS5cR5d6VD7nV8zGfmpVSUVFOdsr3NwXUjGR43whk7i/shIppBOKn6wqpOw+CaWU+SIpFngebM86OVKuVEtuJ8AvjVr2AueCSWBrBCiktsaPzyaBphH4tf4vmSHUR73gW++mSqlcSfVOnbo60w/a+z/81EApp0d1TnqMeAr+BRLKywtK4e2SlVC+lAoFlHvbbdmzt62MCj7RBT9um5697YXte6byyQgoU+1kq5zsSHzmubbq6pES4EsnD/q0B5xGIJx+ZGZkD4XkaH/24s8pR4+ure162Va9lN+7ikBXyf8n5vfuIqCKwDkepLgGLFwO/fSh8nEYu2CLL1P9bx1Bu54VcDXD2cvB5n7l2J13Q9/9aCAA8x3m35zKdR0rjrywpTk9HXfoPiU6aAMJ93+zpJQADE51znh/dtXtJrR6PN6uV2UkPVci2Ra7sP0OkOF33/0zqUJ85Mc/N+SJGo2FpTtVV+b8mJRVZcEjbR1u/ro33jWigeN2faPTVDwLKmxxTAkFT4SfA5j757+5um2ro5r2ZskZtz+BDyyZyig/zLxSSG2gbU/0sPeO7tRzhbpleQhajW5ISJWlxrYKN+/4f5xR9uzb/Caqo4LK4uwqpOyBasLOJedXSiVa9zYfbO5fqplBEi6Xll6TtP+LkWtIAu1HgEKq/fYJ14gEfAK/fv2XTmqBP6pUk6XU3Bc/fW1mH2J6Rud7VvIyrnPSbwSUNi16SSHlSykErXth1VS8SsqpjHJH2nMvyKyFqhBSYTbVbiNWBOgElPlEbdr27BnxjAaeKAFPeNBGQp3WwT9XJLlX1slv7dxvfN2zrM3KcKd3A81NRpQ7mp4fah7e5+dHJf51liAXXgF0XxbP4UiTUmY7f7bD316zyKg9cd3bQbujnvw68MA8oJQVUkBHJ3S+45TepY9h+HDLgom77ijNQ6TQbCklgrEzhyQ1u+RsPG39+ZW3B2HmsRHubLZTcsS9cotdJJHsyKGq2HvTzNFUIX78J/7fWQ3pibXrJTKo/HbBSEzFK4Y8wZFb2jTc/HVvuHtSizZDZNZRCeUIKSf8PGjjC9hCMPHVT1y9rbJwtu3r5qZ582Ha33fJAp/YlxPJ94yKv8sfwPXvnbdjr8nlT5YmoQNeWxFSnuf1YnhX6rlCfWhlOmgFS2CsVSHl7I/tFG4eE1KO1InYutcAtW4HX3ZOrb1SHcn6tbjrPi94DcXWz/kSLSHYYtuWtk3BifTE4iEZyXpbuDwSIIGtEdixb35bw8Jnk0DrCfxfr7xj1pPwg1gzpZTIxNSnr83kQ0zPH/9opCRyXHcqaFsBlZNASoUteua2EVVWUtn7TcWUX50T+51o2bOVTPbM5uZH2eon85i5f82pfJr3oB4pBvLJtNkZ+RQTSeHxkBRKjZBSvpAKRZORUWniKfW+IOxcLusDdgcDCsUuxBNSSvYL5FX5dCEVGwXQBL3bEQLDnC3Tsvf5r0J/92lILhcIqY7O8HcHpKNrAbn8sdLwlanDcDf71dR1h3cS0ANRuX+TKqW0YGqpRzK/cG82v83Mf7zn9h4vr40sCiuUnDa6RAVUzRwpJafefdcbUvPrRvr+oU8rPe2O3hcXU/F8qthyrKiBTHyoTcPNb3jDjJONlVIBFRuVLi6t0oLNIXr4q59oTev1Zo6hbf0cV0glC3yi9454hWq0vRWCJLhjxwqp0aUeKSFqpdu8kMKMd2N3amsv/HY9ZUbX20RIut0z2yfcvGFCyh9PojVCKqqSqiWkNiLbgku7qaWDfI/e1udWrvxZSYBC6qzc7dzo7UDgra+8IyhksaNSNUlKaehj//PUj000k8lV7320r5TPjSOHPi+nfOEUiKdEq174dylvJJWVUoD520oqX0hF2VJhnpQ5k5n7I0EU3vZDx8PbNsTb/LmmgQeLwCNF4IdhBZRTKR59hZuFlDKj6dUlouyoe660KgFXvgKi8k6oubPSzoWeXKYgL8/7PMziqldIhSMPWill+vuMM7v988AZU12Wh3SYlr1OM2a7/0+MnOrohHTmx4pLpRMYzna0xq5/Kg0BCFo13HD7JgSdL/Ymv35v5iunfec9fuVfj3rAUCSknNHvgmolJ0eqol2vHE4O4Nhv3/PG1PPPyI9/bhRmGeG5rzJHKh5sHquUcqqIcm0abl6fkApYVQaaxyvB/C7lHI585eNXs10li5dNQkilV0lRSJldoT6wPKq1HnK/5KmQUnVUNYnoY6V37Eo9V6gPro5CtHkfSClZc6qfY9cIif1jws278r04Ji2r9q330I2ElCNsIhdXb3VU+NxWCSmz+F33eWFVm7OP0nKk7K5KVE3FqqsCeMyRqvcg4nQk0EYEKKTaaGdwVUjAEnjby/9XvycyacN7mymlilLqnTp1uGn5Uc898dhIKY/jVkDFRVRYHWWqpXzpVJkllayWMpVTflZQPpEnZc5mNuB8d1j9tKwBI1/MzxkPeLAEPFoEvhfeGV24lS9M419uu5YqccGUlF/2CjtWmZS4OI4JrrBUSweVTvF/afLJqaIybXzmOUYK9by03DKS3B5nHeV5Oci1uaBCylSHpeVI2ZEHozY+UymlgbUivL+ZAhZNILoRUuXqKFdImds63zGTy3UeWzu2byarV7SfI+X5o+2F7GrPpQAAIABJREFUeRThfmtCpZQnDDY3+3X8ir+a1xA/zLyyAqpWjlRMVi3kc6Xe4ZmjqR8AT/z458qB6TZLL9GaVx7Zrzxfd33MumpIW4abVxVS4SfLIFtqnXY+ZxoKqazOOADqElLuCTixbhXvBTu3QkrevzxvwsxrCqnIpjicEl8IeV7XPgynyyJ1y8osdBiSXWEHE0Iq2i2VX94Itke4+U4RUrv/pTSiRY7Hg9e3liPVWcK+hd72l4oZnq24KBJoewIUUm2/i7iCZyOBt1/3T2YY9SDIN6wuaIaU2rM3t/Dpv752XzMYP2dotid/3p5xrdBfTUYZCaVNTlRCSPmB5pGgKldIGWFlqqX89j0jpmy4ubm9x4iqIO/Ib7kzMsIEjj9UBB5cCyqiktLIlUpOO15mUsr/tFytTS+UUrHHXXm1Buw+H7jEjLAXXMDFvnV2v3E2j70iD1Ml5QspWy0WSSnDLZRPaZlSC/PwPvn1MNC8M6iQilVH2b+DSil0dCwgnx8u/dLeplbeucdt1xdNjhSCDz3NrJRSOLrYKy1pTWzG63Qz8xy/4q8GjZMqt+uVK57Ko8KFo+Gl5T2Fo/FB9MS77hlIbRf+/b7P9mvBZHDes7lUznKcYPMgwypekeXKHA+YueWOV6S3+mwGQIOeUyGkUiuhqggppwLMz48yz2WFVIP2TB2zaaSQsvt9J2ZImTBzrceTQVsVFVLrCCkNnNJD3amtvRhd7VN5bSptyj91VFzF+vLLXyRti3BzX0jZ65dERVTEtlallPOYhkyt9WefIWVWv/t+3S9aTzZSSDHYvI7zFychgTYjQCHVZjuEq0MChsCN133RjK4XtKo0RUoFHVud3epzf/+3z7+h0dT73vmDAXSrcS8nBSOjAukUVEP5okmZlj3lB5Z7fnB5enWUHWnPf9xp2zO5Un6llBFSJgfW/DZB5KbwyZzVTBXUA2uBjDJSKvFNa0UKbasqpUw7nC+cnIooK6BKtpVvLf64P20osc4/BFwQjJy8npRSN3QA5wesfCFlZVTYkucfENWqpn7wMLzP/AuQM4HmrpCKy6lAUkVSCtLZMVY82pFJCHjXF01Aqg4CUpsopURwYvGKszs09f/u/ctJT0n/+q15QdVSOcQ8XsUEUUffdc8bqsq93zv8uXktKETLicSUk1eVNuJe1D4Yyhzjr7U6PPal6zKr2qvnnGqElAn1LUs8N0cq0ZLnC7d1cqS0Hv7q3zJDqh72W57mpicmAQlCzcunX0eIOA/8/+ydCXwkZZ33f09Vd465yMCAXAMdjoER0QREGfFIXG9lTVZEwStRvHZfXzPe+u7uZMT72ERBHIHdBBcQVyXjCXglIogLaMI9nAnHwMAc6ZmcfdXzfp6r6qmr093pTjqZyuczk053dXXVv6qfqvrW7/f7K3DgAiaeP9j2XYZAinxrWoa/OypkuxzeK5A8EIlQ0p7bXBs6VhjfTYkbEnbZPTP3fZZno2ivWyZtxodqqmqs8O6v8wZSavUFyF80INUwTBtStZRtO/t7ZGdhquO4tqxzwrao0968h7ZoBlEFFqMCEZBajKpHnxlVYI4KdG26eZDyCz6pkJonlLLnwzOpJHcgQP1K8vXr/+eMz5Vzg7z4Uzu7qUmkRU+El3P4xH4bAkIpQKWDKBVmrlRQwr4HDrLsTCkFpWoJrLUGb4xHp2XmEQNPOzPAPSlhzwuATPrFQ1VAKT3QXHXYc9n3gux8mqKKBZrXN2jALVwpZVzIbHYATUkVGfcCydrpIMoLpdjkOx4DvfUxwFT5UboiimVIyb9rVK6U/M3CzwmGctRsR3tlJfQ1g7luGNjCr2kqCKUIQf/0SWRBmgCU83tZrnmxMHPDyI0q1ZJLmSSzoxwbnaNaCrD1JT95b1tedeYXz7iBqbA6bAVUkFJK5VUFwSq9G10VhpvnB1IeZZTqpOdSRvlypPr/9ydRl71y7et55/O5fYMgGpAKhVJuEOM+BmmfwPbf5QakvjqTIHEqgsbVAVm76vCppMKBVNLqqss7VhjfTfWBgCk3HbLhuxGl1zscSIGQfusjsaoe4+O/zPFoOTfIkZUOej6PWmoxgRRb4vr7LQcm2ssuJd8By20f4zVQpe9iUae9BRkBow+JKlDWCkRAqqzljGYWVaA8FfjEpj/JDnuOEqBopZSET0xdYBEqlQpKrSAUUiecWNt+6aUvLIv9qKVrtGEG8R5qooMFlzNLnVJFMQDlte1RXRXFVVICPtn/5N+825606VEWUr7OQI4QZCYpckx9MW2BPpQCRtNSDeU949W67lSbUkrPjwrMkvLY+Zh6SuVHMaXUyS3uE1J1Vuax75HnGSCvYUHkEuCx6YTcQuwI+mOvUoq9dtffYY3sA4iET1qguVJFcShlAynVhc9UyzdmxKz2zJsrd9e5ZjDLuuwNcPdLZaHU0MzJB28Xn6tO+O9ugGyxVT0SBLk73AmLnRtWKbgu7XcG6f3kPW/Nq57rbvp1EzHMYWG/U/P0BKbbjR8CbH3yfXx3J0iasWxj71Br1QQWv/EtI8yqEqKQkmHmheRI2eopI/m/Pzm1Ihbs8hzZltFcCgZSwTDGpdrlkyw/IGV8c7qHEjhB40EMyHUVEpLZCNJvddXmBUSxS2ZaLBhMjRUMpDyf7QCMAGC4BMLNiwZSQfBGrjoli6eQkkBKqOhcIG0eOVIUW6ePP7hVzMtopI1W5SCpQASkDpINHa3m0qrAp84eouwCT+WnFKqUEtPJBmpcVaU1U9P+Vs+f947nNXZ2Ns470JzBqFTWGETMaHIsem4oxax5/DVu2RNd9KyYIe17QgVl2/pYhz0NWLF8KHK4iSwB0gcof392fw7Zh2dhjaZ5nVx3yDz5SeK1wBNPf0eeAGWVPVCqW7pBd14Lmb8+I/bYp4rKo4jyZk3VrgaOlbE4+l3EAChFTjFBXhzjuVpcUaYDKR1K6TBKV0rd/RfQ8VnQPTGQnLvDnsyM4jDKyZaSCinTAGF1YXleQJIYRmvmzaQiVoj4IG0icILNKwilkjMbyEF70X9149WjFkHCb9cLsObp3fE0qMQzjyiaN9/fPue+sPWMG0YpSELPkbItgD67ngOuxPS6BY591WnnJX9+5YLlms111HnTW0YGKEGb17Jnfz3tdSgi2Bzo/OtPNlbNOs5VgyX7+nyBlBeQLEMgRb45rdno/Mdfn0JKP05rXMmiRjM2z30zo1zB5vymBq3ucHMbSIWAJvsUKERFpcOfCEgt2VEoWvCoAsumAhGQWjabMlqR5VKBz509mLAoHbWIwUHLnFDKVkIJO55uyfMCKv3vWA2ZHfjVpvr51u3sjtFErJ4MUJM0MWueAlK2QkqBKGXbs3/rAMqTIaXgVC1B/JgYMoQgNcVAFJDZnUHm/llkd2e1fBq23lUIpQhxWrATyrx1Ta474z5VlMqLyuYJO5eqqbXHAYcm/KDNA734+eimGMgJouUcnZGWvUKhVCYLevufmO8SMOPAgRgwLS16zJKnMqNqxHOsA58NpljOl2rhLE+MiUE7M2+MVeSCueaPmo2hgkqpmVO83pL5fouWxvv/O/HfbSAYULDH1eHOthfrIEgGkvtzpMY239feWMhabz3jhm7KFFmeEHPV7IE/r1n5HFilQxzb2jZy6S3VE27+prcM8w5THBGr9VMWRA9MC8yZcivAuCqNEpJMpWcaR7Y3V40SrJDtvOSm4UAKmkTVf2/DGesDboZ4gRTbdhezQMRl8vONmQ5CWJi53uHOrYAqEEiNWV11BY0VxnfTPSBUKrK0m1Aa3HJV17sA7htNVR1uHv9lls4ra0m7iVVVQMoGbNp3Rr/hpqu/w2BbpJBaJoNItBoHUwWWz8HvYNpq0bou6wp87uzftcAyeHepwqAUkINlW2R8EEplRin1lFRNxWvJX3/2q3M2zaeYLR8cbbJAB2EaIrycB5g7uVHKqqdesxVQDFJpCig9P4pNgzoDtcfGkKsxMHNAWPPSezJIPTCN7J6sDEkWEMoJTV4gKEUxRAyMgeBxiyIJAqHyiGEE3WuLuwjsHm8Csg3IpRIGzSVoJvsi0GwCNNdkB5e7MqW0APRjXiTyo+TFrOvE3wOljLY4yGoCOgsgo1n0dCjlte6pfKn9SVgDd4KsjwOHSOXTpARTWoC5E2geh8HgVIwpsoQ6igEDV64Ta61dAShV8/vcMAwI6KcAmPa4XN33DIM0T22ojNJrPt/HSr/3msQPByxCHEWPrYDSOtwVliO1efN97b2FLG930w0JYhCmkrIbPOid/Fx5VUH2QQ/YsSyj+bIqCTd/47nDbQRkwBtW7sC3sA57YtzjX99AFRUZSadnWiMoVcgeVuI0DEhxm5H7NNr1p1ta626u4QNSAL24Ydmck5NvqjBzD5DS1ttbHtexzIFIvVZXXWGNMb6XbjIsvdtemAVQzjw/kIJlVG+4OQdSqrVuAJixV80Dc+zzhKoHUnJHKWXdIiBV4qAWvS2qwOJVYNkc/BavhNEnRxUobwW+cNZvOwCjT6mj5oJSOWpxICUypoRthmdGsd9KPaUFmXMnFgFWHmJuv/Zn5wS3US5glVoufKiJ1JmDlHXSY+BBU0dxEBUT3fUEjDJEkDnLMGIKKdVljwee6+oogvr1MZBDY5jax0AUQXpvBtM7ppDZk3FyabQL4QpCKWZlHAGhdwHGEOpKAE4F1DF0kq7hJsBqMmjuRTSXaQHNNtn5Ueyqp/EcT/dAr0JMzrmGgJxfAyMO0L3SrsdOZFVuFL+qlaopJa/jO4l4jj78GOifWaB5HGR9LbCOhaPHgUwc2KvCzbWQc6WU4kAqoOOdOsE0aGfudeVVSsV/bw0S4u20V/5MKQrSOrtRU7/NZzsvkff+KNGXsGDyMHNlIdZzpJxOehKS2HBIh1USIlukcfOO9oKtwlvPvHGYUjSJz3ZUV1IR5CxPYOi5A23Ybm9R0v+9W19eFYHFb2gbThhZMsr7CxSgjOIKR/XVDQZR0qbI5zdiGrT9r9dtLLjOS2RXrI7FDAFSihHYCzkH9NBXZtkAKRZmHlNh5uFAymZTrisRN0SyQBuxub7gfdi4JDUMoEnU1QOkAiCgULEFKNjE81Ubbu4DUmo11KqEqYcCnueh5q1G62J9servZx1ymdpQO1/gjwNypApZvwhILdamjD43qkDJFYiAVMmli94YVaAyFfj3F9/UbcHY4gCp/EopBqNyNCfsenaGVFCQORUWQDkNCN26/fet3aWsRUvHaINJs4MwmE1PqaKYGkbBJwGebNUUg042nHJb9RSQqj3SRPx5NZiZBDIWkJnNYfKeSaSeSQvQxhVj4sLNCXiXCqn5KqXSk8DMXiB1AEhPAM97+Vr0Fql2KqWQxb7nI79rMazcW+mq53XgiA1CHqWP4j7bIoD1BsireLc7YFw05uFXrd7fbMdgPx6lFL39btD7nwPMGhBm2WNA6vhaYc8jNaDPMfAkrXsSRnG1VMwU4oEwKMWXvbxQquZ3uW4QbHF32ZPXJWVUSlFCOmc3korYDovdJRZq+msSV4kwc/s76A4RV9a5AmDVyMfv/ycZflbY0n/xjBu7LKAnsLOfL0fKHXrOd2s3vEnGYpmqCTd/01tGxilBQxCQ4l/REnKkFLQCIUkQuvmO66JMqcL2tCKmKgpIaQO196xb+3u5ACkeZg4VZl4skHJZ7UaszXVFjRXGpbNdoKRHbMkigZR+PBXbJWnVxhrRWdkOsUXsdfakywpI3WfJE5MCgJTarPmUXxGQKmWXit4TVWBRKxABqUUtf/ThUQX8FehmQIoSD5AKh1JZZJGlOdEwTWVIaWHmrpBz2ZGKXaQ1nlTz0Z4rXr6t2G3AYFQ8k2bKqCZuyZLqJ6GGEkHmLquefN7iaigBqbh1jymmWBO2egOrN9QhCxMz0xTZHMXEg5OYfmzaBaHKCqVYQDgHUPuB6b1gpkcQtjAMqhnscTuufn1Zug8WW99CpidfmxwHJQ2uls/qjR4oRc6KAaeaAIulOkBBhNBf/CiVlAJUOoySr1m/GALGcwJIMWWUWQOsrQFprAVq4xxG0efY87paqobvBwxG8ZucCkpJOKCAkfjY8kGpmpskkHJBsPLb9wjo1unTzJJgbiHbtxqnufb4q5g6KmEHhUtQ4sqRygOrFEwGMTr/7/3tRcG87qbBBhipcT0rSoBpb8c93cKrsqWEclQHPhYxOi/78zlFLUOltsmb3jzSRw106Ms3txJKA1UatBLCxwAVFTBECN1653UbnUy7Sq3QwTLfCEiFbmnyDT3M3HPTxAOJvAIyPlPH97jZ2lxXkLXXXpiemYQRM0btv71xf4FAUHtSBx1sUZiS90M1VTFW6AWP/4JlSHmatXggjV3bfPBGjB+LppBqGKYNqRo6Lra7tq+odQtZ9nyh7QZB6+T6g0vBfLAMu9F6Lt8KREBq+W7baM2WaAW+eMaNAzmQNm5P8f3zB50LIJV1wswlmPKBKFeGFFM30NbtQ68t+gLl9e/YMQCTtCno5IJSLhglbHoMQOkB5ypHij2/4tg46tbXYWKvgGmTT80ged8BWFlq23B0ZdS8oJSVExBqZo/4zUmJpCUMRnEQJQmKSXpx1WsLy61Y6P3sK1NthNAB8bEeSXsAlCLtNcAaApqkQMp+FwdTPiilAyr2eHIS1s9vA3ImSIxBJtlhj/1eVQNyCoNSNQJK7Y+z1oi82x7PjzKJrZAK7HinTkC5UIp2Zspg36u7IdNiGQYLG/Yos8oLpQwGpE4/eIDUjxN9bRY1WEc4xzKnwEdQjpTP1ueAo2ytsXbzSHtxWWsAus+4cYDycdHfSU81fnC66klYpWCNAjVyDGR2tu/d8vKilBeV+poXlyOlwSYNPHkUYI6tzw+nxqhBto5cu6HqLrArVd+KzVcBKTdA8Yty7LPsAFuYNgayh8tCIcXCzEH7XMpd13q665APSFmoXYvNxauTyCXpQQIqLWCey5xCgZQDSEasD8erYqxYjkCq7h7aQgzKLHvBQCrweXlTzQewRIUMIwJSFRv3ohlHFahQBSIgVaHCRrONKlBqBS5uvmHQAlpYdlQhUCpDM8jSjJ0XZSulbPue7LznUU0deljNpiuvb/1rMcv5pvPvE12hGLxRFjz2WIIo8dvptOcEnTtZUiw/yqg3se6MFZiZNpBOA7MTGey7/wBm96U9ljxx8TkvKBVLAs8+LSAUP7nRZDs2hOKqKA1KGWO46lUFdfYppn7lmNb46mQfpehwdXDy3NUV60mAVQTknxhIAuhOyzmLkyqpQCjF3iuVUvTJJ0EHd4j8KA6jpEKK/5ZQ6tQ6oZSqiYPuiwOWCDTnqiilVJIld98B1S5M2PKUAUrFbsi0GEQCqQpCKUqwPXW6UXL+Wjn2g4Wcx3XH97PgbQ7JfblNMtNJKaBc3fD8sGr7xx54W0l1++IZN3RYMPoUlNaDzZ1sKR1W6fDMbX1jXwTLIlUTbp7PtufLl5IQ2oFvAbY+B7z5MqekiippAf0GwVUj124QTRmin+IqEAak5AW06+Rapy7L3LJHviHDzEPX0w/mfFBKqC+30811JY0V5nfTHVR1+JvLtuf9cH25JfCwSPWFm9sKKT3Y3ANv7BtBIVBHnCcsrkKq9t5cjwHS5bLZq+VV5zEh4Cls/aaPPzi74BY3gEVTRxWorgpEQKq6tke0NFEF8JWm3wzmOJASNr25oBQDUhlL5Sw5EUC2fU9Z+TRAxS5y/vU7R65tbi68NfhbzrunxaKEddTjyicOpBSM4vasObKkuEWPYPXxNVjVuAITu8G75+17ZALJhyecXChfTlQJUIplak0/CyTGYa3IwLptSlNDMSKm1FCexzqUomhG/zlVd7FGvjw5DgJPflSIUur5MXDLXhqge1RIlHO2R6iWKWWnJSsrHwW9827QHbsFkFIQiln2dDDFlFIbpX2vtgZ0PAaSZXDPo1LSoZS9CO5DELHmp5Squ4EmcrBGXYqsytj3hmZfuHghsAs5TLIwc8Mioy7gFGTNC+xwJ2xzznvR/rEHzivJCitte8w2yPOWVI6cAmQCxDvAzJ11JTs96qCGomrCzd/0lmEB+oPtdt4MrPBg87wgil/kO/ZFlSUIMpIjuCqXy27fEQWgF/7VKhpIaVfZIbBmySukWJi5KcPM5wOkxP2Uztzm+tKUfD20wYilhQ1sLiAVdCzy3eCpvnDz5QKk6u61RgmQ8Nv15FcxKNhcbdZgO9/I9PGk6hRthQ8s0ZRRBQ7OCkRA6uDc7tFaV3EFvvqiXw1ahLSIbnlzQ6k0TSND00Ih5bLliYggp/uefCyn+9ktby74+9/WNtyQgTkMgyQ4zFF5UfZvOHBKU06JwHOhjjLrDRz+wlXI0jhSaWBmIoNn79mH1ISyG2ph5SVCKSuXgjX9HKzJp2HRLMjJdaDH1cK6axbWfqWOkjDKpY5Sz7EcKRtSbcaVZxWXX1Hp/eorB9oINYRdz3/S7HuOtNYAxxk8Owrsn/rRHtqZUs7Vqt11z7pB5kfFZKC5su0xdZSy7zE4xaDU84V9j9TFQfcSICOXkXVUVHc4WWn1ZXetiNgxCYzmzOtIySAw/pscp2wVhVIGDhog9ePj+lhW1hZXhzvbCqe63mmd9IJsfQy0gCT/5cHz1s7nK9J9xo19lBAtb0nlSCnYErQ8HhDj2PeS8SoJN2fjaypHRilIg8OFBWR2K6FCM6J84eeh780DrZjyD4T8vMY0t4/0NxZtq5zPtl1y742AlG+TGV+f7qEkKMy82BwpkrRIbWMpdj21UMalqT4wJTE/3pRo23OOsUmrprrCzTmQUsdSPTfSA2lsAZgX3mh/8y57r174GyzMrgfQwUClk718AZ328gOp/unjSVV0UV1yY1q0wFEFFrECBV+QLuIyRh8dVeCgqsDXX/hLamdHFQClsshhJjctOtEpAAV3Rz2n+54DqH56y7kFf//PPfeuHhB08TwoBaSkOor9rcCTsvHpz7Eg8/p1MRy2YTWmp0QG1u7H9mPPowckMHOrKOwOesVAqVwKuYknkJt+Vl6YyUDjFTEY56xB7tkccjuYisxly9Phk7TyMWJiQ6kRXN5cVXfayJcnBkDRZp9g54NStQTknbVADKBjltg5vD8STLmhlFRIHUjC+s0d4H4/1WFPB1Iu+14NsLoG5DShlCJxArqbguaCs5yYwM4Nx7QnKJKEGq2lQqn4rwWQqjCUGpptWvgT+MUYCP9nfd8oJUgU1uFOB1Oqo6etWur/lx3nzetCofvMm9ooBc+yCrQPBnXcC8+RYvOonnDzfxzuplRXSQWEk3tDywvJkVI1maNjH9u3bHsgZ8NkBARXEdPYvqO/cWwx9r2q/kwdSHmhh7e5mz28+e1qOpNf6gopHmYOqd5VsETfiHodtCHf65oDQb+1uX5eY4V5SaqNAvLmTYlAygY+jGlVV7j5vIGUtm6LB6Qslh3Vkt9aqH1nCoBtxEDn1HEHVwfcqh4no4WLKlBgBQq+IC1wftFkUQWiCsyzAt88/RcOkJIZLPmUUllYmM5NSruKBqW8nfbk3XbGJVYfbo795y/eUlBGUtubhpssgmGmdCK2XU+qpGSXPSdPSgArAa6ERa/hmHo0NDIYBWSyFp64aw+mxlMCoOmdujRrT8FQiuaQnXoa2YknnYZx7PO51ZFZC00YZ68GXRlD9tYZUIspKlwqKD+UEl32xPMmacZlLyhZrTPPXcH99u7xBInF/N2DwqDUSSbIOXEgTUV+lJJUsek1hZR67IVS9OGHQO983J8fFZQlpUCVglIxUUJrDxWf5bXNyad8UEoul0UxYsWNVrQWH2gb/5UDpCoIpYZmm5c/kPrp+r42CjowlxUuEFZJWGK/16TN/3L/+fP+LnWfcROzD9qAzG3NkxAnMOvKn7UEAyPfu7k6ws2lSmqYgiRslZQN2DzKqEAQFaQEC1FUSQLg+5xwaDVCqXFVzEQEp9SglQ9IyYt9L4dyjcEBoGZJA6mvs2YbDAB5SZO2onnAnA6lCLHac5tXlmTt1ctqXJKSgMxDCL1XPl4ipr8ub24AqKpw8/jPVZc9bWfzqqCUOMxZh4DgcD5GLLhCasXdtM0CHXDdPNIgmQ1q1bYJWAd7s2nrXUOxNtlY/HlDWc/VoplFFYgqUHQFIiBVdMmiN0QVqGwFvv2C7ZRlR7k67OVRSjEgNZU9YAd/25Anj33PjJO/Xntz26ZC1qTtjX8fpAQtShmlAycnR4rBHyam0fKlTILnnbwKK9atwkwKmEjO4vG7diObo1LNJVu0lwilMhNPchhFaU7c2ec1E3Y78dvkv8kxdSCnr0T2gTRyz+Sc17laip2ohgEqk61QL76/oSq67RkXT3RTYIure5Eu1Vcnc/JMjrxa2vX2WsC4TDHXN7gOpaS/Rw85p4O3AM/NuvOjlCpK77bnVUqtioFsZDAPQp21NwBKyeUw9E5/7Dl1hcweUrI99/rig8Pjv8qOAsTJpKiQfW/2DJfOq5Cv0pKb5qfr/1N2ttOscKHB5o5qSY1BHFTx6Y2xjz54XkEAfK4idZ9xE7cFMUuzmL+mylI5UvYyitf05XF2M/neXBWFmzP4bxrDoUBKfscDs6ZC1VNupZVv/TmfLkyNJYYJuh3E+Pmj/Y2l5fvMtYGXyuvFACl7bA6BNfLppQykyNenGFxoKwOQGrM+UV+WscKx7Xkla14Lofo7QMGmwQ7Lyjbio/VVoRYsGkiFwh4Zar6Alr2Vw7Qpa9JBwtR0Ss2cZ/lEN2Q5MHjAlEddtX06QUoKwl8qw060nFEFlmsFIiC1XLdstF5LtgI9pw1IhVThUOpAZp8DpOxwX2HP0+16jq2PDP3kr//UOleRznvDHazb3yC7+OPwhv9zOuxxOKWeU532ZGZU4kWHAvE6sKSDPbsm8eQDe2TLeKmMsrNmilNKWVYaqT33gOVFiQtStgzuWrpaAAAgAElEQVSOIspRR7HnTNAaE7HXNCCXIsj8eYqrpji8cqx5ml1PCzsXUCuJS0+cV+7NXDUu9HXyxclREJqQvMl5WxCUqiEgF9YJILQj57breRVS/ApVJRxTcCg1PQl6418B1hLR22HPB6P0zns1Yv9YQRwoFWeB6lSqpNSJpYRUTCnFP1v7J+EYe4pY2Jp9o8kyjAr+if8iOwgGUNVJrDrhVSey7HcZgs5nz1zeQGog0ZfIZS0WIq7lEykw5QZBAg6F50iB0N6PPPiOsoDd7qbfNlGTMiWRBrbnXsbALCax2/df9ueXz8seVPDOWcCEbzj3bt4hTC2v8/UMUUB5VVSejCgBoOZST4UDqUCAJeaXpACDUt8ZOxgtfSUBKZtMubiNGtOXLJBiYeaGJdS7el5ToBIpuAaO2oX0WpvryjJW4HvpJsOiw2UJNhfr0mt9OF6eZStgLMg3iQ2kVM29wEaxtTnUUXJ8WDCFVMMwbZgxeG5Uk34u48p8VLuIvU4F5kgB7dONZN7KunlumujtUQWiCpRQgQhIlVC06C1RBSpZge88/3rNslcYlDqQHUcOFgc+orueyG8R3a3YbyqUAuz+NiHIETr0k/89f04g9fbX3zlgEdnunZ0xSPikQyhbJSVBFPu78fRDYdbXI0MJxh7Yjb27mKVQdsvTrTzFQilCthOLbp569rZhi5AGpm4ScEnAJ6WOEoBKvMZtey9cBXJcHTJ3zCA3bmlQStrzvAHn+t+m0Yne4xZXDXAxCzOXdgj9xFPtiF4odVoM5CVxYJKCPinDo7yjvUshpdn42POPPgwMPy7gEsuP0jvsBVn27M57cfEe9rOGgJzK6isAEGWXr1yR5nTxUyDKpZTiy0VA1fJlaHvu3FjBJ5kcSIEBKXlxpIGocgadz754eQOpnx37nzzM3LHr6Qood1aUr8OdhCC2MsmwGj+644KyKQu2nHnTKIVu29M7+anMKp6D5FFRyeV2Q5tkjZlp7B1qrZoQ79e/daQPVA9vzwOVPBlReQCSr8NemDKKf//myJzSO/ZZwJBp0q1jVzYOVfLYWFXz/uw+Ab7tMVgDLfKha8i1/whQ4cjplyqQMr4+JdS7Co7oGyoflPIKxvi5S64Zm1fN29qrFsG4NDUKyrq4eRYkcLm8C+RrHpK0PhyvihtUbiClgcAAAOXAPlkVzzSULIxljymjcoTb9JwbawWBM+0741l2bd3GphtJWZR1VTXORAsTVeAgqUAEpA6SDR2t5tKpwCUbf+bOkCrAvjeRTSJNM8KaIiGPDqbEcwJGccUUyNCP78gPpN75htsSlhXjCgm7xTqzwMl8KAZ9lGqKP5YKqRNPX4f4inrMZiw88ehero4SKi2ti16RUCqb2Q+jtqH90f5GDiaOeNOPBygx2hx1lClVUgpCOYopbt87JI74KxuQ3Z1D+u+zYlpbKTUnlBpC79FzwrtK7mHkiwcEZBFn/AEd9twnpOSttcBhBuhTzK7HW9cF/GhPKoWSmurmW4E9M9z2SGzYVCM766kOe1IZpcOoWExLEwewjoCcIKEU2wcm5Ak+/zypkpLgyVZK8StqbtlTWVfJXMpoRHthuRDx7UohJT+rQkqp2bOWN5C6/pgr2XefZzWp768AGB5lklJHybw7t1KKg42RDz/0jrI2B+g+48Yui5AeJ9hcs+ZpweZeu14YZAGqJ9xcfQUZlKIMSoWpm2wQJbaHAFFzKaGCp3G9twgQpddTCBvJGEC2PvlfiwzwKzkYq3l7gVQAjHExkGUMpMjXp5g6SkKGQsCPBu/cfG7M+mR57Ho2kPpuugeEdvlUUoUCKbWoNjipjnBzDqT0ZSul0558/0IAqfph2mWBbiFEht5rN4rs0xr9ZpvrsQdIaeutgBQh6JxqjMLMF2Loiz4jqkAlKhABqUpUNZpnVIF5VOB7p/7UA6QYyMmvlJrKTWLGmpYWPdUKXVn2HGUUU0oJIIWhH995YV7IcsFr7uiiBnrcMElAKMLVUApIOQHnJ71gHWpXrUQqa+H+u57G1GRaU0YVD6UsmkF66mnkmD3PjHU+uf11XKl05Jt+1kEN0sdVUJpdT2VIiTwpB1IxBVX8ZYcAh9cgNTiJ3KywHqppeNC5ropSj9VvK96I3rVlU3gUtXt0T7QQQhmQ0sBSHih1mAEOpHIAvTcrPkof6dVjqUSyl0VJkhgMGn6wnTyxswdGLGGro3z5UTGunoIKNGevGyzNXM5RniCTYwzgGCLsgxkAU34YxXZIHqquZUqJxRFQilAylH1LYSHi8QEvkKqMUir1kuULpAaOvrKNEtbNLsgKF9LhzgemJBwxsPnDD76zt6h9fo6Ju5tuSFDTGA3KkbLtg1qOlD2dBlskQJH5cxi5rErCzfVVf/25d3VZBunR1UgOpw2y2XmAlMe+FwCQ7Ni2QnOk5oRfAoqNgZKtO5czmCoASOn3DpxxOECFo4a6ixuW3jk5CzNX3ezsY03IOnqPYZ5jEwHdbH1yRVnHCvTMJIyYwXIFA22S9vctHzDUVDmUYIh+KL6oN6jYMvuAlFq/AKiTv4tdZTOk6v5GO0AoU885uY46SAuAS8F5UQG2PUddNTZ9QqSOKucxNppXVIGFrsDSO/gtdIWiz4sqsMAV+P4pPwkAUvmhVIrOYCK7323Z05RSQuXAbHvSxkcwdN2d7857UvWu19w+bBE0uRQS7GJDy5HSLXwbTjsCK9asxGzWwn1378TklIRR0kaoz6cQ+156Zjcys7v5XX8YcVAjPvb4z1/DJdmJtoGGVM4cZ6CJdcPTQ8yV8knZ9pSdzziuDrEz1yC9M4PMCFNJOVlSbFoHSsmgcwWjxAlTP769blFyZkh3cgAw2lwnaerqRj/5VBzolbXAySbwnAW6M6cBqTzDvQaCag38ZfaNteega7CBZHIDxIy3QLfsucCUUktJ9RTL5dIvMhSUOtkA1kooNUmBlFxYLTuKL50GpTiQklCKwyqCzZm3mHNerMSuz7Kw1BZ/TpQ8oZUXF/O176VeunyB1PZjLx+g1Gjzh5OrvDe3Fc5l67NVVEJZFc/Uru0cay+7HW7LmTexHCnWAVSGcjvwLKgroBp/2I4UCHiqKNxcP+S8ru3uNouiD0DDnGopVYsQEMW/Yq7w88JyqfzvK1iNNURBtu66cv3ys/KVDKS0AdIzJNMvLT0gRb6mwsy1vbbEHClqoBGbyx8ablySYjlSTT6lcKEqKQ/ksXKLH25ezUBqxZ2sg571VgrCOi822OcEGthTYeb6a0rtVDCQkl8l00Lr5Mlk+Y0xC3ztEX1cVIHFrEAEpBaz+tFnRxUIqMC2DT+mQuEjlE7uf8FKqQxySKZ3O/lRAbY9lSfF7XsUQ9cNvzcUSHW03JbImobLrmfbdtjJpq2OEkqj4xsPxboj12I2Z+Geu5/C5FRK2gedbBcHQuVXSuVyacxMjiGXnQHMGANREkgx9Y3ZPra9ldv2jn7rrwcoMTXbnsyN0uCSCi9Xyqma1x0KujqOmd9NgM6yzG4vlJKh5ioHST+xtsyFV0l1jycINUbFCVqQKsrzHAszP78OqCegd2WBlCRN3ru/3v1Oy5OilHTiH2vszCzj47f0wTQ7WLi5UEQpq15cPma/JZBi9kgvJOP7C0TI+QoCsJBz1nmPsTK1eLpl0PuYrbmUhRAr15xpr8mbL8KAFCha+KbzhZeXD0qlNi1PIDWQ6Gsgmex4QaHhSnGkd8rUbX2UbP/QI++sSNej7jN+22ER9CnAouzKtq1QgXANkPlBlANkLKB/WxWFm+tf0Te0DSey1OyjhLQEwTQbVHnsdjwLSjpffTArj3pK1VSAqMKglXe5PO/tn83kNif7G8sOJhftJIIBKZVVpxYiIKfIdZKdT4XDar3UgBQLMyeWPD6FACn9BoX3sfuYNkQ/UV8R5ZFx6WwXKOkpS44U24Z08cPN49uzbKjzdJ+b29oWBHuoEZ4hVTdIE4hlhR1T/+H2fP6TAKyERXA8IRz6NdlfgzkAlA6j+K6Rd/rQYPPemRNJVQTNL9pYFH1wVIFlUIEISC2DjRitwvKqwOUnX8cVUsVCqT3pZ5ADddn2nFBzGXbOw2r5NEPXDXeEA6lX39ZhEaPPn/0kLlD0bntHHX0IEiccgQwF7n3gGezZxwLMxUWMWI/CoVRqdjdmJ5/QVFHMFsbUUTEOpWCa/Y9d38KVSuvb2AUps+2pLnt6fpRpB52LvCihgDKPr0fsxWuQfjiF9I60/Tx/XVr/2DLbJ0r2WRJ/ph//sbAqKWPLftZtq8NZnjmg1IYYyCtqgAOW6K7nuwCQTyg5EvvThlH8yjVJaY0/r+kTt3cYZqzPVkopAKV33DMZMJSB5kFQqhYgLzA5nGL/6G4nQ0q36vH8KHWe7bHxWZSMWO1m3jyi2P+kh2GwE2MiTnArBKVSL1ueQOoXR13RZRGIfCappvErpebqcKcyndD5oYcvqEhDgO6mwQbLTI87OVJa1lW+HKlwFVGytsrCzb1Htle33dsF0C2UoMFlsdPAU5gCrBBLnv3egkCUBFWFQ7AkJbTzucuPK7hBQVUf2YOAlPt44XeJLTMgZXx1qpsSbPErjzyXFoFKJO3gJKBpJz5ZX5GxAj20wYilx0sGUmpRneNa0vrQ4oabLxiQ+lPO2cYepZi9g/ue1+BSwGtB6qiCgJR/O4zVmmhONhaWL1nV40m0cFEFDvIKREDqIN8BotWvvgpcedKPbMteMVAqmd2LWWsmoNOeP+i8dhXd0XfL+zeGrf37X31bdw5kS7DNjl3ki9yoVavrcfppx/I8qQce2YVnnjvgBKsXAaUsmsPU/oeQyex31FASQlEGOrhlj/9OPjrwSt7lJtE22JAz6HhgjhTvvOdAKTsvqtZE3RsOg2UamP7tAVhZEX4uYJTqyiVAWiCUWkiVVPd4C7EM1snJ+ZlDKUXeUQ+sJqD3Z4Ekw4kBd0yDNrqtVCL91ttqg62Jnx7uMGLxHsTiDY5aSgs6t/OjvLWTH8hqupaAMPsem4TlSY1L+qSBMceqJ3Ol5Gt8EUXY+WbrbeHWvdiPZqkK2+c34HlnPwZRVch5WTKlxlLnmMuyo88vjr58lIKwO95FWeGcvCkFoI2kma1trIRdT+3C/3bmTQMgpM2BLRKAa3lWSjHlBLP7VT8yqoztGJ2X/fmcylwUl+lQ09I23GAY8R6L0g613vyr4YJwmjWv3DlSRXX1C4BWBunPpDJLXy1VCJDS+b/a/rYvyZPttwQVUuRrMsw8EDhpTxYCpIzZtdi8tmIKOnJJaoCAONZ31/ZQxygNknkeeiEKweKGm9tAygVpNAWwB94Eqo/kdsmrkJovkPJDJI+qS6u9ut+mlFJBN7YcFVXSoGid2kDK1pGxTEN0NJuoAlEFSqhABKRKKFr0lqgClazAf514rStDqlAoxYLN92fGBViRqiQW5uvutif+honZa/5+UX3YenS23jYIkJZwm52AUi9pbkTtilo8vXs/7n9kl0cZpfJm8iulMtlJTCbvQ87KShWUC0DxoGzKlDjstxEHiRnND//kHH4Sctzbbu4DMTpElpQAUDxTigMm9rdfNRU/bRVip61G+skMZv82JVvDq2WcE0otmEqK/FtyEISIznqFQKnjYyCvrQVmKOjfGO0JCTO3N7pn+Oewx2jG+XkscV+4t8kwawZh1ggo5Qo01/OjwqGUHXLObHxJCjrNPljcIlfQiS+i3n1P5qDL55M502xGO+vo5f+JXTNFBYCS/5hSisMo/bn5QikylHp5YSHrlRwryj3vXx75/RZqmIMq/DooNFx0rtNhldbhTgdBlPR/4NELKpq71n3mTW0WyIDdBVTZ8zR1pg6rdKUX38VceUoc6ox8/+ZzytoRsNzbSM2vpe2BBIzcFqagDOwemBdEFR5+7q1RXhug1x4YorQCMJJJZ1uXtIVvXkBKG5y1YXhJWfZYmDnFQNjhxKVGmgNIEYJ+65P1FR0rzO+mOyhBX7lypFhjmMUMNy8LkJK7YcFASu22NijKGzSeFzzZ5yceBZXNawOVVc7nMUXd7Iaoq16lji/RfKMKLHQFIiC10BWPPi+qwBwV6D/x2kELaNGzowqBUixH6rnZnTaAYhcpObtFu4JUykoHXHv3h0K//xe13DZICVoU0ApSSjWuPxyJ9YcjOTOL/717zA127AvC/FBqeuoJTB14RIAoDpxiIEwNJVVRCkI5WVIxUBLrfPj6TVzFkHjbX9qoQQbA1FCMOmid84SVTzzPwBSjEty+VxtD/ZvXwYoTTN04jty0VRyUsqxm9B5R2bty/zreQgiRnfU8cMe+lnGfDJI31wFHmaAPZYGnc+Jk0Kv0Uvsee83bZY91Dzq/bu4Mj+7RJgPGoK2UCs2PygOlWJ7UasIYIujTFqOATPnk2Ae1kHW+uq6/Obnanjs/HphNFPvhhFBIKVWUfOxSStmvS7WWvOtaeNA5GUq9YvkBqV8dva3Poga7cJOKG6U4kn9rKhxf5zreOEGz+QHtFz16YcXtWf9+5m/HlYVNWYTdQM29LnPBG2Ki+bIhAbyXwg8DU9TIbbEIEWAqAAIpBVhxOVJuaBUC8AID4r32wKD3WiBjBkX77iuOXTK1du0PCkhpbElcZHsOq97mbvbL/nF9KQEpHmYOtJUDSFFY7fjUysqOFcK2NwpCRMi2fiz0/R2g7goAJIsZbs6BlNr3XMum7Vde2ONTHKlGtmQo85rg41mdrpDyfV5orpPzNXAUTfKcRBY75Pl8Si4+U2nvjGDUUjg6RcsYVaDwCkRAqvBaRVNGFViQCvyw8epBizB1kjvQvBAo9VxqJ9I0w7tbhaukxGvX3vOR0O//B1/1F3GRJy8yvUqpVSvr8NIXnoiUlcMdDzyB/dOzIitKXpC6M6T8UCpHM9g/fi9Sqb0cRIl/Akrxf3pulFRGKShFTHPrjp9u6lYb44Tz7xy1DJIQyqjwHCkGpkSeFEHslBWIn74SqcdTmLlzwr/s+ex7IEPoWTc3uJnH3kL+X5IFxYo2yfpFTphS6igT5C21QBqgf04HBItrV00KRql5MfrATvIoaceFtYVdFHQ/1WTEYoOIxRz7ns/m6PlM/cKtloCcLvOkLAr6jCROdgKzXG8NRNmrzj19ALHQmr0g7u6s0zfeECPGOK+bDZ0cOEU8yildRSWm92Rf+PKnZLY8IUOpVy4vIMXCzOOpNDNRSqVjnk56HEx5lVJabhzI2PsfvXBBLI1bzvxtn0WYSigInnmzrpSyS/4OUhEZpH/bn86pqFpjHkND6FsZmMrGrA5K8XF20V1M+HlQvpS48AsKNJ87KL2IMPWkYaF1SUKpUCClD3TuXhQ2QNAfLEWFlAoz94Ec7YkAMOfaee31NpL0U3Xchl/pH+PSVB9ARCaj+vGeBdkSHXXs9Uzrhjy91gfjixKoXRKQUrumB1RRFACkQt7ru+mlQJPXfhf2fs/zBQSb985siELMK/1dieYfVWChKxABqYWuePR5UQXmqMDVjf8tFVL+TntzQamJ3H6MZ/baOVJK2eSFU+xiZeXh1sbLhz62I2hxPvzKW2WwuuyIpy4+OXQCXvL8BA45ZCXuf+JZjO7a5wSXFwCl0pkDSI7fjUxu2gWjiAJPGqAKUkoxIHW/BqROeuffuikxt7DQcjvgXCqjmEJKZNvIWjLAYDIoBax442Gwag1M3bwfmT2Z4qAUIZ34j3UVyZox/nW8m4Js8Z0wB6md5MkzOZepowyRHfUUU0cFhZ8H3L13Nv4YfXd9cQDhy881GWZsECbLlGKB5mF3lUOUUocaIk/KAOg+CkyokHM5vUclxaQY4vJYZkkRjFjvjLvsVbErxltgUGZ11Cx7bjgloJQXWInlUBBLqKmk5TEASnGLwzIDUr866gddAHochY0EThI+KXWNgM0OrApSSlFCejsfuXBBLtS6X/y7lhzooN+aJ8GJDc8UXPH+diAV37UISdYa6cbeodaK5dlU+iD4src/0AHQt1JAy9fSYVx4jlZYx768oejyotKd5eVRa4UHpSetVKZxydn3woAUr0UeldQyUEjZYealgh0FIfgQS/qtT1XWrqcW07wkxb4PA34LvBdQBRzLgoFK0vrg4oSbxweCuuzJhdSgEF8zdQgOel6A51CFVM2fct2EBdeHAqUic6sKAFNhXfpYB+DZjZFNr9LHj2j+UQUWowIRkFqMqkefGVUgTwWuSfQPUBhtAiIVB6UyNIunU487nfY0pZRSNPD5snMUA61X3/sxt8JELtdHX3nruAU02K3UNaXUoWtW4qyNjdyq9+f7HpMgR4IrafUJU0qlMgewZ/dfYDGwwPKgbPikK6Qc+x7PKdJBFVNOEWPr/dc7CqlT3zmcyJLYKIdPMjtK/Ba1s7v8GUR01WMAxDAQO7EONaevQnp3hkMpRwUmVRW23dH5Wzu5S4LGGtFb5hDWz40niIlhgDQEnjQHQal1Bsjb6oFZCjqYFluQn3h6vSLqxFQf9gXgoQywvbeEDkffGG8ySHwYpsqPKg5KkQ0mDzrnUOoJC8jKHTDUvic6XTudAWln7l01NhiMXbG7hVIyGGzPk/UwWPc9J19KgChm3XNDLD6PwEB0voxb062mrdJbDgPar4/cNkqBhB5O7gT9O1Y8XQkZ2OGOwSoTzZ0Pv2vBrFj/duZvRykhCSfvyNtxL7hjoNj3A0ANRee2Kg83L2SfO/udDyRIlrZZxHgfJbQprxJK5T9pHft8Fj9tmlAbYIE5Uvyb7MxvxKpPtyZ7G5cOBCwVSNmAwD9WLhXLHvlqvjBzuWfmUxppkIQyC/xnVi3YWGFcwrrtoXDbnk+VrDXH4A8XJ9y8ICDlgT9h6iNK5gBSkJ0UFdDStp99nuFRXfFJvNMHTBPUcc/edbTpKSIYVciYH00TVWCpViACUkt1y0XLvWwr8KNEXzeFsUXkNxUPpXalnsIMneHX7N5Qc91KF6vDBf3DH78uqJAffcUtPFBbWf9Upgyb39kbG9FwyEr8ZccY9kxMayAnP5SamH4CyeS9EkaxrCiPTc/1t7LvqTwpPeg8tvXe61/qggEb3vVAHyUs+4ZBKaWIslvPi+fYP5PAUo8NghWvOgR0dRxTf5tA+vFUcVCKohe9h5dVBUK+MC5yOdQZWeDJsFtxRFpqgVNiwMM50AezAXa9EDDFdhA2K4ox+v4Vxamj9J3m2zMdBrSw2GKUUizaqykGxACkKehOveuefbWqKJUNomwoRchY7t0xe9mNy3Z1EcPoYWfC7iBzLdRcgie+mLqtL+CxPwzd7ta3rIDUDSzMHOAqI28Ok/2cUrjo3TM1pZRmmRvpeOzdCxoM/m8vvqkHIF1OCLujggoOZvcrhBy3KFeGjfxgiYSbF3ogZHAqS2kbYLwPQJMPxGn5X3Yt7MwwMZaGArwgsBcAtmwbYAD8AtC77wfHlnU8LbQ2JU03byClXdUrUeiXGqr/nPwrU22E0AHhb/ZUzvd3iNLIWfUx+ql5HHtK2HDGd9M9MMDUoM5P4HqE3VxxAynKshc/GK+ohT9oNW0gpUMn73mDRxFVFiDlgVw+NbYGkcKUTk4UgbuWCk55gFTSsEjr1Auibnol7O7RW6IKLJkKVP/Bb8mUMlrQqALlqcCPj+vrpoSwkFoJlIqDUgdyE9iTZh3vZI4UB1MOLFKQCgbZevX9mwNVHv/y8lt4qLlu+WMXKYeuWYVNp5yA56amcOuDLMjcC6GCodSBqcexd9/fbIseCy7nWVEkBsJUUERlRzmQinXUs7OlTBF4LnKmzK13e4DUqe9+uAWEsOwtJ9tGdhrkd/k1GAUJpRiYMo+qQd1Za5CdoThw0z5YGVoslGpF7+GBKrOi94bPjzMQNWAPyoVAKRYMfuEKIAfQm2aFwsh3F9Jz4eD+AKYQ2YwPrOgtenldUGq6ywDp8WVeaddcNmTzPreWgCmlKEOozwE44NjyuHyFXwVrz8nPdaAU7cy9V6ikYpc8000NsoWrnjiU0sLNbVWUBFEupZQOp5h9T1NTBc2DKaReG182Cqkbjvh+HzX0HCa33c2llNI76QXkSAHY/N7H3h24P33/1B8lgFiCbSslhuOPY4xIOj/iNfFcVntJf569lpOv5axYEwza4wA1rQugyrXzwTOPMsoDZAxjaYWbF/P9ZXAqTUgbLPIqStAWqBKTkEkZZUPVUh5opWdXFR+mbrUmt60vz3haTEFKmVYHUvqYZj92Aw3XybZnDFbj5lJQSJGvTQyAkraigZS3RkJdtNX69MrgcbRnJhED+FhR0o97SLFnYRGziVmTXfMsBUip9WHnWdlsIz5aH9j1taRlL+BNgUDKXibtppXnfMADe4RKcQ6FFIAt4Wqnigabb69Nk85kM1k6yskCtl00SVSBqAL+CkRAKtorogpUWQV+ur6vzSIYsEPNi1RKZUHxxOyjyMHyW/fkRQafN0X/NQ99KjC892OvuLmHUqNLDzNn72luXI9j1q3FLQ+N4rnJqRC7nhtKTU7vxLN7btNglABRbsueHmgeZN+Lww41N2KbR64/y3fBu/HdjwxSHgavKaPYxZIpgZRXISXBVP1LVgENtZh9dAbT90y6gZYe0h4YdE7GQM3meVv3PvdMApY5DMNs4CDFZc0LAUpsutfWASeYoPdkgIelOsqbH2Wfgcod3X1llKQ1qUZ0zt96aHx7pg9AR0lQ6iQDYOIARjifoByw2bY81TqMLb7KldJXhZKxXKdQSZnffXIAxGiz7XdepZTKj9LglNuapwCW267nDUM3qNU6+8b6pXHhPMf4NtjQ05CqrR33qoucrKiQjnuBOVIEOWo2do5dEHhxtm3Dj4cpIdI6pqmYtO59ttLKttKpzCo9bN0BTnZnPzvbSn3/Zc6VnV0k1V+20itPsLn4Di3JcPNiD2dNHaMNSGfaKCVvpYQpqDT1WHjuk+zCqFketfepArYAACAASURBVGl9Sii1feeYH4Cx8W3HlK7WLHbl5zN9PiDFwYD79Nr151IFUizMHLlRUbYiFVIKlmg1pzHSiM3BIMf4j9lhgDJ4JD/Oc7kSqs7SYIy+ffXpCwpcD1F3KdWRBqSYum+hw819QEpfHv38oZxAyr3OWte8InOkfDfNfKqzpGmQzunnk8KarMznexy9N6pAVIGqqEAEpKpiM0QLEVXAqcBPjr2ihRCTq31KhVK7M89iPLvPhisqN8rJkQKIib/+8IHPbgqq/cdednMHCOmz85cIgWmaeHPTC7BvdhZ/3PGwLzhdn1Ypp2YzSTz17CBXv9h5UUwV5emsF2TfozI/SnXf44opppRCrHVk+1k+GPD89zzCOky5llm36rHHtl1PQirLJECtgZX/0IBshmDij+PIHGBIzwl0duVhBUEplMG698mnBkGMFhjMw2byTKM5oRTrrHduPTBDQX8965wc8hPmoFBz/wUEIdhqfTTkDnWxX8qe8QaSqx8khDYVDaVqAWxk680UUgD2eBRRdj97z0LxoHN+Cd2Z+0BNv9nzxCAIWkQmlDekXNntvNlQSknltfAFzEMqrwyDLBsgdePzLpNh5l5gE95JLyxHigJD7xl9T6B95fKT/6eJEsqAlN2N0w5HV539CoVKLljlNF4Q+Vf5YZUvhF1eZHnzlSwgmTLSjf1LONy82K8wg1O5dIYB3fdRgNk4/eApyG7nVUnlzZHyd+7j32AbWtHO5LZjK9Iwoth65J2+SCDl4zf6jQIlBK12y95XJrsIUeqiAPBTqNJIFHaEfnpFsLW3ZyZhWGCdZp2fgiCSIiaaUtgGWh46FQq09PeGrKMfqCx4uDkHUmUCRDzU/LXBXWNrBnPdMKRCqkyfF77cHHAnSZY0zzaTBVWclXVsiGYWVSCqQNEViIBU0SWL3hBVoLIVGDiyL0FjuVFfoHkRSqkUshibeci+8LOzpOwLPyFGOeldqfru7u5Z7xp1nT2YoGZsVLfkHdVwCF5yYgJ3PPEUxvaN213pdBWVDqWyVgajT/8SOZrjAEpBKEIcNVT+HKkYfKHmRhx/+/nZoePWae96ZNQiMphZy42ywRSDUkoxpaCUQVB7Wh2Mo1cgM57FgT+OC9teUVCKtKN3XWl387pGu0GMLQKiCBjlQClGQLQwcv2m7VvqgaNN0DvTwGOss552l1Fd7PhOnF2lS9JsuhGb56+OsvefnpkEscgwAXVC2QvNlDqCAEdLCPQkBWQ+O7frKR8Qv3LV9lb1mHXcuyjebH5rlAq7nrLdKfjEntLUT2FKKZetL2QeBkE6m1mL9jLWrbJDSt6533TE90QguFQ8qe+8Y9FSYErrTqdbY3WlFEXne8feGwgTfnDydSzbq8sGPzaYcs/XVjyp+RYFqzSr3txZVxzc6hYzPUeKu0WXSbh5KbtXE8ucisU6LJCPU6DBBn1yPMrbda+AgHSfnc/JnBpLLgWVVFmAlBugVLtlj3xlkkEizUZXpEpKO/xQYDM+HWwVN749w2x8W/wZVXlUUiGqM3vfd721kOXWto3+METdQ+jChpvHr9e67AUd54OVXIFB4wUBqVAYFXADTFueUoLNKaW9qReaSydPrpQBNnpPVIGoAq4KREAq2iGiClRhBbYfcwUNDDQvAko9k96J/VkGV0THKdUxj8Mp/je/Ld1+9aNfCAQpXS+7mV+oqgvUMxPrsf6wQ7H97vuQsiyhRNC676m8KQWlxp65CbPZJIiuiNIe2zlSHFZplj3tsZ0bZdqh5tvv/PnZ7WGb7PQLH+qwCOljSigGdqgpOuopIMUVURqU4h33JJha2bIGORrD9I4pzOyQYe2FQ6kkkG1G71HF3dX7Pw+2wTCZzUxCFAWjmFKKAREDhAEq+/a6PJE+Pibsegcs0N/MOIooF5Ty3N3VT9j5bOhW6+Ory5+D9C0WemuILCz7xFQnaXLrBSgEcKoBxFnAOQF2sj1PAigFnuxMKfm8fuKbnuzE1N4+3a7n7pwXooRi85CwSkArj1LK1X1PzCPdtmZZHDt/t+6SFsswmNWVA9j86iJv5zqPMglABrm1nWOdgXkfl598nQa+NBVTXmueN5zcbR/kjRtkJ019+e3uoDbUkopHG54FgahAOLXsws1LOdyd+p5HOjggAAOXIZ0J9ec90/Cv8RzwT1djwaDNycuOXbDOa6XUBJ/eNwgDLaFn1AGKHi8TEe91xumqBlJfnWghlDAFqvZTCNgJhkg0llobdjOEfHtmlLD8KO8oW5BKKuBY42FLoux54JY9fdhxyx/GzdShCxluHrs+y75SAZmRWpfdEIhkH3rl6vEMqbkUUvMBUnnfG7IOIK2zp5NlYYsvaXyJ3hRV4CCrwLI4qT7Itlm0ugdBBX5+9OU8a2U+UCpFM3h0ZoedI8WDiSWcsq17Mbrtmgf//aNBJf3EpptZhlSPAk2vPfUUTGTTuGX0cRfgCoJSuw/ci9377+VQRaijBHBicIr/ti174TBKWfX0YHMLZucdv9yU187BVFLEQIJDKZPBKAmlJJyybEjFYJQBBaXIGhP1L12DbIrgwB/3IXMgV6xSagS9hxfeXeyf720C2Am+2cCtelwZxSCUglEalGLKKduGR0DesRJYQ0D/MAvskuootr5BJ34KZrkvJMboJ1dVLKuFfHt2AKBtRUOplewyRC7osxSY9mRJiStbt0pKnZRnZpJkYhfP4HKgkhZQbnfXk6opBZ9cwImV2fM6n07OhwvWyEjmvLWFb+cqHq9+f/ilfRYhHboa0Gej84SBq06dwh7nsvX1v3vsvYGZdFduuLaNUmNAh9b259g2WDcUC4JKagwrFZ75Owbmz5HiwMtA8xVD51Q3HFmgfYyBKQqyhTIVqgsySZjnAU8ce3vtewpA5gFboLQ3We0d9+YCUl7o4WU3+g0COW5XM5AyvjrZR6mWEagONj5o5NkZg8APxXb6mRXBN5Z6JpuIZQ67jh1qlqVCJPv9OksrEUjlgStWLNuIzoUJN19QIEWEWi1/17yQHCm13+eFZ3K7uKcZq8uQ5ijQfIEG9+hjogoscgUiILXIGyD6+KgCQRX45VGXD1qqyx3PkjKcPKkiuu/tTD2J8dw+pxuep9sejdFdVz/UfVTQMjDbnkGMUaVAeHtTE+55dhfuefZZO8zcvmjUlFIzmSQe23UTvxAh3IImAJQDoyScKgJKMaUUNeLJVCzdOLK9NW/HFaaSgmn0sW56orteAJTiyij5vAw3Z9PWvqAO5NA6ZCYtbt3LZWXXvcKVUr3oPXxuqXnHcANqOYxq8oMov3WPWfi4UooBvjNqgeYa4Jks6B9SwdlRmnLI7m6njfYUtBOfWVO5nBaRJzUKQkUfc3t5wu44OzCNHG8A9QBSAH0mIEtKh1LqBJb9zswA+3c6QMm232mZUdKqZ9v3bPgk75grpZTX0uey+xlDmfMPXfA23+UeKVmYeTYeH/eqo0LVRbaKSsAHJ/RcQAfAaL9w7D2BassrT/xRHzUE+AqDSn5Y5VdgOQDMrebyA7V8OVKa0itAueO3ktHeH9z88rm/0+XeQFU6v0THaEOcWltA0eXkPolt5Xw1g0BUMLRS+4R4rz1N9dv2igVSchz0CoyWhEKqe7yB1MTH7V0yAKb5X9Mggy51YkCSkk58pj7w+MOaY1DWHENzqjvzLgQiaQecvLBsDnWXl4jp8wqBKwbQm/1gfEHGChtIhQKywoPG51RIzQdIKTGa75zErzLzdggmoL0zL4ise1V6KIgWK6pAWSsQAamyljOaWVSB8lTg10d+v9sixhYFg0pVSjGV1EMz99mKJpGN5FZKoT73xqvv/9KNQUv+ybOHWEh4xyErVuB1p5yK3z/6CJ6dmhLKIY8VUCmlRnf/EVOp3RKUSBjF4JPLrqd12ZOqKZciyhTKKWHZU133jK1/+dUrCrKYveg9j4zCJAkBpBiYUvDJ+c2VUYYBoZgS0zFV1apXrUI2ZWL6sRlM3z0pQWAxmVK0E71H5Ic9H7hjGIbRFKaIcrKklGJKBp2vjoG0r+IWM/rLaWBSpnrzE2R1Auo5EdXP7MWJ9Aj93OrKK3yYdQ/GgO425PvYXJlSNQBpZBsHoPsoMCH3TNu2p/ZUB2LZ+Vl7RgGalXlRbsikbHnKxieUUJo9zwOnbKWUB06xIPj0Bc8raD8sz2hQmbn8Yd2lXZSgx9+lzmvNkxDJo5TyhJMnL3z8fWvDlvTKk64bpwQNtqomKIPKhuUB9kFfFz6WgScVWp7X/EAtj61PfmYgSHHUPckf3HxO6LpVZutU/1w3vPuRNssw+qBv13x2vhDbXqCKiq++0ZjcVqQFeiHLVjYg5QAU+mXB76vuh4WZQ4WZzxH6rfEgMd57niBI0k+vCP0+kW/PjoNlEAYBqbDjh+eQoEM+Vy29NHBOdZe27F4gpV7SQAshSOYuii/IWLFQQKpuMNNigTVcEYdL8dXUqqo9pgZxcr80aFdKjpQ6bzBAmqdeQCKFatUNCtECRRUobwWq8+BX3nWM5hZVYMlV4IYjv8/CZJmdxs5IKRVKPZ1+Crszz0lFg8iO0rvtUUL6r3ns4kCrzefOHkxkKRk+fM3qhtYTN+B/7r8HqVxOwKgAKDWZ2o3R3YNCMcFzkZiyJw5imFBh5i67HodUwflRDohi4eaxZKzGahyaQx2lNnRTx8MtBMagq8uerZRyIJWCUSronP02mHWveRUys8D+W5LI7MmUAqWa0XtE8ElUx619MMwOlRHF4ZPMi/KGmtvPq+57/7ASRqIGuDsLelfG303PVgx5YI12Ik8pacW/rV6QbAbyrZlBAC3FQinyPAKsJkAWoDxLyk5JdmdmaPkr/OHUHmBqr4jccimkPEHnbFpDZUqpsHM/wOIn0v4w9M7Mu46qnLpsgUarPxx26Sg1mPXK+S77cpgUlLEBkjfYXKpaKPoveKIjcAz5z5Ov6QA1+rgySst00jPovAHqbhWVliPlA1OebCilwAqAVUHgLbCLXABUIQY6tw2ds+S3ebl3rZM7RpsopcOFduMLVVEFWPtg0M7kZVXcbY8BKdbRMwhU2IDEr+jxK6Qc6FGtQIqHmbNMJx/4kcs+J9hxJiCg/dZnVgaOFZD5g66P8c27EJWUdvzTd/r5zEvnannUPoSIjq/l/q5558eAlH1YD1weT6ddzzS6/Y6Hmr8uuMteMetRd1uum1l67RtEavcoQR2lrdvIzGlG5W+gFbOi0bRRBaIKlL0CEZAqe0mjGUYVmH8Fbjjy+y2gGFRAaj5KqQxyeGD6HmSR4xeEDCQ5OTDiIjF++PhR/XdctitoyT9z9mD34atWb/mHE0/BD+8ZtpVRQVDq8X234sDMTtEITeZHqewop9Ne3LbvufOkvFY+BariWN0Qu+DXP37ldcVU9syOxwapgRYVWu77rcLNtW57SiVVe3INjMPrkJmmGP/tXlgZZt1zLn4dGKdZkOwLbl7f4JDz9wz2gSgYpYEolRulMqRUpz0dVB1fA7x6JbAfIL+edTry6f3EXSd+npNydn5K0W91HxJ8MVBMcQudlnXdy9FRFcruulmeTykVB8h6TSXFlGAe2wdfBH2G7LGVAZ572B9SrsMpj5UvBDoJ2MeglT29gFPUoK3Z96xfEKBXaJmLnW6QhZkDMszcY43TQsbtjnuBOVLSlkUIcoQ2v2usMxDA/ueJ1w6AkDYFLVwZVHqHPi+skg0c9KD1sKwrMRZpsCywY2CY0mvuHCkQMvSDP71syds0i91PCpn+pI7RLkopzxp0BZ5LsFdyjpSBrcnLjqleJWIQkNKhhXd8CmI39hm4eFCVQOriiRZiEnZjwfnxUrUigBQlpBWfrg8cP41vzTBwze16QeUTTxYBpLzbw7d95jEvdfNHzVMdbgmGchfFKz5WzA2ktFoFLKt96BTjfVmAFAZpQ20dHeadGL0AzFMnL7TyTm9vatmAZfo0s3rHgkIGymiaqAJRBfJWIAJS0Q4SVaBKK3DTEd+j3uwodeFVbKbU3uwePJ4a9XXbE6oFnhO99dqxr4Ue8C977cjgSYcf0XLj6MOOYkvLo2LLlaEZ3Pf0gBSzsLMIpo6SAebSruf+mwEnZkVjCirdmqceC6teba153W9/9Q8XFLuZzup4qIkasWFXpz0Gn+xsKZExZaujlL2PW/eAVWevRDplIr03g/1/TtrZN7rCTLct6V0MpcJjBIi1onetyLy68KZuEHOL346nB5nLYHOevaUBq1oTaF8D1JvAb5h0i52X61lT7HHABYM6eRevJSmxGtEtl6fYgpY4vfHNqW5KCOvQ5WoW6Lu40E9gQUDWEYCFnGcAukt23JvL7sfmsfsRIJuSUCpEKeWBTF7o5OrUx0qrQazM+49b8sfNwcO+y624al/Wc6SCrHBh6iKZIzX2zic6AgPy+xJ9DTBrxwM/J6iz35wKKKfL3txZV0oJqlkAg5ReoVYyd2c4QozGbUObiuuiWeJ3Zqm97cT3PTZIWeYhA4E+EBWQJ5Wv657KogIZSm47uuIX9iXXuhAgFQJQPBzKhu3VCKSML0+KTKdQ6FRIpz2bBI3Rz6wIbqbBcwfrRE6VV+DkOrYVApGCZiK3dD6YFriO2pPeY6wHuqjNnTMrH24e+1mWfd0KDxp3HV/l+ySoKhuQAlDzF9pGDDpgb0cH1OXpCKhtGw88U4d8g0bWvZLHquiNUQWWQAWW/In1EqhxtIhRBUqqwO8Pv3Q0R0iiXFDqoZkHcCB3QMt+cnKgKEGyhqQb+8d6AwPDhzvGG56c2D98886xhMtGqEGpifRuPLpnSKqjmLJE2PUc254bTuVVR5E4s+mx3KkRmo23Dg3lDzIPK/BZFz3aA2J0qYwopnBRAEqBKd2uZwMqkwB1BKvOWonZCYKpHVOY3jFdOpTa+Zc2HrSuQyTVVY/DJw9c8nbae8VKgCmk7ssC97GuegxisQ6GHrtfHihFDWxG9yG9Je2M83kTv9CoZZaPhqKgVIyAHGmAsj1qL+Uh53NBLP46s+3tf9pWOLEzdhFi7rHkeSx9bouf3qlPnPXzeRgYyVzUuKTtAyzMHKY5SgnhmU5Kfem360kgo4EjB1Y5oeEU2PqOJzoDYXbfCVd3gRDZqVN15XPP1w2rgpenMAVUAUovDwTTVVVs13HUWCJrzxXaDdJ7+c0vW5DA4vl83RbjvSd2jHaAUgY53Sopb4e9UBClgvH1mh8EQMrmJmLgrjogxcLM4zLMPB+Q0viPvf/5jkWEKXR7rc+uCP4OfXumg1D06UDKUx6HWgQd59QHe2lf6HLLued9PUCF6/2cAIDC1rPS4eZFAylVzABAxEPNy2DZU6Wp/atlW/VtuOipU5AiKkg1xRdXvHdk5vmRdW8xxvfoM6MKLEQFIiC1EFWOPiOqQAkV+MO6SwYsQtqCsqNKUUqxgPP7p+8Gs/Bx2568AFPqB8uwvn7d2H98LmxRP33WYBMx6KBFjIYgKMWA1CN7JZBiChdfdz3RaU9kRklYpXXfU5lRtlrKjI3kcvUlwyi2Hk0dow21cToKw2hQdjzWfY+Fl+tKKfW3C06ZBOZhJupOXoHZKcrzpNJ7MsVDqZk9Yxh/OOGCUYXkRqlp1tcCL18pwr1/NyOtegpEsWwuAaecgPSgO7rGEL14zeKpDd57TTd5YfsWSZQKV0qxjN96AqQBsIBz+y5vwDqqM9dcGnjmfg1ICRAVmCnlCyyXQee+Dn1iHixvLfeRExfO8ljCuDHXWwYP+y6zxPBMJwGhWIi5Y7/zgamg0HAFFphdz0DjBWOdgcqh/hOuGaYETepzCu6kpy+TbeWTwClQWaUDMk+ulLb8IUDNAU92TSSQcmcbJS//08sWJLB4rm1Yba+zznsmpbJjYwDYC8qIyl9rUIqR5A+OqV74qxRSXhjjAxx+RY9XpKPGxaoDUl+a7CJEhpnPG+wwWGk14zOrAq295FvTgwBpmRtIFWnbm/dyezawR2kUAlEqHm5uAykPaLKXRx0PvSquBQBSdbfRBCV0VIdOemaVD0Z5l1FbJw1IsQ2/eeb5ZOFvqlXbgBstT1SBZViBCEgtw40ardLyqMAf1n2nGxCd9soFpfZk9+CxWWm74+oIFTQsL8BMq/G6sd5QWwoLOc9ROkCJ0eSFUjaQEqE8LiAVZN1T2VJuy57dUW8kC6t1aKg9ULFVzBY++/2jHSSOPspDzR0Q5VJKaZDKgVPg0GrFhlrkauJIpxiUGkdmPwt1l50KtYD4UPsezcLafS+QnXZseLYqSsEkBzDZcIlNw6x6b1oN1MWAP8wCB1Q4t66oYnBPB1JynqpIbBlN2ozutYvWqWZlyz8fOfOC80Zp4uy6oqBUDMA6kSWFccpDzguCUrseADIM3qnAcqVyUt0IRT6U+3UnwNyGV6yDkDYPQsjmzD+fvKRPiP906HeGLQaJbLCjhYbn66QXrJQaOf+J9wdCg77EjxKGkRuVtj4BfezvS0DekwbIbChmgyn39CrDzQZd+ZReAfP12xIV0PKCKI/djJDOK4Y2VTywuJjxrVqmFbY90hKUIyW8RR7VmdoueZRpyW3HVO85ahiQCgRUboC+VIAU+bIWZj5vsENG6GdWBANGO2tQFs97v6EAyOf6HtgUQz6rv79c8wqDKIqXVTjcXAEpXrG86iNFoPRjp3isylRuhRRbJh5wzrruqU2aBzrZEDJgGs+6JSkhzbMbSWSdrpaBP1qOqAJlqkD1HuzLtILRbKIKLNUKDK7raQE1XcHm5bDvPTb7CJ7LPGt3ylPBxVIxNfTjJ3vzKmm6mgYb4rVMYaHUW0plAdz/3K+Ryk1Lu55SRCmrnuy2x2188jmVMcV/2932ej+/teHzra2ts+Xadps+PDZITLRQg0EpBmiMghRSLEuKQanVTfWYmTaQnshyKJVjuUZFQ6l7gCyDJAHwKFAxZQCvXAU8Lw7cmwUezblzpVQAuoRbtlJKdeRjkIqfd9Kt1pfWLnogqPG23u/TF7/vI4jXOlcJ2kmxWNgA5dNaAsQIwPaGKR6XPzeU2vckMPGcBpMcsCTse35LnrubXgCcEif9rdmPbVyygea3NvQ0ZQ2DqZZkp02PjS6kS10QVBIAlnae/+QHAgHNVSf8dzdAtrgUWFr3u/yB6U5WlN08wRN67ixTPqWXAFmOLdGTQWUrvfIHm7NdTnYJHLoiCjcPHJZdQEqz5gkQVXyOFNtuywJIBYxrSwJIsTBzA0y15GzvULAzd44UNchmfHpFMMz/5rSjxPIESHnZku844QWA9t8hy+2dfj4h6SEgSN6TG8q9v3Lh5hxI6bAnTLml50h6gE8lgRSGaUNtiqukGny2vSLhlEddNTSzcf4dAct1bhnNJ6pAVIHyVCACUuWpYzSXqAIVqcCfDv0O1TvtlUMplYHFrXuT1hRXSKkLNmXhy8RmOq8fu2JOFcBnNg225SjPh+G5UuzCcSqTxCN7/wSLmYCkHS/QusdCzG37ng2nxogR67zxlreX/YK/5SOjiSwhw9QkDRxK6cHmqsueDDx3KaRk5hTqDKx+UT2mxoHUvgySt4zbF1kFd9/jSql7gAxTSnmglA2XtIDzjXUA+/csBe5IO131vOoqBaB4V0N9vjybaoh+ee3iWfX0b0XbVxPk2E2jOP4l2jVOAUHnNQBWsx2VsFh2/8VREMSaGQeefcTJjXIppRgT9KqjlJIqKGfKeS7XddqSPmbefGgvDyj2qqNCc6Q86iJX3hMhME2ytn2sM1DF+MPGq0cpQcK2Bbrm5eRI2XbBUFgVDs/8weZ5bH0BtkRbKeXJNgrsDCenMQiJws0DjnYndTzabVHW8r2YHCn/tAL+iefHq14hRVscqYlWlAJUOH4oRaoqQ8r40mQfJbQjFEi5wI6mwlFl8NSAWkYjPl8fqGwh35pmGYMJ192GfCqpgiCStoDzUXfNpbbKo+rJGZULN/cBKbW6vuVR+Ylyw2gQTamPKqGQYp9WdxvtoAbtK2OOlFqJyLpXkSuOaKZRBRavAkv65HrxyhZ9clSBhanAn9f2MoVUS7mh1KQ1jXun70IGWUdBYFv4kDRzsebrdoVb9/S1//TZgx05wq2FCXYhMZubxrOTO7A/9TTPjOJ5UUR00vNa95htzzDrRiih37nxr++dE4LNp+qv+OhoFwyjR8AoAzABS7fx6bY9G04JhRSz9xmrTdSfVIvpA8D0U7OY+PuBeUCpKSfI3M6A0gLK19UA56wEUgT4cwrIMouZsunJ6XzZUSIc3cmUMpOU1DTja2urRt5O2ntvwEve9wbEaouDUmtkttMMRJ6U726w5+rFygGP3yF9CcGKqDmDztksFbjigeZkKPeJ06sD7pXwRWBh5jFCGCTiGXB6VlRwjhRTQOkB5J7QcGD7eU99oD1oUa5JXNNkEWs48HMCOulJ9ZGW5eTJtrKzrvxB62w9ghVQbpWVrZTy2BLnDDb3qHtAEYWbB2z0E9/3aB9AJOwsLEdKKfV8dj7RrS85/oNjqjezi1v2ygmkWKg5k4NWwQ8LM4/Fxm1PVwhkcnfey6uS2k4/uzJwrMA3JpsIMYadefnhVtEqKbuKAaDMBdLkH3mBlSfYXH9/iNLHFiUR9GY/EK9IIwQXkNJhVBUBKbZYtbfLgPM5rYV+YKbysOztr9bNQJLSyLpXBSNFtAhRBcpWgeo4+JVtdaIZRRVYXhUYWLOlZ525tssPpNhFmCGzpZwLsiAFFVMBBD3PFFLDU3cGASl2YTjy053fKypQtutlg00g5vtyIE0AWrLIYiY7gVRuksWog0pbmmHWgJi1Qxbon1bUH769/3cvWbBso1f9yxOD4NY9liUl7HscSmmKKZ4txeGUsPZZHFwxiEUQO8xE/KgazEwBE/dOYvqx6dKgVPIxYPpZad9TXfakOqrGBFpZbpQJ3JoSYea2zc8DpRik8oIqCaWoYbbjG0dvr6pvl82CLQAAIABJREFUxLnf6CAbXtOHI08Vi6VfOOSz7zGXX62U801pJ66uiwMPlHpqBEhPOwEbHpWUniElLBZsAVh9tWBzO9ycL+rW7GebF936WOr2vLWhp8Mi3Gqr2fVc3fICO+6FwSpK0Pm2ELteqctYifd94azfs7Bt3lEwzD7oyj2aO9soeUUUbu7bVCexDCmgxddpLyAjKlRF5YJ/xtD4tqOrFwDrQMoHOfSxLTiE26+QqiIgxcLMQXvEGO2VKmmb3rsSIWCHEtqJz6yq6A2neY8dPbTBiGfG3ccl/VgTUIcQIKXlMyVzH4hXBKrGfprl0WyFqY80MOdZZvYnNcrbZU/fFvHbaZNBKQeOeYPNdajmeRyYkUWwfeZUIxhyzntniGYQVSCqwEJXIAJSC13x6POiChRRgYtXvLutOb5h4BBjjQs+lSvofFdmFx6aeUBa91R3Kpm5Atr/s6e3ldxRrKtlMJHNxrgMP8vCqcH/G9s2tGnRFDtnd4wm6lebwronlVLUlOBJBZ67lFKOQopZ+RiYqj8uBlofx+wMxYHhA5h5crZ4KMXyp/Y9BEw9K0EIUz1JMMWUUQ0sNyoDPG0F5EYFKaW0UHRh/+vHfxxf8rYrYhctftK3bxsnZ73XzpUoCEqxOKwVEkilqEjjd8EodeGgHdL2PgYkn3ZypNgH6SHlNqDyBZf7OvQxWEVgtWY/f1bZ7aTFF7C0d9yytmeYQg8zL84K58mRSv7TUxdV5EKrtLULf9cXzvq9Y1MM6rhXYI4UN4s6tsMo3NxT8pPe9xhrO9BgA6lCbJB54d8yAlIBYKeagRT5Egszp8JC55Un6QteGJBK0s+uXBJjhXFpug9Ah1v5VUANAsCUA1FoZ+4DNWWHcUsFSLFdqPb2XA9AuvQgdV+nvWKBFL9PR9qnTyHVddOt3AewaH5RBQ6SCkRA6iDZ0NFqLt0KXLLqI/SM2AafIqqcUGrHzH1SNaEypaRywrA6r985d57UUqpuy4dGu4z6mLDu+aCUE3huK6OkZU+opiSUWh+DVRfD7PQ8odSBJ4D9j0toYgCnrwCOrQF2WcB9GaHY0UPKXfY+CbB8HfbMEZBYK3ob592hsCLb9dxv9JEXtnfgkGP81jt5xuq6BlK3VZlCigElluWa02iUfjGgX/gd2AU8+6ADpNQVghdE6SHntiJKqKVYuVWXvdy/nrVkj5cszBygwyIgvLAOd04nOl1FJaC1BdL/tp0XVSfw9Oy0n3/J79sIxYDLPqh1GHTC1Z3sonArmT1NFG6u1fnkjtEmSikDnlxxq6BUaKC52gc90EoPPwch/fu2HVO9+5itkJJj0Zy2L88EXocbg3PVYNljYeaEhZkryK+Tf4/yy/VSsGWPUPRbn1tZvdtR24/NS1JtlJCBsgIpgoqEm9tASu1+edRads5ZCDirpEKKl5cFnGcoywlryN8RUNvnvEqu4PVL1taSxmQjqc5znYqcQEUzjSqwPCuwZE+wl+fmiNYqqoC/AhfXv2vwzPiGlkOM1RWDUs9knsGOmXvZhaa08Cn1BEApOrfvWl5Q6jUff3KAGqSNQSZowIllSzEQpbrwqS57TBml/olMKWDVCTWYmSXIWJifUmr6OWDvg8DRceC0emAawO0pCaOUGkr/HfIcB1dGEnGjGb0bA1VoTz/99IpNV6Rf9eQEfemqON04kbaOgKUuI9m+Z6GhJnv7eAoPAJkh9DaXX8127jc68LxT+8iG14id3QuUwqCUKUV2bHEznrvWQVBqOgk8NaxZ9qT1kX2mHmoe2HFP2SR5dhS7wN5O//2lS9YecGtDTx9A7TBzHk6uQRnbzhYEq1w5UrJbGkFr+1MfXDJqsS+c9ftR1nzB3XFPdX5zQzq2eyggJX4Hd4kzyxBuft7r7+gBwc9/euPSVd6xep38vkd7KBUKCB1I+eo4J4gSUEPMg27dt2199VpklymQ4mHmYGHmJQApD7vi3yVqteLzq5fMWGFcmma2PUfBG1SHIJWYZp/z2tMqEW6+pIAUCzi/nXZQ0L6SgZTat/xgKrLuRRdOUQWWQQUiILUMNmK0Csu7Al+qf1fXWmNVj1BJ+bOjyqWUeibzNB6a2cGDzlXHPQWoANq5fdd/lV12vlhbrqVrtKGGxJl1L6G66gkIpex7wqqnAs3Vb66Qiok8KQal1pxSg8n9mD+UykwBG8aA1CwwPAvkVLe8MBCldeMTIEpZ+9rx/Rf6JOzH//vYG5+YzH0IFG1SA8dJI39M+dYWm4I/ln+zx9QaoZRehXisH73N5bkL2dbTgFxmnGz6IHi4eTFQirs+IRVSBUCpHX+Q89e66rmUUh44xUFVUKc9stnqfllwy/LF2okL/FwWZl4La5SCOHaq0Bwpadv1hJ671UXGWNvOixoL/PiqmOzzZ/2uB8TocudIOUDKyT3ydH0LglNOF7neK4deNq/A4re9/k7WFj0BGEM5g2ze/pvmBcvTK9eGSXSMNtRYav+aA0h5A+LzwD9Qo33v5VWWgacXzQukvDDGp5haAgopFmZuqjDzYoGULIB7Ncfo51YuqbHCuDTNsrM4XHX9hFkX8yiT1FsIyh9uzoGUB9KEwx5NvabAmVxu9h4KMpR5g1HxvLba261hQsAyRuVxVtvHvHX03GSy1y2g3pSS1tmNZMlAz3KNvdF8ogospwpEQGo5bc1oXZZlBb688sImamH4zNgGNHCVVOWg1AFrAn+fvB1pmvWoBNhQsbyg1Gv+z2iLWVszqAea6wBKQCcJpWwIpZRSAljlTIJDTo5jIlkGKGUyqdVDwPhucbamrHgqW8qBTsEd+gxzMy4/0w1Nuh5pA0UPYCX4pbaCTwpGMfjEHysIxb5C6jn5PHvdoklCct+xZrO96G+dP5j6x28Mk5P/oQlHnOoknRailFLASPIzB2aps2v9IgrAo7cAmVktR0pZ8GR4OT8xFiqoYBAllFJWLNaI7sXLPpvPwHZbw7c7QEWYud+ux+13Qi0VlK/kZCbZHfdASO9bd35wXiBmPutTynu/cNZvmygMbll0lGH6uusqKA+U8ql+xOsA5h1u/vbX30l1FREI+i3LuGr7jc1L5uLqlPc8OkAJ2nS7XViwOfuS2aozB+yJDD4PnMoRszG57ajyKzRL2YGC3jMXkAoEVNopdzVa9r54oIMQ0ueHMf+/vTeBjuSq03y/eyO11eLK8r5bRXsFv7aKxmCWaaumGz8vPVgFDTac50aaBh64mXHVO/3ApvscqwYam2Va5de4zbCV/IahefTpKfH6POD04JY8B2a6MVBiaRuwjQTG+1JybVoyI+479964ETciM6XUnpn6ykeWMhUZGfG7kZEZP/3/381ud6Wocfdkd0pA7Y9u39JU5wrcO9cjFbxZ/xYQcxXVuVWDxlc83HxxQsoLp89VcsUZYWsipDofUr0KajRxe/PIvPplm9m3yY527GTr3kqd3LgeElh7AhRSa8+cz0gCiybw8a53TWwWXd1XFS7zws2zs+ytVKXUHEL88Ng/40h4tOWl1DV7nhiUbcGdSZ5Utdn2kln3BFQhFlKmUgo2U6ogsO3CNhw5rFAKl9m+p+XI0SeBI78CorJf+VRFUPmz84lhfPGNSU7HW/7qZ2f/v7/Af4HS05K7lrwIokJEaUnlC6lc1VRSPWWX65Dhc1vb5vqf/8z131z0Qew/4IZPHsBpO/rFZdfbe5N5snNCab5MKf+Cz//rtf8hd/J7gG7dc215+Rwplyfl/75ylr3J6OO9TfVXfh/1P2379CEF0eMkgZFSuQooK6uyWVFaHFSTVaHAzt1Pvq/pKnnuuPLbWkglHDKzDWayjKoLqYqZ4exxu+Rw877eQ8W2jvBwIqR8IQOMCYh7Rr65s6EDey/9o8cHlcKd80sm+4JcZPve5Iv/6dzGfs1lhFR8MqpaVeO9Gv0Z6/KT7zVAhpT46NFDAHrqrg7yPFR8IvdmTtWzt6md+NCWpjtXyM/MxZWL/tjlDGO+ba+KXMlULEmxOxworNjrufC32Vn2FpzFzn+PrdjWtamQ0gTbvx8ekEqkwfG5iq2KsHNvW2vP0mdE6P7pi0Vzyc9lfYjig0mgtQhQSLXWeHJvWpTA3R3vHIqk2PPK4AKcJU9ZdSmlL1r17Hu/nv1VhZRSEsNff+qLTRFSWs/h8L/+H08clG0FkyeVBp1Xtutl2/eQZEq5bKltv1XAyy+tkJQqHQP0LHxzx6yUSsLM3c/erHxCjuP+q3cm+/rBn/QiEgcBVcy05MUySvhVUabUw1VHeRVRTmIlFVX+MgqiY8u+6LP/aun5Ljd8ag+EGhKvf4/Xtlejymk5UuqZh4EXXWi817bnJJhh682ylwgqv5UP+6NP/F5TftD9XvGTPUrJQ1YsVYaT53Okqskqv6oqEmL8xqfelx5r9bzAGmSZO17zwB5IDCUsPCmXiLd6ArmzQdxjXxh7w5JaXW6+9qHeUInRWplLVuKISQjcL8sYHvnWKuS5LWNsLrvl0SEFsSdTGRUfZ/G2V1Q9Zfa1ZqC5OQ/sf+Fz5zb2a24FhFQy61g8Durj29fvM/lfHOsRkdJCKiOV0tv1VEllzuHj6vbNTXmukH81Owgh7syIuWT3c+9TjleVSqmMkAJGwj9uW7EcwkULKXewVa1KWjshZQLOy2pCCBSTY6vOSqn5K6t0lAJ2zVzE1r1lnNb5UBJYNwLr9+a3brvMJyaB5iNwV+fNvQBGA9GGNxVehUAU1kRKvRQexsPHf4xpNW3bKtKL2nGhCrtHnvls47ZU1DnMfXsmiqWOrlFI9GRyo3SYtT/DnpcpZSWUbdvTFVJu9r0t5wWYmQVOnFA48ZsZHP3hkYSbrWDzwuL17ZipFQGuIgVmbM0/XSnlz8Lniyk7+944CsGupI3u/Yf6oYQOsM7lQ/lteCqulMrel7bzuUwpr3oqkzdls6bEyd3D0T09SxOTf/ApXbk1aiqkTvUKIVa6Uuq5XwDPPRpLJzNlXqWAcn9azldJxa18kVA78alrmu6v/Prw+d5Jnz6gABNmXrUCqlqllHud50LPYzG19y1P/+9NmaV1+1Wj3cJkHdnXlz2fZUWdPvIrKqHmCTbXr9kCxI7Pji2+nTMrpOx5oeasdFbejEOp+8M2jHxrZP3k1KU3P9ItCm0HAPQmsxHOn7XlvXdUD4jX6/Hb+aDEzuc/f25jv+a0kILqTaVFDVHhvw/lKqQaSUiZMHMVh5lXrfSqR0jFdsZOmrAXH97UlOcK3DfdLcNAV0ll//mVuL64m0eo+BIlFOUdGOhakc9MiZDyhFhG2FRWQc2T27SGQgpA10NqjxJKZ3VlJzVx1VLVJJ/rBq25jFlgsqONrXt1fvTlYiTQUAQopBpqOLgxJFCbwN0dNx1WQhTPkqfilYULzIf8Wm16K9W+p9dTQohfz07ilzOP5qXUVATs+/unv9CcHzo91G++9Tc9nVsLo6ogijrYPNIB57GQSgLNXeC5EVO5Cqk4YyosAJvPDDBbSqXU8Z8cRViyLStLklK6Wmrql8Dsy/lsqUl0du1MZNR7f9APqAOZDKhqLXpxhVTVTKmkfU/LKg0onzHliS5ZgDj3tcPR3ecuXkrpYPNS6TDOuQLiFW/K/kV+JaXUcz+HevbnaYaUEBBJ2567eMoFnvtVUkJMRkPXNnbrUI1TxqHiULEUleMw87Q6Kp8jNf+Me1lhU1LRjt3PfGBFLqjW41x/x5X/OKqE6k3b9byqsXymUYWIqp5/pKt5lhJu/o5rHjJVGPnspNpVRGkrYSQwLiC+DhmNfWtkbfKmevoniuVyeY9SuE0JFI1Aq1nl5GZx9Fr1ctKq6mPjqrDnP9fg7Xp64+sRUv4Fdyw7M8d9Lkdq3SqkbJj5hJldzv2rkDGLFFJK7sAdKyNf1uNcIT8zp3OkbAB3hkkVDrWElGvLjCWKUNhX/uO2pVcWe5tSTUglh1hNQeZJ08wyayuk9HZ2PBQHnNdZHVXXvunXk8K+E5eIFWG8Hscdn5MENioBCqmNOvLc76Yj8Im2m4aUFHu02HhN4WJsk1vXTEopIXFCTeMXJx7B86VnM+0/EWBmiPrGk59v7L9oLzDib3znd/YUzz17SHZutpVPiZCSaTVUrkoqUyGlM6XiiqpNZ0iUI+DoEYW5o2W8/J3Dy5NS+kx9/Fkrpmy21BTQtgt/e4Nl3v/dHshgFIiKaSaUueTzgswrK5+STKlcVlQ22Dxdh/JD0bW86twK+Yp/vT8a3Lr49pobPqGw+TSIV99kR8Z/N1opKXXsBahffqeyMiquikrllC+lMi18+6N7rl/8vjXA2eV7Wz9pAoor2/XiCqFqM+l5weauItJVE0Fg5Ian379iLSfrgegjVz7QHwkb8J6Kn1zYu6sCrVH1Y15V2WWmvjD2hu2L3Z95hdQ84d+2iipTaTQVCTEGoX6kZ+srozw+NrJCM2LqQKF3/rxPCXFjBPQn1WN1iaiYcW7ZqsHm2VbJfc997rzGv6BcipBKrqrjo6VRhJQLM6+QL3XImPy525Z9jajbNzf1uSK4d65fAboSMP1Xq0LKMagiV7Iz34nJ8N8WVuQPHEZI+c/rXNO8VUY1hJSeZe+61Z9lz0epA84h1GhFZlTdLPPVVem+SWDn8YtFU38eXez7CZcngWYnQCHV7CPI7d8wBD7Z9vYeCHlIXyB2inbogHMpC2sqpfRzv1R+CRMzj+Jw+cV828twEAX7mqmNr6f3YFHKqD8S6rZIhd3tW9px5mU90FIqFVKVrXvJ7HuxgHLte6GulIrva9smIDsFXn4pQjlURkqVXg6XXimlz9aRTk3/FRB07sUXrrCVaf2jRaDtEJTqTvOgsplPVWfOM7LK1NnFweaVgeYqXsaKLT9jKl2/OOOVUKdfvguDWxc3M9gNnzis/yIv3vTBbNm+e0WvhJTSQuqx/x6HplephHIXiLpyKtO6Z5eNCnIn9sfSr8nONN8/6ZOHlNIh3rkWtfjivzJLyQqEWjlSepbNG575wHCTYchs7mDPaHG2PTpcb45UvpUsEVk5yRJBDHxp7PWLYnPTNQ8dVEL0uSkHKmami8VTtTD1mgHhaUv1pILS+VMPGgASY2UAhXJhcmzksqoVble+/Rc9KgiLEdANyG4FcTV0NZkvx+abJS8/G2HMKCPwaizjVYVNzZXKO6aGdyx/Js/VPlArhFR8JV21zcuXGrkFPCm1XhVSSZj5UoVURkrp84gawB1bFvV6WO3hWvT6h1RRtpUOV+ZI1agUqyGCskLK/LFjRcLNK4SUO/zmrThyLesxjWSb115I6S3o+H50UAB9Nscxv03xfbn7EyeYf0zyXm7WMz59sWjK/LJFH6d8AAm0CAEKqRYZSO7GxiDw6fabJvQFg75oPF+ehosL5yV5KGvRvqcrpdzz6IqpielH8cLcsyihnFQNRJDDYST2fatB86V6ew8WZ9qCPqWiGyOl+iLo/xQiFeoP0ug4aRPOvvw1QKEtkyGlW/iMiHKZUYl8qgw414JKZ0sFmwS6ThV44ckIoQSO/eQYph+fXp6Uch+8FMagor148V/eDag9Vhjlg8k92TTPbHp++57K5EX5FVY1ZuCTbRCXXjep2jftxOD2+i8kb/ikyWAR/0sfsO3c1ZFSx56HevRBr2XP+9ReMeOe66+QdtK/Qvtk9Fc3rMhfs9f67HSoeFd3GAa6XS99XebykvIVUH7VUDVZNdvZsX335ED947vWO13n893+ugcOQKG/Wo6U385YVaTUFjJjXxx7/aLCzW9680OjSugcJr9aK62+Siqh3O/rqkqyx/e8bYALVICZsot8++IiMqKqVkAloqyiuiue8dHutxBi3zPNUB2lGTkhlZMx1XOHGlhIDR7rETI6lOTruU2tKtZqyJi8kJqd276o94I6X7trvZi4t3RQQPVlnrdWlVQNoVIxM5xamXDzVhBSnYdUtwrVIRNwvhQh5Y675LGp3RUC+05cxNa9tX7N8PlIYKkEKKSWSo6PI4F1IPCp9ncMAjZ3RF889QQ7cGqwfd2klN6GOZTx/NyzeGbuN5iKq6b0/QXZMRYEnff/18lPrftfSnt7R4toK1kJhbDPqCcVIbQqyv6n0u8nnXkyTrvwCiOlTPVTwWZK2cooK6DSbKn05zAOOjeVUlJA30aHwJYzJA4/G2IuAqafmMHxnxxDVFJLy5TyP3zpY1CHnk+/kLbmVVQzOZFUvcKpciY+v2LKy5BKRJUvpuKsqTNeCXn+a/dFd26rv9XGCSmdIXX2FWlbXebixpsb3f/Aal579sNn5vrADw3Wvzj2HNQvRrMVUkkllF5FPMtevjpKX9RL7MV9b2vKfLQfbPnEkBJ6BjSX5ZMXU1Va1jKz8GUrpSKB4Rue+cDis8LW4Ry50FPe8dpv9ykIXZ2UTCqQn22wolppASGjj8IysGN4EeHmN13z/QkF1e2eq3agefXsqkzlUnzc15qxb6HZ7SrkVx3SKs+oqsCrQ2x58mtyphTubIrqqPmEVP78Vet85okfd2pbjwop+R+OmIkPKoRU1f1YWEgJYDi6Y0tLnCsW1bY3j1DJVPUAWIlw88LXyjbGrcrzVlZlxQebWT5+QOax61Mhpbeq86FwEFLc6d7SFxJTVfetipDS65GKrXsLvR/y9yTQKAQopBplJLgdJFAHgaHOm7vDMJpwFwN6tr2rCpegQ3auq5RKqqaiGSOldNWU/l5SJd3WNyWAESXl1193yjvGBsd3rXqVRV/vaDEMgt5yEF4dqbA3UqrH1j9ZCZXIJ6ejYhnlS6qTzjoZp1/YA7RpKWWlU6ZKKs6ZSuVUvlLK3taVUfr75jMEZmYUjh1VKB0p4+gPj6L8cnllpFQ4Cxx5wuZM+UIqkyFVpYLKz4Tyl/Xb+PKtehkxFQuroA3iNf92SiHcUfdfxq/75Cik6hXnvxY4/8r0E3OFeFqGlNJC6tFR79O4y4dyQitu48tIKnufmmvbjuHdq36s1vGyX/QiP9zyicMKKNrZ9dyMctkAb9N0uUCOlK2UElBK7b7+uVtHFr0hDfqAD7/2gcMQwgRzp7Nb+gHuMas6RJSTPYDY/4Wxq+rOG7v5mofsK2nBMPXqy1gB5HKa6pBWXnVXzZkEF1GNlQi0CkbzbEu8bPUcKbHrmS+ct7i23/U8vmpVSC0kpMzvs2Jn3YSUDjOXQRxmngu0qrkfntDw+cd3KyV24yObW+ZcIe+dM63lya7WqpByvOoQRLp6pzywvHDzVhFSRkr9INLHYHc9rXuLlG1j0xeJRVWurucphc9NAhuZAIXURh597ntTEviPhbfb7JH44mGL2ISr2i5BFLfTrdXse377XtouqC+A07a+Y+ERTJVexNHwCGaiabw89wKCoGO8HM2NdbRv+1EgOidHHhtc1kXIu978vR6pRLEso94wUleEIuyJEHWHRjLZ+icjoZLWPPezXxkV10m5Kin9SBXhpLNPxukXvdpIKSOkKiqjYLKmXJi5/r2uinK3tYwylVJaSkkg2CLQtlXg8PMR9OxmuoVv5vHplZFS+mgOZ4CpCeDYU2kuVBJYXqV9r1qbn14+uT9u2Zun3Q/x8uLyt0JtO2cvBrfVV1WkhZRQvSieA3F5nxdq7l0Y+e9QS8mUyggp7worv143s54TU4XOEfWfdjdlKO+hzXf1KyF11UNGOGVa1FyOVBVZZWbdcyLKSoypa5+9ddGh3Y18ctVte0qJfpPFlDAwaWqeIKpsfctKoLwoklNfHLuqLk79vYeKM+1lLQ0rhVQ9YeqVweZ1ia1URNVo66snTH0R0soPf89WgFVIq/1Pf+H8umVeQxxbVYWUE925Lcx/0vaFlPeQNa+Q0mHmSXD3IoVUNWElMaVu31LXa6AhxrCOjZD3zulg8/6VFFIQYjIcWF64eSKkqoiwijbBzDJejlRaWbTmoeY+ehNwLusPOK97//STSOyd/i1R32eSOo4HLkICJLA6BCikVocr10oCq0ZgKHhbn5LyYFK9AOAseQpeVTi/IaWUkVU6OttUa0jMqBOYDqdN7tTx8hFzvxDB1Ew4PV5CCUqqZy7Y/oaf64tDLXH0Jwr3cwhcACG77frQo4TQIbzmYkzLJyueKiVUIqQSSRVCV0y5Vj1XOaXzk5LfKPv74tmn4PRLYimVtO259r1YRsVVUG52PiOl4mWdjNIX+qGeua8AbD5LYupFHXYOzL5YwrF/OoKwrFv4rAww372WIhs0raPJ4+8VcibXSlGeBl56DDj2NBDN2Xa+vGSq1tqXmW0vF4yeVFNVuV+Ho19wFXDBG8bV4Lb6wkSvu3sUQvRi2zkwOVKZC5wVklJJy57/cqz1F35XLQWoQO3CF25ZlihdtRPAAise33y3ySZKzw/xxb/fouYJJ3espRLKb9czx+H+a5+9tblkwQKMPnLlaE8kIjNBRNUqsfkCuecL9gbqCje/+fcf6oXE6EKtdDZUvX5plcmOil9P+da+ynyp+TOnKloJ6wk2j3tp62whHH/qixfUd85YrxdVtedtASEl9r18CEL0pLIld0lQIdJyFiq/uMT+6PYtLXWuKPxVqTfSsqTiLaTK+0iNtr3qAmV54eYrIqQSUbV+LXsOa8cPooNCwH4QqNGK6O7Pt0Bml899dhCYUgF2zuwQVSdzaKRTCreFBDYyAQqpjTz63PemJTAUvG1CSStmXKXUq4ILcFZwclNIKddKVKuyysqYWMokcsZdKKeyJhU3NhTXSaYKMeVVS2UqpmLplNRMeTlSqaSKUDznVJxx6WtspVQmS0oaaWYqo8z99mcto5yUSoWUrZQKzXYCm86SmAuBE0cVymWFYz88irmn51ZOSumjOyoDhx8DpiaB0rE0Z6qiMmqe6qlMW5+/nCemVATR/Sag+01QItJtewt/+Lv+blumX+iEeN17qoSar4CUMqHm8bVE5t1u3raTSTX8R80ZZt55V7cIxIQTAX7FvcDCAAAgAElEQVRItxNO2QooX3z6LWu2zU8vKxR2XvP8n7TcFNq3v/YB3fqcnkNzGVqLzZEygS4CY18cXTjcPCOkcsKpeii4a82bp8VvMTlS82RE1Wzn8wLybeVT5bZYeeYq7KovkzzWrm+8LYx2TTbDrHr5Twu+kMrL9Jy3qQw6rxQ/+p41rZDSYeYiOpTdtgWqpOZrV9Pbr7ATf7al5c4V8t45+17l/tXiUENIZbIO02VGwoG2JVfhGiE1j7ypnbVUIWy0ARorXS/XtbVNB5wjUhNVZVSujT/Zt6q8q+0fxqYvZOte017wcMM3BAEKqQ0xzNzJViMwVPhDHR59Z1pFYy9YXlO4CEW5ZcNKqUhojeRVSJmKJ6ubXIC5Xxnl3x/5cspr3dN5U3qNVkpdmWnfM615TkSZ1rxUSpmftYAy7XrCiChTJeW+Awi2CgTbJY4fUSiHArNPz+L4D4+aaqkVqZQyH1jj07xu5dNy6tgz2lR5LX25sPNqGVEV1VQ5MaUrpC6+BjjvdVqQDmDwpIWD7K+/236g1pv4xg/GP7g7vE/+uQ+j9gE5oZS8k+WCzn0hlb9IdFdiuXdB1bF1Lz63uylL/H+0+e4hBbXHr3aqlSNVKatcBV4quZUQk9c89ydNKecWOuff/toHBpXQE0QsNkeqMiPJz1MK6wg3f9c1/zwYKXlnzQqovPCpmTVlt8WIoHoql3LtdnUJpEXkaC1mdj8hxLhsVhmlwS1GSFUVVNmq1rUWUnLwyAEl0L8oIeWfeyvOp5hUH9nSkucK+ddzQ1DYsyghlZNF1QRRiPIODHQt/MebKiezJQmpZJu8908r19ZdSOmt6PxBOAgh7lxSsHmtfUs/P7B1b6E3Rf6eBNaRAIXUOsLnU5PAUgkMoa8ogkD/hd8GF8eVUgECXFm4CJtl18aVUklmVCqj0na+bKB5tpUvmzPlV0i532w761ScddnvQHR0JpVQtaSUEVVGSNlKE/NzLKSMlNKRT2bGHaDrnAAlITB9FKZaSkupuadnV15K6TP+9EvAcz+1WVM6DH3BCqharXsuJD12SW+8Degqale0LxqsY7a96+62swTpj8Nv+JMFJZNd0HvF1COlnJDKPM5/1VVUSk0pEe7A8EBThpn/eNPHD9s21oxUio+jfAVUdia9tLLFBaHb/I03P/vBppRzC51bb79qtFsplVSTuey9bOVP9Xa2iioiX9pA7P/SAuHmWkipWEgtJdg8U0W1oIjyBFq8rBVRi8+RqhBo862n6gx79jkhMS5D1ZyVUe7AWo6Qyoud2LGvWYWUDjMXcZh5vnI0f1VQ9XZWppndUWpf9Gdb659ldaEXaCP9/t65HgkcWlBI5SSUX+1TTUgJLD3cvPD/1J5lz0UhZsSOv20VM+01hpAqHlLFGaV01Z6tRstXQHm3a+dI5WVb0gI41SGxY2qHaMr39kZ6OXBbSGA1CFBIrQZVrpME1oDAfvm2AxDoNxcWlFJe7pKuhnJVUmlOVCisjMrMtmdm3IuXSYLPPWnlZt/T61O2xqpr2yac9+o3IOjaCuVlRWUrpeIMKRdobvKjrADwK6RCoaWZFVPBVonCaQFOHIPJliq9WMLxHxxFeMIGoC8rU8q/APLP+qZq6nHgpccBnTtVLVfKVVMlbX45MaRvXnYjcHYcRSLEmNp30vzl/9fe1QshbC+dLmrSQqraNuYqnxYrpfD0vwDP/Eu8bl9mVZdSoqNrf/S5tzdlBsqPO/+iH1IcqN6al2aPpZU0aX5SrRypchDsuO6ZDyzpL/hrcApc9lN8+LX/eEjZLLqkwqhS5tljtGoFUlUhI6a+NDp/uPk7r/nnPih5sKL1rYbgqSqQFtEeN28b4Dzte05aLTVHyu1fRuAJMSIiNdCUbXr+EVdTSLmTWu7wrBA7uTv0zY9vX5vP5DrMXEGHdWclv38Odptfp5BSItiBO5ZW7bPsF/IarEDeO6eFlH2T89+X8gz173yR4g6H/P22MmnJ4eZ1CSm3bXmx43oIk/sbQ0jpzd10SPVFSh1c4RwpNyYj078lltwmuQaHGZ+CBDYsgbV589uweLnjJLB6BIbQ1y2lrpKK/9qdk1K/W3glpCxswEopwM2w50soV+Xk50u5UHMrqUKESn/32vvidj23nGwT6Nzaju3nbcW2cy5FWZwCFbfkJZVS7rarjjIiKiukkgqpOE9KCylbxQV0nl9AuRBg5pgyrXt6Fr6ZR06snpSyH4yBE88BLz4KHH/GZk6VZ+K2vioXLe6D7pYzIXZcDZx2SSx9zME4pj66oJDqhxD2gsi07MVCyr8gyn+oT4I4FlEppWWUllIV68rvk11ASVMd1ZQC5iddHzdh5km7XhKC7yphnHSJQ/OzM+kZWZqTVeO///wHmy9sehGn3A+97oE9gBjymSVCLz4Wq7ahLVCVBLVwuLmeHTTSz23GrHrFUlWRVEdVkjmWa1VAVa1cqhRudh3+/fOHn9eeUc/bFol9k1/a0RpVNH/6kp0l1P9XTaAnJ7ncgVllpr21ElImzBx+mHluJ2pWlLrzZkWF1Lj6yJaWPlfIz8ztgcBQQsq9b+bHt0L+xH90qXE/sLRw80RI+dLJryCqcb99L/Rm2rPnuYZo2XMoO38YjUKgd77WvQR/Va5Vc6TsbivsPnGhGFnE2wQXJQESWAMCFFJrAJlPQQKrReD/km/VFRHp9OWelNoiunBlcOGGlFJpjtRCM+6l1VROOrnHutuQCp1b2tC1rR1BhzCyS198yQ6FzuIr0Lbt/FRKxW16mXY9J6TMLIOxmIpb9VzAuRFUylZK6edHl0BHdztmpoFSCShNR5j50TETer4qlVL+h1R3sIYzwLFnbSudzp3S7X36s+uWM4C2TmDLmfZ7xQWXXFhIXXe3/mCfZHLYlj3vVbJAO57dkDqW/9VDwEuxX1pASgkhhqP7/2hgtV6rq7neRzrv6g5FpFt4k5kYU8mSThCQr47K50i52RxtQLca+L3n//3CWWCruWOrvO49PaPFjg51OMlrc5KuqsxZWMg4gRQBYwfqCDfXu3fztQ/1hiHuhBRGbtQMBc9IphqthAu273lyqK4w9VhI1VONZS9s47DzCsE1HgG6Kqp1Aq8XElL5c1Stc5Z//lyLCikXZu6/tjJXAgsEm8fj7J/3lcIA/mxLS58rcN90t4xMm6P9t0ghVSPYXK9pSeHmVYWU2654PKsGmyfLuIUaUEjpgHMoy7pqZVnc4V9L8ukdryUGgal2tu6t8jsrV08CiydAIbV4ZnwECTQMAV0lVZBywraZVFZKdYp29ASv2ICZUjbc3FRKiVg6xe13Sah5kjWl1ZNuyUvm2oMsCHRsKqBjs/3SVVWmYU9EOHFiBsePzuL40TlACpxx6YXYds4lUIUCdJWUrphKc6PszHp2NkEv0NwLOHc5Ui5TKsmWUsq08MnT2zBz1D527oUSZh85gfIL5UQ8OIngjgF9O/3A7AWA+xdE+WX8D9jV/jruLe8XASR/ac18SMeY+mhxgZa9u+1fQN1n+6Rlz3tprYSUenQMOPZ8utJ5pJSSUdNWR/2042NDkCIOM4+zofI5UouQVfoYkuXy9l1Te1s+b+PDr3vgoILoc217GUm3mHa2nLSJFHYMj72+7mq7P7z2oV6hxLt10HSmPXAeyWRb6WoFmi+cETWPQIrXu+xZ/aaUEHsfH97RerJiuUKqithZiwqpJMx8WULKfzMBVKm0HYPbW/5cIe4tHRRQffMKqSVIlKWEm1cIKf95m1xI6V3pPBQOAnHAeRW5VL9scx8y0sIwLQFPsHWvYa5juCEkkH1HIQ8SIIGmJPAZUyWF/lpSasMGnRuJ5FdIZaulkta9WES1dQTYtKUdXVvaELTLWEKFgIwwF5Zw9Og0jh6dxexsyeZJKRtMrjOotp19Gs4wYedddta9uCrKzK6XtOx5UiqukHKSyuVIVUopQLUBbecVEHUVMDcdi6lfz2L24RMITygjIhtMSs0rpLq7uzsnL32/DqxK/oopXu9VSNVT+VRv+95PDgJhKVtOVUVKCamGo/v7m7I6SmP8l46PHVZSFCsroJys8DKSkta8tJWvSqXUyO+98O82RNbG7VeN9kdKHUhzpPyKskohk0ig3Ix1+da+SIn9wwuEm1d7w+nrO1SUs1G/iNS7Iyl6fDk1b5h6fma+fO5V1UDzhaWV3/q3iDB1LSfumZNyf9NnRdX6VDCvkIpPbvk/+Vbczt1x1+pnSInBI4cBFLMVpjk7teB2+5cPakT92dYNca4I7p3rV/CztzxQ+T/kLEKiLCXc3AipeeRXEmxecxmvba/BWvb0JuuA82moCSFQrLWfmba9/Pu6q5KqMQ5SYNexHWKsKT/0c6NJoAUJsEKqBQeVu7SxCNyHvu6yEBP6YmU+KdVTeAWKcssGypTSLXC2+snNpuff7ugooKurgM5NbejoKkBJu1xZRRBtEcpRCUeOzeDI0RlMz5YQRjpjKkQYRea7CUM3gei23a5jaxfO/u1Xo33babYiKmnf0xLJa9dz1VHQAef68fZ7CD1+NkcqqZJyP+uPnpsECue3WTF1XBnRVfqVFlPTiEzwuT99vZVUvvQxrXfuX/IhLbdMcp2Ra9uosvw8lVIj6mPF2hco132iDzq01P3bdg7Eq27M/Pmyrna8eqTUoa9VBtD611LxTqigeaujHun8D/0K0ggVMx+iL5wyOVLpLHt+a15aGZQ+Vuea7Hrx322YnI0Pve4fzeyEvtDzJZ0+ZCpa6RZsjxNTBxYIN1/onarv2kPdEFGfErgaSRVXXBVVZ0ZU1W1fcIY9b2a++LzhZ0TVbCsU0Bd49//sP1/YehVR+cHSQgoqzbnJn1v981PF7+I78jlSqy2kBo/0i4xQ8XYqczVQ4/yf2Q/7AIUN0K7n9ntIFWV7SQs977211ntoZbvZPDPDTYb9hR0LnQ/83xe+6s2yV6s9rcb9FTlSDSik9L52HlL9ECoN38/tT0ZIufd1/7PK/Fwm2wV2cta9xRx1XJYEVo8AhdTqseWaSWDNCNwr33ogUvrNu7aU0k7jVcEFOCs4eZWklIxb0+y08f6XErV+l7tfSxnzWGmzkiq+0uX9C/B0Frq0Wkj/XoeU62DztjYJLaCshGpHe0cABAq68a2sQigZodChcHx2FsdmZnHk2CxOxBKqHIVmGSeislLKyij9pfmKNokzLrsE2869xM6o51VKVW/ZE1ZAmXDzWE4lQkrZ+122VPxdi6nggnaozbpiSplqrNJTcyg9Oovy82VbMRVfLK+HlBJQ+6KPba8dXHzt3foDZn/y4jjpHIjLtZCKP1FWqWBKZFrF73JZEcmFgs69eh54zE7kVzErknefEGo4+s/NWx31SOdHBxXE1YB+baQtXFqI2qqd7P0aRiTtffpfIl4MJGmO2V0v/vv5Wy7X7My2Nk/0oaseGFRKXm1nLNWvH2me2PDTYjk+Xoywil+vmpVtl9Mzatrt1I/1cqSgVLB3eOy1K5ab1PcHh3ojoDdS0Nsah6HXCCRfYrB5RQXYwm2LOh/qftVWGPnZ8I66WxTXZmRX8Vn+9MUhEwy+0Kfo+NjInofc6a6iQmpVX3dy8OX4XGFe6vP8WyBHyjw2FlIf2bKq27yKI7ikVct7ZweV0Ofb5M2m8kc3rPmx19mTeulq9yu1tzTQXve5ovDV8mi19ZiN8dafaW1z95vtk+n7olTjpeuDhpxdtnM8PACI7op9dWkEVVhaBrk/wFUZEyFwz4kdDDhf0guBDyKBFSaw0FvpCj8dV0cCJLAaBHSVVCTEhL1wml9KnSVPwasK56+4lNIXvhAFQGqZZMVROW4nm9PSZw2k1KbODgQywNbNXZBBgM7ONiOhEABlhFZA6TokGaGrS+FEuYQTc3M4OjOHF4/MmOqoclSOv9uKKCukbFVUpkpKV0zp2fm0KIqFlGvbOemc03DaxVdAdm4xF6uuQiqRUvFFbibU3LXx6e++lFJWWllhFQswfbG5SSLY0Q61tYDSjK2sKr8covzYLMpPziEq2QvktZZSSqjd+Nj22tU1133qMFRUtJfyAE67FOLCf52VRishpV54FHjS+3yfLemyz11ogxKzTZsdtRrnEq6zeQhcf/2hnihAj4K8QkD0KKF0i1/RVjDVMdNe/H5RdSbB2i2JYwoYV1APBh3tY+PDO1o+O6h5jghuKQmQAAmQAAk0HwEKqeYbM24xCVQlcJ/sOxAp0V+PlNoiNuGKwg50yM5kuve0Gqm+aqa0gskub4SUDCCMlAogpPsexLcDI4MgpBFVZX3JJPVjJI6HJdtqpCujdGVHXCGljNyyFR1BEGBLR1ccGC7Q3taG9vZ2U+nR1dkBGchU/miBE1cnqUChvUuLmRCzYQkz5RKOzZXw3JEZlCJdIVVGKRZPJS2e4oooXRXlqqP0dx2Q7oRU2bXtRVGaJaXlVFxBoS8I2zZ34szLfxsd288y7XtmJr2kXS8bdJ4IKFOd4QspK7vS+2wVlW4VdPdjk4S8sB3RtgLKccZUWAbCp+ZQfnQW0VS4dlLq8naoX8zVDri97tM6EPaguVxWpsEM4twrgfOutMe0L42WK6V+/T3g8K+yr5WclBIC+6Ivv7s1pqHneZEEYgK/3/eTXgVVFFA9ptpL4opI6ZZEey4x1RFSxRVWSY7UWFIBZhaRk0pEv4qUmJJCjZeByfGvXrZxKqB4NJEACZAACZAACawJAQqpNcHMJyGB1ScwhL5iB9SEErJYj5QKRMG08J0aFFdMSlkxpWWUFVL6Kwja49vufvddQurlgsB+l9JUNUkp4/v82xIwwkmLHYGylk2x5NEz2mnZU+iUEAUBLaBmI2UzoQQwE0Z44ciskU7pl5VQiZCKJZQRU6ZKyrbpZYWUbduz7XupoLLh5jpPKleVALF/2ysuveeMiy4aCiH6TNB5IspsG5CTVEmouWndi8PSYzHlZ0rp50h+H7cKmsopJUz4Oc5pAy5oN7fD0HIJpyOET5YQPVmCeq7sTYecK2k3QqhWHsY8mVLtAnhVO+TFBagtckRdWKidH3X9kJZRfU5G6e/ilW8BTjonO02zs1PLkVIP/3/A3PF0n9xLMJVSU6rNZEexwmP1T098BhIgARIgARIgARIgARKoIEAhxYOCBFqIwH3oG1RQd5r2uFgw1Ao6NwZACJwqi7gsOB9SFkyFz3IrpZLHe3lQ+j4tpnS1U1uhw1RJ6cqorrYuI6u0iHJiykipwJdSVkyJgq6e0l/AjIhQiiusSlJnQQEz5QizZS2i9LoFEOj9k1ABoCufnIzS7YNWRjlBVTbiycooe39eStnWPdu2lwip+LaunLI5UnrGO1NtMFIO5N6fjQ0k1QT/5qMv9EUCByKBoqlw0m18OSGVCCqvQipzn6uUSmb38yqnnJyKf4ftEji/Her0NhOWHoax/NJ8tJTSX1Mh8JzeivifHwZqjh3vheHSQ919WyRwVgCc3wZ0F4A5BTxSAn5T3o29J1Vv17t2qBuBmLDVUV6F1O/0A4X2GqHm82RE+duYr6zSM+v9NM1NzwS6x49THVv34ktv299CL3/uCgmQAAmQAAmQAAmQAAk0FQEKqaYaLm4sCSxM4D7cOKGA7vmklBZPRgrpLwgURAGXBOfh5GDbqkqpfNC5kUemosq2+9lWP7tdtspKV0bZ7/q2a/FLvgdWUpnbgf2uW/708koLKdPyB5SFSoWUkU+6QkpLqrInptKKKNfC58SUy5LS8ikNOdcz7bk2Pt2up2eYUvvGv/PeqlMJ9w0eLs7JspZSfSbw3IWZuzY9v12vSutevjoqUymlJVYspWzFlhZktrVPnRwA3W0ItxUQbQ4QRXF6kzv7azFVUlZO6fuOR/bLzRKlXZFeh/7dmQVgqwS0kHLLPlayMmpOTeKu7TVnCgqu/8v7QlF4v926WEq1b4a44mZ7UOel13La9448CUx8NyfVMm934+or/TsXfjVxCRIgARIgARIgARIgARIggdUiQCG1WmS5XhJYJwL3oa8XUKPJDFvmYt8FnduqKFM5BAHhsp9iQbVNbsFFwbloFzqbKZ3xrnK2OzsTXlYw1Vg+VynlP8ZIKJc9lQinuKUvrqJKxVQqqRIJZcRTLKQyP2sZJWwelW7pQ1wlBduqN5dUR8WVUjrw3FVJ+e173gx7+nFJhpSXJxVG0ZhS4b7v1xBR+cPg9+54qq/Q1T4UQXXXklJpZpTedhtm7guorIyKM6XibCk365/NmkpnATQthZslotMLiE4KgJMkcFohyRY3Qsh96Y32Z+TxW+eeDQH99UQZeCmWWPYY2427aoSZ9w0VUW7T1VFFUx3lpNTJF0K84ndTRCslpX79EHA4LlDLVHrZG0qqXfjyQFVxuE4vWz4tCZAACZAACZAACZAACWw4AhRSG27IucMbgcBnceNBBfTlpZRuKbPT/boKKXs7f7+eie+c4HRIEcTSaWlB57Xa99z9uorLVj656icdim5/TkRUXCmVVEnpdj5TCVVNRLm2vlRG2fB1oARdEaVb/bLteq6VT1dD2Xa9uH0vlyOVadsz8ioaFlD3f2fslkWLjd7Bw8V2zO0JlbgzmXnPm2XPVDjpVjsjo3QWlM2JcrdtZlVcZaXSoHOzbEWllO2QS+WUgNKPsfPbAzp7qhhYG6UroIxcil8lScWUslVTx3QofbxAtqVvDHefXHP67+AP7rHVUUZGxdVRes+63wScctH87YFLqZR6+BtxfpS3H+7H9q7h6P6bBzbCeYD7SAIkQAIkQAIkQAIkQAKNTIBCqpFHh9tGAkskcB/6ugXUIQWYmZXMDHhxZpRr0zP3OTEVV0j5YkqHnp8hT8HpwcmxmFp5KeVm5ktb9VIZldznySnXtmdb/NJWPZstlbbsmduBDli3MspJHz9LKium0gypNE/KCzePA85DFU6FCIfnytE9Y2PvXPaMU9cOPt09MysOoE30moDzuHZI5z5FWkIZKZXLitLLmXBzK5VM9VTcpqfHupqQMqHnsYTSbXz2tl2PWUE+PyojpeJf1s6UmoIQO3H39uo8+u7rRiQmksooT0qZdj2dKeY/X/JztfyoOjKlpqeAX/y39JXjyzVgSnWAQeZLPK/wYSRAAiRAAiRAAiRAAiSwkgQopFaSJtdFAg1E4K/Rt0dADWnboF/oqZSKRVRcKZWIKS9Xyokp/V2LqdPlySZfqpBp5asdgG5FUGVbn2kj8+63QirNj3LZUa5iKhFQrpJKV0fpzKlA50RZeVUhouIcqch994RUGcpUQLlgc1cNlVZJ2UBzVynlZtoLVTQ+p8r3BCWMjIztXvFZ2Xr//OneKBJDkUSPkVJmtj0tm6pIKZMPlcorX0il7XpWTBnp5JY3mVL2sU5G2d/nhJObaa9eKSXFLty9vXaV2I2fH4WKdBupfWLzPQK6tkNcekMsoxaUXl4V1QJS6ulx4PlHs6/EePVKYDf+ZqB66HoDvXa5KSRAAiRAAiRAAiRAAiSwEQhQSG2EUeY+blgC96FvVAC90oUDZVr29IxwaZVUXkz5AsuFoG8PtuGUoIgO0ZnJj6omn+qRUmZWOteyl2vfM8IpyZeybXrZqil3n2vTs4Hmrloqkno2OyfArJjR4eZGOOm2Pdea583A52bas7PtRZPlKBwJRXTPV7913bKroeo5CP/VR57uj4A7I6Dbtur5VVOuMsrGPlUNNY/lU7ZSKg43z2RKpRVTpnPPSajFVkpBDeBTpw7X2reOt3z2/bOicF8ioTwpJc5+NXDapZXVWbUrseqTUo98Aygdr9ykto4x9eV31WwrrGd8uAwJkAAJkAAJkAAJkAAJkMDKEaCQWjmWXBMJNBwB3boXQBwCRNFmVMeh5kZEuUop3drm50rZ9j5TJaXDz027n/29Flj6/k7ZiW3BSThJbjUVS7UC0OuRUqZCyuRGpTlS2Zn3UhElvKBzmzMVz66ntzORUVpESSOj9POHuiJLxgLHZEnZKikrpaI0M8pIqHCyhGikrML7P/+NXePrNaBvuN2KqdCIKa9lL/7ZVT3lpZTLmVKmlS/OmdIz7bnqqHj2Pde+Z2OkNKelSKn5ZRT6DnQDOASliunMeukMe+KytwDtmy3ivAhbqpSa0e16386u096aUmdduhP7X78mYnG9jhs+LwmQAAmQAAmQAAmQAAk0EwEKqWYaLW4rCSyBwOfx1j0CGLITqNn/rGjSP2UDzX0xlVZPOWFlxZRt59P36Qomgc1yMzYHm9EpuyBFYdGz75kKqbgSys665wWcJ7LKtvalQefudtzyF4sqLaXSVr20QkpLKVNtZFrhVBxwbgPM5xCOlxF+PSyXRz71jTeum4SqNrRX/p9P90cquk1J0WPa7fT2++16JksqrphK7rcVUSZfymvZ091ypo3PSSnTGhjLqMVJqSkoNYD/eOr8rW+779cyqscPMU8qpU46B+KCN1UJM7czQmYkVSKs6siUemoceEG362XXoRR242ts1VvC6YMPIQESIAESIAESIAESIIFVI0AhtWpouWISaBwCX8LbRgH0WgVlhVI20DyWTvlcKS2uMtlSrnoqrZhKqqiEQLvsQJfchHbZab7S2fRqZ0ppCWbb9nKVUjorKqmacjlTOkMqDTTPhJvrzCjTAhiHr7t2vfh7Oa4CCoUaL0ONl6LwwdkgHBkc2bnimVArPfKv+dMneiMl3x0CunLKtuvlxJSTVboaKvl9IqD8WfZ0npiuoEoro+qvlBLjCOVu7K8RYO52/K1fPgCl+k1lVG5mPS2lxPmvB046Jz4OPVrLrZR6eAQIS/EK45UVukbUV27evdJjwvWRAAmQAAmQAAmQAAmQAAksjwCF1PL48dEk0BQEDqCvCBQmJEQxWymVFVGuLc9VUCVtfUZMxRIqmbHPtvO5qir7+7iCKr5fS6mCbDdh6IFsM1+RyM3Wp4VXXBllA8pzVYoX1qIAACAASURBVFJJ9ZQ3s15cVSWkfqyrkkrzo4xwkaZdbzKUYlwJ+aNIRmMzhfL43iYQULUOqp49E8VItvWHEd4dIQ5A9+WU16rnws7TYHMvS0osWkpNAWIf/vKU/Qse8G/9Gy2iDmQqo5yU0vVZhS6Ii6+1qzHvQF7lU3LfEiqlpiaBJx7KVl1BTKo57MTIQMNLxwW5cgESIAESIAESIAESIAESaDECFFItNqDcHRKoReAA/rA3gBiNm/a8Sql01j2XG2Vb8tKcqUrpZCulnIByyya5U4mciquWEnElTVtfINuxqbB5HKIwFQnRax8f2EqpTPueNwufVxmVzMxn7hPjkHIKQk6qQPxKQk5GBTl5y7d31p75rQUOk1feOtETiuDdSsjeSKge06IXz8rnz7aXzKxn8qd0pZqpUbLfF6yUEpOQ6n5Ehf3Yv31hqfPWr/VDhAdMX6CJkXcz63mVUjrMvHh+Ehu1YlLqlw8Cx5/3RBegTjptF77wb1r6OGiBQ5m7QAIkQAIkQAIkQAIksEEJUEht0IHnbm9MAv833jEkgT26bS/Jk6po30tzpRJB5QWc2wypXNi5XykViywnsXRFlGvr88WVEnJSiGD3+57cm+Q2/ZeLvqbFShEFPT4FoGB+iH9Ov9/y/TdTMniHcPf7J7oDGfQqyKtDFfVGEN1aRPmz7WkJ5cLLF5BSWhKOhEJ9HfvPmD8nyn8Zvf3v+qG0jNLP6oko/+e2LuC33pxIo+QNaLmVUjrM/NH/lqm2Eh2b90VfvmlwY77SudckQAIkQAIkQAIkQAIk0PgEKKQaf4y4hSSwogS+gpt0lZTJk8q37xlxlLTm2QqoRD4lUsqffS+tpLLCI5VPpv0vFlX+/f7sfUrIKSXE3vc9uXd4RXdyg6+su3+iWO4s9IRR1KOAolLyikh/122Mmo1pm4xrmASmIil+FAlMBmEwfvyvT198sPvbD/ZDxW16fm6UjVC3OVL668zfBradlwkuXxEp9ZuHgMNuAj0BtHWOqb95164Nfhhw90mABEiABEiABEiABEigoQlQSDX08HDjSGDlCRxAf7ELsxMCKLqQc3siiAVUUgGV3k7zobwcqVg4WYmVSqpq7X2ZrKkqkioS2P/eJ/fsXfm95RpXncA7vj4EFe1Jq6I8CWWEVPxV6AC6d6UZT95sesuSUnMngF98I93NoGNSzZaYG7XqA88nIAESIAESIAESIAESIIHlEaCQWh4/PpoEmpLA1/CuHgCHbOuedgTue7Xg8uoVUa4CKpllL66QylVAZXKmspVSaQB63NY3LgqF3QOTH3ClLk3JdsNs9M3f7EZUPgioHiuj4swoDcD87OVG6d+f1QNsPsPiqTKb3pKl1JPft9VRdgVTSshd+NuBxVd5bZiB446SAAmQAAmQAAmQAAmQQGMQoJBqjHHgVpDAmhP4O7yrHxAH/JBzp6US2RS372Vmz/Nn28vNqmfb+7LVUpW309n4/Ja++OcpCDEw8MSt9WcXrTk5PiFu/mY/lBoCVDEVUX5uVE5KdRWBs6/MzoC3ElJKV0f9/BvJelXH1gF85R1s/+QhSgIkQAIkQAIkQAIkQAJNQIBCqgkGiZtIAqtF4CBu0VIhE3LuKqZc6102V8qvoPLb92zIeSbw3LT0Bea+fIZU9Wwptw6znhEVdAwMTA4sPLPbasHheisJ9I8WMT13AEL1ZVr0kuqoalJKAee9Qec6ZULHzcqXK6VcdZReVeemfdFX3skQcx63JEACJEACJEACJEACJNAkBCikmmSguJkksFoERnDLAQnR74ec6yhzlymViCk3s54nmPQyTkRlAs1zAee1MqSy96fySkkjp6aEkgO3PPEeVkut1uAvYr3BO7/dpyJ1QAlVVH42VDKrnmvZc1Iqzo4qXgAUu+0z1TmbXl3te7MvA4992612OPqvfzywiN3hoiRAAiRAAiRAAiRAAiRAAutMgEJqnQeAT08C603gIPqLBahRAfTYkHOXKWVrpXT7npltLxNe7uVKaUEFK5Nca5+RU4nASqunKjOkbFWVEVMynaEv28onRspC7h2YHGC21DocLJ03j3a3Beq+mVBdq0VUBP1/+5/952VF5Sul2jcBZ/1OlVY9fax4O7OUSqmJB4ETLwBB+7j621t2rgMaPiUJkAAJkAAJkAAJkAAJkMAyCFBILQMeH0oCrUJAS6l2YFTGUsrPlUorpWLhVJEhlZt5zxdRVTOlYvEkXXWV36pnfxeHnNvv0tyeAuS+/23yj/a3CvNm2I8tNz84GKrotkjAVEW5/+aVUi7gXAbAaZcDHVvsrlYIqGVIqaNPAb/+H3qt40oFuzDC1s5mOJ64jSRAAiRAAiRAAiRAAiTgE6CQ4vFAAiRgCHwT/d0C4pCAKLpKKW0R/Pa9JNy8Svtezdn1jMBylVC6kioVWFVCzZPfR6ZiKkDkZVFFEJMKYuCWyVvGOGyrR6Dng/+97/EXMKSAbieffAm1YKWUllLbLgC2nhXLqPitZiWkVFQCHv82EJYmVRjupIxaveOAayYBEiABEiABEiABEiCB1SRAIbWadLluEmgyAv+A/h4g0JVSRSejbLVUXDOVCSjXp4+0uimZmS+RT14Lnmn9y1ZCVQ86j3Ok4vY9XSHlpJUWU+bL5FOJsXKAfQOPUUyt5CF26s3/szeEulMh6rWJUFpD6aY8WxtVW0rprbBLQmdKbToV2P6KWEbFW6hbOvW/5Uqp5x8Bnnt4SnVftQv7Lx9fyf3nukiABEiABEiABEiABEiABNaOAIXU2rHmM5FAUxD4B7y3J7CZUqZSys+VyrfvuVypvFxy8qlaplRaFZWffc/mSFVWTWkRpdv2YiEVS6n49rCKgn0Dk+9kvtQyjq6+we/2/OBxedd0Cdf60ml+KWWFlb+MkVJ6Nr2TLwGCQrpFVTKikl8uJuh8Zgr45benFNQujLyPMmoZY86HkgAJkAAJkAAJkAAJkMB6E6CQWu8R4POTQAMSGMV7ewCM6vY9P+Tcxpz7IskLN09m3Etb9PJVUbaiKpsdZZapEFF6Gdeu50RULSml14nhspD3v/exd7KVbxHH07k3P9Tb1qY+PFNSsYiy1VAVUkooKBXfLxQipaDMfb6UUjaY/uSLgLYuuxWuKsr8HG/YciqlHn9gSs2+RBm1iDHmoiRAAiRAAiRAAiRAAiTQqAQopBp1ZLhdJLDOBLSUCiCMlMqHnOvbNVv0vNDztHLKCiaTM+W1+aUiSq8vbteL2/T8qij9OFsRVVtK6d9DiLFIynve84ubRtYZX0M//c4//uHNx0vqtuk5dZXfimdF1CKlVNzapyultIyK2jbFMionoJYrpZ77yRRe/BllVEMfWdw4EiABEiABEiABEiABEqifAIVU/ay4JAlsOALfxXt7FGRcKZUkSSWZUvmA8oykSsRTNj8qrZqqnGXP/a6afKpXSsWtfJNK4p722Y7hgcndUxtu4Krs8K2f/OmZ//xwuX+6jNtmStGZRj7paicjlNKqqMVJKUAJmzOFrWcj6jxZV6sZeWj+5auiliqlFKYQiF34+Ha26fFgJgESIAESIAESIAESIIEWIUAh1SIDyd0ggdUi8F3cajKlYCqlbMueq5iq2b6XCTD3hZT3s18pFS+vhVQmKyp3e5FSys7QBzGsAvn1Wx/5ww1XNaWU6vzd9z3SNz0X3nh8JrrZteNlJJQWSJnQcn07DjM3wsoGmltpZeWV+Tlu2zOVUVvOhOrcbmWUad1cUSlFGbVaL26ulwRIgARIgARIgARIgATWkQCF1DrC51OTQLMQ+B5u7VHAAQHR47fvmda9Ku17FdlR1Wbe0/dVyZTKCqnKNr0lSSkrtiZDIUZCIe/f+/Dulq60ec/gRO/PJ6Zvmg1V3/RcdGa2EirbkmcrpeqRUrm8qFhQYfMZUB3bEgm1wlJqHLNiF/ZvZ5Vbs5wsuJ0kQAIkQAIkQAIkQAIkUCcBCqk6QXExEtjoBA5hTzFEeRRAj/SqpPTPWkr57XuVQiobhG5n0oszo7zWvoqMqBrZUcuQUq4CazISYgQRHtz7yO6WqJx6/dse7lNS3djeHlx7IpFQNhMqrGjPi6WUDiZP2vWclPIqpFw1VFIplZVS2HQ6VMdWkw3mV0atkJQax5ykjNroJx7uPwmQAAmQAAmQAAmQQMsSoJBq2aHljpHAyhPQUipCeEBC9Nl48rR9z1ZKadGkZ9mrMpNeXCWVl1VGTsGFllcJLl89KZW0B4YCI0LIB5UMxj40fkNTVE/9ft9PessSvaESV0OKXtNOZ1hpaaQFkULkiaRqUkrLqLAeKRVnTblWPqO5uk6F6tgSj1383F673jKl1DBKci8ro1b+Ncw1kgAJkAAJkAAJkAAJkECjEKCQapSR4HaQQBMRGMdtByTQ72dJuXwpW/2kpZT9bmbW8zKl8qHmripqvaVUdlY/ORZCPQiI8RBifHD8usn1HJ7rrz/UowJ0R5BXRxA9SqI3I5+0hDJVSp6UMrdt7lOSCZVIKhdkbr9bKVWtbc+roHIB6HqgO08G2jbFQi8WYMk2pBlSS5RS+/HpU/auJ28+NwmQAAmQAAmQAAmQAAmQwOoToJBafcZ8BhJoSQI/xp5+aXOlkpBz175npVNWRDlR5d+f5kXZMPNGklJm25LKLbN9YxHkpArUrxTEuJKBzjWavPufdq2IrHr7m7/XEwSiGEJ2h0B3JHCFgihGUvQaWWSqzuLvyW2vImpBKRXPqqf0OrSiWoKUkhLoOgUqaDNj5bYnqcparpRSGMBfnjrcki8Y7hQJkAAJkAAJkAAJkAAJkECGAIUUDwgSIIElE/gp9vRIyFEJFKvNvpdWSqUtfK5CqlZ4eSNLqTS7qlqLIcaVkFOuSik0Z1eJSKqpCKKo5U2StaRznaTUFUzdEELLpxoVTtUk1EpJqXQGPbvNymZN1aiUQqEdMOHlbiZEWxm1QlJqClG0C/tPb4p2ySW/YPhAEiABEiABEiABEiABEiCBhACFFA8GEiCBZRGYwJ7iHIJROwOfTpISJltK/8u377nKqYXCy5tXSmlBU611Lq1wclKqtoTKt92ttpTygsrjzCnb5pe266FtM9DWldu3tDprmVJqDKqwm3lRy3oZ8sEkQAIkQAIkQAIkQAIk0HQEKKSabsi4wSTQmAQexZ8OCYg9Nujciqk06FxLlcCEnefb9FqvUqqJpFQsntL2vbitL86eMhVubZuhgiAXXu6k2bKl1H7sP415UY35kuZWkQAJkAAJkAAJkAAJkMCqEqCQWlW8XDkJbCwCE/hQH2yulGnhk2b3/Rn3fCG18Ix6rJSKhU+cZ1WZIbUC7XtVpRRMThSCTjtrnz97X0V74ZKk1BSkGgj3nzGysV4h3FsSIAESIAESIAESIAESIAFHgEKKxwIJkMCKEpjA7d2BkVLoTePOtTiJg8szVVKUUjY4vVaG1Gq179mWPNOWF8+e52bkM6HzhY44Kyo3g57ezqrbW7+UCoUcKwVtbNFb0VcdV0YCJEACJEACJEACJEACzUeAQqr5xoxbTAJNQeA3uGOPgBhyJxk7UxyllMuYcrPmrV+mVF5KCSgZ2K/5ZvFbspQyge/7pu89c39THMDcSBIgARIgARIgARIgARIggVUlQCG1qni5chLY2AR+g4/0SOAAgB5NglIqWw3VKFJKSzFlZv2rFqCeVj8ttX0vghgLlBiY+uxZkxv7FcG9JwESIAESIAESIAESIAEScAQopHgskAAJrDqBJ/GRQQHcBqBIKdVoUsqTUEJXTa2olJoKpdw3dd/ZrIpa9VcZn4AESIAESIAESIAESIAEmosAhVRzjRe3lgSalsDTuL1bQRwARC+l1AaQUsBYEBQGnmFVVNO+ZrnhJEACJEACJEACJEACJLCaBCikVpMu100CJFBB4Cnc0QeIIQV0M1MqDTNf//a9FauUmgTE3qe+eD5n0OPrnwRIgARIgARIgARIgARIoCYBCikeHCRAAmtOYAKDxXbM7QFwWyRk0coYXTXkf9kA9MqvOBjdzPbmvuZf1i2XPkdu+WRdletRcRB7re1I7vfWUbkv2dkEXbC5Xa5lpNSUEuIeGUX7J4d3TK35QcUnJAESIAESIAESIAESIAESaCoCFFJNNVzcWBJoLQK6jS+SwZ2REv2UUgJRMrudk1RZYZUXWNnb1bKf9MyGYv5Z83TYfEaMLalSaljPoDc5vIOh5a31EuXekAAJkAAJkAAJkAAJkMCqEaCQWjW0XDEJkEC9BPRsfErIoUiIXlZKxRIpqZxqXCkVQowhEHsfHd4xXu9YczkSIAESIAESIAESIAESIAES0AQopHgckAAJNAyBJwp/3qtCcWckRS/b92ylkm3vazgpNRYK7PvZly8aa5iDhxtCAiRAAiRAAiRAAiRAAiTQVAQopJpquLixJLAxCEwU/rwXStyphPTEFDOl/LypdWrfGxOB2DdOEbUxXojcSxIgARIgARIgARIgARJYRQIUUqsIl6smARJYHoGJwmBvpNS7lbQZU25WPgad27yptZJSkRDDYSDuGf/KxWzNW94hzUeTAAmQAAmQAAmQAAmQAAnEBCikeCiQAAk0PIGJzsHucojblNBiys7KRym16lJqKpRyWEh1zz999TKGlTf8q4QbSAIkQAIkQAIkQAIkQALNRYBCqrnGi1tLAhuawAQGi6U22RdJcVskRA+l1CpIKYlxpXBPEJVGxkZ2Tm3oA447TwIkQAIkQAIkQAIkQAIksGoEKKRWDS1XTAIksJoEftr2Fz0iULpqqi8SwquasllTygSBu6/586fccukMf7nlk3VVrkeJ+tZtg8lt22HlTILZdkQbZF7Zkmf2a3WCzqcgMFyGvH9s5HK25a3mgct1kwAJkAAJkAAJkAAJkAAJGAIUUjwQSIAEmp7Ajzd9vA/AuyMrp5KsKUopf3Y+K7OsrDPftYQaKUN+/R/+/rdHmv4g4A6QAAmQAAmQAAmQAAmQAAk0FQEKqaYaLm4sCZDAfAQOFQeLKHX0RULeqITQM/QVKaUyUmpKCTUSBfLrf//3Oymh+HIiARIgARIgARIgARIgARJYNwIUUuuGnk9MAiSw2gS+v/UTWk5drWAqp7rrmamv9dr3xCSEGgmlePDvvvkaSqjVPui4fhIgARIgARIgARIgARIggboIUEjVhYkLkQAJNDuB/1kc6gaiXl09FcFWT9UKRW9yKTUZQo0pKR+MgnDsq996PWfIa/aDl9tPAiRAAiRAAiRAAiRAAi1IgEKqBQeVu0QCJLAwgVEtqIKgFwJXKIie0Lb4JflTTSSlxpSQ4wrRgyHE+PAYBdTCo88lSIAESIAESIAESIAESIAE1psAhdR6jwCfnwRIoGEI/MNp9/YgQE8I2a0grg5tFVVPY8y+h/EQclJI/CgSajwKg8m//h9v5Ix4DXP0cENIgARIgARIgARIgARIgAQWQ4BCajG0uCwJkMCGJHDwzPu6USh0R0J2RwLdESSUEFdHQppZ6yJAtwLan70vVeW+KlVYU5GpcBIIhZhSWjhBIpRiXMlgamYG4/vHd01tSPDcaRIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABV2Fu6AAAARVJREFUEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYkQCHVmOPCrSIBEiABEiABEiABEiABEiABEiABEiCBliVAIdWyQ8sdIwESIAESIAESIAESIAESIAESIAESIIHGJEAh1Zjjwq0iARIgARIgARIgARIgARIgARIgARIggZYlQCHVskPLHSMBEiABEiABEiABEiABEiABEiABEiCBxiRAIdWY48KtIgESIAESIAESIAESIAESIAESIAESIIGWJUAh1bJDyx0jARIgARIgARIgARIgARIgARIgARIggcYk8P8DmGlaY9Z1Zz8AAAAASUVORK5CYII="/>
</defs>
</svg>
<svg viewBox="0 0 404 112" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M112 56c0 30.928-25.121 56-56.11 56C26.59 112 2.534 89.586 0 61h73.925V50H.098c3-28.107 26.834-50 55.792-50C86.879 0 112 25.072 112 56Zm212.983-22.244c-.492-4.27-2.487-7.586-5.985-9.945-3.498-2.36-7.788-3.54-12.87-3.54-3.717 0-6.969.618-9.756 1.854-2.76 1.236-4.918 2.936-6.476 5.099-1.53 2.163-2.295 4.621-2.295 7.374 0 2.304.532 4.285 1.598 5.942a14.364 14.364 0 0 0 4.181 4.088 29.617 29.617 0 0 0 5.328 2.655 64.816 64.816 0 0 0 5.124 1.643l8.526 2.36c2.186.59 4.618 1.405 7.296 2.444 2.705 1.04 5.288 2.458 7.747 4.256 2.487 1.77 4.536 4.046 6.149 6.827 1.612 2.781 2.418 6.195 2.418 10.24 0 4.664-1.189 8.878-3.566 12.642-2.35 3.765-5.793 6.757-10.329 8.976-4.509 2.22-9.988 3.329-16.437 3.329-6.012 0-11.218-.997-15.617-2.992-4.372-1.995-7.815-4.776-10.33-8.344-2.486-3.568-3.893-7.711-4.221-12.431h10.493c.273 3.259 1.339 5.956 3.197 8.091 1.886 2.107 4.263 3.68 7.132 4.72 2.897 1.01 6.012 1.517 9.346 1.517 3.88 0 7.364-.646 10.452-1.939 3.088-1.32 5.534-3.146 7.337-5.478 1.804-2.36 2.705-5.113 2.705-8.26 0-2.865-.778-5.197-2.336-6.995-1.557-1.798-3.607-3.259-6.148-4.382-2.542-1.124-5.288-2.107-8.239-2.95l-10.329-3.034c-6.559-1.939-11.751-4.706-15.577-8.302-3.825-3.596-5.738-8.302-5.738-14.117 0-4.832 1.271-9.046 3.812-12.642 2.569-3.624 6.012-6.433 10.329-8.428C296.249 12.011 301.1 11 306.456 11c5.41 0 10.22.997 14.428 2.992 4.208 1.966 7.542 4.663 10.001 8.09 2.487 3.428 3.799 7.32 3.935 11.674h-9.837ZM126 12.18v86.303h30.332c6.613 0 11.983-1.011 16.109-3.034 4.126-2.023 7.146-4.762 9.059-8.218 1.912-3.455 2.869-7.346 2.869-11.672 0-4.551-.875-8.4-2.623-11.547-1.749-3.146-3.922-5.562-6.518-7.248-2.596-1.685-5.178-2.612-7.747-2.781v-.843a22.47 22.47 0 0 0 6.682-3.118c2.076-1.405 3.743-3.315 5-5.731 1.285-2.416 1.927-5.478 1.927-9.187 0-4.214-.929-8.049-2.788-11.504-1.858-3.484-4.686-6.25-8.484-8.302-3.799-2.079-8.622-3.118-14.47-3.118H126Zm30.332 77.032h-20.167V59.208h20.659c3.662 0 6.832.759 9.509 2.276 2.678 1.489 4.742 3.483 6.19 5.984 1.448 2.472 2.172 5.169 2.172 8.09 0 3.793-1.407 7.024-4.222 9.693-2.787 2.64-7.501 3.961-14.141 3.961Zm-1.311-39.106h-18.856V21.451h19.183c5.575 0 9.647 1.334 12.215 4.003 2.569 2.641 3.853 5.857 3.853 9.65 0 3.034-.738 5.675-2.213 7.923-1.449 2.247-3.416 3.989-5.903 5.225-2.459 1.236-5.219 1.854-8.279 1.854Zm38.837 48.377h10.657l8.44-24.441h33.947l8.44 24.44h10.657L235.175 12.18h-10.493l-30.824 86.303Zm49.843-33.712-13.445-38.938h-.655l-13.445 38.938h27.545Zm108.98-52.591v86.303H404v-9.27h-41.153v-29.33h37.874v-9.271h-37.874V21.45h40.497v-9.27h-50.663Z" fill="#2151F5"/>
</svg>
<svg viewBox="0 0 57 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.018 9.929a.73.73 0 0 1 0 .142c-.002.02-.006.04-.009.059a.1.1 0 0 0-.002.01v.008l-.005.016a.66.66 0 0 1-.08.234c-.009.016-.022.029-.032.044l-5.194 9.076a.705.705 0 0 1-.312.39.689.689 0 0 1-.329.091c-.015.002-.03 0-.045 0s-.03.002-.045 0a.687.687 0 0 1-.64-.481L.13 10.442c-.01-.015-.024-.028-.033-.044a.643.643 0 0 1-.08-.235l-.004-.016-.001-.006c0-.004 0-.008-.002-.011l-.008-.059a.717.717 0 0 1 0-.142L.01 9.87l.002-.01.001-.007.004-.015a.652.652 0 0 1 .08-.236c.01-.016.022-.029.033-.044L5.325.482c.054-.16.158-.3.312-.39A.687.687 0 0 1 5.965 0c.015-.002.03 0 .045 0s.03-.002.046 0c.112.003.224.03.328.09.154.09.258.231.312.391l5.194 9.076c.01.015.023.028.033.044a.637.637 0 0 1 .08.235l.004.016v.006l.002.011c.003.02.007.04.008.059ZM6.01 17.795l3.412-5.962-3.031 1.726c-.016.01-.033.015-.05.023a.77.77 0 0 1-.58.042.698.698 0 0 1-.212-.11L2.6 11.832l3.411 5.962Zm0-15.59L2.598 8.167 5.63 6.441c.016-.01.033-.015.049-.022.028-.014.052-.034.082-.043l.008-.003c.02-.006.042-.006.063-.01a.813.813 0 0 1 .137-.023h.02a.73.73 0 0 1 .483.147l.444.253 2.506 1.427L6.01 2.205Zm0 5.632L4.152 8.895 2.212 10l3.798 2.163.756-.43L9.808 10 6.01 7.837Z" fill="#4AD7A7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56.45 13.897a.373.373 0 0 1-.169-.042 2.405 2.405 0 0 1-.215-.127 2.587 2.587 0 0 0-.434-.228 1.307 1.307 0 0 0-.481-.08c-.424 0-.752.143-.986.43-.233.287-.35.685-.35 1.196 0 .511.115.905.346 1.182.23.278.557.416.98.416.187 0 .352-.028.496-.084.153-.061.3-.136.439-.224.068-.044.136-.081.205-.112a.452.452 0 0 1 .187-.047.26.26 0 0 1 .215.107.42.42 0 0 1 .084.267.426.426 0 0 1-.07.238.832.832 0 0 1-.238.22 2.31 2.31 0 0 1-.654.29 2.89 2.89 0 0 1-.757.102c-.442 0-.83-.096-1.163-.29a1.977 1.977 0 0 1-.775-.822c-.184-.355-.276-.766-.276-1.234 0-.473.095-.89.285-1.252a2.06 2.06 0 0 1 .799-.84c.342-.2.734-.3 1.177-.3.236 0 .474.035.714.103.226.063.441.157.64.28.2.137.3.296.3.477a.42.42 0 0 1-.085.266.261.261 0 0 1-.215.108Zm-.337-5.856a.486.486 0 0 1-.336-.117.421.421 0 0 1-.131-.332v-2.42c0-.38-.069-.656-.206-.827-.136-.171-.351-.257-.644-.257-.342 0-.613.117-.813.35-.199.234-.298.553-.298.958v2.196a.422.422 0 0 1-.131.332.5.5 0 0 1-.346.117.487.487 0 0 1-.337-.117.422.422 0 0 1-.13-.332v-2.42c0-.38-.069-.656-.206-.827-.137-.171-.351-.257-.644-.257-.343 0-.615.117-.818.35-.202.234-.303.553-.303.958v2.196a.422.422 0 0 1-.13.332.487.487 0 0 1-.337.117.503.503 0 0 1-.341-.117.414.414 0 0 1-.136-.332V3.79a.41.41 0 0 1 .14-.327.496.496 0 0 1 .337-.122c.13 0 .238.04.322.117a.417.417 0 0 1 .126.322v.346c.137-.261.327-.46.57-.598a1.68 1.68 0 0 1 .84-.205c.35 0 .637.071.865.215.227.143.397.364.51.663a1.55 1.55 0 0 1 .606-.64 1.76 1.76 0 0 1 .916-.238c1.021 0 1.532.613 1.532 1.84v2.43a.422.422 0 0 1-.131.332.5.5 0 0 1-.346.117Zm-6.427 3.576a.6.6 0 0 1-.43.15.602.602 0 0 1-.43-.15.515.515 0 0 1-.158-.393.5.5 0 0 1 .159-.388.613.613 0 0 1 .43-.145c.174 0 .316.049.424.145a.49.49 0 0 1 .164.388.515.515 0 0 1-.159.393ZM48.033 8.04a.439.439 0 0 1-.318-.117.415.415 0 0 1-.121-.313v-.355a1.466 1.466 0 0 1-.593.598 1.74 1.74 0 0 1-.846.206c-1.108 0-1.663-.611-1.663-1.832v-2.43c0-.143.043-.255.127-.336a.483.483 0 0 1 .35-.122.47.47 0 0 1 .34.122.445.445 0 0 1 .127.336v2.42c0 .368.075.64.224.814.15.174.38.261.692.261.367 0 .661-.118.882-.355.221-.237.332-.551.332-.944V3.798a.44.44 0 0 1 .13-.331.476.476 0 0 1 .346-.127.47.47 0 0 1 .341.122.446.446 0 0 1 .126.336v3.803a.414.414 0 0 1-.13.318.49.49 0 0 1-.346.122Zm-2.775 5.005c.206.137.309.296.309.477 0 .1-.03.184-.09.252a.268.268 0 0 1-.21.103.41.41 0 0 1-.167-.037 2.193 2.193 0 0 1-.224-.122 3.13 3.13 0 0 0-.472-.233 1.531 1.531 0 0 0-.547-.085c-.262 0-.472.057-.63.169a.531.531 0 0 0-.239.457c0 .175.074.31.22.407.146.097.422.189.827.276.417.087.744.186.98.299.237.112.407.25.51.416.102.165.154.375.154.63 0 .405-.17.73-.51.977-.339.246-.792.369-1.358.369-.636 0-1.156-.13-1.56-.392a.71.71 0 0 1-.239-.215.463.463 0 0 1-.07-.253c0-.1.028-.183.084-.252a.264.264 0 0 1 .215-.103c.081 0 .209.05.383.15.187.1.369.18.547.243.177.062.4.093.667.093.3 0 .533-.053.701-.159a.502.502 0 0 0 .252-.449.436.436 0 0 0-.098-.298c-.065-.075-.179-.142-.34-.201a5.827 5.827 0 0 0-.72-.192c-.548-.118-.942-.279-1.182-.481-.24-.202-.36-.478-.36-.827 0-.268.078-.51.234-.724.156-.215.37-.382.644-.5a2.33 2.33 0 0 1 .935-.178c.246 0 .491.033.729.098.223.06.434.156.625.285Zm-2.12-7.173h-2.886c.062.965.526 1.448 1.391 1.448.23 0 .43-.03.598-.093.183-.07.36-.15.533-.243.05-.03.101-.056.154-.08a.507.507 0 0 1 .21-.06c.087 0 .159.034.215.103a.4.4 0 0 1 .084.261c0 .181-.112.333-.336.458a2.947 2.947 0 0 1-.715.29 2.96 2.96 0 0 1-.743.103c-.722 0-1.292-.21-1.71-.631-.416-.42-.625-.996-.625-1.724 0-.468.092-.882.276-1.243.183-.362.442-.642.775-.841a2.17 2.17 0 0 1 1.135-.3c.61 0 1.093.197 1.448.59.355.392.532.921.532 1.588 0 .25-.112.374-.336.374Zm-.799-1.519c-.196-.227-.471-.34-.826-.34-.362 0-.651.114-.87.345-.217.23-.348.554-.392.972h2.41c-.018-.424-.126-.75-.322-.977ZM37.253 17.4c-.635 0-1.156-.13-1.56-.392a.713.713 0 0 1-.238-.215.466.466 0 0 1-.07-.253c0-.1.028-.183.084-.252a.264.264 0 0 1 .215-.103c.08 0 .208.05.383.15.186.1.368.18.546.243.178.062.4.093.668.093.299 0 .532-.053.7-.159a.502.502 0 0 0 .253-.449.438.438 0 0 0-.098-.298c-.066-.075-.18-.142-.341-.201a5.82 5.82 0 0 0-.72-.192c-.548-.118-.942-.279-1.181-.481-.24-.202-.36-.478-.36-.827 0-.268.078-.51.234-.724.155-.215.37-.382.644-.5.274-.119.585-.178.934-.178.247 0 .492.033.729.098.223.06.435.156.626.285.205.137.308.296.308.477 0 .1-.03.184-.089.252a.27.27 0 0 1-.21.103.41.41 0 0 1-.168-.037 2.193 2.193 0 0 1-.224-.122 3.13 3.13 0 0 0-.472-.233 1.531 1.531 0 0 0-.546-.085c-.262 0-.472.057-.63.169a.531.531 0 0 0-.24.457c0 .175.074.31.22.407.147.097.422.189.827.276.417.087.744.186.98.299.237.112.407.25.51.416.103.165.154.375.154.63 0 .405-.17.73-.509.977-.34.246-.793.369-1.36.369Zm1.373-13.248-.28.029c-.392.037-.684.174-.874.41a1.33 1.33 0 0 0-.285.86v2.14c0 .15-.043.262-.13.337a.5.5 0 0 1-.337.112.516.516 0 0 1-.34-.112c-.09-.075-.136-.187-.136-.337V3.79c0-.143.045-.254.136-.332a.503.503 0 0 1 .34-.117c.125 0 .23.04.313.117a.418.418 0 0 1 .127.322v.45a1.37 1.37 0 0 1 .541-.627c.237-.143.505-.227.804-.252l.13-.01c.3-.018.449.11.449.383 0 .138-.035.24-.103.309-.069.068-.187.109-.355.121Zm-3.755 1.72h-2.887c.063.965.527 1.448 1.392 1.448.23 0 .43-.03.598-.093.183-.07.36-.15.533-.243.05-.03.1-.056.154-.08a.507.507 0 0 1 .21-.06c.087 0 .159.034.215.103a.4.4 0 0 1 .084.261c0 .181-.112.333-.337.458a2.945 2.945 0 0 1-.714.29 2.96 2.96 0 0 1-.743.103c-.722 0-1.292-.21-1.71-.631-.416-.42-.625-.996-.625-1.724 0-.468.092-.882.275-1.243.184-.362.442-.642.776-.841a2.17 2.17 0 0 1 1.135-.3c.61 0 1.093.197 1.448.59.355.392.532.921.532 1.588 0 .25-.112.374-.336.374Zm-.799-1.519c-.196-.227-.472-.34-.827-.34-.36 0-.65.114-.868.345-.218.23-.349.554-.393.972h2.41c-.018-.424-.126-.75-.322-.977Zm-2.195 8.767c.296.305.444.77.444 1.393v2.42a.44.44 0 0 1-.122.332.466.466 0 0 1-.336.116.442.442 0 0 1-.327-.121.442.442 0 0 1-.122-.327v-.346a1.318 1.318 0 0 1-.527.603c-.234.14-.506.21-.818.21a1.85 1.85 0 0 1-.822-.182 1.41 1.41 0 0 1-.584-.51 1.32 1.32 0 0 1-.21-.729c0-.33.086-.59.257-.78.171-.19.454-.325.85-.406.396-.081.939-.122 1.63-.122h.215v-.27c0-.35-.072-.602-.215-.758-.143-.155-.373-.233-.691-.233-.218 0-.424.028-.616.084a4.633 4.633 0 0 0-.636.243c-.168.093-.286.14-.355.14a.289.289 0 0 1-.229-.103.385.385 0 0 1-.088-.261.4.4 0 0 1 .08-.248.838.838 0 0 1 .256-.21c.218-.118.473-.214.766-.285a3.58 3.58 0 0 1 .85-.108c.604 0 1.054.153 1.35.458Zm-.64 2.084c-.486 0-.86.022-1.121.066-.262.043-.448.116-.56.219-.113.103-.169.25-.169.444 0 .224.081.408.243.551a.882.882 0 0 0 .607.215 1.1 1.1 0 0 0 .841-.35c.218-.234.327-.534.327-.902v-.243h-.168Zm-1.7-7.164a.472.472 0 0 1-.34-.122.433.433 0 0 1-.127-.327v-2.42c0-.374-.076-.648-.229-.822-.153-.175-.39-.262-.714-.262-.38 0-.686.118-.916.355-.23.237-.345.555-.345.953v2.196a.433.433 0 0 1-.127.327.472.472 0 0 1-.34.122.488.488 0 0 1-.346-.122.425.425 0 0 1-.131-.327V1.808c0-.137.045-.246.136-.327a.503.503 0 0 1 .35-.122.47.47 0 0 1 .331.117.406.406 0 0 1 .127.313v2.336c.147-.254.364-.461.625-.598.262-.137.56-.205.897-.205 1.084 0 1.626.613 1.626 1.84v2.43a.426.426 0 0 1-.131.327.49.49 0 0 1-.346.122Zm-5.497-.972c.121.137.306.215.556.234l.261.018c.137.013.235.049.294.108.06.06.09.141.09.247 0 .125-.05.22-.146.285-.096.066-.238.092-.425.08l-.252-.019c-.504-.037-.881-.191-1.13-.463-.25-.27-.374-.67-.374-1.2V4.163h-.56c-.275 0-.412-.122-.412-.365 0-.112.036-.2.108-.266a.434.434 0 0 1 .304-.098h.56V2.47c0-.143.042-.255.126-.336a.471.471 0 0 1 .341-.122.49.49 0 0 1 .346.122c.087.08.13.193.13.336v.963h.925c.131 0 .232.033.304.098a.343.343 0 0 1 .107.266c0 .119-.036.209-.107.271a.45.45 0 0 1-.304.094h-.924v2.261c0 .293.06.508.182.645Zm-2.742-1.196h-2.887c.063.965.527 1.448 1.392 1.448.23 0 .43-.03.598-.093.183-.07.36-.15.533-.243.05-.03.101-.056.154-.08a.507.507 0 0 1 .21-.06c.087 0 .159.034.215.103a.4.4 0 0 1 .084.261c0 .181-.112.333-.336.458a2.958 2.958 0 0 1-.715.29 2.96 2.96 0 0 1-.743.103c-.722 0-1.292-.21-1.71-.631-.416-.42-.625-.996-.625-1.724 0-.468.092-.882.276-1.243.183-.362.442-.642.775-.841.333-.2.711-.3 1.135-.3.61 0 1.093.197 1.448.59.355.392.532.921.532 1.588 0 .25-.112.374-.336.374Zm-.799-1.519c-.196-.227-.471-.34-.826-.34-.362 0-.651.114-.87.345-.217.23-.348.554-.392.972h2.41c-.018-.424-.126-.75-.322-.977Zm-1.947 8.608a2.296 2.296 0 0 1 1.177-.299c.236 0 .474.035.714.103.226.063.441.157.64.28.2.137.299.296.299.477a.42.42 0 0 1-.084.266.261.261 0 0 1-.215.108.373.373 0 0 1-.168-.042 2.405 2.405 0 0 1-.215-.127 2.587 2.587 0 0 0-.434-.228 1.307 1.307 0 0 0-.481-.08c-.424 0-.752.143-.986.43-.233.287-.35.685-.35 1.196 0 .511.115.905.345 1.182.23.278.558.416.981.416.187 0 .352-.028.495-.084.153-.061.3-.136.44-.224.068-.044.136-.081.205-.112a.452.452 0 0 1 .187-.047.26.26 0 0 1 .215.107.42.42 0 0 1 .084.267.426.426 0 0 1-.07.238.832.832 0 0 1-.238.22 2.31 2.31 0 0 1-.654.29 2.846 2.846 0 0 1-.757.102c-.442 0-.83-.096-1.163-.29a1.977 1.977 0 0 1-.775-.822c-.184-.355-.276-.766-.276-1.234 0-.473.095-.89.285-1.252a2.06 2.06 0 0 1 .799-.84Zm6.22-2.261c.138 0 .25.039.337.117.087.077.13.191.13.34v5.776c0 .15-.043.261-.13.336a.498.498 0 0 1-.336.112.518.518 0 0 1-.341-.112c-.09-.075-.136-.187-.136-.336v-5.775c0-.15.045-.264.136-.341a.503.503 0 0 1 .34-.117Zm24.484 1.98c.138 0 .25.04.337.118.087.078.13.191.13.34v3.795c0 .15-.043.261-.13.336a.498.498 0 0 1-.337.112.518.518 0 0 1-.34-.112c-.09-.075-.136-.187-.136-.336V13.14c0-.15.045-.263.135-.341a.505.505 0 0 1 .341-.117Z" fill="#333"/>
</svg>
<svg viewBox="0 0 71 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6 7.467 0 10.4 6 0v7.467Z" fill="#828083"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="m6 7.188-6 2.945 6 3.477V7.188Z" fill="#353336"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="m6 15.046-6-3.854L6 20v-4.954Z" fill="#848285"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="m6 7.467 6 2.933L6 0v7.467Z" fill="#2F2D30"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="m6 7.188 6 2.942-6 3.476V7.189Z" fill="#121212"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="m6 15.046 6-3.854L6 20v-4.954Z" fill="#302E31"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.783 8.886a2.945 2.945 0 0 0 .008 3.904 2.578 2.578 0 0 0 4.056-.333.222.222 0 0 0-.192-.334.233.233 0 0 0-.193.11 2.16 2.16 0 0 1-1.847.93 1.933 1.933 0 0 1-1.445-.614 2.37 2.37 0 0 1-.675-1.467h4.48a.206.206 0 0 0 .24-.225 2.858 2.858 0 0 0-.744-1.962 2.455 2.455 0 0 0-3.688-.009Zm.387.251a1.995 1.995 0 0 1 2.89 0 2.4 2.4 0 0 1 .675 1.477h-4.24a2.4 2.4 0 0 1 .675-1.477Zm7.467-2.697a.224.224 0 1 0-.448 0v1.742h-1.152a.233.233 0 1 0 0 .467h1.152v4.673a.224.224 0 1 0 .448 0V8.65h1.2a.233.233 0 0 0 0-.467h-1.2V6.44Zm3.776 2.782V3.926a.224.224 0 1 0-.448 0v9.36a.224.224 0 1 0 .448 0v-2.328a2.613 2.613 0 0 1 .4-1.675 1.68 1.68 0 0 1 1.481-.749 1.409 1.409 0 0 1 1.195.606c.284.376.43.838.414 1.308v2.839a.224.224 0 0 0 .448 0v-2.849a2.511 2.511 0 0 0-.544-1.632 1.837 1.837 0 0 0-1.52-.733 2.031 2.031 0 0 0-1.872 1.152l-.002-.003Zm6.72-.333a2.944 2.944 0 0 0 .008 3.904 2.578 2.578 0 0 0 4.056-.333.221.221 0 0 0-.303-.303.234.234 0 0 0-.083.08 2.16 2.16 0 0 1-1.847.93 1.934 1.934 0 0 1-1.445-.615 2.365 2.365 0 0 1-.674-1.467h4.479a.204.204 0 0 0 .177-.053.206.206 0 0 0 .064-.172 2.858 2.858 0 0 0-.744-1.963 2.456 2.456 0 0 0-3.688-.01v.002Zm.386.251a1.996 1.996 0 0 1 2.891 0 2.4 2.4 0 0 1 .675 1.477h-4.24c.046-.557.285-1.08.677-1.48l-.003.003Zm7.406-.592a2.69 2.69 0 0 0-.784.837V8.4a.224.224 0 1 0-.448 0v4.867a.224.224 0 0 0 .448 0v-2.133a2.765 2.765 0 0 1 .466-1.643 1.967 1.967 0 0 1 1.44-.862.22.22 0 0 0 .208-.239.199.199 0 0 0-.149-.205.2.2 0 0 0-.09-.002c-.392.009-.77.135-1.089.363l-.002.002Zm3.44.34a2.944 2.944 0 0 0 .008 3.905 2.578 2.578 0 0 0 4.056-.333.221.221 0 0 0-.303-.303.235.235 0 0 0-.083.08 2.159 2.159 0 0 1-1.847.93 1.934 1.934 0 0 1-1.445-.615 2.365 2.365 0 0 1-.674-1.467h4.479a.204.204 0 0 0 .177-.053.206.206 0 0 0 .064-.172 2.858 2.858 0 0 0-.744-1.963 2.456 2.456 0 0 0-3.686-.01l-.002.002Zm.386.252a1.996 1.996 0 0 1 2.891 0 2.4 2.4 0 0 1 .675 1.477h-4.24c.046-.557.285-1.08.677-1.48l-.003.003Zm10.03-.733v1.824c0 1.973-.62 2.96-1.857 2.96a1.43 1.43 0 0 1-1.215-.608 2.105 2.105 0 0 1-.4-1.312V8.404a.223.223 0 0 0-.31-.207.225.225 0 0 0-.138.207v2.872a2.52 2.52 0 0 0 .544 1.637 1.83 1.83 0 0 0 1.52.738 1.988 1.988 0 0 0 1.856-1.267v.928a.224.224 0 1 0 .448 0V8.407a.224.224 0 0 0-.448 0Zm6.863 1.088A1.867 1.867 0 0 0 64.74 8.07a2.035 2.035 0 0 0-1.872 1.133V8.4a.224.224 0 1 0-.448 0v4.887a.224.224 0 0 0 .448 0V11.02a3.047 3.047 0 0 1 .4-1.786 1.685 1.685 0 0 1 1.472-.702 1.431 1.431 0 0 1 1.2.59c.285.375.432.837.416 1.308v2.857a.224.224 0 0 0 .448 0v-2.2a3.346 3.346 0 0 1 .416-1.707 1.6 1.6 0 0 1 1.44-.845 1.404 1.404 0 0 1 1.2.59c.285.375.432.837.416 1.308v2.854a.224.224 0 0 0 .448 0V10.42a2.56 2.56 0 0 0-.56-1.656 1.83 1.83 0 0 0-1.504-.696 2.095 2.095 0 0 0-2.016 1.424v.003Z" fill="#1B1635"/>
</svg>
<svg viewBox="0 0 85 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#gnosis_svg__a)">
<path d="M2.634 9.03c0-.485.159-.925.434-1.274l2.916 2.915a2.067 2.067 0 0 1-1.274.434A2.07 2.07 0 0 1 2.634 9.03Zm8.673 2.069a2.07 2.07 0 0 0 2.077-2.076c0-.478-.16-.918-.435-1.274l-2.916 2.915c.35.275.79.435 1.274.435Zm2.254-3.95a2.94 2.94 0 0 1-4.14 4.139l-1.415 1.414-1.415-1.414a2.94 2.94 0 0 1-4.14-4.139l-.663-.66-.63-.631A7.997 7.997 0 0 0 8 18c4.416 0 8-3.582 8-7.997a7.805 7.805 0 0 0-1.146-4.145L13.56 7.149ZM8 11.48 1.653 5.134a9.34 9.34 0 0 1 .564-.655A7.986 7.986 0 0 1 8.006 2c2.278 0 4.336.955 5.788 2.48.202.202.393.428.552.649L8 11.479Zm-4.913-6.4 4.918 4.917 4.918-4.917a6.856 6.856 0 0 0-4.918-2.039A6.868 6.868 0 0 0 3.087 5.08Zm14.685 4.926v.018c0 4.405 3.574 7.975 7.982 7.975h3.373V15.93h-3.32a5.917 5.917 0 0 1-5.917-6.044c.069-3.233 2.79-5.784 6.026-5.784h3.21V2.053h-3.395c-4.395 0-7.959 3.561-7.959 7.953ZM60.19 2.053h8.57V18h-8.57V2.053Zm1.517 4.804a2.769 2.769 0 1 0 5.537 0 2.769 2.769 0 0 0-5.537 0Zm-20.953.542a1.5 1.5 0 0 1-.467 1.116 1.53 1.53 0 0 1-1.106.456h-4.742c-.441 0-.814-.151-1.117-.456a1.515 1.515 0 0 1-.456-1.116V2.053h-2.052V18h2.052v-5.451c0-.44.152-.813.456-1.116a1.52 1.52 0 0 1 1.117-.456h4.742c.425 0 .794.152 1.106.456a1.5 1.5 0 0 1 .467 1.116V18h2.03V2.053h-2.03V7.4Zm37.132-5.346h-7.44V18h2.052V9.475a5.375 5.375 0 0 1 5.377-5.373 5.375 5.375 0 0 1 5.377 5.373v8.524h2.034V9.45a7.397 7.397 0 0 0-7.4-7.396Zm-25.207.848L59.444 18h-15.9l6.834-15.098c.27-.6.654-.901 1.15-.901.496 0 .88.3 1.15.901Zm-1.15 6.942a2.769 2.769 0 1 0 0 5.537 2.769 2.769 0 0 0 0-5.537Z" fill="#133629"/>
</g>
<defs>
<clipPath id="gnosis_svg__a">
<path fill="#fff" d="M0 0h85v20H0z"/>
</clipPath>
</defs>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 20">
<path data-name="-e-logo_top" d="M13.82 10.054h-6.9v2.731h3.191l-.011 3.432a1.456 1.456 0 0 1-.43.319 4 4 0 0 1-.655.267 5.306 5.306 0 0 1-.795.182 5.647 5.647 0 0 1-.861.065 3.012 3.012 0 0 1-2.715-1.424 7.745 7.745 0 0 1-.9-4.063v-2.6a9.439 9.439 0 0 1 .265-2.36 5.76 5.76 0 0 1 .715-1.71 3.229 3.229 0 0 1 1.059-1.047 2.57 2.57 0 0 1 1.324-.357 2.922 2.922 0 0 1 2.191.735 3.762 3.762 0 0 1 .894 2.191h3.628a8.468 8.468 0 0 0-.616-2.458A5.315 5.315 0 0 0 11.9 2.1 5.626 5.626 0 0 0 9.854.936a9.017 9.017 0 0 0-2.84-.4 6.711 6.711 0 0 0-2.774.572 6.354 6.354 0 0 0-2.225 1.664A7.926 7.926 0 0 0 .532 5.431 10.952 10.952 0 0 0 0 8.988v2.575a11.473 11.473 0 0 0 .51 3.556 7.5 7.5 0 0 0 1.45 2.646 6.25 6.25 0 0 0 2.264 1.651 7.406 7.406 0 0 0 2.966.572 11.15 11.15 0 0 0 2.278-.221 10.5 10.5 0 0 0 1.913-.579 7.641 7.641 0 0 0 1.477-.8 5.159 5.159 0 0 0 .98-.871zm2.661 2.783a8.686 8.686 0 0 0 .451 2.854 6.513 6.513 0 0 0 1.317 2.269 5.984 5.984 0 0 0 2.132 1.5 7.277 7.277 0 0 0 2.88.54 7.194 7.194 0 0 0 2.86-.54 5.934 5.934 0 0 0 2.119-1.5 6.6 6.6 0 0 0 1.311-2.269 8.713 8.713 0 0 0 .45-2.854v-.274a8.673 8.673 0 0 0-.45-2.841 6.532 6.532 0 0 0-1.318-2.269 6.078 6.078 0 0 0-2.125-1.508 7.813 7.813 0 0 0-5.74 0 6.082 6.082 0 0 0-2.119 1.508 6.515 6.515 0 0 0-1.317 2.269 8.647 8.647 0 0 0-.451 2.841v.273zm3.681-.273a7.394 7.394 0 0 1 .173-1.625 4.223 4.223 0 0 1 .542-1.352 2.633 2.633 0 0 1 2.357-1.261 2.777 2.777 0 0 1 1.417.338 2.693 2.693 0 0 1 .947.923 4.31 4.31 0 0 1 .536 1.352 7.394 7.394 0 0 1 .173 1.625v.273a7.606 7.606 0 0 1-.173 1.658 4.227 4.227 0 0 1-.536 1.352 2.621 2.621 0 0 1-2.337 1.255 2.818 2.818 0 0 1-1.424-.338 2.758 2.758 0 0 1-.96-.917 4.143 4.143 0 0 1-.542-1.352 7.606 7.606 0 0 1-.173-1.658v-.274zm-1.747-10.3a1.492 1.492 0 0 0 .37.514 1.761 1.761 0 0 0 .57.338 2.207 2.207 0 0 0 1.456 0 1.761 1.761 0 0 0 .57-.338 1.492 1.492 0 0 0 .37-.514 1.593 1.593 0 0 0 0-1.274 1.562 1.562 0 0 0-.37-.52 1.7 1.7 0 0 0-.57-.344 2.206 2.206 0 0 0-1.456 0 1.7 1.7 0 0 0-.57.345 1.562 1.562 0 0 0-.37.52 1.593 1.593 0 0 0 0 1.274zm6.356.013a1.558 1.558 0 0 0 .37.52 1.7 1.7 0 0 0 .57.345 2.207 2.207 0 0 0 1.456 0 1.7 1.7 0 0 0 .57-.345 1.558 1.558 0 0 0 .37-.52 1.593 1.593 0 0 0 .133-.65 1.562 1.562 0 0 0-.133-.637 1.492 1.492 0 0 0-.37-.514 1.762 1.762 0 0 0-.57-.338 2.206 2.206 0 0 0-1.456 0 1.762 1.762 0 0 0-.57.338 1.492 1.492 0 0 0-.37.514 1.546 1.546 0 0 0-.133.637 1.576 1.576 0 0 0 .133.651z" fill="currentColor" fill-rule="evenodd"/>
</svg>
<svg viewBox="0 0 111 20" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path fill="url(#lukso_svg__a)" d="M0 2h88.889v16H0z"/>
<defs>
<pattern id="lukso_svg__a" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#lukso_svg__b" transform="scale(.00333 .01852)"/>
</pattern>
<image id="lukso_svg__b" width="300" height="54" xlink:href="data:image/png;base64,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"/>
</defs>
</svg>
<svg viewBox="0 0 67 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#poa_svg__a)">
<path opacity=".8" fill-rule="evenodd" clip-rule="evenodd" d="M10.316 15.436h-.938v2.658h-.003l.003.015c0 .492-.42.89-.939.89H.937C.42 19 0 18.602 0 18.11l.003-.015H0V1.932h.003L0 1.917c0-.492.42-.891.937-.891h9.379c4.143 0 7.5 3.226 7.5 7.205 0 3.98-3.357 7.205-7.5 7.205ZM29.07 1.026c5.18 0 9.377 4.024 9.377 8.988 0 4.963-4.198 8.986-9.377 8.986-5.178 0-9.377-4.023-9.377-8.986 0-4.964 4.198-8.988 9.377-8.988ZM60.016 18.43c0 .307-.26.556-.58.556H38.161c-.025.003-.047.014-.073.014a.569.569 0 0 1-.578-.562c0-.123.048-.23.116-.322l-.009-.018L48.178 1.444h.023A.566.566 0 0 1 48.758 1c.28 0 .502.192.557.444h.024L60.016 18.21l-.037.048a.51.51 0 0 1 .037.173Z" fill="#5C34A2"/>
</g>
<defs>
<clipPath id="poa_svg__a">
<path fill="#fff" d="M0 0h66.667v20H0z"/>
</clipPath>
</defs>
</svg>
<svg viewBox="0 0 43 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M42.493 14.318h-2.018l-2.002-3.523-1.066.117v3.406h-1.788V2.498h1.788v6.828l1.018-.1L40.36 5.97h2.002l-2.363 3.907 2.494 4.441ZM31.378 9.351c.913.161 1.562.415 1.944.76.383.345.575.957.575 1.836 0 .88-.277 1.525-.829 1.937-.552.412-1.359.617-2.42.617-.667 0-1.509-.094-2.526-.284l-.509-.083.066-1.519c1.313.178 2.258.267 2.838.267.58 0 .992-.072 1.239-.217.245-.144.368-.384.368-.718 0-.333-.117-.564-.352-.692-.235-.129-.798-.268-1.69-.418-.892-.15-1.544-.386-1.96-.71-.416-.322-.623-.912-.623-1.77 0-.856.287-1.496.86-1.92.575-.423 1.31-.634 2.207-.634.7 0 1.558.09 2.576.268l.508.1-.032 1.519c-1.291-.178-2.226-.268-2.806-.268-.58 0-.982.07-1.206.21-.224.139-.336.359-.336.659 0 .3.123.512.37.634.245.123.825.264 1.738.426Zm-7.587-.86v5.827h-1.788V5.97h1.771v1.002c.93-.612 1.86-1.008 2.79-1.186v1.82c-.942.19-1.745.434-2.412.735l-.361.15ZM18 13.959c0 1.111-.885 2.013-1.977 2.013a1.95 1.95 0 0 1-1.374-.569l-3.716 2.179c.026.131.044.265.044.404C10.977 19.099 10.092 20 9 20s-1.977-.901-1.977-2.014c0-.142.019-.277.046-.41l-3.717-2.174a1.95 1.95 0 0 1-1.374.57C.885 15.972 0 15.07 0 13.959a2.002 2.002 0 0 1 1.438-1.929V7.97A2.002 2.002 0 0 1 0 6.042C0 4.93.885 4.027 1.978 4.027a1.95 1.95 0 0 1 1.471.68L7.11 2.55a2.05 2.05 0 0 1-.079-.534C7.031.901 7.913 0 9 0c1.088 0 1.969.902 1.969 2.015 0 .158-.022.31-.055.456l3.69 2.171a1.953 1.953 0 0 1 1.419-.614c1.092 0 1.977.902 1.977 2.014a2.002 2.002 0 0 1-1.438 1.928v4.06A2.002 2.002 0 0 1 18 13.959Zm-3.89.483a2.028 2.028 0 0 1-.064-.483c0-.138.014-.272.039-.402l-3.372-1.972c-.342.605-.806 1.141-1.166 1.51v2.965c.339.1.638.292.876.544l3.687-2.162ZM9 9.937c.302 0 .547.245.547.548v1.261c.38-.432.816-1.063.816-1.677C10.364 8.986 9 7.848 9 7.848s-1.363 1.14-1.363 2.222c0 .614.437 1.245.816 1.677v-1.261c0-.303.245-.547.547-.547Zm0 8.952c.49 0 .887-.404.887-.903A.895.895 0 0 0 9 17.084a.895.895 0 0 0-.886.902c0 .498.397.903.886.903Zm-1.421-2.288c.239-.254.54-.44.874-.541v-2.965c-.348-.357-.795-.87-1.135-1.451l-3.395 1.991c.017.106.032.213.032.324 0 .168-.026.329-.065.485L7.579 16.6Zm-6.488-2.642c0 .498.397.902.887.902a.894.894 0 0 0 .886-.902.894.894 0 0 0-.886-.903.894.894 0 0 0-.887.903Zm.887-8.82a.894.894 0 0 0-.887.902c0 .5.397.903.887.903a.894.894 0 0 0 .886-.902.894.894 0 0 0-.886-.903Zm1.374 2.346a1.96 1.96 0 0 1-.82.48v4.072c.36.11.68.314.923.595l3.436-2.014a2.37 2.37 0 0 1-.073-.549 2.3 2.3 0 0 1 .067-.518L3.352 7.485ZM7.68 3.502 3.923 5.718c.017.106.032.214.032.325 0 .168-.026.329-.065.485l3.413 1.996c.342-.593.796-1.114 1.15-1.478V3.942a1.976 1.976 0 0 1-.773-.44ZM9 .973a.895.895 0 0 0-.886.903c0 .498.397.903.886.903.49 0 .887-.405.887-.903A.895.895 0 0 0 9 .972Zm5.09 4.65-3.703-2.177c-.23.235-.52.402-.84.498v3.102c.355.364.81.886 1.151 1.48l3.412-2a2.032 2.032 0 0 1-.064-.484c0-.144.016-.283.043-.419Zm.559 1.864-3.532 2.071c.038.17.065.342.065.512 0 .161-.024.322-.059.483l3.466 2.027c.24-.256.543-.443.88-.543V7.965a1.972 1.972 0 0 1-.82-.479Zm2.26-1.444a.894.894 0 0 0-.886-.903.875.875 0 0 0-.682.332l-.147.26a.894.894 0 0 0 .829 1.213c.49 0 .886-.404.886-.903Zm-.886 7.014a.894.894 0 0 0-.886.903c0 .498.396.902.886.902s.886-.404.886-.902a.894.894 0 0 0-.886-.903Z" fill="#27AA8B"/>
</svg>
<svg viewBox="0 0 53 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.522 14.154c-.392 0-.793-.033-1.204-.098a7.78 7.78 0 0 1-1.162-.252 4.695 4.695 0 0 1-.98-.42.974.974 0 0 1-.434-.434 1.084 1.084 0 0 1-.098-.56c.028-.187.098-.35.21-.49a.77.77 0 0 1 .448-.28c.187-.047.392-.014.616.098.383.215.798.373 1.246.476.457.103.91.154 1.358.154.681 0 1.167-.103 1.456-.308.29-.215.434-.48.434-.798a.771.771 0 0 0-.308-.644c-.205-.159-.565-.294-1.078-.406l-1.582-.336c-.896-.187-1.563-.504-2.002-.952-.43-.457-.644-1.055-.644-1.792 0-.467.098-.891.294-1.274.196-.383.471-.714.826-.994s.775-.495 1.26-.644a5.6 5.6 0 0 1 1.624-.224c.523 0 1.036.065 1.54.196.504.121.947.303 1.33.546a.845.845 0 0 1 .378.434.9.9 0 0 1 .07.518.77.77 0 0 1-.21.448.76.76 0 0 1-.434.252c-.177.037-.392-.005-.644-.126a3.955 3.955 0 0 0-.98-.35 5.02 5.02 0 0 0-1.064-.112c-.392 0-.728.051-1.008.154-.27.103-.48.247-.63.434-.14.187-.21.401-.21.644 0 .27.098.49.294.658.196.168.537.303 1.022.406l1.582.336c.915.196 1.596.513 2.044.952.448.43.672.999.672 1.708 0 .467-.093.891-.28 1.274a2.763 2.763 0 0 1-.812.966c-.355.27-.78.48-1.274.63-.495.14-1.05.21-1.666.21Zm6.323-.028c-.346 0-.612-.093-.798-.28-.178-.187-.266-.453-.266-.798V5.082c0-.355.088-.62.266-.798.186-.187.452-.28.798-.28.336 0 .592.093.77.28.186.177.28.443.28.798v3.332h-.196c.214-.457.532-.807.952-1.05.43-.252.914-.378 1.456-.378.55 0 1.003.107 1.358.322.354.205.62.523.798.952.177.42.266.957.266 1.61v3.178c0 .345-.094.611-.28.798-.178.187-.439.28-.784.28-.336 0-.598-.093-.784-.28-.178-.187-.266-.453-.266-.798v-3.08c0-.476-.089-.817-.266-1.022-.168-.215-.43-.322-.784-.322-.448 0-.808.14-1.078.42-.262.28-.392.653-.392 1.12v2.884c0 .719-.35 1.078-1.05 1.078Zm8.326-.014c-.345 0-.611-.098-.798-.294-.177-.205-.266-.49-.266-.854V8.176c0-.373.089-.658.266-.854.187-.205.453-.308.798-.308.336 0 .593.103.77.308.187.196.28.48.28.854v4.788c0 .364-.089.649-.266.854-.177.196-.439.294-.784.294Zm0-8.246c-.392 0-.695-.089-.91-.266-.205-.187-.308-.448-.308-.784 0-.345.103-.607.308-.784.215-.187.518-.28.91-.28s.69.093.896.28c.205.177.308.439.308.784 0 .336-.103.597-.308.784-.205.177-.504.266-.896.266Zm6.924 8.288c-.55 0-1.04-.135-1.47-.406a2.01 2.01 0 0 1-.84-1.106l.154-.462v.868c0 .345-.089.611-.266.798-.177.187-.434.28-.77.28s-.597-.093-.784-.28c-.177-.187-.266-.453-.266-.798V5.082c0-.355.089-.62.266-.798.187-.187.453-.28.798-.28.336 0 .593.093.77.28.187.177.28.443.28.798V8.4h-.168c.15-.42.434-.76.854-1.022.42-.261.9-.392 1.442-.392.607 0 1.134.145 1.582.434.448.29.798.7 1.05 1.232s.378 1.167.378 1.904c0 .737-.126 1.377-.378 1.918-.252.541-.607.957-1.064 1.246-.448.29-.97.434-1.568.434Zm-.63-1.582c.299 0 .56-.075.784-.224.233-.15.41-.369.532-.658.13-.299.196-.677.196-1.134 0-.681-.14-1.18-.42-1.498-.28-.327-.644-.49-1.092-.49-.299 0-.565.07-.798.21-.224.14-.401.36-.532.658-.13.29-.196.663-.196 1.12 0 .681.14 1.19.42 1.526.28.327.649.49 1.106.49Zm7.467 1.582c-.579 0-1.06-.107-1.442-.322a1.972 1.972 0 0 1-.854-.966c-.177-.439-.266-.98-.266-1.624V8.078c0-.355.089-.62.266-.798.187-.177.448-.266.784-.266s.597.089.784.266c.187.177.28.443.28.798v3.22c0 .41.084.719.252.924.168.196.434.294.798.294.401 0 .728-.14.98-.42.261-.29.392-.667.392-1.134V8.078c0-.355.089-.62.266-.798.187-.177.448-.266.784-.266.345 0 .607.089.784.266.187.177.28.443.28.798v4.97c0 .719-.34 1.078-1.022 1.078-.336 0-.593-.093-.77-.28-.177-.187-.266-.453-.266-.798v-.938l.21.546c-.205.476-.5.845-.882 1.106-.383.261-.835.392-1.358.392Zm7.6 2.492a.915.915 0 0 1-.602-.196.775.775 0 0 1-.28-.518c-.028-.205.01-.425.112-.658l.938-2.072v.868l-2.478-5.684a1.357 1.357 0 0 1-.098-.672.756.756 0 0 1 .308-.504c.177-.13.42-.196.728-.196.252 0 .452.06.602.182.158.112.303.331.434.658l1.652 4.2H41.4l1.708-4.214c.13-.317.275-.532.434-.644.168-.121.392-.182.672-.182.242 0 .434.065.574.196a.73.73 0 0 1 .266.49c.037.205 0 .43-.112.672l-3.29 7.462c-.14.317-.299.532-.476.644-.168.112-.383.168-.644.168Zm7.776-2.492c-.504 0-.957-.098-1.358-.294a2.321 2.321 0 0 1-.938-.798 1.998 1.998 0 0 1-.336-1.134c0-.504.13-.9.392-1.19.261-.299.686-.509 1.274-.63.588-.13 1.367-.196 2.338-.196h.742v1.092h-.728c-.476 0-.864.028-1.162.084-.29.047-.5.13-.63.252-.121.121-.182.29-.182.504a.85.85 0 0 0 .266.644c.187.168.453.252.798.252.27 0 .508-.06.714-.182.215-.13.383-.303.504-.518.121-.224.182-.476.182-.756v-1.61c0-.41-.093-.7-.28-.868-.187-.177-.504-.266-.952-.266a3.91 3.91 0 0 0-.826.098 5.52 5.52 0 0 0-.966.294c-.205.093-.387.117-.546.07a.69.69 0 0 1-.364-.28.856.856 0 0 1-.126-.448c0-.168.046-.327.14-.476.093-.159.247-.275.462-.35a6.01 6.01 0 0 1 2.31-.462c.718 0 1.306.107 1.764.322a2.12 2.12 0 0 1 1.05.966c.233.43.35.985.35 1.666v3.108c0 .345-.084.611-.252.798-.168.187-.41.28-.728.28-.317 0-.565-.093-.742-.28-.168-.187-.252-.453-.252-.798v-.518l.098.084a1.799 1.799 0 0 1-1.05 1.358 2.41 2.41 0 0 1-.966.182Z" fill="#000"/>
</svg>
<svg viewBox="0 0 74 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.44 4.331c-1.658.473-4.105 1.461-6.347 3.487-2.253 2.12-.723 4.01-.708 4.03 0 0-.825-1.523 1.172-3.4.025-.021 2.574-2.223 6.28-3.278.473-.135.95-.247 1.42-.334l.033-.006.597-.967-.146.01c-.01.001-.941.071-2.301.458Z" fill="#5928B1"/>
<path d="M14.991 1.62c-.382-.32-.763-.575-.767-.578l-.023-.015-.027.004c-.01 0-1.04.127-2.457.531-2.535.722-5.945 2.204-7.792 5.157-.877 1.34-.17 2.946-.17 2.946l-.022-.409c-.002-.043-.123-4.37 8.746-6.897.777-.221 1.61-.425 2.48-.607l.151-.031-.119-.1Z" fill="#764BC4"/>
<path d="M15.527 2.186c-.011.001-1.178.125-2.804.588-1.72.49-4.225 1.441-6.389 3.185-1.275.99-2.083 2.186-2.215 3.28-.065.534.561 1.667.561 1.667l-.132-.403c-.006-.018-.565-1.851 2.268-3.978 1.587-1.192 3.241-2.008 5.205-2.567 1.013-.288 1.983-.478 3.055-.678l.038-.007.016-.035c.081-.174.468-.935.472-.942l.062-.124-.137.014Z" fill="#764BC4"/>
<path d="M3.13 7.751c.107-1.717 1.407-3.304 3.869-4.718a16.835 16.835 0 0 1 4.31-1.891 15.596 15.596 0 0 1 2.444-.49l-.9-.652c-.009.001-.839.103-2.025.441C3.22 2.608 2.278 6.342 2.36 7.843c.148 2.617 3.23 4.479 3.23 4.479s-2.62-2.012-2.46-4.57Z" fill="#BBA5E1"/>
<path d="M3.224 15.67c1.659-.473 4.106-1.462 6.347-3.487 2.253-2.12.724-4.01.708-4.03 0 0 .825 1.523-1.171 3.399-.026.022-2.574 2.223-6.281 3.279-.473.135-.95.247-1.42.333l-.033.006-.597.967.147-.01c.009 0 .94-.07 2.3-.458Z" fill="#5928B1"/>
<path d="M.673 18.38c.382.32.763.575.767.578l.023.015.027-.004c.01 0 1.04-.128 2.457-.531 2.535-.723 5.945-2.204 7.792-5.157.877-1.341.171-2.946.171-2.946l.021.408c.003.044.124 4.371-8.746 6.898-.777.221-1.61.425-2.48.606l-.151.032.12.1Z" fill="#764BC4"/>
<path d="M.137 17.814c.011-.002 1.178-.126 2.804-.589 1.72-.49 4.226-1.44 6.389-3.184 1.276-.991 2.083-2.187 2.215-3.28.065-.534-.56-1.667-.56-1.667l.13.402c.007.019.566 1.852-2.267 3.979-1.587 1.191-3.241 2.007-5.205 2.567-1.012.288-1.983.477-3.055.678l-.038.007-.016.035c-.081.174-.467.934-.471.942L0 17.828l.137-.014Z" fill="#764BC4"/>
<path d="M12.534 12.25c-.107 1.717-1.407 3.304-3.869 4.717a16.84 16.84 0 0 1-4.309 1.892 15.76 15.76 0 0 1-2.445.49l.9.651a14.67 14.67 0 0 0 2.026-.44c7.607-2.168 8.55-5.902 8.466-7.403-.147-2.617-3.23-4.478-3.23-4.478s2.62 2.011 2.461 4.57Z" fill="#BBA5E1"/>
<path d="M28.754 12.002c0 .316-.04.602-.122.858a2.562 2.562 0 0 1-.32.67 2.11 2.11 0 0 1-.468.494 2.74 2.74 0 0 1-.552.336 2.79 2.79 0 0 1-1.138.253h-6.238v-1.608h6.238c.311 0 .553-.092.724-.275.172-.181.258-.424.258-.729 0-.147-.023-.284-.07-.409a.864.864 0 0 0-.507-.53 1.074 1.074 0 0 0-.405-.074h-3.72c-.26 0-.542-.047-.844-.14a2.574 2.574 0 0 1-.844-.45 2.475 2.475 0 0 1-.647-.81c-.172-.334-.258-.743-.258-1.225 0-.482.086-.89.258-1.223.173-.332.389-.602.647-.81.26-.208.542-.358.844-.452.302-.093.584-.14.844-.14h5.506v1.608h-5.506c-.306 0-.545.094-.717.28-.173.185-.26.43-.26.737 0 .31.087.554.26.734.172.178.41.267.717.267h3.733a2.786 2.786 0 0 1 1.133.275c.193.09.377.204.552.343.173.137.327.302.462.496.136.195.243.418.32.668.08.252.12.537.12.855Zm2.972-6.264v3.626h5.678V5.738h1.616v8.875h-1.616v-3.625h-5.678v3.625H30.11V5.738h1.616Zm10.815 0v8.875h-1.618V5.738h1.618ZM53.33 9.451v1.45a3.84 3.84 0 0 1-.284 1.491 3.536 3.536 0 0 1-.78 1.173 3.591 3.591 0 0 1-1.18.77 3.923 3.923 0 0 1-1.487.278h-4.365a.805.805 0 0 1-.584-.232.776.776 0 0 1-.17-.257.838.838 0 0 1-.06-.322V6.55a.817.817 0 0 1 .23-.576.786.786 0 0 1 .584-.235H49.6c.535 0 1.03.094 1.486.28.457.185.85.441 1.181.769a3.5 3.5 0 0 1 .78 1.177c.19.456.284.952.284 1.487Zm-1.616 1.45V9.45c0-.313-.051-.6-.154-.858a1.85 1.85 0 0 0-.432-.666 1.91 1.91 0 0 0-.669-.427 2.32 2.32 0 0 0-.86-.154h-3.563v5.659h3.563c.315 0 .602-.051.86-.153.26-.1.483-.243.669-.428.187-.183.332-.403.432-.66a2.32 2.32 0 0 0 .154-.864Zm10.534-1.537v1.624h-5.105V9.364h5.105Zm.727 3.64v1.609h-5.832c-.225 0-.47-.04-.735-.119a2.119 2.119 0 0 1-.735-.385 2.178 2.178 0 0 1-.568-.7c-.15-.287-.225-.638-.225-1.054V6.55a.815.815 0 0 1 .233-.576.792.792 0 0 1 .581-.235h7.281v1.608h-6.48v5.01c0 .209.056.369.168.48.113.113.278.169.493.169h5.82Zm10.473-7.266v8.188a.82.82 0 0 1-.064.323.842.842 0 0 1-.175.256.816.816 0 0 1-.575.232.89.89 0 0 1-.303-.055.711.711 0 0 1-.27-.18l-5.907-6.139v6.25h-1.616V6.425c0-.166.046-.315.138-.449a.862.862 0 0 1 .358-.298.805.805 0 0 1 .889.18l5.91 6.13v-6.25h1.615Z" fill="#5928B1"/>
</svg>
<svg viewBox="0 0 101 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M90.748 14.993a.697.697 0 0 1-.488.18.718.718 0 0 1-.505-.18c-.132-.12-.197-.29-.197-.507v-10.9c0-.218.065-.387.197-.507.13-.12.3-.18.505-.18.193 0 .356.06.487.18s.197.29.197.506v10.901c0 .218-.066.386-.197.507Zm-5.142-.318c-.605.355-1.3.532-2.088.532-.787 0-1.48-.177-2.079-.532a3.54 3.54 0 0 1-1.386-1.52c-.325-.657-.487-1.421-.487-2.291 0-.87.162-1.633.487-2.292a3.545 3.545 0 0 1 1.386-1.519c.6-.355 1.292-.532 2.08-.532.786 0 1.482.177 2.087.532A3.52 3.52 0 0 1 87 8.573c.326.658.488 1.421.488 2.291 0 .87-.162 1.634-.488 2.292a3.521 3.521 0 0 1-1.394 1.519ZM85.4 8.504c-.444-.555-1.072-.833-1.882-.833-.81 0-1.437.278-1.882.833-.445.555-.667 1.342-.667 2.36 0 1.03.219 1.82.659 2.369.438.55 1.07.824 1.89.824.822 0 1.452-.272 1.891-.816.44-.543.659-1.335.659-2.377 0-1.018-.223-1.805-.668-2.36Zm-8.137 6.669c-.145 0-.296-.07-.453-.206l-4.385-3.863v3.382c0 .218-.064.386-.193.507a.676.676 0 0 1-.479.18.699.699 0 0 1-.495-.18c-.13-.12-.194-.29-.194-.507v-10.9c0-.218.065-.387.194-.507a.7.7 0 0 1 .495-.18c.19 0 .35.06.48.18.128.12.192.29.192.506v6.97l4.015-3.76a.62.62 0 0 1 .454-.206.59.59 0 0 1 .436.19.617.617 0 0 1 .185.446.69.69 0 0 1-.235.515l-3.309 3.021 3.628 3.227c.18.172.269.355.269.55 0 .171-.059.32-.176.446a.566.566 0 0 1-.429.189Zm-11.525-.498c-.607.355-1.305.532-2.094.532-.79 0-1.485-.177-2.086-.532a3.543 3.543 0 0 1-1.39-1.52c-.327-.657-.49-1.421-.49-2.291 0-.87.163-1.633.49-2.292a3.548 3.548 0 0 1 1.39-1.519c.6-.355 1.296-.532 2.086-.532.79 0 1.487.177 2.094.532a3.53 3.53 0 0 1 1.399 1.52c.326.658.489 1.421.489 2.291 0 .87-.163 1.634-.49 2.292a3.525 3.525 0 0 1-1.398 1.519Zm-.206-6.171c-.446-.555-1.076-.833-1.888-.833-.813 0-1.443.278-1.889.833-.446.555-.67 1.342-.67 2.36 0 1.03.221 1.82.662 2.369.44.55 1.072.824 1.897.824.824 0 1.456-.272 1.896-.816.44-.543.661-1.335.661-2.377 0-1.018-.223-1.805-.67-2.36ZM52.654 9.997c.283.12.689.238 1.22.352.783.172 1.39.36 1.823.567.432.206.74.457.925.755.184.298.276.675.276 1.133 0 .72-.305 1.302-.916 1.742-.61.44-1.417.661-2.42.661a5.917 5.917 0 0 1-1.513-.189 4.627 4.627 0 0 1-1.27-.532 1.695 1.695 0 0 1-.441-.386.73.73 0 0 1-.13-.438c0-.149.044-.271.13-.369a.43.43 0 0 1 .337-.146c.139 0 .34.086.605.257.346.206.689.37 1.029.49.34.12.763.18 1.27.18.623 0 1.107-.108 1.453-.326a1.05 1.05 0 0 0 .518-.944c0-.252-.063-.455-.19-.61-.127-.154-.346-.291-.657-.412-.311-.12-.767-.242-1.366-.368-1.014-.218-1.74-.51-2.178-.876-.438-.366-.657-.864-.657-1.493 0-.493.139-.927.415-1.305.277-.378.66-.675 1.15-.893.49-.217 1.046-.326 1.668-.326.45 0 .884.06 1.305.18.396.11.773.28 1.115.507.392.274.588.56.588.858a.547.547 0 0 1-.285.491.426.426 0 0 1-.182.04c-.138 0-.346-.096-.622-.29a5.527 5.527 0 0 0-.917-.481c-.288-.115-.645-.172-1.07-.172-.543 0-.978.12-1.306.36-.329.24-.493.561-.493.962 0 .252.06.455.181.609.122.154.323.292.605.412ZM40.737 19H20.842l-1.895-6.632h-18c-.93 0-.947-.947-.947-.947V2.895C0 1.083 1.895 1 1.895 1h35.052c1.109 0 1.895 2.842 1.895 2.842l3.79 13.263S42.654 19 40.737 19ZM9.015 3.838h-5.23l1.401 5.696h5.23l-1.4-5.696Zm8.53 0h-5.23l1.402 5.696h5.23l-1.402-5.696ZM29.97 16.153h2.238l-.601-1.884h-2.238l.601 1.884ZM36.23 3.84h-9.701l2.605 9.475h9.701L36.229 3.84Zm2.962 10.43h-2.237l.6 1.884h2.238l-.6-1.884ZM18.474 19H1.894C.056 19 0 17.105 0 17.105v-2.842h17.053L18.473 19Z" fill="#40BFB2"/>
</svg>
<svg viewBox="0 0 78 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.346 5.51 6.368.355A.234.234 0 0 1 6.572 0H9.21a.219.219 0 0 1 .204.12l1.658 2.896a.219.219 0 0 1 0 .233l-1.32 2.262a.234.234 0 0 1-.406 0ZM14.35.355l1.304 2.284a.22.22 0 0 0 .204.098h2.623a.234.234 0 0 0 .204-.354L17.366.121A.24.24 0 0 0 17.178 0H14.54a.234.234 0 0 0-.189.354Zm-3.015 8.602-1.32-2.262a.234.234 0 0 1 0-.241l3.31-5.752a.234.234 0 0 1 .407 0l1.32 2.262a.219.219 0 0 1 0 .233l-3.31 5.737a.233.233 0 0 1-.407.023Zm3.852.701h-2.639a.234.234 0 0 1-.21-.354l3.316-5.737a.219.219 0 0 1 .204-.12h2.638a.241.241 0 0 1 .204.361l-3.31 5.73a.24.24 0 0 1-.203.12Zm1.342 0h5.948a.234.234 0 0 0 .203-.354l-1.32-2.262a.226.226 0 0 0-.225-.143h-3.287a.226.226 0 0 0-.204.12L16.326 9.28a.234.234 0 0 0 .204.377Zm-.79 6.896a.226.226 0 0 0 .119.032h2.638a.233.233 0 0 0 .204-.355l-3.31-5.736a.24.24 0 0 0-.203-.121h-2.639a.234.234 0 0 0-.21.354l3.316 5.737c.02.037.05.068.085.089Zm-5.723-2.984 3.309 5.73a.234.234 0 0 0 .407 0l1.32-2.262a.219.219 0 0 0 0-.234l-3.31-5.737a.234.234 0 0 0-.407 0l-1.32 2.262a.234.234 0 0 0 0 .241Zm7.279 6.397a.242.242 0 0 1-.118.034H14.54a.234.234 0 0 1-.211-.355l1.319-2.261a.24.24 0 0 1 .21-.12h2.64a.233.233 0 0 1 .203.354l-1.32 2.261a.241.241 0 0 1-.085.087ZM9.21 20H6.572a.234.234 0 0 1-.204-.355l2.978-5.126a.234.234 0 0 1 .407 0l1.319 2.262a.219.219 0 0 1 0 .233L9.414 19.88a.219.219 0 0 1-.204.12Zm-3.438-.702 2.97-5.148a.234.234 0 0 0-.203-.355H5.901a.249.249 0 0 0-.204.113L4.04 16.78a.256.256 0 0 0 0 .234l1.319 2.262a.241.241 0 0 0 .414.022Zm15.364-6.196h-3.287a.241.241 0 0 1-.204-.114l-1.319-2.261a.233.233 0 0 1 .204-.354h5.925a.234.234 0 0 1 .204.354l-1.32 2.261a.242.242 0 0 1-.203.114Zm-11.926 0H2.591a.233.233 0 0 1-.203-.347l1.319-2.261a.226.226 0 0 1 .203-.121h6.62a.234.234 0 0 1 .21.354L9.414 12.99a.226.226 0 0 1-.204.113ZM3.707 9.536l-1.32-2.262a.234.234 0 0 1 .204-.354H9.21a.241.241 0 0 1 .211.12l1.32 2.262a.233.233 0 0 1-.212.354H3.91a.226.226 0 0 1-.203-.12Zm-3.679.58 1.35 2.285a.241.241 0 0 0 .384-.023l1.32-2.261a.256.256 0 0 0 0-.234l-1.32-2.261a.241.241 0 0 0-.415 0L.028 9.883a.256.256 0 0 0 0 .234Zm5.67-4.025L4.037 3.22a.256.256 0 0 1 0-.234L5.359.724a.241.241 0 0 1 .414 0l2.97 5.148a.234.234 0 0 1-.203.355H5.901a.249.249 0 0 1-.204-.136Zm28.253 7.915h-1.168a1.46 1.46 0 0 1-1.086-.407 1.448 1.448 0 0 1-.377-1.07V8.835h2.593v-2.05h-2.608v-2.48h-.49l-3.77 3.987v.573h1.72v4.018a3.354 3.354 0 0 0 .904 2.48 3.311 3.311 0 0 0 2.458.905h1.824v-2.262Zm12.74-7.221h2.54l-3.105 9.506h-2.058l-2.149-4.908-2.095 4.908h-2.066l-3.136-9.506h2.6l1.87 5.646 2.465-5.579h.754l2.54 5.594 1.84-5.661Zm13.373 0H58.15l-.294.92a4.523 4.523 0 0 0-3.105-1.161 5.08 5.08 0 0 0-2.548.648 4.62 4.62 0 0 0-1.78 1.794 5.097 5.097 0 0 0-.64 2.548 5.157 5.157 0 0 0 .656 2.593 4.59 4.59 0 0 0 1.779 1.802 5.013 5.013 0 0 0 2.548.656 4.523 4.523 0 0 0 3.083-1.16l.226.843h1.99V6.785Zm-5.612 7.324a2.579 2.579 0 0 1-1.33-.728v.008a2.533 2.533 0 0 1-.755-1.847 2.511 2.511 0 0 1 .754-1.855 2.48 2.48 0 0 1 1.847-.754 2.51 2.51 0 0 1 2.578 2.601 2.578 2.578 0 0 1-3.094 2.575Zm8.07 2.182V3.392h2.563v12.899h-2.563Zm14.662-9.507h-1.922l-.272.95a4.523 4.523 0 0 0-3.113-1.16 5.051 5.051 0 0 0-2.54.648 4.644 4.644 0 0 0-1.787 1.794 5.096 5.096 0 0 0-.641 2.548 5.157 5.157 0 0 0 .64 2.563 4.615 4.615 0 0 0 1.787 1.802 4.98 4.98 0 0 0 2.54.655 4.523 4.523 0 0 0 3.069-1.16l.226.844h2.013V6.784Zm-5.1 7.335a2.668 2.668 0 0 1-1.843-.738v.007a2.54 2.54 0 0 1-.754-1.87 2.52 2.52 0 0 1 .754-1.854 2.457 2.457 0 0 1 1.84-.754 2.488 2.488 0 0 1 1.846.754 2.525 2.525 0 0 1 .754 1.862 2.51 2.51 0 0 1-.754 1.855 2.668 2.668 0 0 1-1.843.738Z" fill="#7A13CE"/>
</svg>
...@@ -18,11 +18,13 @@ import type { BlocksResponse, BlockTransactionsResponse, Block, BlockFilters } f ...@@ -18,11 +18,13 @@ import type { BlocksResponse, BlockTransactionsResponse, Block, BlockFilters } f
import type { ChartMarketResponse, ChartTransactionResponse } from 'types/api/charts'; import type { ChartMarketResponse, ChartTransactionResponse } from 'types/api/charts';
import type { SmartContract, SmartContractReadMethod, SmartContractWriteMethod, SmartContractVerificationConfig } from 'types/api/contract'; import type { SmartContract, SmartContractReadMethod, SmartContractWriteMethod, SmartContractVerificationConfig } from 'types/api/contract';
import type { VerifiedContractsResponse, VerifiedContractsFilters, VerifiedContractsCounters } from 'types/api/contracts'; import type { VerifiedContractsResponse, VerifiedContractsFilters, VerifiedContractsCounters } from 'types/api/contracts';
import type { DepositsResponse, DepositsItem } from 'types/api/deposits';
import type { IndexingStatus } from 'types/api/indexingStatus'; import type { IndexingStatus } from 'types/api/indexingStatus';
import type { InternalTransactionsResponse } from 'types/api/internalTransaction'; import type { InternalTransactionsResponse } from 'types/api/internalTransaction';
import type { L2DepositsResponse, L2DepositsItem } from 'types/api/l2Deposits';
import type { L2OutputRootsResponse } from 'types/api/l2OutputRoots';
import type { L2TxnBatchesResponse } from 'types/api/l2TxnBatches';
import type { L2WithdrawalsResponse } from 'types/api/l2Withdrawals';
import type { LogsResponseTx, LogsResponseAddress } from 'types/api/log'; import type { LogsResponseTx, LogsResponseAddress } from 'types/api/log';
import type { OutputRootsResponse } from 'types/api/outputRoots';
import type { RawTracesResponse } from 'types/api/rawTrace'; import type { RawTracesResponse } from 'types/api/rawTrace';
import type { SearchRedirectResult, SearchResult, SearchResultFilters } from 'types/api/search'; import type { SearchRedirectResult, SearchResult, SearchResultFilters } from 'types/api/search';
import type { Counters, StatsCharts, StatsChart, HomeStats } from 'types/api/stats'; import type { Counters, StatsCharts, StatsChart, HomeStats } from 'types/api/stats';
...@@ -37,11 +39,9 @@ import type { ...@@ -37,11 +39,9 @@ import type {
import type { TokensResponse, TokensFilters, TokenInstanceTransferResponse } from 'types/api/tokens'; import type { TokensResponse, TokensFilters, TokenInstanceTransferResponse } from 'types/api/tokens';
import type { TokenTransferResponse, TokenTransferFilters } from 'types/api/tokenTransfer'; import type { TokenTransferResponse, TokenTransferFilters } from 'types/api/tokenTransfer';
import type { TransactionsResponseValidated, TransactionsResponsePending, Transaction } from 'types/api/transaction'; import type { TransactionsResponseValidated, TransactionsResponsePending, Transaction } from 'types/api/transaction';
import type { TxnBatchesResponse } from 'types/api/txnBatches';
import type { TTxsFilters } from 'types/api/txsFilters'; import type { TTxsFilters } from 'types/api/txsFilters';
import type { TxStateChanges } from 'types/api/txStateChanges'; import type { TxStateChanges } from 'types/api/txStateChanges';
import type { VisualizedContract } from 'types/api/visualization'; import type { VisualizedContract } from 'types/api/visualization';
import type { WithdrawalsResponse } from 'types/api/withdrawals';
import type { ArrayElement } from 'types/utils'; import type { ArrayElement } from 'types/utils';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
...@@ -375,43 +375,43 @@ export const RESOURCES = { ...@@ -375,43 +375,43 @@ export const RESOURCES = {
}, },
// L2 // L2
deposits: { l2_deposits: {
path: '/api/v2/optimism/deposits', path: '/api/v2/optimism/deposits',
paginationFields: [ 'nonce' as const, 'items_count' as const ], paginationFields: [ 'nonce' as const, 'items_count' as const ],
filterFields: [], filterFields: [],
}, },
deposits_count: { l2_deposits_count: {
path: '/api/v2/optimism/deposits/count', path: '/api/v2/optimism/deposits/count',
}, },
withdrawals: { l2_withdrawals: {
path: '/api/v2/optimism/withdrawals', path: '/api/v2/optimism/withdrawals',
paginationFields: [ 'nonce' as const, 'items_count' as const ], paginationFields: [ 'nonce' as const, 'items_count' as const ],
filterFields: [], filterFields: [],
}, },
withdrawals_count: { l2_withdrawals_count: {
path: '/api/v2/optimism/withdrawals/count', path: '/api/v2/optimism/withdrawals/count',
}, },
output_roots: { l2_output_roots: {
path: '/api/v2/optimism/output-roots', path: '/api/v2/optimism/output-roots',
paginationFields: [ 'index' as const, 'items_count' as const ], paginationFields: [ 'index' as const, 'items_count' as const ],
filterFields: [], filterFields: [],
}, },
output_roots_count: { l2_output_roots_count: {
path: '/api/v2/optimism/output-roots/count', path: '/api/v2/optimism/output-roots/count',
}, },
txn_batches: { l2_txn_batches: {
path: '/api/v2/optimism/txn-batches', path: '/api/v2/optimism/txn-batches',
paginationFields: [ 'block_number' as const, 'items_count' as const ], paginationFields: [ 'block_number' as const, 'items_count' as const ],
filterFields: [], filterFields: [],
}, },
txn_batches_count: { l2_txn_batches_count: {
path: '/api/v2/optimism/txn-batches/count', path: '/api/v2/optimism/txn-batches/count',
}, },
...@@ -474,7 +474,7 @@ export type PaginatedResources = 'blocks' | 'block_txs' | ...@@ -474,7 +474,7 @@ export type PaginatedResources = 'blocks' | 'block_txs' |
'token_transfers' | 'token_holders' | 'token_inventory' | 'tokens' | 'token_transfers' | 'token_holders' | 'token_inventory' | 'tokens' |
'token_instance_transfers' | 'token_instance_transfers' |
'verified_contracts' | 'verified_contracts' |
'output_roots' | 'withdrawals' | 'txn_batches' | 'deposits'; 'l2_output_roots' | 'l2_withdrawals' | 'l2_txn_batches' | 'l2_deposits';
export type PaginatedResponse<Q extends PaginatedResources> = ResourcePayload<Q>; export type PaginatedResponse<Q extends PaginatedResources> = ResourcePayload<Q>;
...@@ -492,7 +492,7 @@ Q extends 'homepage_chart_txs' ? ChartTransactionResponse : ...@@ -492,7 +492,7 @@ Q extends 'homepage_chart_txs' ? ChartTransactionResponse :
Q extends 'homepage_chart_market' ? ChartMarketResponse : Q extends 'homepage_chart_market' ? ChartMarketResponse :
Q extends 'homepage_blocks' ? Array<Block> : Q extends 'homepage_blocks' ? Array<Block> :
Q extends 'homepage_txs' ? Array<Transaction> : Q extends 'homepage_txs' ? Array<Transaction> :
Q extends 'homepage_deposits' ? Array<DepositsItem> : Q extends 'homepage_deposits' ? Array<L2DepositsItem> :
Q extends 'homepage_indexing_status' ? IndexingStatus : Q extends 'homepage_indexing_status' ? IndexingStatus :
Q extends 'stats_counters' ? Counters : Q extends 'stats_counters' ? Counters :
Q extends 'stats_lines' ? StatsCharts : Q extends 'stats_lines' ? StatsCharts :
...@@ -539,14 +539,14 @@ Q extends 'verified_contracts' ? VerifiedContractsResponse : ...@@ -539,14 +539,14 @@ Q extends 'verified_contracts' ? VerifiedContractsResponse :
Q extends 'verified_contracts_counters' ? VerifiedContractsCounters : Q extends 'verified_contracts_counters' ? VerifiedContractsCounters :
Q extends 'visualize_sol2uml' ? VisualizedContract : Q extends 'visualize_sol2uml' ? VisualizedContract :
Q extends 'contract_verification_config' ? SmartContractVerificationConfig : Q extends 'contract_verification_config' ? SmartContractVerificationConfig :
Q extends 'output_roots' ? OutputRootsResponse : Q extends 'l2_output_roots' ? L2OutputRootsResponse :
Q extends 'withdrawals' ? WithdrawalsResponse : Q extends 'l2_withdrawals' ? L2WithdrawalsResponse :
Q extends 'deposits' ? DepositsResponse : Q extends 'l2_deposits' ? L2DepositsResponse :
Q extends 'txn_batches' ? TxnBatchesResponse : Q extends 'l2_txn_batches' ? L2TxnBatchesResponse :
Q extends 'output_roots_count' ? number : Q extends 'l2_output_roots_count' ? number :
Q extends 'withdrawals_count' ? number : Q extends 'l2_withdrawals_count' ? number :
Q extends 'deposits_count' ? number : Q extends 'l2_deposits_count' ? number :
Q extends 'txn_batches_count' ? number : Q extends 'l2_txn_batches_count' ? number :
never; never;
/* eslint-enable @typescript-eslint/indent */ /* eslint-enable @typescript-eslint/indent */
......
...@@ -12,16 +12,7 @@ const MAIN_DOMAINS = [ ...@@ -12,16 +12,7 @@ const MAIN_DOMAINS = [
// eslint-disable-next-line no-restricted-properties // eslint-disable-next-line no-restricted-properties
const REPORT_URI = process.env.SENTRY_CSP_REPORT_URI; const REPORT_URI = process.env.SENTRY_CSP_REPORT_URI;
function getMarketplaceAppsHosts() {
return {
frames: appConfig.marketplaceAppList.map(({ url }) => new URL(url).host),
logos: appConfig.marketplaceAppList.map(({ logo }) => new URL(logo).host),
};
}
export function app(): CspDev.DirectiveDescriptor { export function app(): CspDev.DirectiveDescriptor {
const marketplaceAppsHosts = getMarketplaceAppsHosts();
return { return {
'default-src': [ 'default-src': [
// KEY_WORDS.NONE, // KEY_WORDS.NONE,
...@@ -111,7 +102,8 @@ export function app(): CspDev.DirectiveDescriptor { ...@@ -111,7 +102,8 @@ export function app(): CspDev.DirectiveDescriptor {
], ],
'frame-src': [ 'frame-src': [
...marketplaceAppsHosts.frames, // improve: allow only frames from marketplace config
'*',
], ],
...(REPORT_URI && !appConfig.isDev ? { ...(REPORT_URI && !appConfig.isDev ? {
......
...@@ -64,7 +64,7 @@ export function isInternalItem(item: NavItem): item is NavItemInternal { ...@@ -64,7 +64,7 @@ export function isInternalItem(item: NavItem): item is NavItemInternal {
} }
export default function useNavItems(): ReturnType { export default function useNavItems(): ReturnType {
const isMarketplaceFilled = appConfig.marketplaceAppList.length > 0 && appConfig.network.rpcUrl; const isMarketplaceAvailable = Boolean(appConfig.marketplaceConfigUrl && appConfig.network.rpcUrl);
const hasAPIDocs = appConfig.apiDoc.specUrl; const hasAPIDocs = appConfig.apiDoc.specUrl;
const router = useRouter(); const router = useRouter();
...@@ -103,16 +103,16 @@ export default function useNavItems(): ReturnType { ...@@ -103,16 +103,16 @@ export default function useNavItems(): ReturnType {
[ [
txs, txs,
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
{ text: `Deposits (L1${ rightLineArrow }L2)`, nextRoute: { pathname: '/deposits' as const }, icon: depositsIcon, isActive: pathname === '/deposits', isNewUi: true }, { text: `Deposits (L1${ rightLineArrow }L2)`, nextRoute: { pathname: '/l2-deposits' as const }, icon: depositsIcon, isActive: pathname === '/l2-deposits', isNewUi: true },
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
{ text: `Withdrawals (L2${ rightLineArrow }L1)`, nextRoute: { pathname: '/withdrawals' as const }, icon: withdrawalsIcon, isActive: pathname === '/withdrawals', isNewUi: true }, { text: `Withdrawals (L2${ rightLineArrow }L1)`, nextRoute: { pathname: '/l2-withdrawals' as const }, icon: withdrawalsIcon, isActive: pathname === '/l2-withdrawals', isNewUi: true },
], ],
[ [
blocks, blocks,
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
{ text: 'Txn batches', nextRoute: { pathname: '/txn-batches' as const }, icon: txnBatchIcon, isActive: pathname === '/txn-batches', isNewUi: true }, { text: 'Txn batches', nextRoute: { pathname: '/l2-txn-batches' as const }, icon: txnBatchIcon, isActive: pathname === '/l2-txn-batches', isNewUi: true },
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
{ text: 'Output roots', nextRoute: { pathname: '/output-roots' as const }, icon: outputRootsIcon, isActive: pathname === '/output-roots', isNewUi: true }, { text: 'Output roots', nextRoute: { pathname: '/l2-output-roots' as const }, icon: outputRootsIcon, isActive: pathname === '/l2-output-roots', isNewUi: true },
], ],
[ [
topAccounts, topAccounts,
...@@ -170,7 +170,7 @@ export default function useNavItems(): ReturnType { ...@@ -170,7 +170,7 @@ export default function useNavItems(): ReturnType {
isActive: pathname.startsWith('/token'), isActive: pathname.startsWith('/token'),
isNewUi: true, isNewUi: true,
}, },
isMarketplaceFilled ? { isMarketplaceAvailable ? {
text: 'Apps', text: 'Apps',
nextRoute: { pathname: '/apps' as const }, nextRoute: { pathname: '/apps' as const },
icon: appsIcon, icon: appsIcon,
...@@ -234,5 +234,5 @@ export default function useNavItems(): ReturnType { ...@@ -234,5 +234,5 @@ export default function useNavItems(): ReturnType {
}; };
return { mainNavItems, accountNavItems, profileItem }; return { mainNavItems, accountNavItems, profileItem };
}, [ hasAPIDocs, isMarketplaceFilled, pathname ]); }, [ hasAPIDocs, isMarketplaceAvailable, pathname ]);
} }
import type { FeaturedNetwork } from 'types/networks';
import appConfig from 'configs/app/config';
import ASSETS from 'lib/networks/networkAssets';
// for easy .env.example update
// const FEATURED_NETWORKS = JSON.stringify([
// {
// title: 'Ethereum',
// url: 'https://blockscout.com/eth/mainnet',
// group: 'mainnets',
// type: 'eth_mainnet',
// },
// {
// title: 'Ethereum Classic',
// url: 'https://blockscout.com/etx/mainnet',
// group: 'mainnets',
// type: 'etc_mainnet',
// },
// {
// title: 'Gnosis Chain',
// url: 'https://blockscout.com/xdai/mainnet',
// group: 'mainnets',
// type: 'xdai_mainnet',
// },
// {
// title: 'Astar (EVM)',
// url: 'https://blockscout.com/astar',
// group: 'mainnets',
// type: 'astar',
// },
// {
// title: 'Shiden (EVM)',
// url: 'https://blockscout.com/shiden',
// group: 'mainnets',
// type: 'astar',
// },
// {
// title: 'Klaytn Mainnet (Cypress)',
// url: 'https://klaytn-mainnet.aws-k8s.blockscout.com/',
// group: 'mainnets',
// type: 'klaytn',
// },
// {
// title: 'Goerli',
// url: 'https://blockscout.com/eth/goerli/',
// group: 'testnets',
// type: 'goerli',
// },
// {
// title: 'Optimism Goerli',
// url: 'https://blockscout.com/optimism/goerli/',
// group: 'testnets',
// type: 'optimism_goerli',
// },
// {
// title: 'Optimism Bedrock Alpha',
// url: 'https://blockscout.com/optimism/bedrock-alpha',
// group: 'testnets',
// type: 'optimism_bedrock_alpha',
// },
// {
// title: 'Gnosis Chiado',
// url: 'https://blockscout.com/gnosis/chiado/',
// group: 'testnets',
// type: 'gnosis_chiado',
// },
// {
// title: 'Shibuya (EVM)',
// url: 'https://blockscout.com/shibuya',
// group: 'testnets',
// type: 'shibuya',
// },
// {
// title: 'Optimism Opcraft',
// url: 'https://blockscout.com/optimism/opcraft',
// group: 'other',
// type: 'optimism_opcraft',
// },
// {
// title: 'Optimism on Gnosis Chain',
// url: 'https://blockscout.com/xdai/optimism',
// group: 'other',
// type: 'optimism_gnosis',
// },
// {
// title: 'ARTIS-Σ1',
// url: 'https://blockscout.com/artis/sigma1',
// group: 'other',
// type: 'artis_sigma1',
// },
// {
// title: 'LUKSO L14',
// url: 'https://blockscout.com/lukso/l14',
// group: 'other',
// type: 'lukso_l14',
// },
// {
// title: 'POA',
// url: 'https://blockscout.com/poa/core',
// group: 'other',
// type: 'poa_core',
// },
// {
// title: 'POA Sokol',
// url: 'https://blockscout.com/poa/sokol',
// group: 'other',
// type: 'poa_sokol',
// },
// ]).replaceAll('"', '\'');
const featuredNetworks: Array<FeaturedNetwork> = (() => {
return appConfig.featuredNetworks.map((network) => ({
...network,
icon: network.icon || (network.type ? ASSETS[network.type]?.icon : undefined),
}));
})();
export default featuredNetworks;
import type React from 'react';
import type { PreDefinedNetwork } from 'types/networks';
import arbitrumIcon from 'icons/networks/icons/arbitrum.svg';
import artisIcon from 'icons/networks/icons/artis.svg';
import baseIcon from 'icons/networks/icons/base.svg';
import ethereumClassicIcon from 'icons/networks/icons/ethereum-classic.svg';
import ethereumIcon from 'icons/networks/icons/ethereum.svg';
import gnosisIcon from 'icons/networks/icons/gnosis.svg';
import goerliIcon from 'icons/networks/icons/goerli.svg';
import optimismIcon from 'icons/networks/icons/optimism.svg';
import poaSokolIcon from 'icons/networks/icons/poa-sokol.svg';
import poaIcon from 'icons/networks/icons/poa.svg';
import rskIcon from 'icons/networks/icons/rsk.svg';
import artisLogo from 'icons/networks/logos/artis.svg';
import astarLogo from 'icons/networks/logos/astar.svg';
import baseLogo from 'icons/networks/logos/base.svg';
import etcLogo from 'icons/networks/logos/etc.svg';
import ethLogo from 'icons/networks/logos/eth.svg';
import gnosisLogo from 'icons/networks/logos/gnosis.svg';
import goerliLogo from 'icons/networks/logos/goerli.svg';
import luksoLogo from 'icons/networks/logos/lukso.svg';
import poaLogo from 'icons/networks/logos/poa.svg';
import rskLogo from 'icons/networks/logos/rsk.svg';
import shibuyaLogo from 'icons/networks/logos/shibuya.svg';
import shidenLogo from 'icons/networks/logos/shiden.svg';
import sokolLogo from 'icons/networks/logos/sokol.svg';
interface NetworkAssets {
icon?: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
logo?: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
smallLogo?: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
}
const networkAssets: Partial<Record<PreDefinedNetwork, NetworkAssets>> = {
xdai_mainnet: {
icon: gnosisIcon,
logo: gnosisLogo,
},
xdai_optimism: {
icon: optimismIcon,
},
xdai_aox: {
icon: arbitrumIcon,
},
eth_mainnet: {
icon: ethereumIcon,
logo: ethLogo,
},
etc_mainnet: {
icon: ethereumClassicIcon,
logo: etcLogo,
},
poa_core: {
icon: poaIcon,
logo: poaLogo,
},
rsk_mainnet: {
icon: rskIcon,
logo: rskLogo,
},
xdai_testnet: {
icon: arbitrumIcon,
logo: gnosisLogo,
},
poa_sokol: {
icon: poaSokolIcon,
logo: sokolLogo,
},
artis_sigma1: {
icon: artisIcon,
logo: artisLogo,
},
lukso_l14: {
logo: luksoLogo,
},
astar: {
logo: astarLogo,
},
shiden: {
logo: shidenLogo,
},
shibuya: {
logo: shibuyaLogo,
},
goerli: {
logo: goerliLogo,
icon: goerliIcon,
},
base_goerli: {
logo: baseLogo,
icon: baseIcon,
},
};
export default networkAssets;
import React from 'react';
import appConfig from 'configs/app/config';
import featuredNetworks from 'lib/networks/featuredNetworks';
export default function useNetworkNavigationItems() {
return React.useMemo(() => {
return featuredNetworks.map((network) => {
return {
...network,
isActive: network.type ? appConfig.network.type === network.type : false,
};
});
}, []);
}
...@@ -28,7 +28,7 @@ export function middleware(req: NextRequest) { ...@@ -28,7 +28,7 @@ export function middleware(req: NextRequest) {
const end = Date.now(); const end = Date.now();
const res = NextResponse.next(); const res = NextResponse.next();
res.headers.append(appConfig.isDev ? 'Content-Security-Policy' : 'Content-Security-Policy-Report-Only', cspPolicy); res.headers.append('Content-Security-Policy', cspPolicy);
res.headers.append('Server-Timing', `middleware;dur=${ end - start }`); res.headers.append('Server-Timing', `middleware;dur=${ end - start }`);
return res; return res;
......
import type { FeaturedNetwork } from 'types/networks'; import type { FeaturedNetwork } from 'types/networks';
const FEATURED_NETWORKS: Array<FeaturedNetwork> = [ const FEATURED_NETWORKS: Array<FeaturedNetwork> = [
{ title: 'Gnosis Chain', url: 'https://blockscout.com/xdai/mainnet', group: 'mainnets', type: 'xdai_mainnet' }, { title: 'Gnosis Chain', url: 'https://blockscout.com/xdai/mainnet', group: 'Mainnets', isActive: true },
{ title: 'Optimism on Gnosis Chain', url: 'https://blockscout.com/xdai/optimism', group: 'mainnets', type: 'xdai_optimism' }, { title: 'Arbitrum on xDai', url: 'https://blockscout.com/xdai/aox', group: 'Mainnets' },
{ title: 'Arbitrum on xDai', url: 'https://blockscout.com/xdai/aox', group: 'mainnets' }, { title: 'Ethereum', url: 'https://blockscout.com/eth/mainnet', group: 'Mainnets' },
{ title: 'Ethereum', url: 'https://blockscout.com/eth/mainnet', group: 'mainnets', type: 'eth_mainnet' }, { title: 'Ethereum Classic', url: 'https://blockscout.com/etx/mainnet', group: 'Mainnets', icon: 'https://localhost:3000/my-logo.png' },
{ title: 'Ethereum Classic', url: 'https://blockscout.com/etx/mainnet', group: 'mainnets', type: 'etc_mainnet', icon: 'https://example.com/my-logo.png' }, { title: 'POA', url: 'https://blockscout.com/poa/core', group: 'Mainnets' },
{ title: 'POA', url: 'https://blockscout.com/poa/core', group: 'mainnets', type: 'poa_core' }, { title: 'RSK', url: 'https://blockscout.com/rsk/mainnet', group: 'Mainnets' },
{ title: 'RSK', url: 'https://blockscout.com/rsk/mainnet', group: 'mainnets', type: 'rsk_mainnet' }, { title: 'Gnosis Chain Testnet', url: 'https://blockscout.com/xdai/testnet', group: 'Testnets' },
{ title: 'Gnosis Chain Testnet', url: 'https://blockscout.com/xdai/testnet', group: 'testnets', type: 'xdai_testnet' }, { title: 'POA Sokol', url: 'https://blockscout.com/poa/sokol', group: 'Testnets' },
{ title: 'POA Sokol', url: 'https://blockscout.com/poa/sokol', group: 'testnets', type: 'poa_sokol' }, { title: 'ARTIS Σ1', url: 'https://blockscout.com/artis/sigma1', group: 'Other' },
{ title: 'ARTIS Σ1', url: 'https://blockscout.com/artis/sigma1', group: 'other', type: 'artis_sigma1' }, { title: 'LUKSO L14', url: 'https://blockscout.com/lukso/l14', group: 'Other' },
{ title: 'LUKSO L14', url: 'https://blockscout.com/lukso/l14', group: 'other', type: 'lukso_l14' }, { title: 'Astar', url: 'https://blockscout.com/astar', group: 'Other' },
{ title: 'Astar', url: 'https://blockscout.com/astar', group: 'other', type: 'astar' },
]; ];
export const FEATURED_NETWORKS_MOCK = JSON.stringify(FEATURED_NETWORKS).replaceAll('"', '\''); export const FEATURED_NETWORKS_MOCK = JSON.stringify(FEATURED_NETWORKS);
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"format-svg": "./node_modules/.bin/svgo -r ./icons", "format-svg": "./node_modules/.bin/svgo -r ./icons",
"test:pw": "./playwright/make-envs-script.sh && NODE_OPTIONS=\"--max-old-space-size=4096\" playwright test -c playwright-ct.config.ts", "test:pw": "./playwright/make-envs-script.sh && NODE_OPTIONS=\"--max-old-space-size=4096\" playwright test -c playwright-ct.config.ts",
"test:pw:local": "export NODE_PATH=$(pwd)/node_modules && rm -rf ./playwright/.cache && yarn test:pw", "test:pw:local": "export NODE_PATH=$(pwd)/node_modules && rm -rf ./playwright/.cache && yarn test:pw",
"test:pw:docker": "docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.31.0-focal ./playwright/run-tests.sh", "test:pw:docker": "docker run --rm --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.32.0-focal ./playwright/run-tests.sh",
"test:jest": "jest", "test:jest": "jest",
"test:jest:watch": "jest --watch" "test:jest:watch": "jest --watch"
}, },
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
"wagmi": "^0.10.6" "wagmi": "^0.10.6"
}, },
"devDependencies": { "devDependencies": {
"@playwright/experimental-ct-react": "1.31.0", "@playwright/experimental-ct-react": "1.32.3",
"@svgr/webpack": "^6.5.1", "@svgr/webpack": "^6.5.1",
"@testing-library/react": "^13.4.0", "@testing-library/react": "^13.4.0",
"@total-typescript/ts-reset": "^0.3.7", "@total-typescript/ts-reset": "^0.3.7",
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
"lint-staged": ">=10", "lint-staged": ">=10",
"mockdate": "^3.0.5", "mockdate": "^3.0.5",
"next-transpile-modules": "^10.0.0", "next-transpile-modules": "^10.0.0",
"playwright": "1.31.0", "playwright": "1.32.3",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"svgo": "^2.8.0", "svgo": "^2.8.0",
"ts-jest": "^29.0.3", "ts-jest": "^29.0.3",
......
import type { NextPage } from 'next'; import type { NextPage } from 'next';
import Head from 'next/head'; import Head from 'next/head';
import { useRouter } from 'next/router'; import React from 'react';
import React, { useEffect, useState } from 'react';
import type { AppItemOverview } from 'types/client/apps';
import appConfig from 'configs/app/config';
import { apos } from 'lib/html-entities';
import EmptySearchResult from 'ui/apps/EmptySearchResult';
import MarketplaceApp from 'ui/pages/MarketplaceApp'; import MarketplaceApp from 'ui/pages/MarketplaceApp';
import Page from 'ui/shared/Page/Page'; import Page from 'ui/shared/Page/Page';
const AppPage: NextPage = () => { const AppPage: NextPage = () => {
const router = useRouter();
const [ isLoading, setIsLoading ] = useState(true);
const [ app, setApp ] = useState<AppItemOverview | undefined>(undefined);
const id = router.query.id;
useEffect(() => {
if (!id) {
return;
}
const app = appConfig.marketplaceAppList.find((app) => app.id === id);
setApp(app);
setIsLoading(false);
}, [ id ]);
if (app || isLoading) {
return (
<>
<Head><title>{ app ? `Blockscout | ${ app.title }` : 'Loading app..' }</title></Head>
<MarketplaceApp app={ app } isLoading={ isLoading }/>
</>
);
}
return ( return (
<Page> <Page wrapChildren={ false }>
<Head><title>Blockscout | No app found</title></Head> <Head><title>Blockscout | Marketplace</title></Head>
<EmptySearchResult text={ `Couldn${ apos }t find an app.` }/> <MarketplaceApp/>
</Page> </Page>
); );
}; };
......
...@@ -10,7 +10,7 @@ const AppsPage: NextPage = () => { ...@@ -10,7 +10,7 @@ const AppsPage: NextPage = () => {
return ( return (
<Page> <Page>
<PageTitle text="Apps"/> <PageTitle text="Apps"/>
<Head><title>Apps</title></Head> <Head><title>Blockscout | Marketplace</title></Head>
<Apps/> <Apps/>
</Page> </Page>
......
...@@ -3,7 +3,7 @@ import Head from 'next/head'; ...@@ -3,7 +3,7 @@ import Head from 'next/head';
import React from 'react'; import React from 'react';
import getNetworkTitle from 'lib/networks/getNetworkTitle'; import getNetworkTitle from 'lib/networks/getNetworkTitle';
import Deposits from 'ui/pages/Deposits'; import L2Deposits from 'ui/pages/L2Deposits';
const DepositsPage: NextPage = () => { const DepositsPage: NextPage = () => {
const title = getNetworkTitle(); const title = getNetworkTitle();
...@@ -12,7 +12,7 @@ const DepositsPage: NextPage = () => { ...@@ -12,7 +12,7 @@ const DepositsPage: NextPage = () => {
<Head> <Head>
<title>{ title }</title> <title>{ title }</title>
</Head> </Head>
<Deposits/> <L2Deposits/>
</> </>
); );
}; };
......
...@@ -3,7 +3,7 @@ import Head from 'next/head'; ...@@ -3,7 +3,7 @@ import Head from 'next/head';
import React from 'react'; import React from 'react';
import getNetworkTitle from 'lib/networks/getNetworkTitle'; import getNetworkTitle from 'lib/networks/getNetworkTitle';
import OutputRoots from 'ui/pages/OutputRoots'; import L2OutputRoots from 'ui/pages/L2OutputRoots';
const OutputRootsPage: NextPage = () => { const OutputRootsPage: NextPage = () => {
const title = getNetworkTitle(); const title = getNetworkTitle();
...@@ -12,7 +12,7 @@ const OutputRootsPage: NextPage = () => { ...@@ -12,7 +12,7 @@ const OutputRootsPage: NextPage = () => {
<Head> <Head>
<title>{ title }</title> <title>{ title }</title>
</Head> </Head>
<OutputRoots/> <L2OutputRoots/>
</> </>
); );
}; };
......
...@@ -3,7 +3,7 @@ import Head from 'next/head'; ...@@ -3,7 +3,7 @@ import Head from 'next/head';
import React from 'react'; import React from 'react';
import getNetworkTitle from 'lib/networks/getNetworkTitle'; import getNetworkTitle from 'lib/networks/getNetworkTitle';
import TxnBatches from 'ui/pages/TxnBatches'; import L2TxnBatches from 'ui/pages/L2TxnBatches';
const TxnBatchesPage: NextPage = () => { const TxnBatchesPage: NextPage = () => {
const title = getNetworkTitle(); const title = getNetworkTitle();
...@@ -12,7 +12,7 @@ const TxnBatchesPage: NextPage = () => { ...@@ -12,7 +12,7 @@ const TxnBatchesPage: NextPage = () => {
<Head> <Head>
<title>{ title }</title> <title>{ title }</title>
</Head> </Head>
<TxnBatches/> <L2TxnBatches/>
</> </>
); );
}; };
......
...@@ -3,7 +3,7 @@ import Head from 'next/head'; ...@@ -3,7 +3,7 @@ import Head from 'next/head';
import React from 'react'; import React from 'react';
import getNetworkTitle from 'lib/networks/getNetworkTitle'; import getNetworkTitle from 'lib/networks/getNetworkTitle';
import Withdrawals from 'ui/pages/Withdrawals'; import L2Withdrawals from 'ui/pages/L2Withdrawals';
const WithdrawalsPage: NextPage = () => { const WithdrawalsPage: NextPage = () => {
const title = getNetworkTitle(); const title = getNetworkTitle();
...@@ -12,7 +12,7 @@ const WithdrawalsPage: NextPage = () => { ...@@ -12,7 +12,7 @@ const WithdrawalsPage: NextPage = () => {
<Head> <Head>
<title>{ title }</title> <title>{ title }</title>
</Head> </Head>
<Withdrawals/> <L2Withdrawals/>
</> </>
); );
}; };
......
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 209.322 209.322">
<path d="M105.572 101.811c9.889-6.368 27.417-16.464 28.106-42.166.536-20.278-9.971-49.506-49.155-50.878C53.041 7.659 39.9 28.251 36.071 46.739l-.928-.126c-1.932 0-3.438 1.28-5.34 2.889-2.084 1.784-4.683 3.979-7.792 4.308-3.573.361-8.111-1.206-11.698-2.449-4.193-1.431-6.624-2.047-8.265-.759C.545 51.765-.13 53.864.02 56.828c.331 6.326 4.971 18.917 16.016 25.778 7.67 4.765 16.248 5.482 20.681 5.482h.006c2.37 0 4.945-.239 7.388-.726 2.741 4.218 5.228 7.476 6.037 9.752 2.054 5.851-27.848 25.087-27.848 55.01 0 29.916 22.013 48.475 56.727 48.475h55.004c30.593 0 70.814-29.908 75.291-92.48-28.541 24.072-42.294-9.969-103.75-6.308zM18.941 77.945C8.775 71.617 4.992 58.922 5.294 55.525c.897.24 2.194.689 3.228 1.042 4.105 1.415 9.416 3.228 14.068 2.707 4.799-.499 8.253-3.437 10.778-5.574.607-.509 1.393-1.176 1.872-1.491.87.315.962.693 1.176 3.14.196 2.26.473 5.37 2.362 9.006 1.437 2.761 3.581 5.705 5.646 8.542 1.701 2.336 4.278 5.871 4.535 6.404-.445 1.184-4.907 3.282-12.229 3.282-6.553.008-13.04-1.679-17.789-4.638zM56.86 49.368c0-4.938 4.001-8.943 8.931-8.943a8.942 8.942 0 0 1 8.942 8.943c0 4.931-4.001 8.942-8.942 8.942-4.937.001-8.931-4.011-8.931-8.942zm92.299 106.03-20.63 11.169 13.408 9.293s-49.854 15.813-72.198-6.885c-11.006-11.16-13.06-28.533 4.124-38.84 17.184-10.312 84.609 3.943 84.609 3.943L134.295 147.8l14.864 7.598z" fill="#ffef07"/>
</svg>
import type { test } from '@playwright/experimental-ct-react'; import type { test } from '@playwright/experimental-ct-react';
import type { Browser } from '@playwright/test';
interface Env { interface Env {
name: string; name: string;
...@@ -6,9 +7,17 @@ interface Env { ...@@ -6,9 +7,17 @@ interface Env {
} }
// keep in mind that all passed variables here should be present in env config files (.env.pw or .env.poa) // keep in mind that all passed variables here should be present in env config files (.env.pw or .env.poa)
export default function createContextWithEnvs(envs: Array<Env>): Parameters<typeof test.extend>[0]['context'] { export default function contextWithEnvs(envs: Array<Env>): Parameters<typeof test.extend>[0]['context'] {
return async({ browser }, use) => { return async({ browser }, use) => {
const context = await browser.newContext({ const context = await createContextWithEnvs(browser, envs);
await use(context);
await context.close();
};
}
export async function createContextWithEnvs(browser: Browser, envs: Array<Env>) {
return browser.newContext({
storageState: { storageState: {
origins: [ origins: [
{ origin: 'http://localhost:3100', localStorage: envs }, { origin: 'http://localhost:3100', localStorage: envs },
...@@ -16,8 +25,4 @@ export default function createContextWithEnvs(envs: Array<Env>): Parameters<type ...@@ -16,8 +25,4 @@ export default function createContextWithEnvs(envs: Array<Env>): Parameters<type
cookies: [], cookies: [],
}, },
}); });
await use(context);
await context.close();
};
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
targetFile='./playwright/envs.js' targetFile='./playwright/envs.js'
declare -a envFiles=('./configs/envs/.env.pw' './configs/envs/.env.poa_core') declare -a envFiles=('./configs/envs/.env.pw')
touch $targetFile; touch $targetFile;
truncate -s 0 $targetFile; truncate -s 0 $targetFile;
...@@ -26,7 +26,7 @@ do ...@@ -26,7 +26,7 @@ do
# if there is a value, escape it and add line to target file # if there is a value, escape it and add line to target file
escapedConfigValue=$(echo $configValue | sed s/\'/\"/g); escapedConfigValue=$(echo $configValue | sed s/\'/\"/g);
echo "window.process.env.${configName} = localStorage.getItem('${configName}') || '${escapedConfigValue}';" >> $targetFile; echo "window.process.env.${configName} = localStorage.getItem('${configName}') ?? '${escapedConfigValue}';" >> $targetFile;
done < $envFile done < $envFile
done done
......
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 123 24">
<g clip-path="url(#network-logo_svg__a)">
<mask id="network-logo_svg__b" width="123" height="22" x="0" y="1" maskUnits="userSpaceOnUse" style="mask-type:luminance">
<path fill="#fff" d="M122.375 1H0v22h122.375V1Z"/>
</mask>
<g fill="#51AA8F" mask="url(#network-logo_svg__b)">
<path d="M22.28 18.796V4.093h6.204c1.1 0 2.038.169 2.798.506.759.337 1.338.803 1.728 1.398.39.595.58 1.289.58 2.082 0 .615-.11 1.16-.34 1.656-.23.495-.57.902-1.03 1.239-.459.337-1.008.565-1.668.694v.129c.5.119.92.317 1.26.595.339.277.619.614.838 1.001.23.396.43.872.61 1.447l1.269 3.946h-3.157l-1.12-3.51c-.16-.564-.35-1-.569-1.318a1.82 1.82 0 0 0-.86-.684c-.359-.139-.819-.218-1.398-.218h-2.058v5.72h-3.088v.02Zm5.674-8.09c.52 0 .97-.08 1.36-.228.379-.149.679-.387.889-.704.21-.317.32-.714.32-1.17 0-.466-.11-.852-.32-1.16a1.795 1.795 0 0 0-.89-.674 3.98 3.98 0 0 0-1.358-.218h-2.588v4.164h2.587v-.01Zm12.691 8.338c-1.12 0-2.128-.248-3.028-.733a5.355 5.355 0 0 1-2.138-2.073c-.52-.892-.779-1.913-.779-3.063 0-1.14.26-2.162.77-3.054a5.443 5.443 0 0 1 2.127-2.092c.91-.505 1.929-.753 3.068-.753s2.158.248 3.057.753c.9.496 1.609 1.2 2.118 2.092.51.893.77 1.914.77 3.064 0 1.14-.26 2.161-.78 3.053a5.486 5.486 0 0 1-2.128 2.082c-.909.476-1.928.724-3.057.724Zm0-2.449a2.85 2.85 0 0 0 1.528-.416c.45-.278.81-.674 1.08-1.19.26-.515.4-1.12.4-1.814 0-.684-.13-1.29-.39-1.815a2.937 2.937 0 0 0-1.07-1.2 2.892 2.892 0 0 0-1.538-.425c-.57 0-1.08.138-1.529.426-.45.277-.81.684-1.069 1.2-.26.515-.39 1.13-.39 1.824 0 .684.13 1.289.4 1.804.26.516.62.912 1.07 1.19.429.277.938.416 1.508.416Zm12.748 2.449c-1.119 0-2.128-.248-3.027-.733a5.354 5.354 0 0 1-2.138-2.073c-.52-.892-.78-1.913-.78-3.063 0-1.14.26-2.162.77-3.054a5.442 5.442 0 0 1 2.128-2.092c.909-.505 1.928-.753 3.067-.753 1.14 0 2.158.248 3.058.753a5.426 5.426 0 0 1 2.118 2.092c.51.893.769 1.914.769 3.064 0 1.14-.26 2.161-.78 3.053a5.485 5.485 0 0 1-2.128 2.082c-.909.476-1.928.724-3.057.724Zm0-2.449c.57 0 1.08-.139 1.529-.416a2.98 2.98 0 0 0 1.079-1.19c.26-.515.4-1.12.4-1.814 0-.684-.13-1.29-.39-1.815a2.937 2.937 0 0 0-1.07-1.2 2.892 2.892 0 0 0-1.538-.425c-.57 0-1.079.138-1.529.426-.45.277-.809.684-1.069 1.2-.26.515-.39 1.13-.39 1.824 0 .684.13 1.289.4 1.804.26.516.62.912 1.07 1.19.43.277.939.416 1.508.416Zm12.06 2.38c-.949 0-1.708-.149-2.258-.446-.56-.298-.949-.704-1.169-1.2-.23-.506-.34-1.1-.34-1.785v-5.74h-2.008v-2.31h2.009V4.668h2.927v2.826h2.638v2.3h-2.638v5.592c0 .386.12.684.36.892.24.208.63.307 1.169.307.34 0 .699-.04 1.079-.109v2.221a5.416 5.416 0 0 1-1.769.278Zm7.355.079c-1.259 0-2.308-.278-3.147-.833-.84-.555-1.409-1.348-1.709-2.39l2.398-.802c.2.585.51 1.04.92 1.358.41.317.919.476 1.508.476.6 0 1.05-.11 1.36-.317.309-.209.459-.496.459-.833 0-.278-.07-.506-.21-.664-.14-.169-.38-.308-.71-.437-.329-.119-.809-.248-1.418-.386-.96-.208-1.719-.446-2.268-.714-.55-.268-.96-.605-1.219-1.031-.26-.426-.4-.952-.4-1.606 0-.724.19-1.349.56-1.894.37-.545.899-.962 1.598-1.269.7-.297 1.499-.446 2.408-.446.8 0 1.509.109 2.128.337.62.228 1.12.565 1.519 1.011.4.446.68.992.83 1.626l-2.379.793a2.55 2.55 0 0 0-.789-1.17 2.056 2.056 0 0 0-1.289-.426c-.35 0-.65.04-.91.129-.258.09-.459.218-.599.387a.904.904 0 0 0-.21.595c0 .257.06.466.19.614.12.149.35.278.67.387.32.109.79.228 1.399.357 1.008.218 1.808.456 2.378.724.57.257.999.604 1.268 1.02.27.427.41.962.41 1.637 0 .763-.18 1.417-.55 1.982-.369.556-.909.992-1.618 1.31-.709.316-1.568.475-2.578.475Zm10.918-.079c-.95 0-1.709-.149-2.258-.446-.56-.298-.95-.704-1.17-1.2-.229-.506-.339-1.1-.339-1.785v-5.74h-2.008v-2.31h2.008V4.668h2.927v2.826h2.638v2.3h-2.638v5.592c0 .386.12.684.36.892.24.208.63.307 1.17.307.34 0 .699-.04 1.078-.109v2.221a5.401 5.401 0 0 1-1.768.278Zm8.454.069c-1.119 0-2.128-.248-3.027-.733a5.357 5.357 0 0 1-2.138-2.073c-.52-.892-.78-1.913-.78-3.063 0-1.14.26-2.162.77-3.054a5.44 5.44 0 0 1 2.128-2.092c.91-.505 1.928-.753 3.068-.753 1.139 0 2.158.248 3.057.753.9.496 1.609 1.2 2.118 2.092.51.893.77 1.914.77 3.064 0 1.14-.26 2.161-.78 3.053a5.482 5.482 0 0 1-2.128 2.082c-.91.476-1.919.724-3.057.724Zm0-2.449a2.85 2.85 0 0 0 1.529-.416c.45-.278.81-.674 1.08-1.19.26-.515.399-1.12.399-1.814 0-.684-.13-1.29-.39-1.815a2.919 2.919 0 0 0-1.07-1.2 2.89 2.89 0 0 0-1.538-.425c-.569 0-1.078.138-1.528.426-.45.277-.81.684-1.07 1.2-.259.515-.389 1.13-.389 1.824 0 .684.13 1.289.4 1.804.26.516.619.912 1.069 1.19.44.277.939.416 1.509.416Zm13.01 2.459c-1.059 0-2.038-.218-2.937-.664-.91-.446-1.629-1.11-2.178-1.993-.55-.882-.82-1.943-.82-3.173 0-1.219.26-2.27.789-3.172a5.42 5.42 0 0 1 2.138-2.072c.9-.486 1.899-.724 2.988-.724.9 0 1.709.169 2.428.506.72.337 1.329.793 1.809 1.378a5.274 5.274 0 0 1 1.028 1.992l-2.527.724a3.355 3.355 0 0 0-.55-1.1 2.723 2.723 0 0 0-.889-.764c-.35-.188-.76-.277-1.209-.277-.6 0-1.139.148-1.608.436a2.91 2.91 0 0 0-1.1 1.22 4.043 4.043 0 0 0-.399 1.804c0 .704.139 1.309.419 1.824.28.516.66.912 1.129 1.18.47.268.98.406 1.539.406.449 0 .85-.089 1.209-.267.36-.179.659-.427.909-.724.25-.307.44-.644.57-1.011l2.518.743a5.096 5.096 0 0 1-.959 1.854c-.46.565-1.06 1.021-1.799 1.369-.729.327-1.559.505-2.498.505Zm6.685-.258V4.093h2.927v7.912l4.596-4.511h3.387l-4.896 4.7 4.866 6.602h-3.417l-3.527-4.838-1.019.952v3.886h-2.917ZM9.06 6.82a2.747 2.747 0 0 0 2.758-2.737 2.747 2.747 0 0 0-2.757-2.736 2.747 2.747 0 0 0-2.758 2.736A2.747 2.747 0 0 0 9.061 6.82Z"/>
<path d="M16.724 12.54c-1.319-.753-3.007-.307-3.766 1.002a2.72 2.72 0 0 0-.37 1.427c.03 1.21-1.07 1.835-2.108 1.21-.04-.02-.08-.05-.13-.07-1.05-.584-1.05-1.824 0-2.399a2.744 2.744 0 0 0 1.449-2.409v-.06c-.03-1.209 1.069-1.834 2.108-1.209.83.506 1.908.545 2.807.03a2.726 2.726 0 0 0 1.01-3.738 2.77 2.77 0 0 0-3.767-1.001 2.74 2.74 0 0 0-1.379 2.429c.03 1.21-1.07 1.834-2.098 1.21a2.732 2.732 0 0 0-1.439-.407c-.53 0-1.02.148-1.439.396-1.039.615-2.128-.01-2.098-1.21a2.73 2.73 0 0 0-1.379-2.428A2.774 2.774 0 0 0 .358 6.324a2.73 2.73 0 0 0 1.02 3.738 2.785 2.785 0 0 0 2.807-.03c1.04-.625 2.128 0 2.098 1.21v.059c0 1.041.58 1.943 1.45 2.41 1.048.584 1.048 1.823 0 2.399-.04.02-.08.05-.12.069-1.04.615-2.129-.01-2.099-1.21.01-.486-.11-.981-.37-1.437-.759-1.309-2.448-1.755-3.766-1.002-1.32.774-1.769 2.45-1.01 3.758a2.77 2.77 0 0 0 3.767 1.001c.02-.01.03-.02.05-.03 1.04-.624 2.128 0 2.098 1.21v.07c0 1.506 1.24 2.736 2.758 2.736 1.519 0 2.758-1.23 2.758-2.736v-.06c-.03-1.21 1.069-1.834 2.108-1.21.02.01.04.02.06.04 1.319.754 3.007.307 3.766-1.001.76-1.339.31-3.014-1.009-3.768Z"/>
</g>
</g>
<defs>
<clipPath id="network-logo_svg__a">
<path fill="#fff" d="M0 1h122.375v22H0z"/>
</clipPath>
</defs>
</svg>
...@@ -5,5 +5,5 @@ import { RESOURCES } from 'lib/api/resources'; ...@@ -5,5 +5,5 @@ import { RESOURCES } from 'lib/api/resources';
export default function buildApiUrl<R extends ResourceName>(resourceName: R, pathParams?: ResourcePathParams<R>) { export default function buildApiUrl<R extends ResourceName>(resourceName: R, pathParams?: ResourcePathParams<R>) {
const resource = RESOURCES[resourceName]; const resource = RESOURCES[resourceName];
return compile('/node-api/proxy/poa/core' + resource.path)(pathParams); return compile('/node-api/proxy' + resource.path)(pathParams);
} }
export type DepositsItem = { export type L2DepositsItem = {
l1_block_number: number; l1_block_number: number;
l1_tx_hash: string; l1_tx_hash: string;
l1_block_timestamp: string; l1_block_timestamp: string;
...@@ -7,8 +7,8 @@ export type DepositsItem = { ...@@ -7,8 +7,8 @@ export type DepositsItem = {
l2_tx_hash: string; l2_tx_hash: string;
} }
export type DepositsResponse = { export type L2DepositsResponse = {
items: Array<DepositsItem>; items: Array<L2DepositsItem>;
next_page_params: { next_page_params: {
items_count: number; items_count: number;
l1_block_number: number; l1_block_number: number;
......
export type OutputRootsItem = { export type L2OutputRootsItem = {
l1_block_number: number; l1_block_number: number;
l1_timestamp: string; l1_timestamp: string;
l1_tx_hash: string; l1_tx_hash: string;
...@@ -7,8 +7,8 @@ export type OutputRootsItem = { ...@@ -7,8 +7,8 @@ export type OutputRootsItem = {
output_root: string; output_root: string;
} }
export type OutputRootsResponse = { export type L2OutputRootsResponse = {
items: Array<OutputRootsItem>; items: Array<L2OutputRootsItem>;
total: number; total: number;
next_page_params: { next_page_params: {
index: number; index: number;
......
export type TxnBatchesItem = { export type L2TxnBatchesItem = {
epoch_number: number; epoch_number: number;
l1_tx_hashes: Array<string>; l1_tx_hashes: Array<string>;
l1_timestamp: string; l1_timestamp: string;
...@@ -6,8 +6,8 @@ export type TxnBatchesItem = { ...@@ -6,8 +6,8 @@ export type TxnBatchesItem = {
tx_count: number; tx_count: number;
} }
export type TxnBatchesResponse = { export type L2TxnBatchesResponse = {
items: Array<TxnBatchesItem>; items: Array<L2TxnBatchesItem>;
total: number; total: number;
next_page_params: { next_page_params: {
index: number; index: number;
......
import type { AddressParam } from './addressParams'; import type { AddressParam } from './addressParams';
export type WithdrawalsItem = { export type L2WithdrawalsItem = {
'challenge_period_end': string | null; 'challenge_period_end': string | null;
'from': AddressParam | null; 'from': AddressParam | null;
'l1_tx_hash': string | null; 'l1_tx_hash': string | null;
...@@ -11,15 +11,15 @@ export type WithdrawalsItem = { ...@@ -11,15 +11,15 @@ export type WithdrawalsItem = {
'status': string; 'status': string;
} }
export type WithdrawalStatus = export type L2WithdrawalStatus =
'In challenge period' | 'In challenge period' |
'Ready for relay' | 'Ready for relay' |
'Relayed' | 'Relayed' |
'Waiting for state root' | 'Waiting for state root' |
'Ready to prove'; 'Ready to prove';
export type WithdrawalsResponse = { export type L2WithdrawalsResponse = {
items: Array<WithdrawalsItem>; items: Array<L2WithdrawalsItem>;
'next_page_params': { 'next_page_params': {
'items_count': number; 'items_count': number;
'nonce': string; 'nonce': string;
......
export enum MarketplaceCategoryId {
'all',
'favorites',
'defi',
'exchanges',
'finance',
'games',
'marketplaces',
'nft',
'security',
'social',
'tools',
'yieldFarming',
}
export type MarketplaceCategoriesIds = keyof typeof MarketplaceCategoryId;
export type MarketplaceCategory = { id: MarketplaceCategoriesIds; name: string }
export type AppItemPreview = { export type AppItemPreview = {
id: string; id: string;
external: boolean; external?: boolean;
title: string; title: string;
logo: string; logo: string;
shortDescription: string; shortDescription: string;
categories: Array<MarketplaceCategoriesIds>; categories: Array<string>;
url: string; url: string;
} }
...@@ -35,3 +16,8 @@ export type AppItemOverview = AppItemPreview & { ...@@ -35,3 +16,8 @@ export type AppItemOverview = AppItemPreview & {
telegram?: string; telegram?: string;
github?: string; github?: string;
} }
export enum AppCategory {
ALL = 'All apps',
FAVORITES = 'Favorites',
}
import type { FunctionComponent, SVGAttributes } from 'react'; export type NetworkGroup = 'Mainnets' | 'Testnets' | 'Other';
export type NetworkGroup = 'mainnets' | 'testnets' | 'other';
export type PreDefinedNetwork = 'xdai_mainnet' | 'xdai_optimism' | 'xdai_aox' | 'eth_mainnet' | 'etc_mainnet' | 'poa_core' |
'rsk_mainnet' | 'xdai_testnet' | 'poa_sokol' | 'artis_sigma1' | 'lukso_l14' | 'astar' | 'shiden' | 'shibuya' | 'goerli' | 'base_goerli';
export interface FeaturedNetwork { export interface FeaturedNetwork {
title: string; title: string;
url: string; url: string;
group: NetworkGroup; group: NetworkGroup;
icon?: FunctionComponent<SVGAttributes<SVGElement>> | string; icon?: string;
type?: PreDefinedNetwork; isActive?: boolean;
invertIconInDarkMode?: boolean;
} }
export interface NetworkExplorer { export interface NetworkExplorer {
......
...@@ -25,23 +25,23 @@ declare module "nextjs-routes" { ...@@ -25,23 +25,23 @@ declare module "nextjs-routes" {
| DynamicRoute<"/block/[height]", { "height": string }> | DynamicRoute<"/block/[height]", { "height": string }>
| StaticRoute<"/blocks"> | StaticRoute<"/blocks">
| StaticRoute<"/csv-export"> | StaticRoute<"/csv-export">
| StaticRoute<"/deposits">
| StaticRoute<"/graph"> | StaticRoute<"/graph">
| StaticRoute<"/graphiql"> | StaticRoute<"/graphiql">
| StaticRoute<"/"> | StaticRoute<"/">
| StaticRoute<"/l2-deposits">
| StaticRoute<"/l2-output-roots">
| StaticRoute<"/l2-txn-batches">
| StaticRoute<"/l2-withdrawals">
| StaticRoute<"/login"> | StaticRoute<"/login">
| StaticRoute<"/output-roots">
| StaticRoute<"/search-results"> | StaticRoute<"/search-results">
| StaticRoute<"/stats"> | StaticRoute<"/stats">
| DynamicRoute<"/token/[hash]", { "hash": string }> | DynamicRoute<"/token/[hash]", { "hash": string }>
| DynamicRoute<"/token/[hash]/instance/[id]", { "hash": string; "id": string }> | DynamicRoute<"/token/[hash]/instance/[id]", { "hash": string; "id": string }>
| StaticRoute<"/tokens"> | StaticRoute<"/tokens">
| DynamicRoute<"/tx/[hash]", { "hash": string }> | DynamicRoute<"/tx/[hash]", { "hash": string }>
| StaticRoute<"/txn-batches">
| StaticRoute<"/txs"> | StaticRoute<"/txs">
| StaticRoute<"/verified-contracts"> | StaticRoute<"/verified-contracts">
| StaticRoute<"/visualize/sol2uml"> | StaticRoute<"/visualize/sol2uml">;
| StaticRoute<"/withdrawals">;
interface StaticRoute<Pathname> { interface StaticRoute<Pathname> {
pathname: Pathname; pathname: Pathname;
......
import _capitalize from 'lodash/capitalize';
import React from 'react'; import React from 'react';
import { useAccount, useSigner } from 'wagmi'; import { useAccount, useSigner, useNetwork, useSwitchNetwork } from 'wagmi';
import type { SmartContractWriteMethod } from 'types/api/contract'; import type { SmartContractWriteMethod } from 'types/api/contract';
...@@ -16,7 +15,7 @@ import ContractCustomAbiAlert from './ContractCustomAbiAlert'; ...@@ -16,7 +15,7 @@ import ContractCustomAbiAlert from './ContractCustomAbiAlert';
import ContractImplementationAddress from './ContractImplementationAddress'; import ContractImplementationAddress from './ContractImplementationAddress';
import ContractMethodCallable from './ContractMethodCallable'; import ContractMethodCallable from './ContractMethodCallable';
import ContractWriteResult from './ContractWriteResult'; import ContractWriteResult from './ContractWriteResult';
import { getNativeCoinValue, isExtendedError } from './utils'; import { getNativeCoinValue } from './utils';
interface Props { interface Props {
addressHash?: string; addressHash?: string;
...@@ -27,6 +26,8 @@ interface Props { ...@@ -27,6 +26,8 @@ interface Props {
const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => { const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => {
const { data: signer } = useSigner(); const { data: signer } = useSigner();
const { isConnected } = useAccount(); const { isConnected } = useAccount();
const { chain } = useNetwork();
const { switchNetworkAsync } = useSwitchNetwork();
const { data, isLoading, isError } = useApiQuery(isProxy ? 'contract_methods_write_proxy' : 'contract_methods_write', { const { data, isLoading, isError } = useApiQuery(isProxy ? 'contract_methods_write_proxy' : 'contract_methods_write', {
pathParams: { hash: addressHash }, pathParams: { hash: addressHash },
...@@ -56,7 +57,10 @@ const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => { ...@@ -56,7 +57,10 @@ const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => {
throw new Error('Wallet is not connected'); throw new Error('Wallet is not connected');
} }
try { if (chain?.id && String(chain.id) !== config.network.id) {
await switchNetworkAsync?.(Number(config.network.id));
}
if (!_contract) { if (!_contract) {
throw new Error('Something went wrong. Try again later.'); throw new Error('Something went wrong. Try again later.');
} }
...@@ -80,26 +84,7 @@ const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => { ...@@ -80,26 +84,7 @@ const ContractWrite = ({ addressHash, isProxy, isCustomAbi }: Props) => {
}); });
return { hash: result.hash as string }; return { hash: result.hash as string };
} catch (error) { }, [ _contract, addressHash, chain, isConnected, signer, switchNetworkAsync ]);
if (isExtendedError(error)) {
if ('reason' in error && error.reason === 'underlying network changed') {
if ('detectedNetwork' in error && typeof error.detectedNetwork === 'object' && error.detectedNetwork !== null) {
const networkName = error.detectedNetwork.name;
if (networkName) {
throw new Error(
// eslint-disable-next-line max-len
`You connected to ${ _capitalize(networkName) } chain in the wallet, but the current instance of Blockscout is for ${ config.network.name } chain`,
);
}
}
throw new Error('Wrong network detected, please make sure you are switched to the correct network, and try again');
}
}
throw error;
}
}, [ _contract, addressHash, isConnected, signer ]);
const renderContent = React.useCallback((item: SmartContractWriteMethod, index: number, id: number) => { const renderContent = React.useCallback((item: SmartContractWriteMethod, index: number, id: number) => {
return ( return (
......
...@@ -11,7 +11,7 @@ import MockAddressPage from 'ui/address/testUtils/MockAddressPage'; ...@@ -11,7 +11,7 @@ import MockAddressPage from 'ui/address/testUtils/MockAddressPage';
import TokenSelect from './TokenSelect'; import TokenSelect from './TokenSelect';
const ASSET_URL = 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/poa/assets/0xb2a90505dc6680a7a695f7975d0d32EeF610f456/logo.png'; const ASSET_URL = 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xb2a90505dc6680a7a695f7975d0d32EeF610f456/logo.png';
const TOKENS_ERC20_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-20'; const TOKENS_ERC20_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-20';
const TOKENS_ERC721_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-721'; const TOKENS_ERC721_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-721';
const TOKENS_ER1155_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-1155'; const TOKENS_ER1155_API_URL = buildApiUrl('address_tokens', { hash: '1' }) + '?type=ERC-1155';
......
...@@ -9,7 +9,6 @@ import starFilledIcon from 'icons/star_filled.svg'; ...@@ -9,7 +9,6 @@ import starFilledIcon from 'icons/star_filled.svg';
import starOutlineIcon from 'icons/star_outline.svg'; import starOutlineIcon from 'icons/star_outline.svg';
import AppCardLink from './AppCardLink'; import AppCardLink from './AppCardLink';
import { APP_CATEGORIES } from './constants';
interface Props extends AppItemPreview { interface Props extends AppItemPreview {
onInfoClick: (id: string) => void; onInfoClick: (id: string) => void;
...@@ -29,7 +28,7 @@ const AppCard = ({ ...@@ -29,7 +28,7 @@ const AppCard = ({
isFavorite, isFavorite,
onFavoriteClick, onFavoriteClick,
}: Props) => { }: Props) => {
const categoriesLabel = categories.map(c => APP_CATEGORIES[c]).filter(Boolean).join(', '); const categoriesLabel = categories.join(', ');
const handleInfoClick = useCallback((event: MouseEvent) => { const handleInfoClick = useCallback((event: MouseEvent) => {
event.preventDefault(); event.preventDefault();
......
...@@ -5,7 +5,7 @@ import React from 'react'; ...@@ -5,7 +5,7 @@ import React from 'react';
type Props = { type Props = {
id: string; id: string;
url: string; url: string;
external: boolean; external?: boolean;
title: string; title: string;
} }
......
import { Grid, GridItem, Heading, VisuallyHidden } from '@chakra-ui/react'; import { Grid, GridItem } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { AppItemPreview } from 'types/client/apps'; import type { AppItemPreview } from 'types/client/apps';
...@@ -7,25 +7,15 @@ import { apos } from 'lib/html-entities'; ...@@ -7,25 +7,15 @@ import { apos } from 'lib/html-entities';
import AppCard from 'ui/apps/AppCard'; import AppCard from 'ui/apps/AppCard';
import EmptySearchResult from 'ui/apps/EmptySearchResult'; import EmptySearchResult from 'ui/apps/EmptySearchResult';
import AppModal from './AppModal';
type Props = { type Props = {
apps: Array<AppItemPreview>; apps: Array<AppItemPreview>;
onAppClick: (id: string) => void; onAppClick: (id: string) => void;
displayedAppId: string | null;
onModalClose: () => void;
favoriteApps: Array<string>; favoriteApps: Array<string>;
onFavoriteClick: (id: string, isFavorite: boolean) => void; onFavoriteClick: (id: string, isFavorite: boolean) => void;
} }
const AppList = ({ apps, onAppClick, displayedAppId, onModalClose, favoriteApps, onFavoriteClick }: Props) => { const AppList = ({ apps, onAppClick, favoriteApps, onFavoriteClick }: Props) => {
return ( return apps.length > 0 ? (
<>
<VisuallyHidden>
<Heading as="h2">App list</Heading>
</VisuallyHidden>
{ apps.length > 0 ? (
<Grid <Grid
templateColumns={{ templateColumns={{
sm: 'repeat(auto-fill, minmax(178px, 1fr))', sm: 'repeat(auto-fill, minmax(178px, 1fr))',
...@@ -55,17 +45,6 @@ const AppList = ({ apps, onAppClick, displayedAppId, onModalClose, favoriteApps, ...@@ -55,17 +45,6 @@ const AppList = ({ apps, onAppClick, displayedAppId, onModalClose, favoriteApps,
</Grid> </Grid>
) : ( ) : (
<EmptySearchResult text={ `Couldn${ apos }t find an app that matches your filter query.` }/> <EmptySearchResult text={ `Couldn${ apos }t find an app that matches your filter query.` }/>
) }
{ displayedAppId && (
<AppModal
id={ displayedAppId }
onClose={ onModalClose }
isFavorite={ favoriteApps.includes(displayedAppId) }
onFavoriteClick={ onFavoriteClick }
/>
) }
</>
); );
}; };
......
...@@ -4,9 +4,8 @@ import { ...@@ -4,9 +4,8 @@ import {
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import type { AppItemOverview, MarketplaceCategoriesIds } from 'types/client/apps'; import type { AppItemOverview } from 'types/client/apps';
import appConfig from 'configs/app/config';
import linkIcon from 'icons/link.svg'; import linkIcon from 'icons/link.svg';
import ghIcon from 'icons/social/git.svg'; import ghIcon from 'icons/social/git.svg';
import tgIcon from 'icons/social/telega.svg'; import tgIcon from 'icons/social/telega.svg';
...@@ -17,20 +16,19 @@ import useIsMobile from 'lib/hooks/useIsMobile'; ...@@ -17,20 +16,19 @@ import useIsMobile from 'lib/hooks/useIsMobile';
import { nbsp } from 'lib/html-entities'; import { nbsp } from 'lib/html-entities';
import AppModalLink from './AppModalLink'; import AppModalLink from './AppModalLink';
import { APP_CATEGORIES } from './constants';
type Props = { type Props = {
id: string;
onClose: () => void; onClose: () => void;
isFavorite: boolean; isFavorite: boolean;
onFavoriteClick: (id: string, isFavorite: boolean) => void; onFavoriteClick: (id: string, isFavorite: boolean) => void;
data: AppItemOverview;
} }
const AppModal = ({ const AppModal = ({
id,
onClose, onClose,
isFavorite, isFavorite,
onFavoriteClick, onFavoriteClick,
data,
}: Props) => { }: Props) => {
const { const {
title, title,
...@@ -44,7 +42,7 @@ const AppModal = ({ ...@@ -44,7 +42,7 @@ const AppModal = ({
twitter, twitter,
logo, logo,
categories, categories,
} = appConfig.marketplaceAppList.find(app => app.id === id) as AppItemOverview; } = data;
const socialLinks = [ const socialLinks = [
telegram ? { telegram ? {
...@@ -62,14 +60,14 @@ const AppModal = ({ ...@@ -62,14 +60,14 @@ const AppModal = ({
].filter(Boolean); ].filter(Boolean);
const handleFavoriteClick = useCallback(() => { const handleFavoriteClick = useCallback(() => {
onFavoriteClick(id, isFavorite); onFavoriteClick(data.id, isFavorite);
}, [ onFavoriteClick, id, isFavorite ]); }, [ onFavoriteClick, data.id, isFavorite ]);
const isMobile = useIsMobile(); const isMobile = useIsMobile();
return ( return (
<Modal <Modal
isOpen={ Boolean(id) } isOpen={ Boolean(data.id) }
onClose={ onClose } onClose={ onClose }
size={ isMobile ? 'full' : 'md' } size={ isMobile ? 'full' : 'md' }
isCentered isCentered
...@@ -123,7 +121,7 @@ const AppModal = ({ ...@@ -123,7 +121,7 @@ const AppModal = ({
> >
<Box display="flex"> <Box display="flex">
<AppModalLink <AppModalLink
id={ id } id={ data.id }
url={ url } url={ url }
external={ external } external={ external }
title={ title } title={ title }
...@@ -157,14 +155,14 @@ const AppModal = ({ ...@@ -157,14 +155,14 @@ const AppModal = ({
</Heading> </Heading>
<Box marginBottom={ 2 }> <Box marginBottom={ 2 }>
{ categories.map((category: MarketplaceCategoriesIds) => APP_CATEGORIES[category] && ( { categories.map((category) => (
<Tag <Tag
colorScheme="blue" colorScheme="blue"
marginRight={ 2 } marginRight={ 2 }
marginBottom={ 2 } marginBottom={ 2 }
key={ category } key={ category }
> >
{ APP_CATEGORIES[category] } { category }
</Tag> </Tag>
)) } )) }
</Box> </Box>
......
...@@ -5,7 +5,7 @@ import React from 'react'; ...@@ -5,7 +5,7 @@ import React from 'react';
type Props = { type Props = {
id: string; id: string;
url: string; url: string;
external: boolean; external?: boolean;
title: string; title: string;
} }
......
import { Box, Button, Icon, Menu, MenuButton, MenuList } from '@chakra-ui/react'; import { Box, Button, Icon, Menu, MenuButton, MenuList } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { MarketplaceCategoriesIds, MarketplaceCategory } from 'types/client/apps'; import { AppCategory } from 'types/client/apps';
import appConfig from 'configs/app/config';
import eastMiniArrowIcon from 'icons/arrows/east-mini.svg'; import eastMiniArrowIcon from 'icons/arrows/east-mini.svg';
import CategoriesMenuItem from './CategoriesMenuItem'; import CategoriesMenuItem from './CategoriesMenuItem';
import { APP_CATEGORIES } from './constants';
const categoriesList = Object.keys(APP_CATEGORIES).map((id: string) => ({
id: id,
name: APP_CATEGORIES[id as MarketplaceCategoriesIds],
})) as Array<MarketplaceCategory>;
type Props = { type Props = {
selectedCategoryId: MarketplaceCategoriesIds; categories: Array<string>;
onSelect: (category: MarketplaceCategoriesIds) => void; selectedCategoryId: string;
onSelect: (category: string) => void;
} }
const CategoriesMenu = ({ selectedCategoryId, onSelect }: Props) => { const CategoriesMenu = ({ selectedCategoryId, onSelect, categories }: Props) => {
const selectedCategory = categoriesList.find(category => category.id === selectedCategoryId); const options = React.useMemo(() => ([
const actualCategories = appConfig.marketplaceAppList.map(app => app.categories).flat(); AppCategory.FAVORITES,
const displayedCategories = categoriesList.filter(category => category.id === 'all' || AppCategory.ALL,
category.id === 'favorites' || ...categories,
actualCategories.includes(category.id)); ]), [ categories ]);
return ( return (
<Menu> <Menu>
...@@ -42,17 +36,16 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect }: Props) => { ...@@ -42,17 +36,16 @@ const CategoriesMenu = ({ selectedCategoryId, onSelect }: Props) => {
display="flex" display="flex"
alignItems="center" alignItems="center"
> >
{ selectedCategory?.name } { selectedCategoryId }
<Icon transform="rotate(-90deg)" ml={{ base: 'auto', sm: 1 }} as={ eastMiniArrowIcon } w={ 5 } h={ 5 }/> <Icon transform="rotate(-90deg)" ml={{ base: 'auto', sm: 1 }} as={ eastMiniArrowIcon } w={ 5 } h={ 5 }/>
</Box> </Box>
</MenuButton> </MenuButton>
<MenuList zIndex={ 3 }> <MenuList zIndex={ 3 }>
{ displayedCategories.map((category: MarketplaceCategory) => ( { options.map((category: string) => (
<CategoriesMenuItem <CategoriesMenuItem
key={ category.id } key={ category }
id={ category.id } id={ category }
name={ category.name }
onClick={ onSelect } onClick={ onSelect }
/> />
)) } )) }
......
...@@ -2,21 +2,20 @@ import { Icon, MenuItem } from '@chakra-ui/react'; ...@@ -2,21 +2,20 @@ import { Icon, MenuItem } from '@chakra-ui/react';
import type { FunctionComponent, SVGAttributes } from 'react'; import type { FunctionComponent, SVGAttributes } from 'react';
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import type { MarketplaceCategoriesIds } from 'types/client/apps'; import { AppCategory } from 'types/client/apps';
import starFilledIcon from 'icons/star_filled.svg'; import starFilledIcon from 'icons/star_filled.svg';
type Props = { type Props = {
id: MarketplaceCategoriesIds; id: string;
name: string; onClick: (category: string) => void;
onClick: (category: MarketplaceCategoriesIds) => void;
} }
const ICONS = { const ICONS: Record<string, FunctionComponent<SVGAttributes<SVGElement>>> = {
favorites: starFilledIcon, [AppCategory.FAVORITES]: starFilledIcon,
} as { [key in MarketplaceCategoriesIds]: FunctionComponent<SVGAttributes<SVGElement>> }; };
const CategoriesMenuItem = ({ id, name, onClick }: Props) => { const CategoriesMenuItem = ({ id, onClick }: Props) => {
const handleSelection = useCallback(() => { const handleSelection = useCallback(() => {
onClick(id); onClick(id);
}, [ id, onClick ]); }, [ id, onClick ]);
...@@ -28,11 +27,8 @@ const CategoriesMenuItem = ({ id, name, onClick }: Props) => { ...@@ -28,11 +27,8 @@ const CategoriesMenuItem = ({ id, name, onClick }: Props) => {
display="flex" display="flex"
alignItems="center" alignItems="center"
> >
{ id in ICONS && ( { id in ICONS && <Icon mr={ 3 } as={ ICONS[id] } w={ 4 } h={ 4 } color="blackAlpha.800"/> }
<Icon mr={ 3 } as={ ICONS[id] } w={ 4 } h={ 4 } color="blackAlpha.800"/> { id }
) }
{ name }
</MenuItem> </MenuItem>
); );
}; };
......
import type { MarketplaceCategoriesIds } from 'types/client/apps';
export const APP_CATEGORIES: {[key in MarketplaceCategoriesIds]: string} = {
favorites: 'Favorites',
all: 'All apps',
defi: 'DeFi',
exchanges: 'Exchanges',
finance: 'Finance',
games: 'Games',
marketplaces: 'Marketplaces',
nft: 'NFT',
security: 'Security',
social: 'Social',
tools: 'Tools',
yieldFarming: 'Yield farming',
};
import debounce from 'lodash/debounce'; import { useQuery } from '@tanstack/react-query';
import _unique from 'lodash/uniq';
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import type { AppItemOverview, MarketplaceCategoriesIds } from 'types/client/apps'; import type { AppItemOverview } from 'types/client/apps';
import { AppCategory } from 'types/client/apps';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import type { ResourceError } from 'lib/api/resources';
import useDebounce from 'lib/hooks/useDebounce';
import useApiFetch from 'lib/hooks/useFetch';
const favoriteAppsLocalStorageKey = 'favoriteApps'; const favoriteAppsLocalStorageKey = 'favoriteApps';
...@@ -19,21 +24,26 @@ function isAppNameMatches(q: string, app: AppItemOverview) { ...@@ -19,21 +24,26 @@ function isAppNameMatches(q: string, app: AppItemOverview) {
return app.title.toLowerCase().includes(q.toLowerCase()); return app.title.toLowerCase().includes(q.toLowerCase());
} }
function isAppCategoryMatches(category: MarketplaceCategoriesIds, app: AppItemOverview, favoriteApps: Array<string>) { function isAppCategoryMatches(category: string, app: AppItemOverview, favoriteApps: Array<string>) {
return category === 'all' || return category === AppCategory.ALL ||
(category === 'favorites' && favoriteApps.includes(app.id)) || (category === AppCategory.FAVORITES && favoriteApps.includes(app.id)) ||
app.categories.includes(category); app.categories.includes(category);
} }
export default function useMarketplaceApps() { export default function useMarketplaceApps() {
const [ isLoading, setIsLoading ] = useState(true); const [ selectedAppId, setSelectedAppId ] = useState<string | null>(null);
const [ defaultAppList, setDefaultAppList ] = useState<Array<AppItemOverview>>(); const [ selectedCategoryId, setSelectedCategoryId ] = useState<string>(AppCategory.ALL);
const [ displayedApps, setDisplayedApps ] = useState<Array<AppItemOverview>>([]);
const [ displayedAppId, setDisplayedAppId ] = useState<string | null>(null);
const [ category, setCategory ] = useState<MarketplaceCategoriesIds>('all');
const [ filterQuery, setFilterQuery ] = useState(''); const [ filterQuery, setFilterQuery ] = useState('');
const [ favoriteApps, setFavoriteApps ] = useState<Array<string>>([]); const [ favoriteApps, setFavoriteApps ] = useState<Array<string>>([]);
const apiFetch = useApiFetch();
const { isLoading, isError, error, data } = useQuery<unknown, ResourceError<unknown>, Array<AppItemOverview>>(
[ 'marketplace-apps' ],
async() => apiFetch(appConfig.marketplaceConfigUrl || ''),
{
select: (data) => (data as Array<AppItemOverview>).sort((a, b) => a.title.localeCompare(b.title)),
});
const handleFavoriteClick = useCallback((id: string, isFavorite: boolean) => { const handleFavoriteClick = useCallback((id: string, isFavorite: boolean) => {
const favoriteApps = getFavoriteApps(); const favoriteApps = getFavoriteApps();
...@@ -49,61 +59,53 @@ export default function useMarketplaceApps() { ...@@ -49,61 +59,53 @@ export default function useMarketplaceApps() {
}, [ ]); }, [ ]);
const showAppInfo = useCallback((id: string) => { const showAppInfo = useCallback((id: string) => {
setDisplayedAppId(id); setSelectedAppId(id);
}, []); }, []);
// eslint-disable-next-line react-hooks/exhaustive-deps const debouncedFilterQuery = useDebounce(filterQuery, 500);
const debounceFilterApps = useCallback(debounce(q => setFilterQuery(q), 500), []); const clearSelectedAppId = useCallback(() => setSelectedAppId(null), []);
const clearDisplayedAppId = useCallback(() => setDisplayedAppId(null), []);
const filterApps = useCallback((q: string, category: MarketplaceCategoriesIds) => {
const apps = defaultAppList
?.filter(app => {
return isAppNameMatches(q, app) && isAppCategoryMatches(category, app, favoriteApps);
});
setDisplayedApps(apps || []); const handleCategoryChange = useCallback((newCategory: string) => {
}, [ defaultAppList, favoriteApps ]); setSelectedCategoryId(newCategory);
const handleCategoryChange = useCallback((newCategory: MarketplaceCategoriesIds) => {
setCategory(newCategory);
}, []); }, []);
useEffect(() => { const displayedApps = React.useMemo(() => {
setFavoriteApps(getFavoriteApps()); return data?.filter(app => isAppNameMatches(debouncedFilterQuery, app) && isAppCategoryMatches(selectedCategoryId, app, favoriteApps)) || [];
}, [ ]); }, [ selectedCategoryId, data, debouncedFilterQuery, favoriteApps ]);
useEffect(() => { const categories = React.useMemo(() => {
filterApps(filterQuery, category); return _unique(data?.map(app => app.categories).flat()) || [];
}, [ filterQuery, category, filterApps ]); }, [ data ]);
useEffect(() => { useEffect(() => {
const defaultDisplayedApps = [ ...appConfig.marketplaceAppList ] setFavoriteApps(getFavoriteApps());
.sort((a, b) => a.title.localeCompare(b.title));
setDefaultAppList(defaultDisplayedApps);
setDisplayedApps(defaultDisplayedApps);
setIsLoading(false);
}, [ ]); }, [ ]);
return React.useMemo(() => ({ return React.useMemo(() => ({
category, selectedCategoryId,
handleCategoryChange, onCategoryChange: handleCategoryChange,
debounceFilterApps, onSearchInputChange: setFilterQuery,
isLoading, isLoading,
isError,
error,
categories,
displayedApps, displayedApps,
showAppInfo, showAppInfo,
displayedAppId, selectedAppId,
clearDisplayedAppId, clearSelectedAppId,
favoriteApps, favoriteApps,
handleFavoriteClick, onFavoriteClick: handleFavoriteClick,
}), [ category, }), [
clearDisplayedAppId, selectedCategoryId,
debounceFilterApps, categories,
displayedAppId, displayedApps, clearSelectedAppId,
selectedAppId,
displayedApps,
error,
favoriteApps, favoriteApps,
handleCategoryChange, handleCategoryChange,
handleFavoriteClick, handleFavoriteClick,
isError,
isLoading, isLoading,
showAppInfo, showAppInfo,
]); ]);
......
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import * as depositMock from 'mocks/deposits/deposits'; import * as depositMock from 'mocks/l2deposits/deposits';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
......
...@@ -62,7 +62,7 @@ const LatestDeposits = () => { ...@@ -62,7 +62,7 @@ const LatestDeposits = () => {
} }
if (data) { if (data) {
const depositsUrl = route({ pathname: '/deposits' }); const depositsUrl = route({ pathname: '/l2-deposits' });
return ( return (
<> <>
<SocketNewItemsNotice borderBottomRadius={ 0 } url={ depositsUrl } num={ num } alert={ socketAlert } type="deposit"/> <SocketNewItemsNotice borderBottomRadius={ 0 } url={ depositsUrl } num={ num } alert={ socketAlert } type="deposit"/>
......
...@@ -8,7 +8,7 @@ import { ...@@ -8,7 +8,7 @@ import {
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { DepositsItem } from 'types/api/deposits'; import type { L2DepositsItem } from 'types/api/l2Deposits';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import blockIcon from 'icons/block.svg'; import blockIcon from 'icons/block.svg';
...@@ -20,7 +20,7 @@ import LinkExternal from 'ui/shared/LinkExternal'; ...@@ -20,7 +20,7 @@ import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
type Props = { type Props = {
item: DepositsItem; item: L2DepositsItem;
} }
const LatestTxsItem = ({ item }: Props) => { const LatestTxsItem = ({ item }: Props) => {
......
...@@ -4,6 +4,7 @@ import { ...@@ -4,6 +4,7 @@ import {
HStack, HStack,
Icon, Icon,
Text, Text,
Grid,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
...@@ -32,31 +33,28 @@ const LatestTxsItem = ({ tx }: Props) => { ...@@ -32,31 +33,28 @@ const LatestTxsItem = ({ tx }: Props) => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
if (isMobile) {
return ( return (
<Box <Box
width="100%" width="100%"
borderTop="1px solid" borderTop="1px solid"
borderColor="divider" borderColor="divider"
py={ 4 } py={ 4 }
px={{ base: 0, lg: 4 }}
_last={{ borderBottom: '1px solid', borderColor: 'divider' }} _last={{ borderBottom: '1px solid', borderColor: 'divider' }}
> >
<Flex justifyContent="space-between" width="100%" alignItems="start" flexDirection={{ base: 'column', lg: 'row' }}>
{ !isMobile && <Flex mr={ 3 }><TxAdditionalInfo tx={ tx }/></Flex> }
<Box width={{ base: '100%', lg: 'calc(50% - 32px)' }}>
<Flex justifyContent="space-between"> <Flex justifyContent="space-between">
<HStack> <HStack>
<TxType types={ tx.tx_types }/> <TxType types={ tx.tx_types }/>
<TxStatus status={ tx.status } errorText={ tx.status === 'error' ? tx.result : undefined }/> <TxStatus status={ tx.status } errorText={ tx.status === 'error' ? tx.result : undefined }/>
</HStack> </HStack>
{ isMobile && <TxAdditionalInfo tx={ tx } isMobile/> } <TxAdditionalInfo tx={ tx } isMobile/>
</Flex> </Flex>
<Flex <Flex
mt={ 2 } mt={ 2 }
alignItems="center" alignItems="center"
width="100%" width="100%"
justifyContent={{ base: 'space-between', lg: 'start' }} justifyContent="space-between"
mb={{ base: 6, lg: 0 }} mb={ 6 }
> >
<Flex mr={ 3 }> <Flex mr={ 3 }>
<Icon <Icon
...@@ -76,9 +74,7 @@ const LatestTxsItem = ({ tx }: Props) => { ...@@ -76,9 +74,7 @@ const LatestTxsItem = ({ tx }: Props) => {
</Flex> </Flex>
{ tx.timestamp && <Text variant="secondary" fontWeight="400" fontSize="sm">{ timeAgo }</Text> } { tx.timestamp && <Text variant="secondary" fontWeight="400" fontSize="sm">{ timeAgo }</Text> }
</Flex> </Flex>
</Box> <Flex alignItems="center" mb={ 3 }>
<Box width={{ base: '100%', lg: '50%' }}>
<Flex alignItems="center" mb={ 3 } justifyContent={{ base: 'start', lg: 'end' }}>
<Address> <Address>
<AddressIcon address={ tx.from }/> <AddressIcon address={ tx.from }/>
<AddressLink <AddressLink
...@@ -112,18 +108,102 @@ const LatestTxsItem = ({ tx }: Props) => { ...@@ -112,18 +108,102 @@ const LatestTxsItem = ({ tx }: Props) => {
</Address> </Address>
) } ) }
</Flex> </Flex>
<Flex fontSize="sm" justifyContent="end" flexDirection={{ base: 'column', lg: 'row' }}> <Box mb={ 2 } fontSize="sm">
<Box mr={{ base: 0, lg: 3 }} mb={{ base: 2, lg: 0 }}>
<Text as="span">Value { appConfig.network.currency.symbol } </Text> <Text as="span">Value { appConfig.network.currency.symbol } </Text>
<Text as="span" variant="secondary">{ getValueWithUnit(tx.value).dp(5).toFormat() }</Text> <Text as="span" variant="secondary">{ getValueWithUnit(tx.value).dp(5).toFormat() }</Text>
</Box> </Box>
<Box> <Box fontSize="sm">
<Text as="span">Fee { appConfig.network.currency.symbol } </Text> <Text as="span">Fee { appConfig.network.currency.symbol } </Text>
<Text as="span" variant="secondary">{ getValueWithUnit(tx.fee.value).dp(5).toFormat() }</Text> <Text as="span" variant="secondary">{ getValueWithUnit(tx.fee.value).dp(5).toFormat() }</Text>
</Box> </Box>
</Box>
);
}
return (
<Box
width="100%"
minW="700px"
borderTop="1px solid"
borderColor="divider"
p={ 4 }
_last={{ borderBottom: '1px solid', borderColor: 'divider' }}
>
<Grid width="100%" gridTemplateColumns="3fr 2fr 150px" gridGap={ 8 }>
<Flex overflow="hidden" w="100%">
<TxAdditionalInfo tx={ tx }/>
<Box ml={ 3 } w="calc(100% - 40px)">
<HStack>
<TxType types={ tx.tx_types }/>
<TxStatus status={ tx.status } errorText={ tx.status === 'error' ? tx.result : undefined }/>
</HStack>
<Flex
mt={ 2 }
alignItems="center"
>
<Icon
as={ transactionIcon }
boxSize="30px"
color="link"
display="inline"
mr={ 2 }
/>
<Address overflow="hidden" w="calc(100% - 130px)" maxW="calc(100% - 130px)" mr={ 2 }>
<AddressLink
hash={ tx.hash }
type="transaction"
fontWeight="700"
/>
</Address>
{ tx.timestamp && <Text variant="secondary" fontWeight="400" fontSize="sm">{ timeAgo }</Text> }
</Flex> </Flex>
</Box> </Box>
</Flex> </Flex>
<Grid alignItems="center" templateColumns="24px auto">
<Icon
as={ rightArrowIcon }
boxSize={ 6 }
color="gray.500"
transform="rotate(90deg)"
/>
<Box overflow="hidden" ml={ 1 }>
<Address mb={ 2 }>
<AddressIcon address={ tx.from }/>
<AddressLink
type="address"
hash={ tx.from.hash }
alias={ tx.from.name }
fontWeight="500"
ml={ 2 }
fontSize="sm"
/>
</Address>
{ dataTo && (
<Address>
<AddressIcon address={ dataTo }/>
<AddressLink
type="address"
hash={ dataTo.hash }
alias={ dataTo.name }
fontWeight="500"
ml={ 2 }
fontSize="sm"
/>
</Address>
) }
</Box>
</Grid>
<Box>
<Box mb={ 2 }>
<Text as="span" whiteSpace="pre">{ appConfig.network.currency.symbol } </Text>
<Text as="span" variant="secondary">{ getValueWithUnit(tx.value).dp(5).toFormat() }</Text>
</Box>
<Box>
<Text as="span">Fee </Text>
<Text as="span" variant="secondary">{ getValueWithUnit(tx.fee.value).dp(5).toFormat() }</Text>
</Box>
</Box>
</Grid>
</Box> </Box>
); );
}; };
......
...@@ -17,8 +17,7 @@ const LatestTxsItemSkeleton = () => { ...@@ -17,8 +17,7 @@ const LatestTxsItemSkeleton = () => {
px={{ base: 0, lg: 4 }} px={{ base: 0, lg: 4 }}
_last={{ borderBottom: '1px solid', borderColor: 'divider' }} _last={{ borderBottom: '1px solid', borderColor: 'divider' }}
> >
<Flex justifyContent="space-between" width="100%" alignItems="start" flexDirection={{ base: 'column', lg: 'row' }}> <Box width="100%" display={{ base: 'block', lg: 'none' }}>
<Box width="100%">
<HStack spacing={ 2 }> <HStack spacing={ 2 }>
<Skeleton w="101px" h="24px"/> <Skeleton w="101px" h="24px"/>
<Skeleton w="101px" h="24px"/> <Skeleton w="101px" h="24px"/>
...@@ -27,8 +26,8 @@ const LatestTxsItemSkeleton = () => { ...@@ -27,8 +26,8 @@ const LatestTxsItemSkeleton = () => {
mt={ 2 } mt={ 2 }
alignItems="center" alignItems="center"
width="100%" width="100%"
justifyContent={{ base: 'space-between', lg: 'start' }} justifyContent="space-between"
mb={{ base: 6, lg: 0 }} mb={ 6 }
> >
<Flex mr={ 3 } alignItems="center"> <Flex mr={ 3 } alignItems="center">
<Skeleton w="30px" h="30px" mr={ 2 }/> <Skeleton w="30px" h="30px" mr={ 2 }/>
...@@ -36,20 +35,45 @@ const LatestTxsItemSkeleton = () => { ...@@ -36,20 +35,45 @@ const LatestTxsItemSkeleton = () => {
</Flex> </Flex>
<Skeleton w="40px" h="12px"/> <Skeleton w="40px" h="12px"/>
</Flex> </Flex>
</Box>
<Box>
<Flex alignItems="center" mb={ 3 }> <Flex alignItems="center" mb={ 3 }>
<SkeletonCircle w="30px" h="30px" mr={ 2 }/> <SkeletonCircle w="30px" h="30px" mr={ 2 }/>
<Skeleton w="101px" h="12px" mr={ 5 }/> <Skeleton w="101px" h="12px" mr={ 5 }/>
<SkeletonCircle w="30px" h="30px" mr={ 2 }/> <SkeletonCircle w="30px" h="30px" mr={ 2 }/>
<Skeleton w="101px" h="12px"/> <Skeleton w="101px" h="12px"/>
</Flex> </Flex>
<Flex fontSize="sm" mt={ 3 } justifyContent="end" flexDirection={{ base: 'column', lg: 'row' }}> <Skeleton w="123px" h="12px" mb={ 2 } mt={ 3 }/>
<Skeleton w="123px" h="12px" mr={{ base: 0, lg: 9 }} mb={{ base: 2, lg: 0 }}/>
<Skeleton w="123px" h="12px"/> <Skeleton w="123px" h="12px"/>
</Box>
<Box display={{ base: 'none', lg: 'grid' }} width="100%" gridTemplateColumns="3fr 2fr 150px" gridGap={ 8 }>
<Flex w="100%">
<Skeleton w={ 5 } h={ 5 } mr={ 3 }/>
<Box w="100%">
<HStack>
<Skeleton w="101px" h="24px"/>
<Skeleton w="101px" h="24px"/>
</HStack>
<Flex alignItems="center" mt={ 2 }>
<Skeleton w="30px" h="30px" mr={ 2 }/>
<Skeleton w="calc(100% - 100px)" h="20px" mr={ 5 }/>
<Skeleton w="40px" h="16px"/>
</Flex> </Flex>
</Box> </Box>
</Flex> </Flex>
<Box>
<Flex alignItems="center" mb={ 2 } mt={ 1 }>
<SkeletonCircle w="24px" h="24px" mr={ 2 }/>
<Skeleton w="100%" h="16px"/>
</Flex>
<Flex alignItems="center">
<SkeletonCircle w="24px" h="24px" mr={ 2 }/>
<Skeleton w="100%" h="16px"/>
</Flex>
</Box>
<Box>
<Skeleton w="123px" h="16px" mb={ 4 } mt={ 2 }/>
<Skeleton w="123px" h="16px"/>
</Box>
</Box>
</Box> </Box>
); );
}; };
......
...@@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js'; ...@@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { DepositsItem } from 'types/api/deposits'; import type { L2DepositsItem } from 'types/api/l2Deposits';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import blockIcon from 'icons/block.svg'; import blockIcon from 'icons/block.svg';
...@@ -15,7 +15,7 @@ import LinkExternal from 'ui/shared/LinkExternal'; ...@@ -15,7 +15,7 @@ import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid'; import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid';
type Props = { item: DepositsItem }; type Props = { item: L2DepositsItem };
const DepositsListItem = ({ item }: Props) => { const DepositsListItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_block_timestamp).fromNow(); const timeAgo = dayjs(item.l1_block_timestamp).fromNow();
......
import { Table, Tbody, Th, Tr } from '@chakra-ui/react'; import { Table, Tbody, Th, Tr } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { DepositsItem } from 'types/api/deposits'; import type { L2DepositsItem } from 'types/api/l2Deposits';
import { default as Thead } from 'ui/shared/TheadSticky'; import { default as Thead } from 'ui/shared/TheadSticky';
import DepositsTableItem from './DepositsTableItem'; import DepositsTableItem from './DepositsTableItem';
type Props = { type Props = {
items: Array<DepositsItem>; items: Array<L2DepositsItem>;
top: number; top: number;
} }
......
...@@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js'; ...@@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { DepositsItem } from 'types/api/deposits'; import type { L2DepositsItem } from 'types/api/l2Deposits';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import blockIcon from 'icons/block.svg'; import blockIcon from 'icons/block.svg';
...@@ -14,7 +14,7 @@ import HashStringShorten from 'ui/shared/HashStringShorten'; ...@@ -14,7 +14,7 @@ import HashStringShorten from 'ui/shared/HashStringShorten';
import LinkExternal from 'ui/shared/LinkExternal'; import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
type Props = { item: DepositsItem }; type Props = { item: L2DepositsItem };
const WithdrawalsTableItem = ({ item }: Props) => { const WithdrawalsTableItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_block_timestamp).fromNow(); const timeAgo = dayjs(item.l1_block_timestamp).fromNow();
......
...@@ -2,7 +2,7 @@ import { Box, Flex, Text, Icon } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Flex, Text, Icon } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { OutputRootsItem } from 'types/api/outputRoots'; import type { L2OutputRootsItem } from 'types/api/l2OutputRoots';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -13,7 +13,7 @@ import LinkExternal from 'ui/shared/LinkExternal'; ...@@ -13,7 +13,7 @@ import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid'; import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid';
type Props = { item: OutputRootsItem }; type Props = { item: L2OutputRootsItem };
const OutputRootsListItem = ({ item }: Props) => { const OutputRootsListItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_timestamp).fromNow(); const timeAgo = dayjs(item.l1_timestamp).fromNow();
......
import { Table, Tbody, Th, Tr } from '@chakra-ui/react'; import { Table, Tbody, Th, Tr } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { OutputRootsItem } from 'types/api/outputRoots'; import type { L2OutputRootsItem } from 'types/api/l2OutputRoots';
import { default as Thead } from 'ui/shared/TheadSticky'; import { default as Thead } from 'ui/shared/TheadSticky';
import OutputRootsTableItem from './OutputRootsTableItem'; import OutputRootsTableItem from './OutputRootsTableItem';
type Props = { type Props = {
items: Array<OutputRootsItem>; items: Array<L2OutputRootsItem>;
top: number; top: number;
} }
......
...@@ -2,7 +2,7 @@ import { Box, Flex, Td, Tr, Text, Icon } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Flex, Td, Tr, Text, Icon } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { OutputRootsItem } from 'types/api/outputRoots'; import type { L2OutputRootsItem } from 'types/api/l2OutputRoots';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -13,7 +13,7 @@ import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic'; ...@@ -13,7 +13,7 @@ import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic';
import LinkExternal from 'ui/shared/LinkExternal'; import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
type Props = { item: OutputRootsItem }; type Props = { item: L2OutputRootsItem };
const OutputRootsTableItem = ({ item }: Props) => { const OutputRootsTableItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_timestamp).fromNow(); const timeAgo = dayjs(item.l1_timestamp).fromNow();
......
...@@ -2,7 +2,7 @@ import { Box, Icon, VStack } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Icon, VStack } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { TxnBatchesItem } from 'types/api/txnBatches'; import type { L2TxnBatchesItem } from 'types/api/l2TxnBatches';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -13,7 +13,7 @@ import LinkExternal from 'ui/shared/LinkExternal'; ...@@ -13,7 +13,7 @@ import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid'; import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid';
type Props = { item: TxnBatchesItem }; type Props = { item: L2TxnBatchesItem };
const TxnBatchesListItem = ({ item }: Props) => { const TxnBatchesListItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_timestamp).fromNow(); const timeAgo = dayjs(item.l1_timestamp).fromNow();
......
import { Table, Tbody, Th, Tr } from '@chakra-ui/react'; import { Table, Tbody, Th, Tr } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { TxnBatchesItem } from 'types/api/txnBatches'; import type { L2TxnBatchesItem } from 'types/api/l2TxnBatches';
import { default as Thead } from 'ui/shared/TheadSticky'; import { default as Thead } from 'ui/shared/TheadSticky';
import TxnBatchesTableItem from './TxnBatchesTableItem'; import TxnBatchesTableItem from './TxnBatchesTableItem';
type Props = { type Props = {
items: Array<TxnBatchesItem>; items: Array<L2TxnBatchesItem>;
top: number; top: number;
} }
......
...@@ -2,7 +2,7 @@ import { Box, Td, Tr, Text, Icon, VStack } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Td, Tr, Text, Icon, VStack } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { TxnBatchesItem } from 'types/api/txnBatches'; import type { L2TxnBatchesItem } from 'types/api/l2TxnBatches';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -12,7 +12,7 @@ import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic'; ...@@ -12,7 +12,7 @@ import HashStringShortenDynamic from 'ui/shared/HashStringShortenDynamic';
import LinkExternal from 'ui/shared/LinkExternal'; import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
type Props = { item: TxnBatchesItem }; type Props = { item: L2TxnBatchesItem };
const TxnBatchesTableItem = ({ item }: Props) => { const TxnBatchesTableItem = ({ item }: Props) => {
const timeAgo = dayjs(item.l1_timestamp).fromNow(); const timeAgo = dayjs(item.l1_timestamp).fromNow();
......
...@@ -2,7 +2,7 @@ import { Box, Icon } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Icon } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { WithdrawalsItem } from 'types/api/withdrawals'; import type { L2WithdrawalsItem } from 'types/api/l2Withdrawals';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -15,7 +15,7 @@ import LinkExternal from 'ui/shared/LinkExternal'; ...@@ -15,7 +15,7 @@ import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid'; import ListItemMobileGrid from 'ui/shared/ListItemMobile/ListItemMobileGrid';
type Props = { item: WithdrawalsItem }; type Props = { item: L2WithdrawalsItem };
const WithdrawalsListItem = ({ item }: Props) => { const WithdrawalsListItem = ({ item }: Props) => {
const timeAgo = item.l2_timestamp ? dayjs(item.l2_timestamp).fromNow() : null; const timeAgo = item.l2_timestamp ? dayjs(item.l2_timestamp).fromNow() : null;
......
import { Table, Tbody, Th, Tr } from '@chakra-ui/react'; import { Table, Tbody, Th, Tr } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { WithdrawalsItem } from 'types/api/withdrawals'; import type { L2WithdrawalsItem } from 'types/api/l2Withdrawals';
import { default as Thead } from 'ui/shared/TheadSticky'; import { default as Thead } from 'ui/shared/TheadSticky';
import WithdrawalsTableItem from './WithdrawalsTableItem'; import WithdrawalsTableItem from './WithdrawalsTableItem';
type Props = { type Props = {
items: Array<WithdrawalsItem>; items: Array<L2WithdrawalsItem>;
top: number; top: number;
} }
......
...@@ -2,7 +2,7 @@ import { Box, Td, Tr, Text, Icon } from '@chakra-ui/react'; ...@@ -2,7 +2,7 @@ import { Box, Td, Tr, Text, Icon } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import type { WithdrawalsItem } from 'types/api/withdrawals'; import type { L2WithdrawalsItem } from 'types/api/l2Withdrawals';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import txIcon from 'icons/transactions.svg'; import txIcon from 'icons/transactions.svg';
...@@ -14,7 +14,7 @@ import HashStringShorten from 'ui/shared/HashStringShorten'; ...@@ -14,7 +14,7 @@ import HashStringShorten from 'ui/shared/HashStringShorten';
import LinkExternal from 'ui/shared/LinkExternal'; import LinkExternal from 'ui/shared/LinkExternal';
import LinkInternal from 'ui/shared/LinkInternal'; import LinkInternal from 'ui/shared/LinkInternal';
type Props = { item: WithdrawalsItem }; type Props = { item: L2WithdrawalsItem };
const WithdrawalsTableItem = ({ item }: Props) => { const WithdrawalsTableItem = ({ item }: Props) => {
const timeAgo = item.l2_timestamp ? dayjs(item.l2_timestamp).fromNow() : 'N/A'; const timeAgo = item.l2_timestamp ? dayjs(item.l2_timestamp).fromNow() : 'N/A';
......
...@@ -5,6 +5,7 @@ import config from 'configs/app/config'; ...@@ -5,6 +5,7 @@ import config from 'configs/app/config';
import PlusIcon from 'icons/plus.svg'; import PlusIcon from 'icons/plus.svg';
import AppList from 'ui/apps/AppList'; import AppList from 'ui/apps/AppList';
import AppListSkeleton from 'ui/apps/AppListSkeleton'; import AppListSkeleton from 'ui/apps/AppListSkeleton';
import AppModal from 'ui/apps/AppModal';
import CategoriesMenu from 'ui/apps/CategoriesMenu'; import CategoriesMenu from 'ui/apps/CategoriesMenu';
import FilterInput from 'ui/shared/filters/FilterInput'; import FilterInput from 'ui/shared/filters/FilterInput';
...@@ -13,17 +14,26 @@ import useMarketplaceApps from '../apps/useMarketplaceApps'; ...@@ -13,17 +14,26 @@ import useMarketplaceApps from '../apps/useMarketplaceApps';
const Apps = () => { const Apps = () => {
const { const {
isLoading, isLoading,
category, isError,
handleCategoryChange, error,
debounceFilterApps, selectedCategoryId,
categories,
onCategoryChange,
onSearchInputChange,
showAppInfo, showAppInfo,
displayedApps, displayedApps,
displayedAppId, selectedAppId,
clearDisplayedAppId, clearSelectedAppId,
favoriteApps, favoriteApps,
handleFavoriteClick, onFavoriteClick,
} = useMarketplaceApps(); } = useMarketplaceApps();
if (isError) {
throw new Error('Unable to get apps list', { cause: error });
}
const selectedApp = displayedApps.find(app => app.id === selectedAppId);
return ( return (
<> <>
<Box <Box
...@@ -31,21 +41,29 @@ const Apps = () => { ...@@ -31,21 +41,29 @@ const Apps = () => {
flexDirection={{ base: 'column', sm: 'row' }} flexDirection={{ base: 'column', sm: 'row' }}
> >
<CategoriesMenu <CategoriesMenu
selectedCategoryId={ category } categories={ categories }
onSelect={ handleCategoryChange } selectedCategoryId={ selectedCategoryId }
onSelect={ onCategoryChange }
/> />
<FilterInput onChange={ debounceFilterApps } marginBottom={{ base: '4', lg: '6' }} placeholder="Find app"/> <FilterInput onChange={ onSearchInputChange } marginBottom={{ base: '4', lg: '6' }} placeholder="Find app"/>
</Box> </Box>
{ isLoading ? <AppListSkeleton/> : ( { isLoading ? <AppListSkeleton/> : (
<AppList <AppList
apps={ displayedApps } apps={ displayedApps }
onAppClick={ showAppInfo } onAppClick={ showAppInfo }
displayedAppId={ displayedAppId }
onModalClose={ clearDisplayedAppId }
favoriteApps={ favoriteApps } favoriteApps={ favoriteApps }
onFavoriteClick={ handleFavoriteClick } onFavoriteClick={ onFavoriteClick }
/>
) }
{ selectedApp && (
<AppModal
onClose={ clearSelectedAppId }
isFavorite={ favoriteApps.includes(selectedApp.id) }
onFavoriteClick={ onFavoriteClick }
data={ selectedApp }
/> />
) } ) }
......
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect, devices } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import * as blockMock from 'mocks/blocks/block'; import * as blockMock from 'mocks/blocks/block';
...@@ -11,7 +11,7 @@ import insertAdPlaceholder from 'playwright/utils/insertAdPlaceholder'; ...@@ -11,7 +11,7 @@ import insertAdPlaceholder from 'playwright/utils/insertAdPlaceholder';
import Home from './Home'; import Home from './Home';
test('default view -@default +@desktop-xl +@mobile +@dark-mode', async({ mount, page }) => { test('default view -@default +@desktop-xl +@dark-mode', async({ mount, page }) => {
await page.route(buildApiUrl('homepage_stats'), (route) => route.fulfill({ await page.route(buildApiUrl('homepage_stats'), (route) => route.fulfill({
status: 200, status: 200,
body: JSON.stringify(statsMock.base), body: JSON.stringify(statsMock.base),
...@@ -46,3 +46,44 @@ test('default view -@default +@desktop-xl +@mobile +@dark-mode', async({ mount, ...@@ -46,3 +46,44 @@ test('default view -@default +@desktop-xl +@mobile +@dark-mode', async({ mount,
await expect(component.locator('main')).toHaveScreenshot(); await expect(component.locator('main')).toHaveScreenshot();
}); });
// had to separate mobile test, otherwise all the tests fell on CI
test.describe('mobile', () => {
test.use({ viewport: devices['iPhone 13 Pro'].viewport });
test('base view', async({ mount, page }) => {
await page.route(buildApiUrl('homepage_stats'), (route) => route.fulfill({
status: 200,
body: JSON.stringify(statsMock.base),
}));
await page.route(buildApiUrl('homepage_blocks'), (route) => route.fulfill({
status: 200,
body: JSON.stringify([
blockMock.base,
blockMock.base2,
]),
}));
await page.route(buildApiUrl('homepage_txs'), (route) => route.fulfill({
status: 200,
body: JSON.stringify([
txMock.base,
txMock.withContractCreation,
txMock.withTokenTransfer,
]),
}));
await page.route(buildApiUrl('homepage_chart_txs'), (route) => route.fulfill({
status: 200,
body: JSON.stringify(dailyTxsMock.base),
}));
const component = await mount(
<TestApp>
<Home/>
</TestApp>,
);
await insertAdPlaceholder(page);
await expect(component.locator('main')).toHaveScreenshot();
});
});
...@@ -17,7 +17,7 @@ const Home = () => { ...@@ -17,7 +17,7 @@ const Home = () => {
<Page isHomePage> <Page isHomePage>
<Box <Box
w="100%" w="100%"
backgroundImage={ appConfig.homepage.plateGradient } backgroundImage={ appConfig.homepage.plate.gradient }
backgroundColor="blue.400" backgroundColor="blue.400"
borderRadius="24px" borderRadius="24px"
padding={{ base: '24px', lg: '48px' }} padding={{ base: '24px', lg: '48px' }}
...@@ -29,7 +29,7 @@ const Home = () => { ...@@ -29,7 +29,7 @@ const Home = () => {
size={{ base: 'md', lg: 'xl' }} size={{ base: 'md', lg: 'xl' }}
lineHeight={{ base: '32px', lg: '50px' }} lineHeight={{ base: '32px', lg: '50px' }}
fontWeight={ 600 } fontWeight={ 600 }
color="white" color={ appConfig.homepage.plate.textColor }
> >
Welcome to { appConfig.network.name } explorer Welcome to { appConfig.network.name } explorer
</Heading> </Heading>
...@@ -39,7 +39,7 @@ const Home = () => { ...@@ -39,7 +39,7 @@ const Home = () => {
columnGap={ 12 } columnGap={ 12 }
pl={ 4 } pl={ 4 }
> >
<ColorModeToggler trackBg="whiteAlpha.500"/> <ColorModeToggler trackBg="blackAlpha.900"/>
{ appConfig.isAccountSupported && <ProfileMenuDesktop/> } { appConfig.isAccountSupported && <ProfileMenuDesktop/> }
</Flex> </Flex>
</Flex> </Flex>
......
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import { data as depositsData } from 'mocks/deposits/deposits'; import { data as depositsData } from 'mocks/l2deposits/deposits';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
import Deposits from './Deposits'; import L2Deposits from './L2Deposits';
const DEPOSITS_API_URL = buildApiUrl('deposits'); const DEPOSITS_API_URL = buildApiUrl('l2_deposits');
const DEPOSITS_COUNT_API_URL = buildApiUrl('deposits_count'); const DEPOSITS_COUNT_API_URL = buildApiUrl('l2_deposits_count');
test('base view +@mobile', async({ mount, page }) => { test('base view +@mobile', async({ mount, page }) => {
await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({ await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({
...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => { ...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Deposits/> <L2Deposits/>
</TestApp>, </TestApp>,
); );
......
...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery'; ...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import useQueryWithPages from 'lib/hooks/useQueryWithPages'; import useQueryWithPages from 'lib/hooks/useQueryWithPages';
import { rightLineArrow, nbsp } from 'lib/html-entities'; import { rightLineArrow, nbsp } from 'lib/html-entities';
import DepositsListItem from 'ui/deposits/DepositsListItem'; import DepositsListItem from 'ui/l2Deposits/DepositsListItem';
import DepositsTable from 'ui/deposits/DepositsTable'; import DepositsTable from 'ui/l2Deposits/DepositsTable';
import ActionBar from 'ui/shared/ActionBar'; import ActionBar from 'ui/shared/ActionBar';
import DataListDisplay from 'ui/shared/DataListDisplay'; import DataListDisplay from 'ui/shared/DataListDisplay';
import Page from 'ui/shared/Page/Page'; import Page from 'ui/shared/Page/Page';
import PageTitle from 'ui/shared/Page/PageTitle'; import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/Pagination'; import Pagination from 'ui/shared/Pagination';
const Deposits = () => { const L2Deposits = () => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({ const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({
resourceName: 'deposits', resourceName: 'l2_deposits',
}); });
const countersQuery = useApiQuery('deposits_count'); const countersQuery = useApiQuery('l2_deposits_count');
const content = data?.items ? ( const content = data?.items ? (
<> <>
...@@ -82,4 +82,4 @@ const Deposits = () => { ...@@ -82,4 +82,4 @@ const Deposits = () => {
); );
}; };
export default Deposits; export default L2Deposits;
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import { outputRootsData } from 'mocks/outputRoots/outputRoots'; import { outputRootsData } from 'mocks/l2outputRoots/outputRoots';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
import OutputRoots from './OutputRoots'; import OutputRoots from './L2OutputRoots';
const OUTPUT_ROOTS_API_URL = buildApiUrl('output_roots'); const OUTPUT_ROOTS_API_URL = buildApiUrl('l2_output_roots');
const OUTPUT_ROOTS_COUNT_API_URL = buildApiUrl('output_roots_count'); const OUTPUT_ROOTS_COUNT_API_URL = buildApiUrl('l2_output_roots_count');
test('base view +@mobile', async({ mount, page }) => { test('base view +@mobile', async({ mount, page }) => {
await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({ await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({
......
...@@ -4,22 +4,22 @@ import React from 'react'; ...@@ -4,22 +4,22 @@ import React from 'react';
import useApiQuery from 'lib/api/useApiQuery'; import useApiQuery from 'lib/api/useApiQuery';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import useQueryWithPages from 'lib/hooks/useQueryWithPages'; import useQueryWithPages from 'lib/hooks/useQueryWithPages';
import OutputRootsListItem from 'ui/outputRoots/OutputRootsListItem'; import OutputRootsListItem from 'ui/l2OutputRoots/OutputRootsListItem';
import OutputRootsTable from 'ui/outputRoots/OutputRootsTable'; import OutputRootsTable from 'ui/l2OutputRoots/OutputRootsTable';
import ActionBar from 'ui/shared/ActionBar'; import ActionBar from 'ui/shared/ActionBar';
import DataListDisplay from 'ui/shared/DataListDisplay'; import DataListDisplay from 'ui/shared/DataListDisplay';
import Page from 'ui/shared/Page/Page'; import Page from 'ui/shared/Page/Page';
import PageTitle from 'ui/shared/Page/PageTitle'; import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/Pagination'; import Pagination from 'ui/shared/Pagination';
const OutputRoots = () => { const L2OutputRoots = () => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({ const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({
resourceName: 'output_roots', resourceName: 'l2_output_roots',
}); });
const countersQuery = useApiQuery('output_roots_count'); const countersQuery = useApiQuery('l2_output_roots_count');
const content = data?.items ? ( const content = data?.items ? (
<> <>
...@@ -84,4 +84,4 @@ const OutputRoots = () => { ...@@ -84,4 +84,4 @@ const OutputRoots = () => {
); );
}; };
export default OutputRoots; export default L2OutputRoots;
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import { txnBatchesData } from 'mocks/txnBatches/txnBatches'; import { txnBatchesData } from 'mocks/l2txnBatches/txnBatches';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
import TxnBatches from './TxnBatches'; import L2TxnBatches from './L2TxnBatches';
const TXN_BATCHES_API_URL = buildApiUrl('txn_batches'); const TXN_BATCHES_API_URL = buildApiUrl('l2_txn_batches');
const TXN_BATCHES_COUNT_API_URL = buildApiUrl('txn_batches_count'); const TXN_BATCHES_COUNT_API_URL = buildApiUrl('l2_txn_batches_count');
test('base view +@mobile', async({ mount, page }) => { test('base view +@mobile', async({ mount, page }) => {
await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({ await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({
...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => { ...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<TxnBatches/> <L2TxnBatches/>
</TestApp>, </TestApp>,
); );
......
...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery'; ...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import useQueryWithPages from 'lib/hooks/useQueryWithPages'; import useQueryWithPages from 'lib/hooks/useQueryWithPages';
import { nbsp } from 'lib/html-entities'; import { nbsp } from 'lib/html-entities';
import TxnBatchesListItem from 'ui/l2TxnBatches/TxnBatchesListItem';
import TxnBatchesTable from 'ui/l2TxnBatches/TxnBatchesTable';
import ActionBar from 'ui/shared/ActionBar'; import ActionBar from 'ui/shared/ActionBar';
import DataListDisplay from 'ui/shared/DataListDisplay'; import DataListDisplay from 'ui/shared/DataListDisplay';
import Page from 'ui/shared/Page/Page'; import Page from 'ui/shared/Page/Page';
import PageTitle from 'ui/shared/Page/PageTitle'; import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/Pagination'; import Pagination from 'ui/shared/Pagination';
import TxnBatchesListItem from 'ui/txnBatches/TxnBatchesListItem';
import TxnBatchesTable from 'ui/txnBatches/TxnBatchesTable';
const TxnBatches = () => { const L2TxnBatches = () => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({ const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({
resourceName: 'txn_batches', resourceName: 'l2_txn_batches',
}); });
const countersQuery = useApiQuery('txn_batches_count'); const countersQuery = useApiQuery('l2_txn_batches_count');
const content = data?.items ? ( const content = data?.items ? (
<> <>
...@@ -85,4 +85,4 @@ const TxnBatches = () => { ...@@ -85,4 +85,4 @@ const TxnBatches = () => {
); );
}; };
export default TxnBatches; export default L2TxnBatches;
import { test, expect } from '@playwright/experimental-ct-react'; import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import { data as withdrawalsData } from 'mocks/withdrawals/withdrawals'; import { data as withdrawalsData } from 'mocks/l2withdrawals/withdrawals';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
import Withdrawals from './Withdrawals'; import L2Withdrawals from './L2Withdrawals';
const WITHDRAWALS_API_URL = buildApiUrl('withdrawals'); const WITHDRAWALS_API_URL = buildApiUrl('l2_withdrawals');
const WITHDRAWALS_COUNT_API_URL = buildApiUrl('withdrawals_count'); const WITHDRAWALS_COUNT_API_URL = buildApiUrl('l2_withdrawals_count');
test('base view +@mobile', async({ mount, page }) => { test('base view +@mobile', async({ mount, page }) => {
await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({ await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({
...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => { ...@@ -28,7 +28,7 @@ test('base view +@mobile', async({ mount, page }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Withdrawals/> <L2Withdrawals/>
</TestApp>, </TestApp>,
); );
......
...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery'; ...@@ -5,22 +5,22 @@ import useApiQuery from 'lib/api/useApiQuery';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import useQueryWithPages from 'lib/hooks/useQueryWithPages'; import useQueryWithPages from 'lib/hooks/useQueryWithPages';
import { rightLineArrow, nbsp } from 'lib/html-entities'; import { rightLineArrow, nbsp } from 'lib/html-entities';
import WithdrawalsListItem from 'ui/l2Withdrawals/WithdrawalsListItem';
import WithdrawalsTable from 'ui/l2Withdrawals/WithdrawalsTable';
import ActionBar from 'ui/shared/ActionBar'; import ActionBar from 'ui/shared/ActionBar';
import DataListDisplay from 'ui/shared/DataListDisplay'; import DataListDisplay from 'ui/shared/DataListDisplay';
import Page from 'ui/shared/Page/Page'; import Page from 'ui/shared/Page/Page';
import PageTitle from 'ui/shared/Page/PageTitle'; import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/Pagination'; import Pagination from 'ui/shared/Pagination';
import WithdrawalsListItem from 'ui/withdrawals/WithdrawalsListItem';
import WithdrawalsTable from 'ui/withdrawals/WithdrawalsTable';
const Withdrawals = () => { const L2Withdrawals = () => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({ const { data, isError, isLoading, isPaginationVisible, pagination } = useQueryWithPages({
resourceName: 'withdrawals', resourceName: 'l2_withdrawals',
}); });
const countersQuery = useApiQuery('withdrawals_count'); const countersQuery = useApiQuery('l2_withdrawals_count');
const content = data?.items ? ( const content = data?.items ? (
<> <>
...@@ -82,4 +82,4 @@ const Withdrawals = () => { ...@@ -82,4 +82,4 @@ const Withdrawals = () => {
); );
}; };
export default Withdrawals; export default L2Withdrawals;
import { Box, Center, useColorMode } from '@chakra-ui/react'; import { Box, Center, useColorMode } from '@chakra-ui/react';
import { useQuery } from '@tanstack/react-query';
import { useRouter } from 'next/router';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React, { useCallback, useEffect, useRef, useState } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react';
import type { AppItemOverview } from 'types/client/apps'; import type { AppItemOverview } from 'types/client/apps';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import type { ResourceError } from 'lib/api/resources';
import useApiFetch from 'lib/hooks/useFetch';
import getQueryParamString from 'lib/router/getQueryParamString';
import ContentLoader from 'ui/shared/ContentLoader'; import ContentLoader from 'ui/shared/ContentLoader';
import Page from 'ui/shared/Page/Page';
type Props = { const IFRAME_SANDBOX_ATTRIBUTE = 'allow-forms allow-orientation-lock ' +
app?: AppItemOverview; 'allow-pointer-lock allow-popups-to-escape-sandbox ' +
isLoading: boolean; 'allow-same-origin allow-scripts ' +
} 'allow-top-navigation-by-user-activation allow-popups';
const IFRAME_ALLOW_ATTRIBUTE = 'clipboard-read; clipboard-write;';
const MarketplaceApp = () => {
const ref = useRef<HTMLIFrameElement>(null);
const apiFetch = useApiFetch();
const router = useRouter();
const id = getQueryParamString(router.query.id);
const { isLoading, isError, error, data } = useQuery<unknown, ResourceError<unknown>, AppItemOverview>(
[ 'marketplace-apps', id ],
async() => {
const result = await apiFetch<Array<AppItemOverview>, unknown>(appConfig.marketplaceConfigUrl || '');
if (!Array.isArray(result)) {
throw result;
}
const item = result.find((app: AppItemOverview) => app.id === id);
if (!item) {
throw { status: 404 };
}
return item;
},
);
const MarketplaceApp = ({ app, isLoading }: Props) => {
const [ isFrameLoading, setIsFrameLoading ] = useState(isLoading); const [ isFrameLoading, setIsFrameLoading ] = useState(isLoading);
const { colorMode } = useColorMode(); const { colorMode } = useColorMode();
const ref = useRef<HTMLIFrameElement>(null);
const handleIframeLoad = useCallback(() => { const handleIframeLoad = useCallback(() => {
setIsFrameLoading(false); setIsFrameLoading(false);
}, []); }, []);
useEffect(() => { useEffect(() => {
if (app && !isFrameLoading) { if (data && !isFrameLoading) {
const message = { const message = {
blockscoutColorMode: colorMode, blockscoutColorMode: colorMode,
blockscoutRootUrl: appConfig.baseUrl + route({ pathname: '/' }), blockscoutRootUrl: appConfig.baseUrl + route({ pathname: '/' }),
...@@ -35,19 +63,15 @@ const MarketplaceApp = ({ app, isLoading }: Props) => { ...@@ -35,19 +63,15 @@ const MarketplaceApp = ({ app, isLoading }: Props) => {
blockscoutNetworkRpc: appConfig.network.rpcUrl, blockscoutNetworkRpc: appConfig.network.rpcUrl,
}; };
ref?.current?.contentWindow?.postMessage(message, app.url); ref?.current?.contentWindow?.postMessage(message, data.url);
} }
}, [ isFrameLoading, app, colorMode, ref ]); }, [ isFrameLoading, data, colorMode, ref ]);
const sandboxAttributeValue = 'allow-forms allow-orientation-lock ' +
'allow-pointer-lock allow-popups-to-escape-sandbox ' +
'allow-same-origin allow-scripts ' +
'allow-top-navigation-by-user-activation allow-popups';
const allowAttributeValue = 'clipboard-read; clipboard-write;'; if (isError) {
throw new Error('Unable to load app', { cause: error });
}
return ( return (
<Page wrapChildren={ false }>
<Center <Center
as="main" as="main"
h="100vh" h="100vh"
...@@ -58,22 +82,21 @@ const MarketplaceApp = ({ app, isLoading }: Props) => { ...@@ -58,22 +82,21 @@ const MarketplaceApp = ({ app, isLoading }: Props) => {
<ContentLoader/> <ContentLoader/>
) } ) }
{ app && ( { data && (
<Box <Box
allow={ allowAttributeValue } allow={ IFRAME_ALLOW_ATTRIBUTE }
ref={ ref } ref={ ref }
sandbox={ sandboxAttributeValue } sandbox={ IFRAME_SANDBOX_ATTRIBUTE }
as="iframe" as="iframe"
h="100%" h="100%"
w="100%" w="100%"
display={ isFrameLoading ? 'none' : 'block' } display={ isFrameLoading ? 'none' : 'block' }
src={ app.url } src={ data.url }
title={ app.title } title={ data.title }
onLoad={ handleIframeLoad } onLoad={ handleIframeLoad }
/> />
) } ) }
</Center> </Center>
</Page>
); );
}; };
......
...@@ -5,7 +5,7 @@ import TestApp from 'playwright/TestApp'; ...@@ -5,7 +5,7 @@ import TestApp from 'playwright/TestApp';
import TokenSnippet from './TokenSnippet'; import TokenSnippet from './TokenSnippet';
const API_URL = 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/poa/assets/0x363574E6C5C71c343d7348093D84320c76d5Dd29/logo.png'; const API_URL = 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x363574E6C5C71c343d7348093D84320c76d5Dd29/logo.png';
test.use(devices['iPhone 13 Pro']); test.use(devices['iPhone 13 Pro']);
...@@ -43,7 +43,5 @@ test('with logo', async({ mount, page }) => { ...@@ -43,7 +43,5 @@ test('with logo', async({ mount, page }) => {
</TestApp>, </TestApp>,
); );
await page.waitForResponse(API_URL),
await expect(component).toHaveScreenshot(); await expect(component).toHaveScreenshot();
}); });
import { test, expect, devices } from '@playwright/experimental-ct-react'; import { test as base, expect, devices } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import { FEATURED_NETWORKS_MOCK } from 'mocks/config/network';
import authFixture from 'playwright/fixtures/auth'; import authFixture from 'playwright/fixtures/auth';
import contextWithEnvs, { createContextWithEnvs } from 'playwright/fixtures/contextWithEnvs';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import Burger from './Burger'; import Burger from './Burger';
test.use({ viewport: devices['iPhone 13 Pro'].viewport }); const FEATURED_NETWORKS_URL = 'https://localhost:3000/featured-networks.json';
const LOGO_URL = 'https://localhost:3000/my-logo.png';
base.use({ viewport: devices['iPhone 13 Pro'].viewport });
const hooksConfig = { const hooksConfig = {
router: { router: {
...@@ -16,7 +21,26 @@ const hooksConfig = { ...@@ -16,7 +21,26 @@ const hooksConfig = {
}, },
}; };
const test = base.extend({
context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any,
});
test('base view', async({ mount, page }) => { test('base view', async({ mount, page }) => {
await page.route(FEATURED_NETWORKS_URL, (route) => {
return route.fulfill({
body: FEATURED_NETWORKS_MOCK,
});
});
await page.route(LOGO_URL, (route) => {
return route.fulfill({
status: 200,
path: './playwright/image_s.jpg',
});
});
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Burger/> <Burger/>
...@@ -35,6 +59,18 @@ test.describe('dark mode', () => { ...@@ -35,6 +59,18 @@ test.describe('dark mode', () => {
test.use({ colorScheme: 'dark' }); test.use({ colorScheme: 'dark' });
test('base view', async({ mount, page }) => { test('base view', async({ mount, page }) => {
await page.route(FEATURED_NETWORKS_URL, (route) => {
return route.fulfill({
body: FEATURED_NETWORKS_MOCK,
});
});
await page.route(LOGO_URL, (route) => {
return route.fulfill({
status: 200,
path: './playwright/image_s.jpg',
});
});
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Burger/> <Burger/>
...@@ -64,8 +100,11 @@ test('submenu', async({ mount, page }) => { ...@@ -64,8 +100,11 @@ test('submenu', async({ mount, page }) => {
}); });
test.describe('auth', () => { test.describe('auth', () => {
const extendedTest = test.extend({ const extendedTest = base.extend({
context: ({ context }, use) => { context: async({ browser }, use) => {
const context = await createContextWithEnvs(browser, [
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
]);
authFixture(context); authFixture(context);
use(context); use(context);
}, },
......
...@@ -8,20 +8,21 @@ import NavigationMobile from 'ui/snippets/navigation/NavigationMobile'; ...@@ -8,20 +8,21 @@ import NavigationMobile from 'ui/snippets/navigation/NavigationMobile';
import NetworkLogo from 'ui/snippets/networkMenu/NetworkLogo'; import NetworkLogo from 'ui/snippets/networkMenu/NetworkLogo';
import NetworkMenuButton from 'ui/snippets/networkMenu/NetworkMenuButton'; import NetworkMenuButton from 'ui/snippets/networkMenu/NetworkMenuButton';
import NetworkMenuContentMobile from 'ui/snippets/networkMenu/NetworkMenuContentMobile'; import NetworkMenuContentMobile from 'ui/snippets/networkMenu/NetworkMenuContentMobile';
import useNetworkMenu from 'ui/snippets/networkMenu/useNetworkMenu';
const Burger = () => { const Burger = () => {
const iconColor = useColorModeValue('gray.600', 'white'); const iconColor = useColorModeValue('gray.600', 'white');
const { isOpen, onOpen, onClose } = useDisclosure(); const { isOpen, onOpen, onClose } = useDisclosure();
const [ isNetworkMenuOpened, setNetworkMenuVisibility ] = React.useState(false); const networkMenu = useNetworkMenu();
const handleNetworkMenuButtonClick = React.useCallback(() => { const handleNetworkMenuButtonClick = React.useCallback(() => {
setNetworkMenuVisibility((flag) => !flag); networkMenu.onToggle();
}, []); }, [ networkMenu ]);
const handleNetworkLogoClick = React.useCallback((event: React.SyntheticEvent) => { const handleNetworkLogoClick = React.useCallback((event: React.SyntheticEvent) => {
isNetworkMenuOpened && event.preventDefault(); networkMenu.isOpen && event.preventDefault();
setNetworkMenuVisibility(false); networkMenu.onClose();
}, [ isNetworkMenuOpened ]); }, [ networkMenu ]);
return ( return (
<> <>
...@@ -46,15 +47,15 @@ const Burger = () => { ...@@ -46,15 +47,15 @@ const Burger = () => {
<Icon as={ testnetIcon } h="14px" w="auto" color="red.400" alignSelf="flex-start"/> <Icon as={ testnetIcon } h="14px" w="auto" color="red.400" alignSelf="flex-start"/>
<Flex alignItems="center" justifyContent="space-between"> <Flex alignItems="center" justifyContent="space-between">
<NetworkLogo onClick={ handleNetworkLogoClick }/> <NetworkLogo onClick={ handleNetworkLogoClick }/>
{ appConfig.featuredNetworks.length > 0 ? ( { appConfig.featuredNetworks ? (
<NetworkMenuButton <NetworkMenuButton
isMobile isMobile
isActive={ isNetworkMenuOpened } isActive={ networkMenu.isOpen }
onClick={ handleNetworkMenuButtonClick } onClick={ handleNetworkMenuButtonClick }
/> />
) : <Box boxSize={ 9 }/> } ) : <Box boxSize={ 9 }/> }
</Flex> </Flex>
{ isNetworkMenuOpened ? <NetworkMenuContentMobile/> : <NavigationMobile/> } { networkMenu.isOpen ? <NetworkMenuContentMobile tabs={ networkMenu.availableTabs } items={ networkMenu.data }/> : <NavigationMobile/> }
</DrawerBody> </DrawerBody>
</DrawerContent> </DrawerContent>
</Drawer> </Drawer>
......
...@@ -36,8 +36,8 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref) ...@@ -36,8 +36,8 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref)
getRootProps, getRootProps,
} = useCheckbox({ ...ownProps, isChecked: colorMode === 'light' }); } = useCheckbox({ ...ownProps, isChecked: colorMode === 'light' });
const trackBg = useColorModeValue('blackAlpha.100', 'whiteAlpha.200'); const trackBg = useColorModeValue('blackAlpha.100', 'whiteAlpha.100');
const thumbBg = useColorModeValue('white', 'black'); const thumbBg = 'white';
const transitionProps = getDefaultTransitionProps(); const transitionProps = getDefaultTransitionProps();
const trackStyles: SystemStyleObject = React.useMemo(() => ({ const trackStyles: SystemStyleObject = React.useMemo(() => ({
...@@ -96,7 +96,7 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref) ...@@ -96,7 +96,7 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref)
margin={ 2 } margin={ 2 }
zIndex="docked" zIndex="docked"
as={ moonIcon } as={ moonIcon }
color={ useColorModeValue('blue.600', 'white') } color={ useColorModeValue('blue.300', 'blackAlpha.900') }
{ ...transitionProps } { ...transitionProps }
/> />
<chakra.div <chakra.div
...@@ -109,7 +109,7 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref) ...@@ -109,7 +109,7 @@ const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref)
margin={ 1.5 } margin={ 1.5 }
zIndex="docked" zIndex="docked"
as={ sunIcon } as={ sunIcon }
color={ useColorModeValue('gray.500', 'blue.600') } color={ useColorModeValue('blackAlpha.900', 'blue.300') }
{ ...transitionProps } { ...transitionProps }
/> />
</chakra.div> </chakra.div>
......
import { Box, Flex } from '@chakra-ui/react'; import { Box, Flex } from '@chakra-ui/react';
import { test, expect } from '@playwright/experimental-ct-react'; import { test as base, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import * as cookies from 'lib/cookies'; import * as cookies from 'lib/cookies';
import authFixture from 'playwright/fixtures/auth'; import authFixture from 'playwright/fixtures/auth';
import contextWithEnvs, { createContextWithEnvs } from 'playwright/fixtures/contextWithEnvs';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import NavigationDesktop from './NavigationDesktop'; import NavigationDesktop from './NavigationDesktop';
...@@ -16,6 +17,15 @@ const hooksConfig = { ...@@ -16,6 +17,15 @@ const hooksConfig = {
}, },
}; };
const FEATURED_NETWORKS_URL = 'https://localhost:3000/featured-networks.json';
const test = base.extend({
context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any,
});
test('no auth +@desktop-xl +@dark-mode-xl', async({ mount }) => { test('no auth +@desktop-xl +@dark-mode-xl', async({ mount }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
...@@ -30,15 +40,18 @@ test('no auth +@desktop-xl +@dark-mode-xl', async({ mount }) => { ...@@ -30,15 +40,18 @@ test('no auth +@desktop-xl +@dark-mode-xl', async({ mount }) => {
await expect(component).toHaveScreenshot(); await expect(component).toHaveScreenshot();
}); });
test.describe('auth', () => { base.describe('auth', () => {
const extendedTest = test.extend({ const test = base.extend({
context: ({ context }, use) => { context: async({ browser }, use) => {
const context = await createContextWithEnvs(browser, [
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
]);
authFixture(context); authFixture(context);
use(context); use(context);
}, },
}); });
extendedTest('+@desktop-xl +@dark-mode-xl', async({ mount }) => { test('+@desktop-xl +@dark-mode-xl', async({ mount }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Flex w="100%" minH="100vh" alignItems="stretch"> <Flex w="100%" minH="100vh" alignItems="stretch">
...@@ -85,15 +98,18 @@ test('with submenu +@desktop-xl +@dark-mode', async({ mount, page }) => { ...@@ -85,15 +98,18 @@ test('with submenu +@desktop-xl +@dark-mode', async({ mount, page }) => {
await expect(component).toHaveScreenshot(); await expect(component).toHaveScreenshot();
}); });
test.describe('cookie set to false', () => { base.describe('cookie set to false', () => {
const extendedTest = test.extend({ const test = base.extend({
context: ({ context }, use) => { context: async({ browser }, use) => {
const context = await createContextWithEnvs(browser, [
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
]);
context.addCookies([ { name: cookies.NAMES.NAV_BAR_COLLAPSED, value: 'false', domain: 'localhost', path: '/' } ]); context.addCookies([ { name: cookies.NAMES.NAV_BAR_COLLAPSED, value: 'false', domain: 'localhost', path: '/' } ]);
use(context); use(context);
}, },
}); });
extendedTest('navbar is opened +@desktop-xl', async({ mount }) => { test('navbar is opened +@desktop-xl', async({ mount }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Flex w="100%" minH="100vh" alignItems="stretch"> <Flex w="100%" minH="100vh" alignItems="stretch">
...@@ -109,15 +125,18 @@ test.describe('cookie set to false', () => { ...@@ -109,15 +125,18 @@ test.describe('cookie set to false', () => {
}); });
}); });
test.describe('cookie set to true', () => { base.describe('cookie set to true', () => {
const extendedTest = test.extend({ const test = base.extend({
context: ({ context }, use) => { context: async({ browser }, use) => {
const context = await createContextWithEnvs(browser, [
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
]);
context.addCookies([ { name: cookies.NAMES.NAV_BAR_COLLAPSED, value: 'true', domain: 'localhost', path: '/' } ]); context.addCookies([ { name: cookies.NAMES.NAV_BAR_COLLAPSED, value: 'true', domain: 'localhost', path: '/' } ]);
use(context); use(context);
}, },
}); });
extendedTest('navbar is collapsed', async({ mount }) => { test('navbar is collapsed', async({ mount }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<Flex w="100%" minH="100vh" alignItems="stretch"> <Flex w="100%" minH="100vh" alignItems="stretch">
......
...@@ -77,7 +77,7 @@ const NavigationDesktop = () => { ...@@ -77,7 +77,7 @@ const NavigationDesktop = () => {
transitionTimingFunction="ease" transitionTimingFunction="ease"
> >
<NetworkLogo isCollapsed={ isCollapsed }/> <NetworkLogo isCollapsed={ isCollapsed }/>
{ appConfig.featuredNetworks.length > 0 && <NetworkMenu isCollapsed={ isCollapsed }/> } { Boolean(appConfig.featuredNetworks) && <NetworkMenu isCollapsed={ isCollapsed }/> }
</Box> </Box>
<Box as="nav" mt={ 8 } w="100%"> <Box as="nav" mt={ 8 } w="100%">
<VStack as="ul" spacing="1" alignItems="flex-start"> <VStack as="ul" spacing="1" alignItems="flex-start">
......
...@@ -6,7 +6,16 @@ import TestApp from 'playwright/TestApp'; ...@@ -6,7 +6,16 @@ import TestApp from 'playwright/TestApp';
import NetworkLogo from './NetworkLogo'; import NetworkLogo from './NetworkLogo';
test('fallback logo +@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount }) => { test.describe('placeholder logo', () => {
const extendedTest = test.extend({
context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_NETWORK_LOGO', value: '' },
{ name: 'NEXT_PUBLIC_NETWORK_ICON', value: '' },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any,
});
extendedTest('+@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount }) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<NetworkLogo/> <NetworkLogo/>
...@@ -14,17 +23,34 @@ test('fallback logo +@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount }) = ...@@ -14,17 +23,34 @@ test('fallback logo +@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount }) =
); );
await expect(component.locator('a')).toHaveScreenshot(); await expect(component.locator('a')).toHaveScreenshot();
});
}); });
test.describe('placeholder logo', () => { test.describe('custom logo', () => {
const LOGO_URL = 'https://localhost:3000/my-logo.png';
const ICON_URL = 'https://localhost:3000/my-icon.png';
const extendedTest = test.extend({ const extendedTest = test.extend({
context: contextWithEnvs([ context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_NETWORK_TYPE', value: 'unknown' }, { name: 'NEXT_PUBLIC_NETWORK_LOGO', value: LOGO_URL },
{ name: 'NEXT_PUBLIC_NETWORK_ICON', value: ICON_URL },
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any, ]) as any,
}); });
extendedTest('+@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount }) => { extendedTest('+@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount, page }) => {
await page.route(LOGO_URL, (route) => {
return route.fulfill({
status: 200,
path: './playwright/network-logo.svg',
});
});
await page.route(ICON_URL, (route) => {
return route.fulfill({
status: 200,
path: './playwright/duck.svg',
});
});
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<NetworkLogo/> <NetworkLogo/>
...@@ -35,25 +61,27 @@ test.describe('placeholder logo', () => { ...@@ -35,25 +61,27 @@ test.describe('placeholder logo', () => {
}); });
}); });
test.describe('custom logo', () => { test.describe('custom logo with dark option', () => {
const LOGO_URL = 'https://example.com/my-logo.png'; const LOGO_URL = 'https://localhost:3000/my-logo.png';
const SMALL_LOGO_URL = 'https://example.com/my-logo-short.png'; const ICON_URL = 'https://localhost:3000/my-icon.png';
const extendedTest = test.extend({ const extendedTest = test.extend({
context: contextWithEnvs([ context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_NETWORK_LOGO', value: LOGO_URL }, { name: 'NEXT_PUBLIC_NETWORK_LOGO', value: LOGO_URL },
{ name: 'NEXT_PUBLIC_NETWORK_SMALL_LOGO', value: SMALL_LOGO_URL }, { name: 'NEXT_PUBLIC_NETWORK_LOGO_DARK', value: LOGO_URL },
{ name: 'NEXT_PUBLIC_NETWORK_ICON', value: ICON_URL },
{ name: 'NEXT_PUBLIC_NETWORK_ICON_DARK', value: ICON_URL },
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any, ]) as any,
}); });
extendedTest('+@desktop-xl +@dark-mode +@dark-mode-xl', async({ mount, page }) => { extendedTest('-@default +@dark-mode +@dark-mode-xl', async({ mount, page }) => {
await page.route(LOGO_URL, (route) => { await page.route(LOGO_URL, (route) => {
return route.fulfill({ return route.fulfill({
status: 200, status: 200,
path: './playwright/giant_duck_long.jpg', path: './playwright/giant_duck_long.jpg',
}); });
}); });
await page.route(SMALL_LOGO_URL, (route) => { await page.route(ICON_URL, (route) => {
return route.fulfill({ return route.fulfill({
status: 200, status: 200,
path: './playwright/image_s.jpg', path: './playwright/image_s.jpg',
......
import { Icon, Box, Image, useColorModeValue } from '@chakra-ui/react'; import { Icon, Box, Image, useColorModeValue, Skeleton } from '@chakra-ui/react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import React from 'react'; import React from 'react';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import smallLogoPlaceholder from 'icons/networks/icons/placeholder.svg'; import iconPlaceholder from 'icons/networks/icon-placeholder.svg';
import logoPlaceholder from 'icons/networks/logos/blockscout.svg'; import logoPlaceholder from 'icons/networks/logo-placeholder.svg';
import ASSETS from 'lib/networks/networkAssets';
interface Props { interface Props {
isCollapsed?: boolean; isCollapsed?: boolean;
onClick?: (event: React.SyntheticEvent) => void; onClick?: (event: React.SyntheticEvent) => void;
} }
const NetworkLogo = ({ isCollapsed, onClick }: Props) => { const LogoFallback = ({ isCollapsed, isSmall }: { isCollapsed?: boolean; isSmall?: boolean }) => {
const field = isSmall ? 'icon' : 'logo';
const logoColor = useColorModeValue('blue.600', 'white'); const logoColor = useColorModeValue('blue.600', 'white');
const href = route({ pathname: '/' });
const [ isLogoError, setLogoError ] = React.useState(false);
const [ isSmallLogoError, setSmallLogoError ] = React.useState(false);
const style = useColorModeValue({}, { filter: 'brightness(0) invert(1)' });
const handleSmallLogoError = React.useCallback(() => {
setSmallLogoError(true);
}, []);
const handleLogoError = React.useCallback(() => { const display = isSmall ? {
setLogoError(true); base: 'none',
}, []); lg: isCollapsed === false ? 'none' : 'block',
xl: isCollapsed ? 'block' : 'none',
} : {
base: 'block',
lg: isCollapsed === false ? 'block' : 'none',
xl: isCollapsed ? 'none' : 'block',
};
const logoEl = (() => { if (appConfig.network[field].default) {
const fallbackLogoSrc = appConfig.network.type ? ASSETS[appConfig.network.type]?.logo : undefined; return <Skeleton w="100%" borderRadius="sm" display={ display }/>;
const fallbackSmallLogoSrc = appConfig.network.type ? ASSETS[appConfig.network.type]?.smallLogo || ASSETS[appConfig.network.type]?.icon : undefined; }
const logo = appConfig.network.logo; return (
const smallLogo = appConfig.network.smallLogo;
const fallbackLogo = (
<Icon
as={ fallbackLogoSrc || logoPlaceholder }
width="auto"
height="100%"
color={ fallbackLogoSrc ? undefined : logoColor }
display={{ base: 'block', lg: isCollapsed === false ? 'block' : 'none', xl: isCollapsed ? 'none' : 'block' }}
style={ style }
/>
);
const fallbackSmallLogo = (
<Icon <Icon
as={ fallbackSmallLogoSrc || smallLogoPlaceholder } as={ isSmall ? iconPlaceholder : logoPlaceholder }
width="auto" width="auto"
height="100%" height="100%"
color={ fallbackSmallLogoSrc ? undefined : logoColor } color={ logoColor }
display={{ base: 'none', lg: isCollapsed === false ? 'none' : 'block', xl: isCollapsed ? 'block' : 'none' }} display={ display }
style={ style }
/> />
); );
};
const NetworkLogo = ({ isCollapsed, onClick }: Props) => {
const logoSrc = useColorModeValue(appConfig.network.logo.default, appConfig.network.logo.dark || appConfig.network.logo.default);
const iconSrc = useColorModeValue(appConfig.network.icon.default, appConfig.network.icon.dark || appConfig.network.icon.default);
const darkModeFilter = { filter: 'brightness(0) invert(1)' };
const logoStyle = useColorModeValue({}, !appConfig.network.logo.dark ? darkModeFilter : {});
const iconStyle = useColorModeValue({}, !appConfig.network.icon.dark ? darkModeFilter : {});
return ( return (
<> // TODO switch to <NextLink href={ href } passHref> when main page for network will be ready
<Box
as="a"
href={ route({ pathname: '/' }) }
width={{ base: 'auto', lg: isCollapsed === false ? '120px' : '30px', xl: isCollapsed ? '30px' : '120px' }}
height={{ base: '20px', lg: isCollapsed === false ? '20px' : '30px', xl: isCollapsed ? '30px' : '20px' }}
display="inline-flex"
overflow="hidden"
onClick={ onClick }
flexShrink={ 0 }
aria-label="Link to main page"
>
{ /* big logo */ } { /* big logo */ }
<Image <Image
w="auto" w="auto"
h="100%" h="100%"
src={ logo } src={ logoSrc }
display={{ base: 'block', lg: isCollapsed === false ? 'block' : 'none', xl: isCollapsed ? 'none' : 'block' }}
alt={ `${ appConfig.network.name } network logo` } alt={ `${ appConfig.network.name } network logo` }
fallback={ isLogoError || !logo ? fallbackLogo : undefined } fallback={ <LogoFallback isCollapsed={ isCollapsed }/> }
onError={ handleLogoError } display={{ base: 'block', lg: isCollapsed === false ? 'block' : 'none', xl: isCollapsed ? 'none' : 'block' }}
style={ logoStyle }
/> />
{ /* small logo */ } { /* small logo */ }
<Image <Image
w="auto" w="auto"
h="100%" h="100%"
src={ smallLogo } src={ iconSrc }
display={{ base: 'none', lg: isCollapsed === false ? 'none' : 'block', xl: isCollapsed ? 'block' : 'none' }}
alt={ `${ appConfig.network.name } network logo` } alt={ `${ appConfig.network.name } network logo` }
fallback={ isSmallLogoError || !smallLogo ? fallbackSmallLogo : undefined } fallback={ <LogoFallback isCollapsed={ isCollapsed } isSmall/> }
onError={ handleSmallLogoError } display={{ base: 'none', lg: isCollapsed === false ? 'none' : 'block', xl: isCollapsed ? 'block' : 'none' }}
style={ iconStyle }
/> />
</>
);
})();
return (
// TODO switch to <NextLink href={ href } passHref> when main page for network will be ready
<Box
as="a"
href={ href }
width={{ base: 'auto', lg: isCollapsed === false ? '113px' : '30px', xl: isCollapsed ? '30px' : '113px' }}
height={{ base: '20px', lg: isCollapsed === false ? '20px' : '30px', xl: isCollapsed ? '30px' : '20px' }}
display="inline-flex"
overflow="hidden"
onClick={ onClick }
flexShrink={ 0 }
aria-label="Link to main page"
>
{ logoEl }
</Box> </Box>
); );
}; };
......
...@@ -7,9 +7,11 @@ import TestApp from 'playwright/TestApp'; ...@@ -7,9 +7,11 @@ import TestApp from 'playwright/TestApp';
import NetworkMenu from './NetworkMenu'; import NetworkMenu from './NetworkMenu';
const FEATURED_NETWORKS_URL = 'https://localhost:3000/featured-networks.json';
const extendedTest = test.extend({ const extendedTest = test.extend({
context: contextWithEnvs([ context: contextWithEnvs([
{ name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_MOCK }, { name: 'NEXT_PUBLIC_FEATURED_NETWORKS', value: FEATURED_NETWORKS_URL },
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
]) as any, ]) as any,
}); });
...@@ -17,13 +19,19 @@ const extendedTest = test.extend({ ...@@ -17,13 +19,19 @@ const extendedTest = test.extend({
extendedTest.use({ viewport: { width: 1600, height: 1000 } }); extendedTest.use({ viewport: { width: 1600, height: 1000 } });
extendedTest('base view +@dark-mode', async({ mount, page }) => { extendedTest('base view +@dark-mode', async({ mount, page }) => {
const LOGO_URL = 'https://example.com/my-logo.png'; const LOGO_URL = 'https://localhost:3000/my-logo.png';
await page.route(LOGO_URL, (route) => { await page.route(LOGO_URL, (route) => {
return route.fulfill({ return route.fulfill({
status: 200, status: 200,
path: './playwright/image_s.jpg', path: './playwright/image_s.jpg',
}); });
}); });
await page.route(FEATURED_NETWORKS_URL, (route) => {
return route.fulfill({
status: 200,
body: FEATURED_NETWORKS_MOCK,
});
});
const component = await mount( const component = await mount(
<TestApp> <TestApp>
...@@ -39,6 +47,6 @@ extendedTest('base view +@dark-mode', async({ mount, page }) => { ...@@ -39,6 +47,6 @@ extendedTest('base view +@dark-mode', async({ mount, page }) => {
await component.locator('button[aria-label="Network menu"]').click(); await component.locator('button[aria-label="Network menu"]').click();
await expect(page).toHaveScreenshot({ clip: { x: 0, y: 0, width: 450, height: 550 } }); await expect(page).toHaveScreenshot({ clip: { x: 0, y: 0, width: 450, height: 550 } });
await component.getByText(/optimism/i).hover(); await component.getByText(/poa/i).hover();
await expect(page).toHaveScreenshot({ clip: { x: 0, y: 0, width: 450, height: 550 } }); await expect(page).toHaveScreenshot({ clip: { x: 0, y: 0, width: 450, height: 550 } });
}); });
...@@ -3,26 +3,27 @@ import React from 'react'; ...@@ -3,26 +3,27 @@ import React from 'react';
import NetworkMenuButton from './NetworkMenuButton'; import NetworkMenuButton from './NetworkMenuButton';
import NetworkMenuContentDesktop from './NetworkMenuContentDesktop'; import NetworkMenuContentDesktop from './NetworkMenuContentDesktop';
import useNetworkMenu from './useNetworkMenu';
interface Props { interface Props {
isCollapsed?: boolean; isCollapsed?: boolean;
} }
const NetworkMenu = ({ isCollapsed }: Props) => { const NetworkMenu = ({ isCollapsed }: Props) => {
const menu = useNetworkMenu();
return ( return (
<Popover openDelay={ 300 } placement="right-start" gutter={ 8 } isLazy> <Popover openDelay={ 300 } placement="right-start" gutter={ 8 } isLazy isOpen={ menu.isOpen } onClose={ menu.onClose }>
{ ({ isOpen }) => (
<>
<PopoverTrigger> <PopoverTrigger>
<NetworkMenuButton <NetworkMenuButton
marginLeft="auto" marginLeft="auto"
overflow="hidden" overflow="hidden"
width={{ base: 'auto', lg: isCollapsed === false ? 'auto' : '0px', xl: isCollapsed ? '0px' : 'auto' }} width={{ base: 'auto', lg: isCollapsed === false ? 'auto' : '0px', xl: isCollapsed ? '0px' : 'auto' }}
isActive={ isOpen } isActive={ menu.isOpen }
onClick={ menu.onToggle }
/> />
</PopoverTrigger> </PopoverTrigger>
<NetworkMenuContentDesktop/> <NetworkMenuContentDesktop items={ menu.data } tabs={ menu.availableTabs }/>
</>
) }
</Popover> </Popover>
); );
}; };
......
import { PopoverContent, PopoverBody, Text, Tabs, TabList, TabPanels, TabPanel, Tab, VStack } from '@chakra-ui/react'; import { PopoverContent, PopoverBody, Text, Tabs, TabList, TabPanels, TabPanel, Tab, VStack, Skeleton, Flex } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { NetworkGroup } from 'types/networks'; import type { FeaturedNetwork, NetworkGroup } from 'types/networks';
import featuredNetworks from 'lib/networks/featuredNetworks';
import useNetworkNavigationItems from 'lib/networks/useNetworkNavigationItems';
import NetworkMenuLink from './NetworkMenuLink'; import NetworkMenuLink from './NetworkMenuLink';
const TABS: Array<NetworkGroup> = [ 'mainnets', 'testnets', 'other' ]; interface Props {
const availableTabs = TABS.filter((tab) => featuredNetworks.some(({ group }) => group === tab)); tabs: Array<NetworkGroup>;
items?: Array<FeaturedNetwork>;
}
const NetworkMenuPopup = () => { const NetworkMenuPopup = ({ items, tabs }: Props) => {
const items = useNetworkNavigationItems(); const selectedNetwork = items?.find(({ isActive }) => isActive);
const selectedNetwork = items.find(({ isActive }) => isActive); const selectedTab = tabs.findIndex((tab) => selectedNetwork?.group === tab);
const selectedTab = availableTabs.findIndex((tab) => selectedNetwork?.group === tab);
return ( const content = !items || items.length === 0 ? (
<PopoverContent w="382px"> <>
<PopoverBody> <Skeleton h="30px" w="120px"/>
<Flex mt={ 4 } alignItems="center">
<Skeleton h="40px" w="105px"/>
<Skeleton h="24px" w="68px" mx={ 4 }/>
<Skeleton h="24px" w="45px" mx={ 4 }/>
</Flex>
<Flex mt={ 8 } flexDir="column" rowGap={ 2 }>
<Flex mx={ 4 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="24px" w="120px" ml={ 3 }/>
</Flex>
<Flex mx={ 4 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="24px" w="180px" ml={ 3 }/>
</Flex>
<Flex mx={ 4 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="24px" w="150px" ml={ 3 }/>
</Flex>
</Flex>
</>
) : (
<>
<Text as="h4" fontSize="18px" lineHeight="30px" fontWeight="500">Networks</Text> <Text as="h4" fontSize="18px" lineHeight="30px" fontWeight="500">Networks</Text>
<Tabs variant="soft-rounded" mt={ 4 } isLazy defaultIndex={ selectedTab !== -1 ? selectedTab : undefined }> <Tabs variant="soft-rounded" mt={ 4 } isLazy defaultIndex={ selectedTab !== -1 ? selectedTab : undefined }>
{ availableTabs.length > 1 && ( { tabs.length > 1 && (
<TabList> <TabList>
{ availableTabs.map((tab) => <Tab key={ tab } textTransform="capitalize">{ tab }</Tab>) } { tabs.map((tab) => <Tab key={ tab } textTransform="capitalize">{ tab }</Tab>) }
</TabList> </TabList>
) } ) }
<TabPanels mt={ 8 }> <TabPanels mt={ 8 }>
{ availableTabs.map((tab) => ( { tabs.map((tab) => (
<TabPanel key={ tab } p={ 0 }> <TabPanel key={ tab } p={ 0 }>
<VStack as="ul" spacing={ 2 } alignItems="stretch" mt={ 4 }> <VStack as="ul" spacing={ 2 } alignItems="stretch" mt={ 4 }>
{ items { items
...@@ -43,9 +63,16 @@ const NetworkMenuPopup = () => { ...@@ -43,9 +63,16 @@ const NetworkMenuPopup = () => {
)) } )) }
</TabPanels> </TabPanels>
</Tabs> </Tabs>
</>
);
return (
<PopoverContent w="382px">
<PopoverBody>
{ content }
</PopoverBody> </PopoverBody>
</PopoverContent> </PopoverContent>
); );
}; };
export default NetworkMenuPopup; export default React.memo(NetworkMenuPopup);
import { Box, Select, VStack } from '@chakra-ui/react'; import { Box, Select, VStack, Skeleton, Flex } from '@chakra-ui/react';
import capitalize from 'lodash/capitalize'; import capitalize from 'lodash/capitalize';
import React from 'react'; import React from 'react';
import type { NetworkGroup } from 'types/networks'; import type { NetworkGroup, FeaturedNetwork } from 'types/networks';
import useNetworkNavigationItems from 'lib/networks/useNetworkNavigationItems';
import NetworkMenuLink from './NetworkMenuLink'; import NetworkMenuLink from './NetworkMenuLink';
const TABS: Array<NetworkGroup> = [ 'mainnets', 'testnets', 'other' ]; interface Props {
tabs: Array<NetworkGroup>;
items?: Array<FeaturedNetwork>;
}
const NetworkMenuContentMobile = ({ items, tabs }: Props) => {
const selectedNetwork = items?.find(({ isActive }) => isActive);
const [ selectedTab, setSelectedTab ] = React.useState<NetworkGroup>('Mainnets');
const NetworkMenuContentMobile = () => { React.useEffect(() => {
const items = useNetworkNavigationItems(); if (items) {
const selectedNetwork = items.find(({ isActive }) => isActive); setSelectedTab(tabs.find((tab) => selectedNetwork?.group === tab) || 'Mainnets');
const [ selectedTab, setSelectedTab ] = React.useState<NetworkGroup>(TABS.find((tab) => selectedNetwork?.group === tab) || 'mainnets'); }
}, [ items, selectedNetwork?.group, tabs ]);
const handleSelectChange = React.useCallback((event: React.ChangeEvent<HTMLSelectElement>) => { const handleSelectChange = React.useCallback((event: React.ChangeEvent<HTMLSelectElement>) => {
setSelectedTab(event.target.value as NetworkGroup); setSelectedTab(event.target.value as NetworkGroup);
}, []); }, []);
return ( const content = !items || items.length === 0 ? (
<Box mt={ 6 }> <>
<Skeleton h="32px" w="100%"/>
<Flex mt={ 6 } flexDir="column" rowGap={ 2 }>
<Flex mx={ 3 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="20px" w="60px" ml={ 3 }/>
</Flex>
<Flex mx={ 3 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="20px" w="120px" ml={ 3 }/>
</Flex>
<Flex mx={ 3 } my={ 2 } alignItems="center">
<Skeleton h="30px" w="30px" borderRadius="full"/>
<Skeleton h="20px" w="80px" ml={ 3 }/>
</Flex>
</Flex>
</>
) : (
<>
<Select size="xs" borderRadius="base" value={ selectedTab } onChange={ handleSelectChange } focusBorderColor="none"> <Select size="xs" borderRadius="base" value={ selectedTab } onChange={ handleSelectChange } focusBorderColor="none">
{ TABS.map((tab) => <option key={ tab } value={ tab }>{ capitalize(tab) }</option>) } { tabs.map((tab) => <option key={ tab } value={ tab }>{ capitalize(tab) }</option>) }
</Select> </Select>
<VStack as="ul" spacing={ 2 } alignItems="stretch" mt={ 6 }> <VStack as="ul" spacing={ 2 } alignItems="stretch" mt={ 6 }>
{ items { items
...@@ -36,8 +60,14 @@ const NetworkMenuContentMobile = () => { ...@@ -36,8 +60,14 @@ const NetworkMenuContentMobile = () => {
)) ))
} }
</VStack> </VStack>
</>
);
return (
<Box mt={ 6 }>
{ content }
</Box> </Box>
); );
}; };
export default NetworkMenuContentMobile; export default React.memo(NetworkMenuContentMobile);
import { Box, Flex, Icon, Text, Image } from '@chakra-ui/react'; import { Box, Flex, Icon, Text, Image, useColorModeValue } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { FeaturedNetwork } from 'types/networks'; import type { FeaturedNetwork } from 'types/networks';
import checkIcon from 'icons/check.svg'; import checkIcon from 'icons/check.svg';
import placeholderIcon from 'icons/networks/icons/placeholder.svg'; import placeholderIcon from 'icons/networks/icon-placeholder.svg';
import useColors from './useColors'; import useColors from './useColors';
interface Props extends FeaturedNetwork { interface Props extends FeaturedNetwork {
isActive: boolean; isActive?: boolean;
isMobile?: boolean; isMobile?: boolean;
} }
const NetworkMenuLink = ({ title, icon, isActive, isMobile, url }: Props) => { const NetworkMenuLink = ({ title, icon, isActive, isMobile, url, invertIconInDarkMode }: Props) => {
const hasIcon = Boolean(icon); const colors = useColors();
const colors = useColors({ hasIcon }); const darkModeFilter = { filter: 'brightness(0) invert(1)' };
const style = useColorModeValue({}, invertIconInDarkMode ? darkModeFilter : {});
const iconEl = typeof icon === 'string' ? ( const iconEl = icon ? (
<Image w="30px" h="30px" src={ icon } alt={ `${ title } network icon` }/> <Image w="30px" h="30px" src={ icon } alt={ `${ title } network icon` } style={ style }/>
) : ( ) : (
<Icon <Icon
as={ hasIcon ? icon : placeholderIcon } as={ placeholderIcon }
boxSize="30px" boxSize="30px"
color={ isActive ? colors.icon.active : colors.icon.default } color={ colors.iconPlaceholder.default }
/> />
); );
......
import { useColorModeValue } from '@chakra-ui/react'; import { useColorModeValue } from '@chakra-ui/react';
export default function useColors({ hasIcon }: {hasIcon: boolean}) { export default function useColors() {
const iconDefaultColor = useColorModeValue('blackAlpha.600', 'whiteAlpha.600');
const iconPlaceholderDefaultColor = useColorModeValue('blackAlpha.100', 'whiteAlpha.100');
return { return {
text: { text: {
'default': useColorModeValue('gray.600', 'gray.400'), 'default': useColorModeValue('gray.600', 'gray.400'),
active: useColorModeValue('blackAlpha.900', 'whiteAlpha.900'), active: useColorModeValue('blackAlpha.900', 'whiteAlpha.900'),
hover: useColorModeValue('blue.600', 'link_hovered'), hover: useColorModeValue('blue.600', 'link_hovered'),
}, },
icon: { iconPlaceholder: {
'default': hasIcon ? iconDefaultColor : iconPlaceholderDefaultColor, 'default': useColorModeValue('blackAlpha.100', 'whiteAlpha.300'),
active: useColorModeValue('blackAlpha.900', 'whiteAlpha.900'),
}, },
bg: { bg: {
'default': 'transparent', 'default': 'transparent',
......
import { useDisclosure } from '@chakra-ui/react';
import { useQuery } from '@tanstack/react-query';
import React from 'react';
import type { FeaturedNetwork, NetworkGroup } from 'types/networks';
import appConfig from 'configs/app/config';
import type { ResourceError } from 'lib/api/resources';
import useApiFetch from 'lib/hooks/useFetch';
const TABS: Array<NetworkGroup> = [ 'Mainnets', 'Testnets', 'Other' ];
export default function useNetworkMenu() {
const { isOpen, onClose, onOpen, onToggle } = useDisclosure();
const apiFetch = useApiFetch();
const { isLoading, data } = useQuery<unknown, ResourceError<unknown>, Array<FeaturedNetwork>>(
[ 'featured-network' ],
async() => apiFetch(appConfig.featuredNetworks || ''),
{
enabled: Boolean(appConfig.featuredNetworks) && isOpen,
staleTime: Infinity,
});
return React.useMemo(() => ({
isOpen,
onClose,
onOpen,
onToggle,
isLoading,
data,
availableTabs: TABS.filter((tab) => data?.some(({ group }) => group === tab)),
}), [ isOpen, onClose, onOpen, onToggle, data, isLoading ]);
}
...@@ -47,7 +47,7 @@ const TxsTable = ({ ...@@ -47,7 +47,7 @@ const TxsTable = ({
<Th width="20%">Method</Th> <Th width="20%">Method</Th>
{ showBlockInfo && <Th width="18%">Block</Th> } { showBlockInfo && <Th width="18%">Block</Th> }
<Th width={{ xl: '132px', base: '66px' }}>From</Th> <Th width={{ xl: '132px', base: '66px' }}>From</Th>
<Th width={{ xl: currentAddress ? '48px' : '36px', base: '0' }}></Th> <Th width={{ xl: currentAddress ? '48px' : '36px', base: currentAddress ? '52px' : '28px' }}></Th>
<Th width={{ xl: '132px', base: '66px' }}>To</Th> <Th width={{ xl: '132px', base: '66px' }}>To</Th>
<Th width="20%" isNumeric> <Th width="20%" isNumeric>
<Link onClick={ sort('val') } display="flex" justifyContent="end"> <Link onClick={ sort('val') } display="flex" justifyContent="end">
......
import { import {
Box,
Tr, Tr,
Td, Td,
Tag, Tag,
...@@ -8,6 +7,7 @@ import { ...@@ -8,6 +7,7 @@ import {
Text, Text,
Show, Show,
Hide, Hide,
Flex,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
...@@ -44,14 +44,14 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement } ...@@ -44,14 +44,14 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }
const timeAgo = useTimeAgoIncrement(tx.timestamp, enableTimeIncrement); const timeAgo = useTimeAgoIncrement(tx.timestamp, enableTimeIncrement);
const addressFrom = ( const addressFrom = (
<Address> <Address w="100%">
<AddressIcon address={ tx.from }/> <AddressIcon address={ tx.from }/>
<AddressLink type="address" hash={ tx.from.hash } alias={ tx.from.name } fontWeight="500" ml={ 2 } truncation="constant" isDisabled={ isOut }/> <AddressLink type="address" hash={ tx.from.hash } alias={ tx.from.name } fontWeight="500" ml={ 2 } truncation="constant" isDisabled={ isOut }/>
</Address> </Address>
); );
const addressTo = dataTo ? ( const addressTo = dataTo ? (
<Address> <Address w="100%">
<AddressIcon address={ dataTo }/> <AddressIcon address={ dataTo }/>
<AddressLink type="address" hash={ dataTo.hash } alias={ dataTo.name } fontWeight="500" ml={ 2 } truncation="constant" isDisabled={ isIn }/> <AddressLink type="address" hash={ dataTo.hash } alias={ dataTo.name } fontWeight="500" ml={ 2 } truncation="constant" isDisabled={ isIn }/>
</Address> </Address>
...@@ -117,21 +117,23 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement } ...@@ -117,21 +117,23 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }
</Show> </Show>
<Hide above="xl" ssr={ false }> <Hide above="xl" ssr={ false }>
<Td colSpan={ 3 }> <Td colSpan={ 3 }>
<Box> <Flex alignItems="center">
{ addressFrom }
{ (isIn || isOut) ? { (isIn || isOut) ?
<InOutTag isIn={ isIn } isOut={ isOut } width="48px" my={ 2 }/> : ( <InOutTag isIn={ isIn } isOut={ isOut } width="48px"/> :
(
<Icon <Icon
as={ rightArrowIcon } as={ rightArrowIcon }
boxSize={ 6 } boxSize={ 6 }
mt={ 2 }
mb={ 1 }
color="gray.500" color="gray.500"
transform="rotate(90deg)" transform="rotate(90deg)"
/> />
) } )
}
<VStack alignItems="start" overflow="hidden" ml={ 1 }>
{ addressFrom }
{ addressTo } { addressTo }
</Box> </VStack>
</Flex>
</Td> </Td>
</Hide> </Hide>
<Td isNumeric> <Td isNumeric>
......
...@@ -1093,10 +1093,10 @@ ...@@ -1093,10 +1093,10 @@
core-js-pure "^3.25.1" core-js-pure "^3.25.1"
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime-corejs3@^7.11.2", "@babel/runtime-corejs3@^7.18.9": "@babel/runtime-corejs3@^7.18.9", "@babel/runtime-corejs3@^7.20.13", "@babel/runtime-corejs3@^7.20.7":
version "7.20.13" version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.13.tgz#ad012857db412ab0b5ccf184b67be2cfcc2a1dcf" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz#6e4939d9d9789ff63e2dc58e88f13a3913a24eba"
integrity sha512-p39/6rmY9uvlzRiLZBIB3G9/EBr66LBMcYm7fIDeSBNdRjF2AGD3rFZucUyAgGHC2N+7DdLvVi33uTjSE44FIw== integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==
dependencies: dependencies:
core-js-pure "^3.25.1" core-js-pure "^3.25.1"
regenerator-runtime "^0.13.11" regenerator-runtime "^0.13.11"
...@@ -1108,13 +1108,20 @@ ...@@ -1108,13 +1108,20 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@^7.12.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": "@babel/runtime@^7.12.0", "@babel/runtime@^7.8.7":
version "7.20.13" version "7.20.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
dependencies: dependencies:
regenerator-runtime "^0.13.11" regenerator-runtime "^0.13.11"
"@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.9.2":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
dependencies:
regenerator-runtime "^0.13.11"
"@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5": "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5":
version "7.20.7" version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd"
...@@ -1227,10 +1234,10 @@ ...@@ -1227,10 +1234,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@braintree/sanitize-url@=6.0.0": "@braintree/sanitize-url@=6.0.2":
version "6.0.0" version "6.0.2"
resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f"
integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==
"@chakra-ui/accordion@2.1.9": "@chakra-ui/accordion@2.1.9":
version "2.1.9" version "2.1.9"
...@@ -3297,22 +3304,22 @@ ...@@ -3297,22 +3304,22 @@
tiny-glob "^0.2.9" tiny-glob "^0.2.9"
tslib "^2.4.0" tslib "^2.4.0"
"@playwright/experimental-ct-react@1.31.0": "@playwright/experimental-ct-react@1.32.3":
version "1.31.0" version "1.32.3"
resolved "https://registry.yarnpkg.com/@playwright/experimental-ct-react/-/experimental-ct-react-1.31.0.tgz#26bab075d4f3b18a249b11c3c7f29311ab7d3ad9" resolved "https://registry.yarnpkg.com/@playwright/experimental-ct-react/-/experimental-ct-react-1.32.3.tgz#167c147d4a425a8adc8160471027a75fbbc92ab6"
integrity sha512-FwYj0KqY8PsrUrUfQGr7Gzm+/iKyHI4pVHLnix9mS2m3yklPYa4N1N1L8AEGICsBZ+jpCtPzNzGXn18s4dF2Bg== integrity sha512-sLFbMAIXiyWcgK9g6Nfe9FhOyxNKoBVrV6ES6bv6OyjzT33m0Coi1PN3fyCFjQaZUaiup/UyLS6dbSLTX7bHwA==
dependencies: dependencies:
"@playwright/test" "1.31.0" "@playwright/test" "1.32.3"
"@vitejs/plugin-react" "^3.1.0" "@vitejs/plugin-react" "^3.1.0"
vite "^4.1.1" vite "^4.1.1"
"@playwright/test@1.31.0": "@playwright/test@1.32.3":
version "1.31.0" version "1.32.3"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.31.0.tgz#bde42ca06804164be54893525110adda946248d6" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.32.3.tgz#75be8346d4ef289896835e1d2a86fdbe3d9be92a"
integrity sha512-Ys5s/06Dg9g3zAIdCIb/UOBYim3U7Zjb3DvC6XBtnRmnglH5O47iwYzmtxXu9fhSyzI2Jn28apkXIOD81GgCdw== integrity sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
playwright-core "1.31.0" playwright-core "1.32.3"
optionalDependencies: optionalDependencies:
fsevents "2.3.2" fsevents "2.3.2"
...@@ -3958,6 +3965,299 @@ ...@@ -3958,6 +3965,299 @@
"@svgr/plugin-jsx" "^6.5.1" "@svgr/plugin-jsx" "^6.5.1"
"@svgr/plugin-svgo" "^6.5.1" "@svgr/plugin-svgo" "^6.5.1"
"@swagger-api/apidom-ast@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ast/-/apidom-ast-0.69.0.tgz#5b1ca845c3d237c3785c78c725a3a556129e8989"
integrity sha512-JsRyi1Ir3VeNSSWmIFqgaFOQCIUvCoKcfmOcU/h4Jz1IOkQij1vj3qEFln4J9sByOWHrhA8zD1Cf+LnXkbGVZg==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
unraw "=2.0.1"
"@swagger-api/apidom-core@>=0.69.2 <1.0.0", "@swagger-api/apidom-core@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-core/-/apidom-core-0.69.2.tgz#37df0b8f21be1d81d1f7145fed3ba5e464925431"
integrity sha512-av9vS1SbXxGJvCt4QggrIvS8dr3ZfL6jxrNQGr4cq1wFY/n5ruj0RsXix208c3Zp1Kua3QVOUaJvA+7RdT1VJA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
"@types/ramda" "=0.28.23"
minim "=0.23.8"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
short-unique-id "=4.4.4"
stampit "=4.3.2"
"@swagger-api/apidom-json-pointer@>=0.69.2 <1.0.0", "@swagger-api/apidom-json-pointer@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.69.2.tgz#b830ba9de425f36ceafc14bd850f56633d303ce0"
integrity sha512-ipu94QNw8ZKWC+pfie5IyIzVImR5N0PANXkUSfFon5L4aMAtggKpZn7aUv/2Cxn51JsCvjZwkXT7PaJ8RddpxA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-ns-api-design-systems@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.69.2.tgz#4062943a03225de95a91b2f6f09a6f2558f26565"
integrity sha512-JnOPiDvPfNH/6WWVBqBwK0oIHscHECtL1iZDUE9nB4NSbyoV10oulkuhHNAO9BImqtU4rxtWbXyTL1MEuUdHHQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-asyncapi-2@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.69.2.tgz#b4d0fef1dee9c0ccef551b429157e8c737402fc2"
integrity sha512-SOg9P4rM5Aj2jabt4njmFbZTRMX8/vRHgiDL9vE+uz7s6j64B9QBSFF42j17cEVq6ToqQ7jtu40f1D7K62puQA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-json-schema-draft-7" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-4@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.69.2.tgz#d558c276b83389d4bf20bb3bacd57955c256596b"
integrity sha512-8yB4afGBAX+vN5oNRxZMWWS/2G0Q9VUzlL2AOu0Q70FQkscbjQcsb6QX9LbHFMrwi3MgOgE0ewMncpcwskuoXA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-6@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.69.2.tgz#c86f17e9cbdea97a1d70b4d9f3584465e5e8f2e9"
integrity sha512-RPazXv7L37vrdqHeFy/ZrKVz+vnVOqEFrHFefaq2L5avnzInVTRsTJm+61q0jqnckozz426Gbg5wJgq+Yvpbqg==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-7@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.69.2.tgz#af2661cb3dfec302f3caba07e25437a35b49d0a7"
integrity sha512-pQQE85xjv+UaObQzkhpOPochQ8GhWETAUuzDxHrgKmw20Ca03QAC7RV3tbSnkIbI5cy9wpb4gRM0T5/PzZnBYA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-json-schema-draft-6" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-openapi-3-0@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.69.2.tgz#97385359da3bbfe5b51eddeba7cf9879fec9132e"
integrity sha512-OroXRC+Q1btrpuQ3+ZbMi9XGYiab3YQMg/Rx1wpszbW5C5IPtaa2/FtMcBGYWR5IIdxi+bAT8itbMBGSCcz/Ew==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-openapi-3-1@>=0.69.2 <1.0.0", "@swagger-api/apidom-ns-openapi-3-1@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.69.2.tgz#58abda9ca82af4cfc49d9aa61c5a87629e40cbe9"
integrity sha512-2yyUmdbvkDnZuOGDduvlp4dtLL/8a1PCR+Ajk9+PR4ZTdbMFtZWcr/knGc33Rtr8eXQwd4NPypFHhTLCEHiGwg==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-parser-adapter-api-design-systems-json@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.69.2.tgz#779c3dd2e36e576513432d1683aa6663b29b9292"
integrity sha512-qVL8JrnsjuD3uS1PTNoBTKd5YXPs2SfxRGyKwcmrUXFS+jJmbyYF04xmCgXkwI6TZYjY6KlNb8vmOt4Xr8FqnA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.2"
"@swagger-api/apidom-parser-adapter-json" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.69.2.tgz#0e4a6843330a9871d189e16a43f18e441fcb92b6"
integrity sha512-vMWfQiXcSeo9XSJJ1Yny4BAUw/3RBbBTsPBbNSsnMtpcDhBbodxdko1CeYkGc8sKM0QyeTFPJuiVhb3kGidbcQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.2"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-asyncapi-json-2@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.69.2.tgz#7d319ae39c10758b63b32b3dafb85a55651e8642"
integrity sha512-/WDVzOcGFxSgBVCiXHVnfiOeYIWtn2RG/Bnn8leUmWRN9oRBiCS3Lh60qWVpvs4BOVntL7SYJnC+buicKD1iJA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.2"
"@swagger-api/apidom-parser-adapter-json" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.69.2.tgz#13ccfc09e36ccb7e9280bafa85a2112936823c81"
integrity sha512-qr5epdayokdYyPIJITyqWmUxdknhgPbXhWpSxdEvM8UHgtyutvvvFenFM5pXD1ft8I/uv9oj2WNZxCH2mpsR1g==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.2"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-json@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.69.2.tgz#178d0c84db723ce05f0e159b2731c57dba7c1660"
integrity sha512-mRXrf9bz2lxf9DY2n2WkB3GlQ8MXRqKBwpXLwjDqqve25Wf6X8QNzfz5ykYORQMuyDIgPq/8aMet7yjHRNtcUQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
tree-sitter "=0.20.1"
tree-sitter-json "=0.20.0"
web-tree-sitter "=0.20.7"
"@swagger-api/apidom-parser-adapter-openapi-json-3-0@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.69.2.tgz#33aeb3315bbec6b8460ea8eaf25659d66299e0b5"
integrity sha512-NGOX9NcrAy1RX1f+uA2rLZbgVWte6O4HRVk0eVjuR3NKjJzuXFdfaYJUpT8IGJx2cW6HsQtJU+BpR+LMfZnM9A==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.2"
"@swagger-api/apidom-parser-adapter-json" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-json-3-1@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.69.2.tgz#4b5daff23257cb1523255739c3fe3b376840b33c"
integrity sha512-agafo94Uru42/nnydZ2wEt3ENAB6LWAd9l4d8wZL0ifAkjx8fv8rfH601LpFBQq3iD2DlGm0+UpFZXLfBuuQbQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.2"
"@swagger-api/apidom-parser-adapter-json" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.69.2.tgz#2b22bcb7ed376c4612a1157420cb039649fd46c4"
integrity sha512-p7Wqk7vCgh9mkXQmk9I/uXri2+1MLCQ14NHfrVowey4ntH4LzBf0NtvxgfCryzzLb2RpdUwIxoh+uf4ibTzyyA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.2"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.69.2.tgz#9fc15e0e6024d7ffaaa6f77c5b64781e83a37e47"
integrity sha512-Dq914JCnOqmRl6DyxeaP91MlZvIn62hax4RsANeiHIm2ICwwCQLNM9RNUkWq3iimHZpvTz+etM3QkKMakXUnqQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.2"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2@^0.69.2":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.69.2.tgz#d558b9a54f31508d8ec4e17148822180ad37d13d"
integrity sha512-5sWKGF/phSd+kvOD8xfB2W26QeN2U6LOoLy6eYvf8DP5q4doiLoEcVIunpcVjl04IWVet+VFH9XFGEMlKk7qKQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.2"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
tree-sitter "=0.20.1"
tree-sitter-yaml "=0.5.0"
web-tree-sitter "=0.20.7"
"@swagger-api/apidom-reference@>=0.69.2 <1.0.0":
version "0.69.2"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-reference/-/apidom-reference-0.69.2.tgz#dfb0986d440fef7543a5a2569d513cc1751d6f45"
integrity sha512-aJsgtCP71t8a+frS+qn1FW9MqjjK60c3AnB2G3cUXGVwzmEPEkvBFF0LGlPmHftVvzzBvI7AsMC7+HZPM/t7rQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.2"
"@types/ramda" "=0.28.23"
axios "=1.3.4"
minimatch "=7.4.3"
process "=0.11.10"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
optionalDependencies:
"@swagger-api/apidom-json-pointer" "^0.69.2"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.2"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.2"
"@swagger-api/apidom-parser-adapter-api-design-systems-json" "^0.69.2"
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml" "^0.69.2"
"@swagger-api/apidom-parser-adapter-asyncapi-json-2" "^0.69.2"
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2" "^0.69.2"
"@swagger-api/apidom-parser-adapter-json" "^0.69.2"
"@swagger-api/apidom-parser-adapter-openapi-json-3-0" "^0.69.2"
"@swagger-api/apidom-parser-adapter-openapi-json-3-1" "^0.69.2"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0" "^0.69.2"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^0.69.2"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.2"
"@swc/helpers@0.4.14": "@swc/helpers@0.4.14":
version "0.4.14" version "0.4.14"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
...@@ -4405,7 +4705,7 @@ ...@@ -4405,7 +4705,7 @@
dependencies: dependencies:
"@types/unist" "*" "@types/unist" "*"
"@types/hoist-non-react-statics@^3.3.0": "@types/hoist-non-react-statics@^3.3.1":
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
...@@ -4532,6 +4832,13 @@ ...@@ -4532,6 +4832,13 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/ramda@=0.28.23":
version "0.28.23"
resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.28.23.tgz#d04279865a86c330c03c99ac61161d9905f276f5"
integrity sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==
dependencies:
ts-toolbelt "^6.15.1"
"@types/react-dom@18.0.5": "@types/react-dom@18.0.5":
version "18.0.5" version "18.0.5"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.5.tgz#330b2d472c22f796e5531446939eacef8378444a" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.5.tgz#330b2d472c22f796e5531446939eacef8378444a"
...@@ -4553,16 +4860,6 @@ ...@@ -4553,16 +4860,6 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react-redux@^7.1.20":
version "7.1.25"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88"
integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==
dependencies:
"@types/hoist-non-react-statics" "^3.3.0"
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-scroll@^1.8.4": "@types/react-scroll@^1.8.4":
version "1.8.4" version "1.8.4"
resolved "https://registry.yarnpkg.com/@types/react-scroll/-/react-scroll-1.8.4.tgz#2b6258fb34104d3fcc7a22e8eceaadc669ba3ad1" resolved "https://registry.yarnpkg.com/@types/react-scroll/-/react-scroll-1.8.4.tgz#2b6258fb34104d3fcc7a22e8eceaadc669ba3ad1"
...@@ -4578,9 +4875,9 @@ ...@@ -4578,9 +4875,9 @@
"@types/react" "*" "@types/react" "*"
"@types/react@*": "@types/react@*":
version "18.0.21" version "18.0.37"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.37.tgz#7a784e2a8b8f83abb04dc6b9ed9c9b4c0aee9be7"
integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== integrity sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==
dependencies: dependencies:
"@types/prop-types" "*" "@types/prop-types" "*"
"@types/scheduler" "*" "@types/scheduler" "*"
...@@ -4596,9 +4893,9 @@ ...@@ -4596,9 +4893,9 @@
csstype "^3.0.2" csstype "^3.0.2"
"@types/scheduler@*": "@types/scheduler@*":
version "0.16.2" version "0.16.3"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5"
integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==
"@types/secp256k1@^4.0.1": "@types/secp256k1@^4.0.1":
version "4.0.3" version "4.0.3"
...@@ -4639,6 +4936,11 @@ ...@@ -4639,6 +4936,11 @@
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
"@types/use-sync-external-store@^0.0.3":
version "0.0.3"
resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43"
integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
"@types/ws@^7.4.4": "@types/ws@^7.4.4":
version "7.4.7" version "7.4.7"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702"
...@@ -5647,6 +5949,15 @@ axe-core@^4.4.3: ...@@ -5647,6 +5949,15 @@ axe-core@^4.4.3:
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f"
integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==
axios@=1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024"
integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axios@^0.21.0: axios@^0.21.0:
version "0.21.4" version "0.21.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
...@@ -5803,6 +6114,15 @@ bindings@^1.3.0: ...@@ -5803,6 +6114,15 @@ bindings@^1.3.0:
dependencies: dependencies:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
blakejs@^1.1.0: blakejs@^1.1.0:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
...@@ -5965,7 +6285,7 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: ...@@ -5965,7 +6285,7 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.2.1" ieee754 "^1.2.1"
buffer@^5.4.3: buffer@^5.4.3, buffer@^5.5.0:
version "5.7.1" version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
...@@ -6087,6 +6407,11 @@ chokidar@^3.5.3: ...@@ -6087,6 +6407,11 @@ chokidar@^3.5.3:
optionalDependencies: optionalDependencies:
fsevents "~2.3.2" fsevents "~2.3.2"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
ci-info@^2.0.0: ci-info@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
...@@ -6340,9 +6665,9 @@ core-js-compat@^3.25.1: ...@@ -6340,9 +6665,9 @@ core-js-compat@^3.25.1:
browserslist "^4.21.4" browserslist "^4.21.4"
core-js-pure@^3.25.1: core-js-pure@^3.25.1:
version "3.25.5" version "3.30.1"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec"
integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg==
core-util-is@~1.0.0: core-util-is@~1.0.0:
version "1.0.3" version "1.0.3"
...@@ -6494,11 +6819,16 @@ cssstyle@^2.3.0: ...@@ -6494,11 +6819,16 @@ cssstyle@^2.3.0:
dependencies: dependencies:
cssom "~0.3.6" cssom "~0.3.6"
csstype@^3.0.11, csstype@^3.0.2: csstype@^3.0.11:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
csstype@^3.0.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14"
...@@ -6808,6 +7138,13 @@ decode-uri-component@^0.2.0: ...@@ -6808,6 +7138,13 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
dependencies:
mimic-response "^2.0.0"
dedent@^0.7.0: dedent@^0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
...@@ -6834,7 +7171,7 @@ deep-equal@^2.0.5: ...@@ -6834,7 +7171,7 @@ deep-equal@^2.0.5:
which-collection "^1.0.1" which-collection "^1.0.1"
which-typed-array "^1.1.8" which-typed-array "^1.1.8"
deep-extend@0.6.0: deep-extend@0.6.0, deep-extend@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
...@@ -6844,11 +7181,16 @@ deep-is@^0.1.3, deep-is@~0.1.3: ...@@ -6844,11 +7181,16 @@ deep-is@^0.1.3, deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.2.2, deepmerge@~4.2.2: deepmerge@^4.2.2:
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
deepmerge@~4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
define-lazy-prop@^2.0.0: define-lazy-prop@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
...@@ -6899,6 +7241,11 @@ detect-browser@5.3.0, detect-browser@^5.2.0: ...@@ -6899,6 +7241,11 @@ detect-browser@5.3.0, detect-browser@^5.2.0:
resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca"
integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
detect-newline@^3.0.0: detect-newline@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
...@@ -6991,10 +7338,10 @@ domhandler@^4.2.0, domhandler@^4.3.1: ...@@ -6991,10 +7338,10 @@ domhandler@^4.2.0, domhandler@^4.3.1:
dependencies: dependencies:
domelementtype "^2.2.0" domelementtype "^2.2.0"
dompurify@=2.3.10: dompurify@=3.0.1:
version "2.3.10" version "3.0.1"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.1.tgz#a0933f38931b3238934dd632043b727e53004289"
integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g== integrity sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw==
domutils@^2.8.0: domutils@^2.8.0:
version "2.8.0" version "2.8.0"
...@@ -7850,6 +8197,11 @@ exit@^0.1.2: ...@@ -7850,6 +8197,11 @@ exit@^0.1.2:
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
expand-template@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
expect@^29.0.0, expect@^29.3.1: expect@^29.0.0, expect@^29.3.1:
version "29.3.1" version "29.3.1"
resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6"
...@@ -8044,7 +8396,7 @@ focus-lock@^0.11.6: ...@@ -8044,7 +8396,7 @@ focus-lock@^0.11.6:
dependencies: dependencies:
tslib "^2.0.3" tslib "^2.0.3"
follow-redirects@^1.14.0: follow-redirects@^1.14.0, follow-redirects@^1.15.0:
version "1.15.2" version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
...@@ -8062,9 +8414,9 @@ for-each@^0.3.3: ...@@ -8062,9 +8414,9 @@ for-each@^0.3.3:
is-callable "^1.1.3" is-callable "^1.1.3"
form-data-encoder@^1.4.3: form-data-encoder@^1.4.3:
version "1.7.2" version "1.9.0"
resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.9.0.tgz#fd18d316b1ec830d2a8be8ad86c1cf0317320b34"
integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== integrity sha512-rahaRMkN8P8d/tgK/BLPX+WBVM27NbvdXBxqQujBtkDAIFspaRqN7Od7lfdGQA6KAD+f82fYCLBq1ipvcu8qLw==
form-data@^4.0.0: form-data@^4.0.0:
version "4.0.0" version "4.0.0"
...@@ -8123,6 +8475,11 @@ framesync@6.1.2: ...@@ -8123,6 +8475,11 @@ framesync@6.1.2:
dependencies: dependencies:
tslib "2.4.0" tslib "2.4.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra@^9.0.0: fs-extra@^9.0.0:
version "9.1.0" version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
...@@ -8187,19 +8544,19 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: ...@@ -8187,19 +8544,19 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: get-intrinsic@^1.0.2, get-intrinsic@^1.2.0:
version "1.1.3" version "1.2.0"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f"
integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==
dependencies: dependencies:
function-bind "^1.1.1" function-bind "^1.1.1"
has "^1.0.3" has "^1.0.3"
has-symbols "^1.0.3" has-symbols "^1.0.3"
get-intrinsic@^1.2.0: get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
version "1.2.0" version "1.1.3"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
dependencies: dependencies:
function-bind "^1.1.1" function-bind "^1.1.1"
has "^1.0.3" has "^1.0.3"
...@@ -8233,6 +8590,11 @@ get-tsconfig@^4.5.0: ...@@ -8233,6 +8590,11 @@ get-tsconfig@^4.5.0:
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f"
integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==
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#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
glob-parent@^5.1.2, glob-parent@~5.1.2: glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2" version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
...@@ -8358,7 +8720,12 @@ gopd@^1.0.1: ...@@ -8358,7 +8720,12 @@ gopd@^1.0.1:
dependencies: dependencies:
get-intrinsic "^1.1.3" get-intrinsic "^1.1.3"
graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.10" version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
...@@ -8637,6 +9004,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, ...@@ -8637,6 +9004,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3,
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@~1.3.0:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
internal-slot@^1.0.3: internal-slot@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
...@@ -9816,7 +10188,7 @@ lodash.throttle@^4.1.1: ...@@ -9816,7 +10188,7 @@ lodash.throttle@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
lodash@^4.0.0, lodash@^4.17.20, lodash@^4.17.21: lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.20, lodash@^4.17.21:
version "4.17.21" version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
...@@ -9981,6 +10353,18 @@ mimic-fn@^4.0.0: ...@@ -9981,6 +10353,18 @@ mimic-fn@^4.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
mimic-response@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
minim@=0.23.8:
version "0.23.8"
resolved "https://registry.yarnpkg.com/minim/-/minim-0.23.8.tgz#a529837afe1654f119dfb68ce7487dd8d4866b9c"
integrity sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==
dependencies:
lodash "^4.15.0"
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
...@@ -9991,6 +10375,13 @@ minimalistic-crypto-utils@^1.0.1: ...@@ -9991,6 +10375,13 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
minimatch@=7.4.3:
version "7.4.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.3.tgz#012cbf110a65134bb354ae9773b55256cdb045a2"
integrity sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==
dependencies:
brace-expansion "^2.0.1"
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
...@@ -10005,11 +10396,21 @@ minimatch@^5.0.1: ...@@ -10005,11 +10396,21 @@ minimatch@^5.0.1:
dependencies: dependencies:
brace-expansion "^2.0.1" brace-expansion "^2.0.1"
minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: minimist@^1.2.0, minimist@^1.2.5:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
minimist@^1.2.3, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
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#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mkdirp@^0.5.5: mkdirp@^0.5.5:
version "0.5.6" version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
...@@ -10068,11 +10469,21 @@ mz@^2.7.0: ...@@ -10068,11 +10469,21 @@ mz@^2.7.0:
object-assign "^4.0.1" object-assign "^4.0.1"
thenify-all "^1.0.0" thenify-all "^1.0.0"
nan@^2.14.0, nan@^2.14.1:
version "2.17.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb"
integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==
nanoid@^3.3.4: nanoid@^3.3.4:
version "3.3.4" version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
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#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
natural-compare-lite@^1.4.0: natural-compare-lite@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
...@@ -10124,6 +10535,13 @@ nice-try@^1.0.4: ...@@ -10124,6 +10535,13 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
node-abi@^2.21.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
dependencies:
semver "^5.4.1"
node-addon-api@^2.0.0: node-addon-api@^2.0.0:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
...@@ -10184,7 +10602,7 @@ npm-run-path@^5.1.0: ...@@ -10184,7 +10602,7 @@ npm-run-path@^5.1.0:
dependencies: dependencies:
path-key "^4.0.0" path-key "^4.0.0"
npmlog@^4.1.2: npmlog@^4.0.1, npmlog@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
...@@ -10221,11 +10639,16 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: ...@@ -10221,11 +10639,16 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-inspect@^1.12.2, object-inspect@^1.9.0: object-inspect@^1.12.2:
version "1.12.2" version "1.12.2"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
object-inspect@^1.9.0:
version "1.12.3"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
object-is@^1.1.5: object-is@^1.1.5:
version "1.1.5" version "1.1.5"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
...@@ -10693,17 +11116,17 @@ pkg-dir@^4.2.0: ...@@ -10693,17 +11116,17 @@ pkg-dir@^4.2.0:
dependencies: dependencies:
find-up "^4.0.0" find-up "^4.0.0"
playwright-core@1.31.0: playwright-core@1.32.3:
version "1.31.0" version "1.32.3"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.0.tgz#dbd184771535e76c6743ef5c082def5564f07e85" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.32.3.tgz#e6dc7db0b49e9b6c0b8073c4a2d789a96f519c48"
integrity sha512-/KquBjS5DcASCh8cGeNVHuC0kyb7c9plKTwaKxgOGtxT7+DZO2fjmFvPDBSXslEIK5CeOO/2kk5rOCktFXKEdA== integrity sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==
playwright@1.31.0: playwright@1.32.3:
version "1.31.0" version "1.32.3"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.31.0.tgz#c34de492c79b65dfa1a3e45c5bded785f0badc6c" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.32.3.tgz#88583167880e42ca04fa8c4cc303680f4ff457d0"
integrity sha512-cFn1ie3bdYw/9/Ty3842CfPSRSy+ZWPjEhrxWgC+jL/CUjq5RKVJZwUbXV1UKBQU1Vo0NetsokXmk9EEZiqVHQ== integrity sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==
dependencies: dependencies:
playwright-core "1.31.0" playwright-core "1.32.3"
pngjs@^3.3.0: pngjs@^3.3.0:
version "3.4.0" version "3.4.0"
...@@ -10794,6 +11217,25 @@ preact@^10.5.9: ...@@ -10794,6 +11217,25 @@ preact@^10.5.9:
resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
prebuild-install@^6.0.1:
version "6.1.4"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f"
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"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
...@@ -10847,7 +11289,7 @@ process-warning@^2.0.0: ...@@ -10847,7 +11289,7 @@ process-warning@^2.0.0:
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.0.0.tgz#341dbeaac985b90a04ebcd844d50097c7737b2ee" resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.0.0.tgz#341dbeaac985b90a04ebcd844d50097c7737b2ee"
integrity sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww== integrity sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==
process@^0.11.10: process@=0.11.10, process@^0.11.10:
version "0.11.10" version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
...@@ -10942,7 +11384,14 @@ qrcode@1.5.1, qrcode@^1.5.1: ...@@ -10942,7 +11384,14 @@ qrcode@1.5.1, qrcode@^1.5.1:
pngjs "^5.0.0" pngjs "^5.0.0"
yargs "^15.3.1" yargs "^15.3.1"
qs@^6.10.2, qs@^6.10.3: qs@^6.10.2:
version "6.11.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f"
integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==
dependencies:
side-channel "^1.0.4"
qs@^6.10.3:
version "6.11.0" version "6.11.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
...@@ -10988,6 +11437,16 @@ quick-format-unescaped@^4.0.3: ...@@ -10988,6 +11437,16 @@ quick-format-unescaped@^4.0.3:
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
ramda-adjunct@=3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/ramda-adjunct/-/ramda-adjunct-3.4.0.tgz#3b07f4d879406b8cbb5415b165bea48d2fe0ab06"
integrity sha512-qKRgqwZzJUZmPJfGK8/uLVxQXkiftKhW6FW9NUCUlQrzsBUZBvFAZUxwH7nTRwDMg+ChRU69rVVuS/4EUgtuIg==
ramda@=0.28.0:
version "0.28.0"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97"
integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==
randexp@^0.5.3: randexp@^0.5.3:
version "0.5.3" version "0.5.3"
resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738" resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738"
...@@ -11003,6 +11462,16 @@ randombytes@^2.1.0: ...@@ -11003,6 +11462,16 @@ randombytes@^2.1.0:
dependencies: dependencies:
safe-buffer "^5.1.0" safe-buffer "^5.1.0"
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-async-script@^1.1.1: react-async-script@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/react-async-script/-/react-async-script-1.2.0.tgz#ab9412a26f0b83f5e2e00de1d2befc9400834b21" resolved "https://registry.yarnpkg.com/react-async-script/-/react-async-script-1.2.0.tgz#ab9412a26f0b83f5e2e00de1d2befc9400834b21"
...@@ -11099,7 +11568,7 @@ react-is@^16.13.1, react-is@^16.7.0: ...@@ -11099,7 +11568,7 @@ react-is@^16.13.1, react-is@^16.7.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^17.0.1, react-is@^17.0.2: react-is@^17.0.1:
version "17.0.2" version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
...@@ -11116,17 +11585,17 @@ react-jazzicon@^1.0.4: ...@@ -11116,17 +11585,17 @@ react-jazzicon@^1.0.4:
dependencies: dependencies:
mersenne-twister "^1.1.0" mersenne-twister "^1.1.0"
react-redux@^7.2.4: react-redux@^8.0.5:
version "7.2.9" version "8.0.5"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.5.tgz#e5fb8331993a019b8aaf2e167a93d10af469c7bd"
integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== integrity sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==
dependencies: dependencies:
"@babel/runtime" "^7.15.4" "@babel/runtime" "^7.12.1"
"@types/react-redux" "^7.1.20" "@types/hoist-non-react-statics" "^3.3.1"
"@types/use-sync-external-store" "^0.0.3"
hoist-non-react-statics "^3.3.2" hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0" react-is "^18.0.0"
prop-types "^15.7.2" use-sync-external-store "^1.0.0"
react-is "^17.0.2"
react-refresh@^0.14.0: react-refresh@^0.14.0:
version "0.14.0" version "0.14.0"
...@@ -11242,6 +11711,15 @@ readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: ...@@ -11242,6 +11711,15 @@ readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0:
string_decoder "^1.1.1" string_decoder "^1.1.1"
util-deprecate "^1.0.1" util-deprecate "^1.0.1"
readable-stream@^3.4.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@^4.0.0: readable-stream@^4.0.0:
version "4.2.0" version "4.2.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46"
...@@ -11285,7 +11763,7 @@ redux-immutable@^4.0.0: ...@@ -11285,7 +11763,7 @@ redux-immutable@^4.0.0:
resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3"
integrity sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg== integrity sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==
redux@^4.0.0, redux@^4.1.2: redux@^4.1.2:
version "4.2.1" version "4.2.1"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
...@@ -11430,9 +11908,9 @@ requires-port@^1.0.0: ...@@ -11430,9 +11908,9 @@ requires-port@^1.0.0:
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
reselect@^4.1.5: reselect@^4.1.5:
version "4.1.7" version "4.1.8"
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524"
integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==
resolve-cwd@^3.0.0: resolve-cwd@^3.0.0:
version "3.0.0" version "3.0.0"
...@@ -11679,7 +12157,7 @@ semver@7.x, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: ...@@ -11679,7 +12157,7 @@ semver@7.x, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^5.5.0, semver@^5.6.0: semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1" version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
...@@ -11746,6 +12224,11 @@ shebang-regex@^3.0.0: ...@@ -11746,6 +12224,11 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
short-unique-id@=4.4.4:
version "4.4.4"
resolved "https://registry.yarnpkg.com/short-unique-id/-/short-unique-id-4.4.4.tgz#a45df68303bbd2dbb5785ed7708e891809c9cb7a"
integrity sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw==
side-channel@^1.0.4: side-channel@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
...@@ -11760,6 +12243,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: ...@@ -11760,6 +12243,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
simple-concat "^1.0.0"
sisteransi@^1.0.5: sisteransi@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
...@@ -11875,6 +12372,11 @@ stack-utils@^2.0.3: ...@@ -11875,6 +12372,11 @@ stack-utils@^2.0.3:
dependencies: dependencies:
escape-string-regexp "^2.0.0" escape-string-regexp "^2.0.0"
stampit@=4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/stampit/-/stampit-4.3.2.tgz#cfd3f607dd628a161ce6305621597994b4d56573"
integrity sha512-pE2org1+ZWQBnIxRPrBM2gVupkuDD0TTNIo1H6GdT/vO82NXli2z8lRE8cu/nBIHrcOCXFBAHpb9ZldrB2/qOA==
state-local@^1.0.6: state-local@^1.0.6:
version "1.0.7" version "1.0.7"
resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5"
...@@ -12090,6 +12592,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: ...@@ -12090,6 +12592,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
style-loader@^3.3.1: style-loader@^3.3.1:
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575"
...@@ -12195,15 +12702,19 @@ svgo@^2.8.0: ...@@ -12195,15 +12702,19 @@ svgo@^2.8.0:
picocolors "^1.0.0" picocolors "^1.0.0"
stable "^0.1.8" stable "^0.1.8"
swagger-client@^3.18.5: swagger-client@^3.19.5:
version "3.18.5" version "3.19.6"
resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.18.5.tgz#8034df561452f4bbd36871a8072394b7ca883106" resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.19.6.tgz#ca27831b57669194540afa4bf9488d5fe5b0f519"
integrity sha512-c0txGDtfQTJnaIBaEKCwtRNcUaaAfj+RXI4QVV9p3WW+AUCQqp4naCjaDNNsOfMkE4ySyhnblbL+jGqAVC7snw== integrity sha512-fd0XaoKz3lgs6viKkqK+o8QyrOOZULD4tLcUd8wEfsVBjJIAks2Qa1AhGUr87mfCWZw0Z9OXItWF9T477rRXzw==
dependencies: dependencies:
"@babel/runtime-corejs3" "^7.11.2" "@babel/runtime-corejs3" "^7.20.13"
"@swagger-api/apidom-core" ">=0.69.2 <1.0.0"
"@swagger-api/apidom-json-pointer" ">=0.69.2 <1.0.0"
"@swagger-api/apidom-ns-openapi-3-1" ">=0.69.2 <1.0.0"
"@swagger-api/apidom-reference" ">=0.69.2 <1.0.0"
cookie "~0.5.0" cookie "~0.5.0"
cross-fetch "^3.1.5" cross-fetch "^3.1.5"
deepmerge "~4.2.2" deepmerge "~4.3.0"
fast-json-patch "^3.0.0-1" fast-json-patch "^3.0.0-1"
form-data-encoder "^1.4.3" form-data-encoder "^1.4.3"
formdata-node "^4.0.0" formdata-node "^4.0.0"
...@@ -12215,17 +12726,17 @@ swagger-client@^3.18.5: ...@@ -12215,17 +12726,17 @@ swagger-client@^3.18.5:
url "~0.11.0" url "~0.11.0"
swagger-ui-react@^4.15.5: swagger-ui-react@^4.15.5:
version "4.15.5" version "4.18.2"
resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-4.15.5.tgz#b3cdfa16f327e31d5a8e512f1610cf933ba53f31" resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-4.18.2.tgz#8ab7dc1a9d6b3101cf80a8c3fd00872fbf24debc"
integrity sha512-jt2g6cDt3wOsc+1YQv4D86V4K659Xs1/pbhjYWlgNfjZB0TSN601MASWxbP+65U0iPpsJTpF7EmRzAunTOVs8Q== integrity sha512-UkREQzLyNHIuHxfh37+JnVrUiNYwXw9Glw8ywj8iuPy+Kvcsf0ct9A6QUUczUr3jEuMaop8JEJZpsfK5S+XKGw==
dependencies: dependencies:
"@babel/runtime-corejs3" "^7.18.9" "@babel/runtime-corejs3" "^7.18.9"
"@braintree/sanitize-url" "=6.0.0" "@braintree/sanitize-url" "=6.0.2"
base64-js "^1.5.1" base64-js "^1.5.1"
classnames "^2.3.1" classnames "^2.3.1"
css.escape "1.5.1" css.escape "1.5.1"
deep-extend "0.6.0" deep-extend "0.6.0"
dompurify "=2.3.10" dompurify "=3.0.1"
ieee754 "^1.2.1" ieee754 "^1.2.1"
immutable "^3.x.x" immutable "^3.x.x"
js-file-download "^0.4.12" js-file-download "^0.4.12"
...@@ -12240,7 +12751,7 @@ swagger-ui-react@^4.15.5: ...@@ -12240,7 +12751,7 @@ swagger-ui-react@^4.15.5:
react-immutable-proptypes "2.2.0" react-immutable-proptypes "2.2.0"
react-immutable-pure-component "^2.2.0" react-immutable-pure-component "^2.2.0"
react-inspector "^6.0.1" react-inspector "^6.0.1"
react-redux "^7.2.4" react-redux "^8.0.5"
react-syntax-highlighter "^15.5.0" react-syntax-highlighter "^15.5.0"
redux "^4.1.2" redux "^4.1.2"
redux-immutable "^4.0.0" redux-immutable "^4.0.0"
...@@ -12248,7 +12759,7 @@ swagger-ui-react@^4.15.5: ...@@ -12248,7 +12759,7 @@ swagger-ui-react@^4.15.5:
reselect "^4.1.5" reselect "^4.1.5"
serialize-error "^8.1.0" serialize-error "^8.1.0"
sha.js "^2.4.11" sha.js "^2.4.11"
swagger-client "^3.18.5" swagger-client "^3.19.5"
url-parse "^1.5.8" url-parse "^1.5.8"
xml "=1.0.1" xml "=1.0.1"
xml-but-prettier "^1.0.1" xml-but-prettier "^1.0.1"
...@@ -12277,6 +12788,27 @@ tapable@^2.2.0: ...@@ -12277,6 +12788,27 @@ tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar-fs@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
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@^2.1.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
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"
test-exclude@^6.0.0: test-exclude@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
...@@ -12403,6 +12935,28 @@ traverse@~0.6.6: ...@@ -12403,6 +12935,28 @@ traverse@~0.6.6:
resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe"
integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==
tree-sitter-json@=0.20.0:
version "0.20.0"
resolved "https://registry.yarnpkg.com/tree-sitter-json/-/tree-sitter-json-0.20.0.tgz#e17bb4917e8d5fe9f2f0d5eaec603e2d3552b07c"
integrity sha512-PteOLH+Tx6Bz4ZA/d40/DbkiSXXRM/gKahhHI8hQ1lWNfFvdknnz9k3Mz84ol5srRyLboJ8wp8GSkhZ6ht9EGQ==
dependencies:
nan "^2.14.1"
tree-sitter-yaml@=0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz#c617ba72837399d8105ec10cdb4c360e1ed76076"
integrity sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==
dependencies:
nan "^2.14.0"
tree-sitter@=0.20.1:
version "0.20.1"
resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.20.1.tgz#1ebed9e22f4d488d74f8f5ce10bfc1953daf37bc"
integrity sha512-Cmb8V0ocamHbgWMVhZIa+78k/7r8VCQ6+ePG8eYEAO7AccwWi06Ct4ATNiI94KwhIkRl0+OwZ42/5nk3GnEMpQ==
dependencies:
nan "^2.14.0"
prebuild-install "^6.0.1"
ts-interface-checker@^0.1.9: ts-interface-checker@^0.1.9:
version "0.1.13" version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
...@@ -12441,6 +12995,11 @@ ts-node@^10.9.1: ...@@ -12441,6 +12995,11 @@ ts-node@^10.9.1:
v8-compile-cache-lib "^3.0.1" v8-compile-cache-lib "^3.0.1"
yn "3.1.1" yn "3.1.1"
ts-toolbelt@^6.15.1:
version "6.15.5"
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83"
integrity sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==
tsconfig-paths@^3.14.1: tsconfig-paths@^3.14.1:
version "3.14.1" version "3.14.1"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
...@@ -12482,6 +13041,13 @@ tsutils@^3.21.0: ...@@ -12482,6 +13041,13 @@ tsutils@^3.21.0:
dependencies: dependencies:
tslib "^1.8.1" tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies:
safe-buffer "^5.0.1"
type-check@^0.4.0, type-check@~0.4.0: type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
...@@ -12594,6 +13160,11 @@ universalify@^2.0.0: ...@@ -12594,6 +13160,11 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
unraw@=2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unraw/-/unraw-2.0.1.tgz#7b51dcdfb1e43d59d5e52cdb44d349d029edbaba"
integrity sha512-tdOvLfRzHolwYcHS6HIX860MkK9LQ4+oLuNwFYL7bpgTEO64PZrcQxkisgwJYCfF8sKiWLwwu1c83DvMkbefIQ==
update-browserslist-db@^1.0.9: update-browserslist-db@^1.0.9:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
...@@ -12653,7 +13224,7 @@ use-sidecar@^1.1.2: ...@@ -12653,7 +13224,7 @@ use-sidecar@^1.1.2:
detect-node-es "^1.1.0" detect-node-es "^1.1.0"
tslib "^2.0.0" tslib "^2.0.0"
use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
...@@ -12781,6 +13352,11 @@ web-streams-polyfill@^3.0.3: ...@@ -12781,6 +13352,11 @@ web-streams-polyfill@^3.0.3:
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==
web-tree-sitter@=0.20.7:
version "0.20.7"
resolved "https://registry.yarnpkg.com/web-tree-sitter/-/web-tree-sitter-0.20.7.tgz#b0ddb78e8244221a3100f432c7e162516cd9cd09"
integrity sha512-flC9JJmTII9uAeeYpWF8hxDJ7bfY+leldQryetll8Nv4WgI+MXc6h7TiyAZASWl9uC9TvmfdgOjZn1DAQecb3A==
webextension-polyfill-ts@^0.22.0: webextension-polyfill-ts@^0.22.0:
version "0.22.0" version "0.22.0"
resolved "https://registry.yarnpkg.com/webextension-polyfill-ts/-/webextension-polyfill-ts-0.22.0.tgz#86cfd7bab4d9d779d98c8340983f4b691b2343f3" resolved "https://registry.yarnpkg.com/webextension-polyfill-ts/-/webextension-polyfill-ts-0.22.0.tgz#86cfd7bab4d9d779d98c8340983f4b691b2343f3"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment