UNPKG

@xspswap/smart-order-router

Version:
129 lines 16.5 kB
import { Token } from '@x-swap-protocol/sdk-core'; import _ from 'lodash'; import { IERC20Metadata__factory } from '../types/v3/factories/IERC20Metadata__factory'; import { ChainId, log, WRAPPED_NATIVE_CURRENCY } from '../util'; // Some well known tokens on each chain for seeding cache / testing. export const USDT_XDC_APOTHEM = new Token(ChainId.XDC_APOTHEM, '0xac4cdD44931d4A0Ff6B1Ea9206e02FeaC8EB9a50', 6, 'USDT', 'Tether Token'); export const USDC_XDC_APOTHEM = new Token(ChainId.XDC_APOTHEM, '0xDF5038D080Ca5bd21c6c90F0b004306a26Af4bA8', 18, 'USDC', 'USDC'); export const DAI_XDC_APOTHEM = new Token(ChainId.XDC_APOTHEM, '0xE46554Ad93a7046C85f2dA0C20EbD68e41f11b36', 18, 'DAI', 'DAI Stablecoin on XDC testnet'); export const WBTC_XDC_APOTHEM = new Token(ChainId.XDC_APOTHEM, '0x885c04a08FbE1C6059f407E36c35B165704D1A03', 8, 'WBTC', 'Wrapped BTC'); export const XSP_XDC = new Token(ChainId.XDC, '0x36726235dAdbdb4658D33E62a249dCA7c4B2bC68', 18, 'XSP', 'XSwap Protocol'); export const XTT_XDC = new Token(ChainId.XDC, '0x17476dc3eda45aD916cEAdDeA325B240A7FB259D', 18, 'XTT', 'XSwap Treasury Token'); export const SRX_XDC = new Token(ChainId.XDC, '0x5D5f074837f5d4618B3916ba74De1Bf9662a3fEd', 18, 'SRX', 'StoreX'); export const PLI_XDC = new Token(ChainId.XDC, '0xff7412ea7c8445c46a8254dfb557ac1e48094391', 18, 'PLI', 'Plugin'); export const EURS_XDC = new Token(ChainId.XDC, '0x1eBb2C8a71A9ec59bF558886a8Adf8F4a565814F', 2, 'EURS', 'STASIS EURO'); export const PRNT_XDC = new Token(ChainId.XDC, '0x0e11710aad67e7427cfbc12c353284c2e335f62c', 18, 'PRNT', 'PrimeNumbers Token'); export const USDT_XDC = new Token(ChainId.XDC, '0xd4b5f10d61916bd6e0860144a91ac658de8a1437', 6, 'xUSDT', 'USDT@xinfin'); export const FTHM_XDC = new Token(ChainId.XDC, '0x3279dBEfABF3C6ac29d7ff24A6c46645f3F4403c', 18, 'FTHM', 'Fathom Protocol Token'); export const FXD_XDC = new Token(ChainId.XDC, '0x49d3f7543335cf38Fa10889CCFF10207e22110B5', 18, 'FXD', 'Fathom USD'); export const WXDC_XDC = new Token(ChainId.XDC, '0x951857744785e80e2de051c32ee7b25f9c458c42', 18, 'WXDC', 'Wrapped XDC'); export const DOPU_XDC = new Token(ChainId.XDC, '0x3fB46c4Db76d8E9f69F3F8388f43a7CA7E140807', 18, 'DOPU', 'Dog with a Purpose'); export const pstXDC_XDC = new Token(ChainId.XDC, '0x7f115f68a789f819047b94efa0114aa9829b83d8', 18, 'pstXDC', 'PrimeStakeXDC'); export const GAMA_XDC = new Token(ChainId.XDC, '0x678adF7955d8f6dCaa9e2fcC1C5BA70bCcC464E6', 18, 'GAMA', 'Gama Coin'); export const BTCx_XDC = new Token(ChainId.XDC, '0xb6E57fBB2D44092f75d9da2769FFc788ce931320', 18, 'BTCx', 'BitcoinX'); export const BBB_XDC = new Token(ChainId.XDC, '0xFa4dDcFa8E3d0475f544d0de469277CF6e0A6Fd1', 18, 'BBB', 'Beny Bad Boy'); export const LBT_XDC = new Token(ChainId.XDC, '0x05940B2dF33D6371201e7Ae099CeD4C363855dFE', 18, 'LBT', 'Law Block'); export const CGO_XDC = new Token(ChainId.XDC, '0x8f9920283470F52128bF11B0c14E798bE704fD15', 18, 'CGO', 'Comtech Gold'); // Chupa v2 export const CHUPAV2_XDC = new Token(ChainId.XDC, '0xCF071288cC70D737105c97485F9820668EAcCa51', 18, 'CHUPAV2', 'ChupaCabraV2'); export const WTK_XDC = new Token(ChainId.XDC, '0xb3f18b584263191a33169f6393487e43e9586329', 18, 'WTK', 'WadzPay Token'); export const CIFI_XDC = new Token(ChainId.XDC, '0xe5F9AE9D32D93d3934007568B30B7A7cA489C486', 18, 'CIFI', 'Circularity Finance'); export const REFI_XDC = new Token(ChainId.XDC, '0xbc24F5f3f09ced3C12322DB67EffB55297816Ef6', 18, 'REFI', 'REFI Token'); export const BIC_XDC = new Token(ChainId.XDC, '0x11f4B2aE467020FB7Bce8631bAC27F62B869D49a', 18, 'BIC', 'Blue Phoenix Investments Coin'); export const PWM3_XDC = new Token(ChainId.XDC, '0xB2b2aaB80f9fcD8f2bcA8A404Cbbf72A618897c0', 18, 'PWM3', 'Diamondium Private Currency'); export const XZO_XDC = new Token(ChainId.XDC, '0x0df7703E492386CC7ee04E4b4c0A5511e750600C', 18, 'XZO', 'Zodiac Odyssey'); export class TokenProvider { constructor(chainId, multicall2Provider) { this.chainId = chainId; this.multicall2Provider = multicall2Provider; } async getTokens(_addresses, providerConfig) { const addressToToken = {}; const symbolToToken = {}; const addresses = _(_addresses) .map((address) => address.toLowerCase()) .uniq() .value(); if (addresses.length > 0) { const [symbolsResult, decimalsResult] = await Promise.all([ this.multicall2Provider.callSameFunctionOnMultipleContracts({ addresses, contractInterface: IERC20Metadata__factory.createInterface(), functionName: 'symbol', providerConfig, }), this.multicall2Provider.callSameFunctionOnMultipleContracts({ addresses, contractInterface: IERC20Metadata__factory.createInterface(), functionName: 'decimals', providerConfig, }), ]); const { results: symbols } = symbolsResult; const { results: decimals } = decimalsResult; for (let i = 0; i < addresses.length; i++) { const address = addresses[i]; const symbolResult = symbols[i]; const decimalResult = decimals[i]; if (!(symbolResult === null || symbolResult === void 0 ? void 0 : symbolResult.success) || !(decimalResult === null || decimalResult === void 0 ? void 0 : decimalResult.success)) { log.info({ symbolResult, decimalResult, }, `Dropping token with address ${address} as symbol or decimal are invalid`); continue; } const symbol = symbolResult.result[0]; const decimal = decimalResult.result[0]; addressToToken[address.toLowerCase()] = new Token(this.chainId, address, decimal, symbol); symbolToToken[symbol.toLowerCase()] = addressToToken[address.toLowerCase()]; } log.info(`Got token symbol and decimals for ${Object.values(addressToToken).length} out of ${addresses.length} tokens on-chain ${providerConfig ? `as of: ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}` : ''}`); } return { getTokenByAddress: (address) => { return addressToToken[address.toLowerCase()]; }, getTokenBySymbol: (symbol) => { return symbolToToken[symbol.toLowerCase()]; }, getAllTokens: () => { return Object.values(addressToToken); }, }; } } export const DAI_ON = (chainId) => { switch (chainId) { // case ChainId.XDC: // return USDT_BSC; case ChainId.XDC_APOTHEM: return DAI_XDC_APOTHEM; default: throw new Error(`Chain id: ${chainId} not supported`); } }; export const USDT_ON = (chainId) => { switch (chainId) { case ChainId.XDC: return USDT_XDC; case ChainId.XDC_APOTHEM: return USDT_XDC_APOTHEM; default: throw new Error(`Chain id: ${chainId} not supported`); } }; export const USDC_ON = (chainId) => { switch (chainId) { case ChainId.XDC: return USDT_XDC; case ChainId.XDC_APOTHEM: return USDC_XDC_APOTHEM; default: throw new Error(`Chain id: ${chainId} not supported`); } }; export const WNATIVE_ON = (chainId) => { return WRAPPED_NATIVE_CURRENCY[chainId]; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3Rva2VuLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUErQmhFLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssQ0FDdkMsT0FBTyxDQUFDLFdBQVcsRUFDbkIsNENBQTRDLEVBQzVDLENBQUMsRUFDRCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssQ0FDdkMsT0FBTyxDQUFDLFdBQVcsRUFDbkIsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixNQUFNLEVBQ04sTUFBTSxDQUNQLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQ3RDLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLCtCQUErQixDQUNoQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQ3ZDLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLDRDQUE0QyxFQUM1QyxDQUFDLEVBQ0QsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLGdCQUFnQixDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLFFBQVEsQ0FDVCxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLFFBQVEsQ0FDVCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxDQUFDLEVBQ0QsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLG9CQUFvQixDQUNyQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxDQUFDLEVBQ0QsT0FBTyxFQUNQLGFBQWEsQ0FDZCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLHVCQUF1QixDQUN4QixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLFlBQVksQ0FDYixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLG9CQUFvQixDQUNyQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUNqQyxPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsUUFBUSxFQUNSLGVBQWUsQ0FDaEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FDL0IsT0FBTyxDQUFDLEdBQUcsRUFDWCw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLE1BQU0sRUFDTixXQUFXLENBQ1osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FDL0IsT0FBTyxDQUFDLEdBQUcsRUFDWCw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FDOUIsT0FBTyxDQUFDLEdBQUcsRUFDWCw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxjQUFjLENBQ2YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FDOUIsT0FBTyxDQUFDLEdBQUcsRUFDWCw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLENBQ1osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FDOUIsT0FBTyxDQUFDLEdBQUcsRUFDWCw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxjQUFjLENBQ2YsQ0FBQztBQUVGLFdBQVc7QUFDWCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQ2xDLE9BQU8sQ0FBQyxHQUFHLEVBQ1gsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixTQUFTLEVBQ1QsY0FBYyxDQUNmLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQzlCLE9BQU8sQ0FBQyxHQUFHLEVBQ1gsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixLQUFLLEVBQ0wsZUFBZSxDQUNoQixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLHFCQUFxQixDQUN0QixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLFlBQVksQ0FDYixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLCtCQUErQixDQUNoQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUMvQixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsTUFBTSxFQUNOLDZCQUE2QixDQUM5QixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUM5QixPQUFPLENBQUMsR0FBRyxFQUNYLDRDQUE0QyxFQUM1QyxFQUFFLEVBQ0YsS0FBSyxFQUNMLGdCQUFnQixDQUNqQixDQUFDO0FBRUYsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFDVSxPQUFnQixFQUNkLGtCQUFzQztRQUR4QyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2QsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtJQUMvQyxDQUFDO0lBRUcsS0FBSyxDQUFDLFNBQVMsQ0FDcEIsVUFBb0IsRUFDcEIsY0FBK0I7UUFFL0IsTUFBTSxjQUFjLEdBQWlDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBZ0MsRUFBRSxDQUFDO1FBRXRELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUM7YUFDNUIsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdkMsSUFBSSxFQUFFO2FBQ04sS0FBSyxFQUFFLENBQUM7UUFFWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUNBQW1DLENBR3pEO29CQUNBLFNBQVM7b0JBQ1QsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsZUFBZSxFQUFFO29CQUM1RCxZQUFZLEVBQUUsUUFBUTtvQkFDdEIsY0FBYztpQkFDZixDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQ0FBbUMsQ0FHekQ7b0JBQ0EsU0FBUztvQkFDVCxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQyxlQUFlLEVBQUU7b0JBQzVELFlBQVksRUFBRSxVQUFVO29CQUN4QixjQUFjO2lCQUNmLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQztZQUMzQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLGNBQWMsQ0FBQztZQUU3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO2dCQUU5QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbEMsSUFBSSxDQUFDLENBQUEsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLE9BQU8sQ0FBQSxJQUFJLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsT0FBTyxDQUFBLEVBQUU7b0JBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQ047d0JBQ0UsWUFBWTt3QkFDWixhQUFhO3FCQUNkLEVBQ0QsK0JBQStCLE9BQU8sbUNBQW1DLENBQzFFLENBQUM7b0JBQ0YsU0FBUztpQkFDVjtnQkFFRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxDQUFDO2dCQUN2QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxDQUFDO2dCQUV6QyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQy9DLElBQUksQ0FBQyxPQUFPLEVBQ1osT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLENBQ1AsQ0FBQztnQkFDRixhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNqQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFFLENBQUM7YUFDMUM7WUFFRCxHQUFHLENBQUMsSUFBSSxDQUNOLHFDQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsTUFDaEMsV0FBVyxTQUFTLENBQUMsTUFBTSxvQkFDekIsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDN0QsRUFBRSxDQUNILENBQUM7U0FDSDtRQUVELE9BQU87WUFDTCxpQkFBaUIsRUFBRSxDQUFDLE9BQWUsRUFBcUIsRUFBRTtnQkFDeEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELGdCQUFnQixFQUFFLENBQUMsTUFBYyxFQUFxQixFQUFFO2dCQUN0RCxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsWUFBWSxFQUFFLEdBQVksRUFBRTtnQkFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsT0FBZ0IsRUFBUyxFQUFFO0lBQ2hELFFBQVEsT0FBTyxFQUFFO1FBQ2Ysb0JBQW9CO1FBQ3BCLHFCQUFxQjtRQUNyQixLQUFLLE9BQU8sQ0FBQyxXQUFXO1lBQ3RCLE9BQU8sZUFBZSxDQUFDO1FBQ3pCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztLQUN6RDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQWdCLEVBQVMsRUFBRTtJQUNqRCxRQUFRLE9BQU8sRUFBRTtRQUNmLEtBQUssT0FBTyxDQUFDLEdBQUc7WUFDZCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLE9BQU8sQ0FBQyxXQUFXO1lBQ3RCLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUI7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3pEO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBZ0IsRUFBUyxFQUFFO0lBQ2pELFFBQVEsT0FBTyxFQUFFO1FBQ2YsS0FBSyxPQUFPLENBQUMsR0FBRztZQUNkLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLEtBQUssT0FBTyxDQUFDLFdBQVc7WUFDdEIsT0FBTyxnQkFBZ0IsQ0FBQztRQUMxQjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxPQUFPLGdCQUFnQixDQUFDLENBQUM7S0FDekQ7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFnQixFQUFTLEVBQUU7SUFDcEQsT0FBTyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUMifQ==