Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PoolAssetManager
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-15 */ // Sources flattened with hardhat v2.11.1 https://hardhat.org // File src/base/Multicall.sol uint256 constant NUM_STABLE_COINS = 2; pragma solidity 0.8.13; /// @title Multicall /// @author Uniswap Labs /// /// @notice Enables calling multiple methods in a single call to the contract abstract contract Multicall { error MulticallFailed(bytes data, bytes result); function multicall( bytes[] calldata data ) external payable returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; ++i) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { revert MulticallFailed(data[i], result); } results[i] = result; } } } // File src/base/ErrorMessages.sol pragma solidity >=0.8.4; /// @notice An error used to indicate that an argument passed to a function is illegal or /// inappropriate. /// /// @param message The error message. error IllegalArgument(string message); /// @notice An error used to indicate that a function has encountered an unrecoverable state. /// /// @param message The error message. error IllegalState(string message); /// @notice An error used to indicate that an operation is unsupported. /// /// @param message The error message. error UnsupportedOperation(string message); /// @notice An error used to indicate that a message sender tried to execute a privileged function. /// /// @param message The error message. error Unauthorized(string message); // File src/base/MutexLock.sol pragma solidity 0.8.13; /// @title Mutex /// @author Alchemix Finance /// /// @notice Provides a mutual exclusion lock for implementing contracts. abstract contract MutexLock { enum State { RESERVED, UNLOCKED, LOCKED } /// @notice The lock state. State private _lockState = State.UNLOCKED; /// @dev A modifier which acquires the mutex. modifier lock() { _claimLock(); _; _freeLock(); } /// @dev Gets if the mutex is locked. /// /// @return if the mutex is locked. function _isLocked() internal view returns (bool) { return _lockState == State.LOCKED; } /// @dev Claims the lock. If the lock is already claimed, then this will revert. function _claimLock() internal { // Check that the lock has not been claimed yet. if (_lockState != State.UNLOCKED) { revert IllegalState("Lock already claimed"); } // Claim the lock. _lockState = State.LOCKED; } /// @dev Frees the lock. function _freeLock() internal { _lockState = State.UNLOCKED; } } // File src/interfaces/IERC20Metadata.sol pragma solidity >=0.5.0; /// @title IERC20Metadata /// @author Alchemix Finance interface IERC20Metadata { /// @notice Gets the name of the token. /// /// @return The name. function name() external view returns (string memory); /// @notice Gets the symbol of the token. /// /// @return The symbol. function symbol() external view returns (string memory); /// @notice Gets the number of decimals that the token has. /// /// @return The number of decimals. function decimals() external view returns (uint8); } // File lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File src/libraries/SafeERC20.sol pragma solidity >=0.8.4; /// @title SafeERC20 /// @author Alchemix Finance library SafeERC20 { /// @notice An error used to indicate that a call to an ERC20 contract failed. /// /// @param target The target address. /// @param success If the call to the token was a success. /// @param data The resulting data from the call. This is error data when the call was not a /// success. Otherwise, this is malformed data when the call was a success. error ERC20CallFailed(address target, bool success, bytes data); /// @dev A safe function to get the decimals of an ERC20 token. /// /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an /// unexpected value. /// /// @param token The target token. /// /// @return The amount of decimals of the token. function expectDecimals(address token) internal view returns (uint8) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20Metadata.decimals.selector) ); if (!success || data.length < 32) { revert ERC20CallFailed(token, success, data); } return abi.decode(data, (uint8)); } /// @dev Transfers tokens to another address. /// /// @dev Reverts with a {CallFailed} error if execution of the transfer failed or returns an /// unexpected value. /// /// @param token The token to transfer. /// @param recipient The address of the recipient. /// @param amount The amount of tokens to transfer. function safeTransfer(address token, address recipient, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, recipient, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Approves tokens for the smart contract. /// /// @dev Reverts with a {CallFailed} error if execution of the approval fails or returns an /// unexpected value. /// /// @param token The token to approve. /// @param spender The contract to spend the tokens. /// @param value The amount of tokens to approve. function safeApprove(address token, address spender, uint256 value) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.approve.selector, spender, value) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } /// @dev Transfer tokens from one address to another address. /// /// @dev Reverts with a {CallFailed} error if execution of the transfer fails or returns an /// unexpected value. /// /// @param token The token to transfer. /// @param owner The address of the owner. /// @param recipient The address of the recipient. /// @param amount The amount of tokens to transfer. function safeTransferFrom(address token, address owner, address recipient, uint256 amount) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transferFrom.selector, owner, recipient, amount) ); if (!success || (data.length != 0 && !abi.decode(data, (bool)))) { revert ERC20CallFailed(token, success, data); } } } // File src/interfaces/IERC20TokenReceiver.sol pragma solidity >=0.5.0; /// @title IERC20TokenReceiver /// @author Alchemix Finance interface IERC20TokenReceiver { /// @notice Informs implementors of this interface that an ERC20 token has been transferred. /// /// @param token The token that was transferred. /// @param value The amount of the token that was transferred. function onERC20Received(address token, uint256 value) external; } // File src/interfaces/external/convex/IConvexStakingWrapper.sol pragma solidity >=0.5.0; interface IConvexStakingWrapper { function deposit(uint256 amount, address to) external; function withdraw(uint256 amount) external; function withdrawAndUnwrap(uint256 _amount) external; } // File src/interfaces/external/curve/IStableSwap2Pool.sol pragma solidity >=0.5.0; uint256 constant N_COINS = 2; interface IStableSwap2Pool { function coins(uint256 index) external view returns (address); function A() external view returns (uint256); function get_virtual_price() external view returns (uint256); function calc_token_amount( uint256[N_COINS] calldata amounts, bool deposit ) external view returns (uint256 amount); function add_liquidity(uint256[N_COINS] calldata amounts, uint256 minimumMintAmount) external; function get_dy(int128 i, int128 j, uint256 dx) external view returns (uint256 dy); function get_dy_underlying(int128 i, int128 j, uint256 dx) external view returns (uint256 dy); function exchange( int128 i, int128 j, uint256 dx, uint256 minimumDy ) external payable returns (uint256); function remove_liquidity(uint256 amount, uint256[N_COINS] calldata minimumAmounts, address receiver) external returns (uint256[] memory); function remove_liquidity_imbalance( uint256[N_COINS] calldata amounts, uint256 maximumBurnAmount ) external; function calc_withdraw_one_coin(uint256 tokenAmount, int128 i) external view returns (uint256); function remove_liquidity_one_coin( uint256 tokenAmount, int128 i, uint256 minimumAmount ) external; } // File src/interfaces/external/convex/IConvexFraxFarm.sol pragma solidity >=0.5.0; interface IConvexFraxFarm { function withdrawLocked(bytes32 kek_id, address destination_address) external returns (uint256); function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32); function earned(address account) external view returns (uint256[] memory); function getReward(address destination_address) external returns (uint256[] memory); function combinedWeightOf(address account) external view returns (uint256); function lockedLiquidityOf(address account) external view returns (uint256); } // File src/interfaces/external/convex/IConvexFraxVault.sol pragma solidity >=0.5.0; interface IConvexFraxVault { function stakeLockedCurveLp(uint256 liquidity, uint256 secs) external returns (bytes32 kekId); function stakeLocked(uint256 liquidity, uint256 secs) external returns (bytes32 kekId); function withdrawLockedAndUnwrap(bytes32 kekId) external; function getReward() external; function earned() external view returns (address[] memory tokenAddresses, uint256[] memory totalEarned); } // File src/interfaces/external/convex/IConvexRewards.sol pragma solidity >=0.5.0; interface IConvexRewards { function rewardToken() external view returns (IERC20); function earned(address account) external view returns (uint256); function extraRewards(uint256 index) external view returns (address); function balanceOf(address account) external returns(uint256); function withdraw(uint256 amount, bool claim) external returns (bool); function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool); function getReward() external returns (bool); function getReward(address recipient, bool claim) external returns (bool); function stake(uint256 amount) external returns (bool); function stakeFor(address account, uint256 amount) external returns (bool); } // File src/interfaces/external/convex/IConvexFraxBooster.sol pragma solidity >=0.5.0; interface IConvexFraxBooster { function createVault(uint256 _pid) external returns (address); } // File src/interfaces/external/convex/IConvexToken.sol pragma solidity >=0.5.0; interface IConvexToken is IERC20 { function maxSupply() external view returns (uint256); function totalCliffs() external view returns (uint256); function reductionPerCliff() external view returns (uint256); } // File src/PoolAssetManager.sol pragma solidity 0.8.13; /// @notice A struct used to define initialization parameters. This is not included /// in the contract to prevent naming collisions. struct InitializationParams { address admin; address operator; address rewardReceiver; address transmuterBuffer; IERC20 fraxShareToken; IERC20 curveToken; IStableSwap2Pool twoPool; uint256 twoPoolSlippage; IConvexToken convexToken; IConvexStakingWrapper convexStakingWrapper; IConvexFraxBooster convexFraxBooster; uint256 convexPoolId; } struct LockParams { uint256 amount; uint256 timeLocked; } /// @dev The amount of precision that slippage parameters have. uint256 constant SLIPPAGE_PRECISION = 1e4; /// @dev The amount of precision that curve pools use for price calculations. uint256 constant CURVE_PRECISION = 1e18; uint256 constant MINIMUM_LOCK_TIME = 604800; /// @notice Enumerations for FRAX/USDC two pool assets. /// /// @dev Do not change the order of these fields. enum PoolAsset { ALETH, FRXETH } /// @title PoolAssetManager /// @author Alchemix Finance contract PoolAssetManager is Multicall, MutexLock, IERC20TokenReceiver { /// @notice Emitted when the admin is updated. /// /// @param admin The admin. event AdminUpdated(address admin); /// @notice Emitted when the pending admin is updated. /// /// @param pendingAdmin The pending admin. event PendingAdminUpdated(address pendingAdmin); /// @notice Emitted when the operator is updated. /// /// @param operator The operator. event OperatorUpdated(address operator); /// @notice Emitted when the reward receiver is updated. /// /// @param rewardReceiver The reward receiver. event RewardReceiverUpdated(address rewardReceiver); /// @notice Emitted when the transmuter buffer is updated. /// /// @param transmuterBuffer The transmuter buffer. event TransmuterBufferUpdated(address transmuterBuffer); /// @notice Emitted when the 2pool slippage is updated. /// /// @param twoPoolSlippage The 2pool slippage. event TwoPoolSlippageUpdated(uint256 twoPoolSlippage); /// @notice Emitted when 2pool tokens are minted. /// /// @param amounts The amounts of each 2pool asset used to mint liquidity. /// @param mintedTwoPoolTokens The amount of 2pool tokens minted. event MintTwoPoolTokens(uint256[NUM_STABLE_COINS] amounts, uint256 mintedTwoPoolTokens); /// @notice Emitted when 2pool tokens are minted. /// /// @param asset The 2pool asset used to mint 2pool tokens. /// @param amount The amount of the asset used to mint 2pool tokens. /// @param mintedTwoPoolTokens The amount of 2pool tokens minted. event MintTwoPoolTokens(PoolAsset asset, uint256 amount, uint256 mintedTwoPoolTokens); /// @notice Emitted when 2pool tokens are burned. /// /// @param asset The 2pool asset that was received. /// @param amount The amount of 2pool tokens that were burned. /// @param withdrawn The amount of the 2pool asset that was withdrawn. event BurnTwoPoolTokens(PoolAsset asset, uint256 amount, uint256 withdrawn); /// @notice Emitted when meta pool tokens are deposited into convex. /// /// @param amount The amount of meta pool tokens that were deposited. /// @param id The ID of the new lock. /// @param success If the operation was successful. event DepositTwoPoolTokens(uint256 amount, bytes32 id, bool success); /// @notice Emitted when meta pool tokens are withdrawn from convex. /// /// @param amount The amount of meta pool tokens that were withdrawn. /// @param success If the operation was successful. event WithdrawTwoPoolTokens(uint256 amount, bool success); /// @notice Emitted when convex rewards are claimed. /// /// @param success If the operation was successful. /// @param amountFxs The amount of frax share tokens sent to the reward recipient. /// @param amountCurve The amount of curve tokens sent to the reward recipient. /// @param amountConvex The amount of convex tokens sent to the reward recipient. event ClaimRewards(bool success, uint256 amountFxs, uint256 amountCurve, uint256 amountConvex); /// @notice Emitted when 2pool assets are sent to the transmuter buffer. /// /// @param asset The 2pool asset that was reclaimed. /// @param amount The amount of the asset that was reclaimed. event ReclaimTwoPoolAsset(PoolAsset asset, uint256 amount); /// @notice The admin. address public admin; /// @notice The current pending admin. address public pendingAdmin; /// @notice The operators. mapping(address => bool) public operators; // @notice The reward receiver. address public rewardReceiver; /// @notice The transmuter buffer. address public transmuterBuffer; /// @notice The frax share token. IERC20 public immutable fraxShareToken; /// @notice The curve token. IERC20 public immutable curveToken; /// @notice The 2pool contract. IStableSwap2Pool public immutable twoPool; /// @notice The amount of slippage that will be tolerated when depositing and withdrawing assets /// from the stable swap pool. In units of basis points. uint256 public twoPoolSlippage; /// @notice The convex token. IConvexToken public immutable convexToken; /// @notice The staking wrapper. IConvexStakingWrapper public immutable convexStakingWrapper; /// @notice The convex booster contract. IConvexFraxBooster public immutable convexFraxBooster; /// @notice The address of the vault created during the contructor. IConvexFraxVault public convexFraxVault; /// @notice The convex pool identifier. uint256 public immutable convexPoolId; /// @notice the kek_id of the twoPool token deposit. mapping (bytes32 => LockParams) public kekId; /// @dev A cache of the tokens that the stable swap pool supports. IERC20[NUM_STABLE_COINS] private _twoPoolAssetCache; /// @dev A modifier which reverts if the message sender is not the admin. modifier onlyAdmin() { if (msg.sender != admin) { revert Unauthorized("Not admin"); } _; } /// @dev A modifier which reverts if the message sender is not the operator. modifier onlyOperator() { if (!operators[msg.sender]) { revert Unauthorized("Not operator"); } _; } constructor(InitializationParams memory params) { admin = params.admin; rewardReceiver = params.rewardReceiver; transmuterBuffer = params.transmuterBuffer; fraxShareToken = params.fraxShareToken; curveToken = params.curveToken; twoPool = params.twoPool; twoPoolSlippage = params.twoPoolSlippage; convexToken = params.convexToken; convexStakingWrapper = params.convexStakingWrapper; convexFraxBooster = params.convexFraxBooster; convexPoolId = params.convexPoolId; operators[params.operator] = true; convexFraxVault = IConvexFraxVault(convexFraxBooster.createVault(convexPoolId)); for (uint256 i = 0; i < NUM_STABLE_COINS; i++) { _twoPoolAssetCache[i] = IERC20(params.twoPool.coins(i)); } emit AdminUpdated(admin); emit OperatorUpdated(params.operator); emit RewardReceiverUpdated(rewardReceiver); emit TransmuterBufferUpdated(transmuterBuffer); emit TwoPoolSlippageUpdated(twoPoolSlippage); } /// @notice Gets the amount of a 2pool asset that this contract has in reserves. /// /// @param asset The 2pool asset. /// /// @return The reserves. function twoPoolAssetReserves(PoolAsset asset) external view returns (uint256) { IERC20 token = getTokenForTwoPoolAsset(asset); return token.balanceOf(address(this)); } /// @notice Gets the amount of a 2pool asset that one alUSD is worth. /// /// @param asset The 2pool asset. /// /// @return The amount of the underying. function exchangeRate(PoolAsset asset) public view returns (uint256) { return twoPool.calc_withdraw_one_coin(1e18, int128(uint128(uint256(asset)))); } /// @notice Gets the ERC20 token associated with a 2pool asset. /// /// @param asset The asset to get the token for. /// /// @return The token. function getTokenForTwoPoolAsset(PoolAsset asset) public view returns (IERC20) { uint256 index = uint256(asset); if (index >= NUM_STABLE_COINS) { revert IllegalArgument("Asset index out of bounds"); } return _twoPoolAssetCache[index]; } /// @notice Begins the 2-step process of setting the administrator. /// /// The caller must be the admin. Setting the pending timelock to the zero address will stop /// the process of setting a new timelock. /// /// @param value The value to set the pending timelock to. function setPendingAdmin(address value) external onlyAdmin { pendingAdmin = value; emit PendingAdminUpdated(value); } /// @notice Completes the 2-step process of setting the administrator. /// /// The pending admin must be set and the caller must be the pending admin. After this function /// is successfully executed, the admin will be set to the pending admin and the pending admin /// will be reset. function acceptAdmin() external { if (pendingAdmin == address(0)) { revert IllegalState("Pending admin unset"); } if (pendingAdmin != msg.sender) { revert Unauthorized("Not pending admin"); } admin = pendingAdmin; pendingAdmin = address(0); emit AdminUpdated(admin); emit PendingAdminUpdated(address(0)); } /// @notice Sets the operator. /// /// The caller must be the admin. /// /// @param operator The address to set /// @param value The value to set the admin to. function setOperator(address operator, bool value) external onlyAdmin { operators[operator] = value; emit OperatorUpdated(operator); } /// @notice Sets the reward receiver. /// /// @param value The value to set the reward receiver to. function setRewardReceiver(address value) external onlyAdmin { rewardReceiver = value; emit RewardReceiverUpdated(value); } /// @notice Sets the transmuter buffer. /// /// @param value The value to set the transmuter buffer to. function setTransmuterBuffer(address value) external onlyAdmin { transmuterBuffer = value; emit TransmuterBufferUpdated(value); } /// @notice Sets the slippage that will be tolerated when depositing and withdrawing 2pool /// assets. The slippage has a resolution of 6 decimals. /// /// The operator is allowed to set the slippage because it is a volatile parameter that may need /// fine adjustment in a short time window. /// /// @param value The value to set the slippage to. function setTwoPoolSlippage(uint256 value) external onlyOperator { if (value > SLIPPAGE_PRECISION) { revert IllegalArgument("Slippage not in range"); } twoPoolSlippage = value; emit TwoPoolSlippageUpdated(value); } /// @notice Mints 2pool tokens with a combination of assets. /// /// @param amounts The amounts of the assets to deposit. /// /// @return minted The number of 2pool tokens minted. function mintTwoPoolTokens( uint256[NUM_STABLE_COINS] calldata amounts ) external lock onlyOperator returns (uint256 minted) { return _mintTwoPoolTokens(amounts); } /// @notice Mints 2pool tokens with an asset. /// /// @param asset The asset to deposit into the 2pool. /// @param amount The amount of the asset to deposit. /// /// @return minted The number of 2pool tokens minted. function mintTwoPoolTokens( PoolAsset asset, uint256 amount ) external lock onlyOperator returns (uint256 minted) { return _mintTwoPoolTokens(asset, amount); } /// @notice Burns 2pool tokens to withdraw an asset. /// /// @param asset The asset to withdraw. /// @param amount The amount of 2pool tokens to burn. /// /// @return withdrawn The amount of the asset withdrawn from the pool. function burnTwoPoolTokens( PoolAsset asset, uint256 amount ) external lock onlyOperator returns (uint256 withdrawn) { return _burnTwoPoolTokens(asset, amount); } /// @notice Deposits and stakes meta pool tokens into convex. /// /// @param amount The amount of meta pool tokens to deposit. /// /// @return success If the tokens were successfully deposited. /// @return id The ID of the new lock. function depositTwoPoolTokens( uint256 amount ) external lock onlyOperator returns (bool success, bytes32 id) { return _depositTwoPoolTokens(amount, MINIMUM_LOCK_TIME); } /// @notice Deposits and stakes meta pool tokens into convex. /// /// @param amount The amount of meta pool tokens to deposit. /// /// @return success If the tokens were successfully deposited. /// @return id The ID of the new lock. function depositTwoPoolTokensCustomLock( uint256 amount, uint256 lockTime ) external lock onlyOperator returns (bool success, bytes32 id) { return _depositTwoPoolTokens(amount, lockTime); } /// @notice Withdraws and unwraps meta pool tokens from convex. /// /// @param amount The amount of meta pool tokens to withdraw. /// @param id The id of the lock to withdraw from. /// /// @return success If the tokens were successfully withdrawn. function withdrawTwoPoolTokens( uint256 amount, bytes32 id ) external lock onlyOperator returns (bool success) { return _withdrawTwoPoolTokens(amount, id); } /// @notice Claims convex, curve, and auxiliary rewards. /// /// @return success If the claim was successful. function claimRewards() external lock onlyOperator returns (bool success) { convexFraxVault.getReward(); success = true; uint256 fxsBalance = fraxShareToken.balanceOf(address(this)); uint256 curveBalance = curveToken.balanceOf(address(this)); uint256 convexBalance = convexToken.balanceOf(address(this)); SafeERC20.safeTransfer(address(curveToken), rewardReceiver, curveBalance); SafeERC20.safeTransfer(address(convexToken), rewardReceiver, convexBalance); SafeERC20.safeTransfer(address(fraxShareToken), rewardReceiver, fxsBalance); emit ClaimRewards(success, fxsBalance, curveBalance, convexBalance); } /// @notice Flushes two pool assets into convex by minting 2pool tokens from the assets, /// minting meta pool tokens using the 2pool tokens, and then depositing the meta pool /// tokens into convex. /// /// This function is provided for ease of use. /// /// @param amounts The amounts of the 2pool assets to flush. /// /// @return The amount of meta pool tokens deposited into convex. function flush( uint256[NUM_STABLE_COINS] calldata amounts ) external lock onlyOperator returns (uint256) { uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(amounts); (bool success,) = _depositTwoPoolTokens(mintedTwoPoolTokens, MINIMUM_LOCK_TIME); if (!success) { revert IllegalState("Deposit into convex failed"); } return mintedTwoPoolTokens; } /// @notice Flushes two pool assets into convex by minting 2pool tokens from the assets, /// minting meta pool tokens using the 2pool tokens, and then depositing the meta pool /// tokens into convex. Allows specification of locking period. /// /// This function is provided for ease of use. /// /// @param amounts The amounts of the 2pool assets to flush. /// @param lockTime The amount of time to lock the staked tokens. /// /// @return The amount of meta pool tokens deposited into convex. function flushCustomLock( uint256[NUM_STABLE_COINS] calldata amounts, uint256 lockTime ) external lock onlyOperator returns (uint256) { uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(amounts); (bool success, ) = _depositTwoPoolTokens(mintedTwoPoolTokens, lockTime); if (!success) { revert IllegalState("Deposit into convex failed"); } return mintedTwoPoolTokens; } /// @notice Flushes a two pool asset into convex by minting 2pool tokens using the asset, /// minting meta pool tokens using the 2pool tokens, and then depositing the meta pool /// tokens into convex. /// /// This function is provided for ease of use. /// /// @param asset The 2pool asset to flush. /// @param amount The amount of the 2pool asset to flush. /// /// @return The amount of meta pool tokens deposited into convex. function flush( PoolAsset asset, uint256 amount ) external lock onlyOperator returns (uint256) { uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(asset, amount); (bool success,) = _depositTwoPoolTokens(mintedTwoPoolTokens, MINIMUM_LOCK_TIME); if (!success) { revert IllegalState("Deposit into convex failed"); } return mintedTwoPoolTokens; } /// @notice Flushes a two pool asset into convex by minting 2pool tokens using the asset, /// minting meta pool tokens using the 2pool tokens, and then depositing the meta pool /// tokens into convex. Allows specification of locking period. /// /// This function is provided for ease of use. /// /// @param asset The 2pool asset to flush. /// @param amount The amount of the 2pool asset to flush. /// @param lockTime The amount of time to lock the staked tokens. /// /// @return The amount of meta pool tokens deposited into convex. function flushCustomLock( PoolAsset asset, uint256 amount, uint256 lockTime ) external lock onlyOperator returns (uint256) { uint256 mintedTwoPoolTokens = _mintTwoPoolTokens(asset, amount); (bool success, bytes32 id) = _depositTwoPoolTokens(mintedTwoPoolTokens, lockTime); if (!success) { revert IllegalState("Deposit into convex failed"); } return mintedTwoPoolTokens; } /// @notice Recalls a two pool asset into reserves by withdrawing meta pool tokens from /// convex, burning the meta pool tokens for 2pool tokens, and then burning the 2pool /// tokens for an asset. /// /// This function is provided for ease of use. /// /// @param asset The 2pool asset to recall. /// @param amount The amount of the meta pool tokens to withdraw from convex and burn. /// @param id The id of the lock to withdraw from. /// /// @return The amount of the 2pool asset recalled. function recall( PoolAsset asset, uint256 amount, bytes32 id ) external lock onlyOperator returns (uint256) { if (!_withdrawTwoPoolTokens(amount, id)) { revert IllegalState("Withdraw from convex failed"); } return _burnTwoPoolTokens(asset, amount); } /// @notice Recalls tokens in a balanced manner in case of an emergency function emergencyRecall(uint256 amount, bytes32 id) external lock onlyOperator { if (!_withdrawTwoPoolTokens(amount, id)) { revert IllegalState("Withdraw from convex failed"); } IERC20 twoPoolToken = IERC20(address(twoPool)); SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0); SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount); // Remove the liquidity from the pool. uint256[2] memory minAmounts = [uint256(0), uint256(0)]; twoPool.remove_liquidity(amount, minAmounts, address(this)); } /// @notice Reclaims a two pool asset to the transmuter buffer. /// /// @param asset The 2pool asset to reclaim. /// @param amount The amount to reclaim. function reclaimTwoPoolAsset(PoolAsset asset, uint256 amount) public lock onlyAdmin { IERC20 token = getTokenForTwoPoolAsset(asset); SafeERC20.safeTransfer(address(token), transmuterBuffer, amount); IERC20TokenReceiver(transmuterBuffer).onERC20Received(address(token), amount); emit ReclaimTwoPoolAsset(asset, amount); } /// @notice Sweeps a token out of the contract to the admin. /// /// @param token The token to sweep. /// @param amount The amount of the token to sweep. function sweep(address token, uint256 amount) external lock onlyAdmin { SafeERC20.safeTransfer(address(token), msg.sender, amount); } /// @inheritdoc IERC20TokenReceiver /// /// @dev This function is required in order to receive tokens from the conduit. function onERC20Received(address token, uint256 value) external { /* noop */ } /// @dev Mints 2pool tokens with a combination of assets. /// /// @param amounts The amounts of the assets to deposit. /// /// @return minted The number of 2pool tokens minted. function _mintTwoPoolTokens( uint256[NUM_STABLE_COINS] calldata amounts ) internal returns (uint256 minted) { IERC20[NUM_STABLE_COINS] memory tokens = _twoPoolAssetCache; IERC20 twoPoolToken = IERC20(address(twoPool)); uint256 twoPoolDecimals = SafeERC20.expectDecimals(address(twoPoolToken)); uint256 normalizedTotal = 0; for (uint256 i = 0; i < NUM_STABLE_COINS; i++) { if (amounts[i] == 0) continue; uint256 tokenDecimals = SafeERC20.expectDecimals(address(tokens[i])); uint256 missingDecimals = twoPoolDecimals - tokenDecimals; normalizedTotal += amounts[i] * 10**missingDecimals; // For assets like USDT, the approval must be first set to zero before updating it. SafeERC20.safeApprove(address(tokens[i]), address(twoPool), 0); SafeERC20.safeApprove(address(tokens[i]), address(twoPool), amounts[i]); } // Calculate what the normalized value of the tokens is. uint256 expectedOutput = normalizedTotal * CURVE_PRECISION / twoPool.get_virtual_price(); // Calculate the minimum amount of 2pool lp tokens that we are expecting out when // adding liquidity for all of the assets. This value is twod off the optimistic // assumption that one of each token is approximately equal to one 2pool lp token. uint256 minimumMintAmount = expectedOutput * twoPoolSlippage / SLIPPAGE_PRECISION; // Record the amount of 2pool lp tokens that we start with before adding liquidity // so that we can determine how many we minted. uint256 startingBalance = twoPoolToken.balanceOf(address(this)); // Add the liquidity to the pool. twoPool.add_liquidity(amounts, minimumMintAmount); // Calculate how many 2pool lp tokens were minted. minted = twoPoolToken.balanceOf(address(this)) - startingBalance; emit MintTwoPoolTokens(amounts, minted); } /// @dev Mints 2pool tokens with an asset. /// /// @param asset The asset to deposit into the 2pool. /// @param amount The amount of the asset to deposit. /// /// @return minted The number of 2pool tokens minted. function _mintTwoPoolTokens( PoolAsset asset, uint256 amount ) internal returns (uint256 minted) { IERC20 token = getTokenForTwoPoolAsset(asset); IERC20 twoPoolToken = IERC20(address(twoPool)); uint256 twoPoolDecimals = SafeERC20.expectDecimals(address(twoPoolToken)); uint256 missingDecimals = twoPoolDecimals - SafeERC20.expectDecimals(address(token)); uint256[NUM_STABLE_COINS] memory amounts; amounts[uint256(asset)] = amount; // Calculate the minimum amount of 2pool lp tokens that we are expecting out when // adding single sided liquidity. This value is twod off the optimistic assumption that // one of each token is approximately equal to one 2pool lp token. uint256 expectedOutput = amount * CURVE_PRECISION / twoPool.get_virtual_price(); uint256 minimumMintAmount = expectedOutput * twoPoolSlippage / SLIPPAGE_PRECISION; // Record the amount of 2pool lp tokens that we start with before adding liquidity // so that we can determine how many we minted. uint256 startingBalance = twoPoolToken.balanceOf(address(this)); // For assets like USDT, the approval must be first set to zero before updating it. SafeERC20.safeApprove(address(token), address(twoPool), 0); SafeERC20.safeApprove(address(token), address(twoPool), amount); // Add the liquidity to the pool. twoPool.add_liquidity(amounts, minimumMintAmount); // Calculate how many 2pool lp tokens were minted. minted = twoPoolToken.balanceOf(address(this)) - startingBalance; emit MintTwoPoolTokens(asset, amount, minted); } /// @dev Burns 2pool tokens to withdraw an asset. /// /// @param asset The asset to withdraw. /// @param amount The amount of 2pool tokens to burn. /// /// @return withdrawn The amount of the asset withdrawn from the pool. function _burnTwoPoolTokens( PoolAsset asset, uint256 amount ) internal returns (uint256 withdrawn) { IERC20 token = getTokenForTwoPoolAsset(asset); IERC20 twoPoolToken = IERC20(address(twoPool)); uint256 index = uint256(asset); // Calculate the minimum amount of underlying tokens that we are expecting out when // removing single sided liquidity. This value is twod off the optimistic assumption that // one of each token is approximately equal to one 2pool lp token. uint256 normalizedAmount = amount * twoPoolSlippage / SLIPPAGE_PRECISION; uint256 minimumAmountOut = normalizedAmount * twoPool.get_virtual_price() / CURVE_PRECISION; // Record the amount of underlying tokens that we start with before removing liquidity // so that we can determine how many we withdrew from the pool. uint256 startingBalance = token.balanceOf(address(this)); SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0); SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount); // Remove the liquidity from the pool. twoPool.remove_liquidity_one_coin(amount, int128(uint128(index)), minimumAmountOut); // Calculate how many underlying tokens that were withdrawn. withdrawn = token.balanceOf(address(this)) - startingBalance; emit BurnTwoPoolTokens(asset, amount, withdrawn); } // /// @dev Burns 2pool tokens to withdraw an asset. // /// // /// @param amount The amount of 2pool tokens to burn. // function _burnTwoPoolTokensBalanced( // uint256 amount, // uint256[2] calldata minAmounts // ) internal { // IERC20 twoPoolToken = IERC20(address(twoPool)); // SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), 0); // SafeERC20.safeApprove(address(twoPoolToken), address(twoPool), amount); // // Remove the liquidity from the pool. // twoPool.remove_liquidity(amount, minAmounts, address(this)); // } /// @dev Deposits and stakes meta pool tokens into convex. /// /// @param amount The amount of meta pool tokens to deposit. /// @param lockTime The time of the new lock. /// /// @return success If the tokens were successfully deposited. /// @return id The id of the new lock. function _depositTwoPoolTokens(uint256 amount, uint256 lockTime) internal returns (bool success, bytes32 id) { SafeERC20.safeApprove(address(twoPool), address(convexFraxVault), amount); id = convexFraxVault.stakeLockedCurveLp(amount, lockTime); kekId[id] = LockParams({amount: amount, timeLocked: lockTime}); success = true; emit DepositTwoPoolTokens(amount, id, success); } /// @dev Withdraws and unwraps meta pool tokens from convex. /// /// @param amount The amount of meta pool tokens to withdraw. /// @param id The id of the lock you wish to withdraw from. /// /// @return success If the tokens were successfully withdrawn. function _withdrawTwoPoolTokens(uint256 amount, bytes32 id) internal returns (bool success) { uint256 originalBalance = IERC20(address(twoPool)).balanceOf(address(this)); convexFraxVault.withdrawLockedAndUnwrap(id); uint256 newBalance = IERC20(address(twoPool)).balanceOf(address(this)); // Frax vaults require to withdraw all meta tokens. // We must re-stake any remaining tokens. uint256 restakeAmount = newBalance - originalBalance - amount; if (restakeAmount > 1) { SafeERC20.safeApprove(address(twoPool), address(convexFraxVault), restakeAmount); bytes32 newId = convexFraxVault.stakeLockedCurveLp(restakeAmount, MINIMUM_LOCK_TIME); kekId[newId] = LockParams({amount: restakeAmount, timeLocked: MINIMUM_LOCK_TIME}); emit DepositTwoPoolTokens(restakeAmount, newId, success); } success = true; emit WithdrawTwoPoolTokens(IERC20(address(twoPool)).balanceOf(address(this)), success); } /// @dev Claims convex, curve, and auxiliary rewards. /// /// @return success If the claim was successful. function _claimRewards() internal returns (bool) { convexFraxVault.getReward(); uint256 fxsBalance = fraxShareToken.balanceOf(address(this)); uint256 curveBalance = curveToken.balanceOf(address(this)); uint256 convexBalance = convexToken.balanceOf(address(this)); SafeERC20.safeTransfer(address(curveToken), rewardReceiver, curveBalance); SafeERC20.safeTransfer(address(convexToken), rewardReceiver, convexBalance); emit ClaimRewards(true, fxsBalance, curveBalance, convexBalance); return true; } /// @dev Gets the minimum of two integers. /// /// @param x The first integer. /// @param y The second integer. /// /// @return The minimum value. function min(uint256 x , uint256 y) private pure returns (uint256) { return x > y ? y : x; } /// @dev Gets the absolute value of the difference of two integers. /// /// @param x The first integer. /// @param y The second integer. /// /// @return The absolute value. function abs(uint256 x , uint256 y) private pure returns (uint256) { return x > y ? x - y : y - x; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"rewardReceiver","type":"address"},{"internalType":"address","name":"transmuterBuffer","type":"address"},{"internalType":"contract IERC20","name":"fraxShareToken","type":"address"},{"internalType":"contract IERC20","name":"curveToken","type":"address"},{"internalType":"contract IStableSwap2Pool","name":"twoPool","type":"address"},{"internalType":"uint256","name":"twoPoolSlippage","type":"uint256"},{"internalType":"contract IConvexToken","name":"convexToken","type":"address"},{"internalType":"contract IConvexStakingWrapper","name":"convexStakingWrapper","type":"address"},{"internalType":"contract IConvexFraxBooster","name":"convexFraxBooster","type":"address"},{"internalType":"uint256","name":"convexPoolId","type":"uint256"}],"internalType":"struct InitializationParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20CallFailed","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"IllegalArgument","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"IllegalState","type":"error"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"result","type":"bytes"}],"name":"MulticallFailed","type":"error"},{"inputs":[{"internalType":"string","name":"message","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"}],"name":"BurnTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amountFxs","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountCurve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountConvex","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"DepositTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"},{"indexed":false,"internalType":"uint256","name":"mintedTwoPoolTokens","type":"uint256"}],"name":"MintTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintedTwoPoolTokens","type":"uint256"}],"name":"MintTwoPoolTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"PendingAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReclaimTwoPoolAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardReceiver","type":"address"}],"name":"RewardReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transmuterBuffer","type":"address"}],"name":"TransmuterBufferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"twoPoolSlippage","type":"uint256"}],"name":"TwoPoolSlippageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"WithdrawTwoPoolTokens","type":"event"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTwoPoolTokens","outputs":[{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convexFraxBooster","outputs":[{"internalType":"contract IConvexFraxBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexFraxVault","outputs":[{"internalType":"contract IConvexFraxVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexStakingWrapper","outputs":[{"internalType":"contract IConvexStakingWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexToken","outputs":[{"internalType":"contract IConvexToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTwoPoolTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"depositTwoPoolTokensCustomLock","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"emergencyRecall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"}],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flush","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"flushCustomLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"flushCustomLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fraxShareToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"getTokenForTwoPoolAsset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"kekId","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timeLocked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTwoPoolTokens","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"amounts","type":"uint256[2]"}],"name":"mintTwoPoolTokens","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"onERC20Received","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"recall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reclaimTwoPoolAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setRewardReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setTransmuterBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTwoPoolSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transmuterBuffer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"twoPool","outputs":[{"internalType":"contract IStableSwap2Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum PoolAsset","name":"asset","type":"uint8"}],"name":"twoPoolAssetReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"twoPoolSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"withdrawTwoPoolTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101606040526000805460ff191660011790553480156200001f57600080fd5b5060405162003af738038062003af7833981016040819052620000429162000401565b805160008054610100600160a81b0319166101006001600160a01b039384168102919091178255604080850151600380546001600160a01b03199081169287169290921790556060860151600480549092169086161781556080808701518616905260a0808701518616905260c0808701518616905260e080870151600555838701518616905261012080870151861690935261014080870151861693849052610160870151908190526020808801519096168552600290955292819020805460ff1916600117905551639abbdf4b60e01b815291820192909252639abbdf4b906024016020604051808303816000875af115801562000146573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016c9190620004f8565b600680546001600160a01b0319166001600160a01b039290921691909117905560005b6002811015620002555760c082015160405163c661065760e01b8152600481018390526001600160a01b039091169063c661065790602401602060405180830381865afa158015620001e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020b9190620004f8565b600882600281106200022157620002216200051f565b0180546001600160a01b0319166001600160a01b0392909216919091179055806200024c8162000535565b9150506200018f565b506000546040516101009091046001600160a01b031681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a16020808201516040516001600160a01b0390911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a16003546040516001600160a01b0390911681527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f61749060200160405180910390a16004546040516001600160a01b0390911681527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b9060200160405180910390a17f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb16005546040516200038f91815260200190565b60405180910390a1506200055d565b60405161018081016001600160401b0381118282101715620003d057634e487b7160e01b600052604160045260246000fd5b60405290565b6001600160a01b0381168114620003ec57600080fd5b50565b8051620003fc81620003d6565b919050565b600061018082840312156200041557600080fd5b6200041f6200039e565b6200042a83620003ef565b81526200043a60208401620003ef565b60208201526200044d60408401620003ef565b60408201526200046060608401620003ef565b60608201526200047360808401620003ef565b60808201526200048660a08401620003ef565b60a08201526200049960c08401620003ef565b60c082015260e083015160e0820152610100620004b8818501620003ef565b90820152610120620004cc848201620003ef565b90820152610140620004e0848201620003ef565b90820152610160928301519281019290925250919050565b6000602082840312156200050b57600080fd5b81516200051881620003d6565b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200055657634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161346d6200068a60003960006107cd015260006105bb015260006104d301526000818161080101528181610dc20152610e7101526000818161025d015281816117000152818161184101528181611872015281816118c001528181611ad901528181611bbb01528181611bfd01528181611c5201528181611d9501528181611ec70152818161200401528181612086015281816121b7015281816121e30152818161221f01528181612357015281816123b8015281816124c2015281816124ee0152818161253a0152818161278501528181612866015281816129070152612a6101526000818161052701528181610d340152610e390152600081816102ae01528181610c9d0152610ea9015261346d6000f3fe6080604052600436106102465760003560e01c80635dd077e311610139578063ac9650d8116100b6578063c48fb9101161007a578063c48fb9101461077b578063dae254dd1461079b578063e529ee95146107bb578063e89133b2146107ef578063f851a44014610823578063f999ea661461084857600080fd5b8063ac9650d8146106b3578063bc04f0af146106d3578063bd6acfa6146106f2578063be4b853414610712578063c0511c251461073257600080fd5b80636ea056a9116100fd5780636ea056a91461061d5780639459f2861461063d578063a608d79a1461065d578063a6f74b141461067d578063aa45bd291461069357600080fd5b80635dd077e314610569578063602955f114610589578063625540ea146105a95780636426177d146105dd5780636464cdb1146105fd57600080fd5b80632c9d737a116101c757806341af8cb21161018b57806341af8cb2146104a15780634a9fc49c146104c15780634dd18bf5146104f55780634f39059c14610515578063558a72971461054957600080fd5b80632c9d737a1461040c578063357aa4e11461042c578063372500ab1461044c578063397d9663146104615780634070a3481461048157600080fd5b806318d123211161020e57806318d12321146103475780631a637fe1146103755780631dac30b0146103ac57806326782247146103cc57806327409b3c146103ec57600080fd5b806307e6754c1461024b5780630896f2c61461029c5780630dc3d0ff146102d05780630e18b681146102f057806313e7c9d814610307575b600080fd5b34801561025757600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102dc57600080fd5b5060045461027f906001600160a01b031681565b3480156102fc57600080fd5b50610305610868565b005b34801561031357600080fd5b50610337610322366004612c36565b60026020526000908152604090205460ff1681565b6040519015158152602001610293565b34801561035357600080fd5b50610367610362366004612c62565b6109b3565b604051908152602001610293565b34801561038157600080fd5b50610395610390366004612c8d565b610a38565b604080519215158352602083019190915201610293565b3480156103b857600080fd5b5060035461027f906001600160a01b031681565b3480156103d857600080fd5b5060015461027f906001600160a01b031681565b3480156103f857600080fd5b50610367610407366004612cbe565b610a90565b34801561041857600080fd5b50610367610427366004612cf1565b610b1b565b34801561043857600080fd5b50610367610447366004612d1b565b610b69565b34801561045857600080fd5b50610337610be0565b34801561046d57600080fd5b5061027f61047c366004612d1b565b610f30565b34801561048d57600080fd5b5061036761049c366004612cf1565b610fbd565b3480156104ad57600080fd5b506103676104bc366004612d36565b611001565b3480156104cd57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050157600080fd5b50610305610510366004612c36565b611088565b34801561052157600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561055557600080fd5b50610305610564366004612d63565b61110d565b34801561057557600080fd5b50610367610584366004612cbe565b611199565b34801561059557600080fd5b5060065461027f906001600160a01b031681565b3480156105b557600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e957600080fd5b506103056105f8366004612cf1565b61123e565b34801561060957600080fd5b50610305610618366004612c36565b611346565b34801561062957600080fd5b50610305610638366004612d9a565b6113c4565b34801561064957600080fd5b50610305610658366004612db6565b61140f565b34801561066957600080fd5b50610367610678366004612d36565b6114bf565b34801561068957600080fd5b5061036760055481565b34801561069f57600080fd5b506103376106ae366004612c8d565b61150c565b6106c66106c1366004612dcf565b611550565b6040516102939190612ea0565b3480156106df57600080fd5b506103056106ee366004612d9a565b5050565b3480156106fe57600080fd5b5061036761070d366004612cf1565b6116a5565b34801561071e57600080fd5b5061036761072d366004612d1b565b6116fc565b34801561073e57600080fd5b5061076661074d366004612db6565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610293565b34801561078757600080fd5b50610305610796366004612c8d565b6117b0565b3480156107a757600080fd5b506103056107b6366004612c36565b61194b565b3480156107c757600080fd5b506103677f000000000000000000000000000000000000000000000000000000000000000081565b3480156107fb57600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561082f57600080fd5b5060005461027f9061010090046001600160a01b031681565b34801561085457600080fd5b50610395610863366004612db6565b6119c9565b6001546001600160a01b03166108bc5760405163c50656df60e01b815260206004820152601360248201527214195b991a5b99c818591b5a5b881d5b9cd95d606a1b60448201526064015b60405180910390fd5b6001546001600160a01b0316331461090b5760405163973d02cb60e01b81526020600482015260116024820152702737ba103832b73234b7339030b236b4b760791b60448201526064016108b3565b6001805460008054610100600160a81b0319166101006001600160a01b03808516820292909217928390556001600160a01b031990931690935560405191900490911681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a1604051600081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df359060200160405180910390a1565b60006109bd611a22565b3360009081526002602052604090205460ff166109ed5760405163973d02cb60e01b81526004016108b390612f02565b60006109f884611a97565b90506000610a068285611eb9565b50905080610a275760405163c50656df60e01b81526004016108b390612f28565b509050610a32611fe1565b92915050565b600080610a43611a22565b3360009081526002602052604090205460ff16610a735760405163973d02cb60e01b81526004016108b390612f02565b610a7d8484611eb9565b91509150610a89611fe1565b9250929050565b6000610a9a611a22565b3360009081526002602052604090205460ff16610aca5760405163973d02cb60e01b81526004016108b390612f02565b6000610ad68585611ff4565b9050600080610ae58386611eb9565b9150915081610b075760405163c50656df60e01b81526004016108b390612f28565b5090915050610b14611fe1565b9392505050565b6000610b25611a22565b3360009081526002602052604090205460ff16610b555760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612347565b9050610a32611fe1565b600080610b7583610f30565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612f5f565b6000610bea611a22565b3360009081526002602052604090205460ff16610c1a5760405163973d02cb60e01b81526004016108b390612f02565b600660009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6a57600080fd5b505af1158015610c7e573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260019350600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190612f5f565b600354909150610e68907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168461265b565b600354610ea0907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168361265b565b600354610ed8907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168561265b565b60408051851515815260208101859052908101839052606081018290527fc3a2bfdd669309fab32bff187e250ae46596032d10653edb1c04abc3988c44459060800160405180910390a1505050610f2d611fe1565b90565b600080826001811115610f4557610f45612f78565b905060028110610f98576040516354a1577760e11b815260206004820152601960248201527f417373657420696e646578206f7574206f6620626f756e64730000000000000060448201526064016108b3565b60088160028110610fab57610fab612f8e565b01546001600160a01b03169392505050565b6000610fc7611a22565b3360009081526002602052604090205460ff16610ff75760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383611ff4565b600061100b611a22565b3360009081526002602052604090205460ff1661103b5760405163973d02cb60e01b81526004016108b390612f02565b600061104683611a97565b905060006110578262093a80611eb9565b509050806110785760405163c50656df60e01b81526004016108b390612f28565b509050611083611fe1565b919050565b60005461010090046001600160a01b031633146110b85760405163973d02cb60e01b81526004016108b390612fa4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df35906020015b60405180910390a150565b60005461010090046001600160a01b0316331461113d5760405163973d02cb60e01b81526004016108b390612fa4565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151517905590519182527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a15050565b60006111a3611a22565b3360009081526002602052604090205460ff166111d35760405163973d02cb60e01b81526004016108b390612f02565b6111dd8383612763565b61122a5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b6112348484612347565b9050610b14611fe1565b611246611a22565b60005461010090046001600160a01b031633146112765760405163973d02cb60e01b81526004016108b390612fa4565b600061128183610f30565b60045490915061129c9082906001600160a01b03168461265b565b6004805460405163bc04f0af60e01b81526001600160a01b03848116938201939093526024810185905291169063bc04f0af90604401600060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050507f79b317be1efd69d6bf9fcbcd2f3353788aadfc2d546bf7ed03dabab1488b28178383604051611335929190612fe9565b60405180910390a1506106ee611fe1565b60005461010090046001600160a01b031633146113765760405163973d02cb60e01b81526004016108b390612fa4565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b90602001611102565b6113cc611a22565b60005461010090046001600160a01b031633146113fc5760405163973d02cb60e01b81526004016108b390612fa4565b61140782338361265b565b6106ee611fe1565b3360009081526002602052604090205460ff1661143f5760405163973d02cb60e01b81526004016108b390612f02565b61271081111561148a576040516354a1577760e11b8152602060048201526015602482015274536c697070616765206e6f7420696e2072616e676560581b60448201526064016108b3565b60058190556040518181527f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb190602001611102565b60006114c9611a22565b3360009081526002602052604090205460ff166114f95760405163973d02cb60e01b81526004016108b390612f02565b61150282611a97565b9050611083611fe1565b6000611516611a22565b3360009081526002602052604090205460ff166115465760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612763565b60608167ffffffffffffffff81111561156b5761156b613004565b60405190808252806020026020018201604052801561159e57816020015b60608152602001906001900390816115895790505b50905060005b8281101561169e57600080308686858181106115c2576115c2612f8e565b90506020028101906115d4919061301a565b6040516115e2929190613061565b600060405180830381855af49150503d806000811461161d576040519150601f19603f3d011682016040523d82523d6000602084013e611622565b606091505b50915091508161166d5785858481811061163e5761163e612f8e565b9050602002810190611650919061301a565b8260405163070c497560e21b81526004016108b393929190613071565b8084848151811061168057611680612f8e565b6020026020010181905250505080611697906130cf565b90506115a4565b5092915050565b60006116af611a22565b3360009081526002602052604090205460ff166116df5760405163973d02cb60e01b81526004016108b390612f02565b60006116eb8484611ff4565b90506000610a068262093a80611eb9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cc2b27d7670de0b6b3a764000084600181111561174857611748612f78565b6040516001600160e01b031960e085901b1681526004810192909252600f0b6024820152604401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a329190612f5f565b6117b8611a22565b3360009081526002602052604090205460ff166117e85760405163973d02cb60e01b81526004016108b390612f02565b6117f28282612763565b61183f5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b7f000000000000000000000000000000000000000000000000000000000000000061186c81806000612af5565b611897817f000000000000000000000000000000000000000000000000000000000000000085612af5565b604080518082018252600080825260208201529051633eb1719f60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633eb1719f906118f99087908590309060040161310b565b6000604051808303816000875af1158015611918573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119409190810190613138565b5050506106ee611fe1565b60005461010090046001600160a01b0316331461197b5760405163973d02cb60e01b81526004016108b390612fa4565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f617490602001611102565b6000806119d4611a22565b3360009081526002602052604090205460ff16611a045760405163973d02cb60e01b81526004016108b390612f02565b611a118362093a80611eb9565b91509150611a1d611fe1565b915091565b600160005460ff166002811115611a3b57611a3b612f78565b14611a805760405163c50656df60e01b8152602060048201526014602482015273131bd8dac8185b1c9958591e4818db185a5b595960621b60448201526064016108b3565b600080546002919060ff19166001835b0217905550565b604080518082019182905260009182919060089060029082845b81546001600160a01b03168152600190910190602001808311611ab1575050505050905060007f000000000000000000000000000000000000000000000000000000000000000090506000611b0582612b28565b60ff1690506000805b6002811015611c4d57868160028110611b2957611b29612f8e565b602002013515611c3b576000611b54868360028110611b4a57611b4a612f8e565b6020020151612b28565b60ff1690506000611b6582866131f6565b9050611b7281600a6132f1565b898460028110611b8457611b84612f8e565b6020020135611b9391906132fd565b611b9d908561331c565b9350611be1878460028110611bb457611bb4612f8e565b60200201517f00000000000000000000000000000000000000000000000000000000000000006000612af5565b611c38878460028110611bf657611bf6612f8e565b60200201517f00000000000000000000000000000000000000000000000000000000000000008b8660028110611c2e57611c2e612f8e565b6020020135612af5565b50505b80611c45816130cf565b915050611b0e565b5060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd29190612f5f565b611ce4670de0b6b3a7640000846132fd565b611cee9190613334565b9050600061271060055483611d0391906132fd565b611d0d9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190612f5f565b604051630b4c7e4d60e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630b4c7e4d90611dcc908c908690600401613356565b600060405180830381600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e689190612f5f565b611e7291906131f6565b97507f517ddf7483018304eeee2bc47b77b2f2b8b4f0519936b5c1bc4a78e808522c998989604051611ea5929190613356565b60405180910390a150505050505050919050565b6006546000908190611ef6907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031686612af5565b60065460405163a41ce7e960e01b815260048101869052602481018590526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af1158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612f5f565b60408051808201825286815260208082018781526000858152600783528490209251835551600192830155825188815290810184905291820181905293509091507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f9060600160405180910390a19250929050565b600080546001919060ff19168280611a90565b60008061200084610f30565b90507f0000000000000000000000000000000000000000000000000000000000000000600061202e82612b28565b60ff169050600061203e84612b28565b61204b9060ff16836131f6565b9050612055612c01565b868189600181111561206957612069612f78565b6002811061207957612079612f8e565b60200201818152505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190612f5f565b612118670de0b6b3a76400008a6132fd565b6121229190613334565b905060006127106005548361213791906132fd565b6121419190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa15801561218b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121af9190612f5f565b90506121dd887f00000000000000000000000000000000000000000000000000000000000000006000612af5565b612208887f00000000000000000000000000000000000000000000000000000000000000008c612af5565b604051630b4c7e4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630b4c7e4d90612256908790869060040161336c565b600060405180830381600087803b15801561227057600080fd5b505af1158015612284573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b038a1691506370a0823190602401602060405180830381865afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190612f5f565b6122fc91906131f6565b98507f92eab167f439529a32b5391965d26b5f172158ac6931fae02a936e50ba8d16608b8b8b60405161233193929190613387565b60405180910390a1505050505050505092915050565b60008061235384610f30565b90507f0000000000000000000000000000000000000000000000000000000000000000600085600181111561238a5761238a612f78565b905060006127106005548761239f91906132fd565b6123a99190613334565b90506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190612f5f565b61244290846132fd565b61244c9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190612f5f565b90506124e8857f00000000000000000000000000000000000000000000000000000000000000006000612af5565b612513857f00000000000000000000000000000000000000000000000000000000000000008a612af5565b604051630d2680e960e11b815260048101899052600f85900b6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631a4d01d290606401600060405180830381600087803b15801561258657600080fd5b505af115801561259a573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156125e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126089190612f5f565b61261291906131f6565b96507ff00c2bb112527cee6bc4b721538408ee2f9ecc2ca6998706b4b71b23774e365689898960405161264793929190613387565b60405180910390a150505050505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c891906133a6565b6000604051808303816000865af19150503d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b5091509150811580612738575080511580159061273857508080602001905181019061273691906133c2565b155b1561275c5784828260405163e7e40b5b60e01b81526004016108b3939291906133df565b5050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190612f5f565b600654604051634ab794a360e01b8152600481018690529192506001600160a01b031690634ab794a390602401600060405180830381600087803b15801561283757600080fd5b505af115801561284b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190612f5f565b90506000856128e984846131f6565b6128f391906131f6565b90506001811115612a2657600654612936907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612af5565b60065460405163a41ce7e960e01b81526004810183905262093a8060248201526000916001600160a01b03169063a41ce7e9906044016020604051808303816000875af115801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af9190612f5f565b60408051808201825284815262093a80602080830191825260008581526007825284902092518355905160019092019190915581518581529081018390528715158183015290519192507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f919081900360600190a1505b6040516370a0823160e01b8152306004820152600194507f554ea882a1b2a34679dfdcdd2fbca86efdadd76d2fb7902b4f0a31b7b2a7fc98907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190612f5f565b6040805191825286151560208301520160405180910390a150505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b9060640161268a565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691612b6e91906133a6565b600060405180830381855afa9150503d8060008114612ba9576040519150601f19603f3d011682016040523d82523d6000602084013e612bae565b606091505b5091509150811580612bc1575060208151105b15612be55783828260405163e7e40b5b60e01b81526004016108b3939291906133df565b80806020019051810190612bf99190613414565b949350505050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b038116811461108357600080fd5b600060208284031215612c4857600080fd5b610b1482612c1f565b8060408101831015610a3257600080fd5b60008060608385031215612c7557600080fd5b612c7f8484612c51565b946040939093013593505050565b60008060408385031215612ca057600080fd5b50508035926020909101359150565b80356002811061108357600080fd5b600080600060608486031215612cd357600080fd5b612cdc84612caf565b95602085013595506040909401359392505050565b60008060408385031215612d0457600080fd5b612d0d83612caf565b946020939093013593505050565b600060208284031215612d2d57600080fd5b610b1482612caf565b600060408284031215612d4857600080fd5b610b148383612c51565b8015158114612d6057600080fd5b50565b60008060408385031215612d7657600080fd5b612d7f83612c1f565b91506020830135612d8f81612d52565b809150509250929050565b60008060408385031215612dad57600080fd5b612d0d83612c1f565b600060208284031215612dc857600080fd5b5035919050565b60008060208385031215612de257600080fd5b823567ffffffffffffffff80821115612dfa57600080fd5b818501915085601f830112612e0e57600080fd5b813581811115612e1d57600080fd5b8660208260051b8501011115612e3257600080fd5b60209290920196919550909350505050565b60005b83811015612e5f578181015183820152602001612e47565b83811115612e6e576000848401525b50505050565b60008151808452612e8c816020860160208601612e44565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef557603f19888603018452612ee3858351612e74565b94509285019290850190600101612ec7565b5092979650505050505050565b6020808252600c908201526b2737ba1037b832b930ba37b960a11b604082015260600190565b6020808252601a908201527f4465706f73697420696e746f20636f6e766578206661696c6564000000000000604082015260600190565b600060208284031215612f7157600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252600990820152682737ba1030b236b4b760b91b604082015260600190565b60028110612fe557634e487b7160e01b600052602160045260246000fd5b9052565b60408101612ff78285612fc7565b8260208301529392505050565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261303157600080fd5b83018035915067ffffffffffffffff82111561304c57600080fd5b602001915036819003821315610a8957600080fd5b8183823760009101908152919050565b60408152826040820152828460608301376000606084830101526000601f19601f850116820160608382030160208401526130af6060820185612e74565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016130e1576130e16130b9565b5060010190565b8060005b6002811015612e6e5781518452602093840193909101906001016130ec565b8381526080810161311f60208301856130e8565b6001600160a01b03929092166060919091015292915050565b6000602080838503121561314b57600080fd5b825167ffffffffffffffff8082111561316357600080fd5b818501915085601f83011261317757600080fd5b81518181111561318957613189613004565b8060051b604051601f19603f830116810181811085821117156131ae576131ae613004565b6040529182528482019250838101850191888311156131cc57600080fd5b938501935b828510156131ea578451845293850193928501926131d1565b98975050505050505050565b600082821015613208576132086130b9565b500390565b600181815b8085111561324857816000190482111561322e5761322e6130b9565b8085161561323b57918102915b93841c9390800290613212565b509250929050565b60008261325f57506001610a32565b8161326c57506000610a32565b8160018114613282576002811461328c576132a8565b6001915050610a32565b60ff84111561329d5761329d6130b9565b50506001821b610a32565b5060208310610133831016604e8410600b84101617156132cb575081810a610a32565b6132d5838361320d565b80600019048211156132e9576132e96130b9565b029392505050565b6000610b148383613250565b6000816000190483118215151615613317576133176130b9565b500290565b6000821982111561332f5761332f6130b9565b500190565b60008261335157634e487b7160e01b600052601260045260246000fd5b500490565b6060810160408483378260408301529392505050565b6060810161337a82856130e8565b8260408301529392505050565b606081016133958286612fc7565b602082019390935260400152919050565b600082516133b8818460208701612e44565b9190910192915050565b6000602082840312156133d457600080fd5b8151610b1481612d52565b6001600160a01b0384168152821515602082015260606040820181905260009061340b90830184612e74565b95945050505050565b60006020828403121561342657600080fd5b815160ff81168114610b1457600080fdfea2646970667358221220251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f64736f6c634300080d00330000000000000000000000008392f6669292fa56123f71949b52d883ae57e2250000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf90000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d00000000000000000000000000000000000000000000000000000000000026fc0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b0000000000000000000000008a59781b415288f9e633b948618726cb6e47e9800000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc950000000000000000000000000000000000000000000000000000000000000036
Deployed Bytecode
0x6080604052600436106102465760003560e01c80635dd077e311610139578063ac9650d8116100b6578063c48fb9101161007a578063c48fb9101461077b578063dae254dd1461079b578063e529ee95146107bb578063e89133b2146107ef578063f851a44014610823578063f999ea661461084857600080fd5b8063ac9650d8146106b3578063bc04f0af146106d3578063bd6acfa6146106f2578063be4b853414610712578063c0511c251461073257600080fd5b80636ea056a9116100fd5780636ea056a91461061d5780639459f2861461063d578063a608d79a1461065d578063a6f74b141461067d578063aa45bd291461069357600080fd5b80635dd077e314610569578063602955f114610589578063625540ea146105a95780636426177d146105dd5780636464cdb1146105fd57600080fd5b80632c9d737a116101c757806341af8cb21161018b57806341af8cb2146104a15780634a9fc49c146104c15780634dd18bf5146104f55780634f39059c14610515578063558a72971461054957600080fd5b80632c9d737a1461040c578063357aa4e11461042c578063372500ab1461044c578063397d9663146104615780634070a3481461048157600080fd5b806318d123211161020e57806318d12321146103475780631a637fe1146103755780631dac30b0146103ac57806326782247146103cc57806327409b3c146103ec57600080fd5b806307e6754c1461024b5780630896f2c61461029c5780630dc3d0ff146102d05780630e18b681146102f057806313e7c9d814610307575b600080fd5b34801561025757600080fd5b5061027f7f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102a857600080fd5b5061027f7f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d081565b3480156102dc57600080fd5b5060045461027f906001600160a01b031681565b3480156102fc57600080fd5b50610305610868565b005b34801561031357600080fd5b50610337610322366004612c36565b60026020526000908152604090205460ff1681565b6040519015158152602001610293565b34801561035357600080fd5b50610367610362366004612c62565b6109b3565b604051908152602001610293565b34801561038157600080fd5b50610395610390366004612c8d565b610a38565b604080519215158352602083019190915201610293565b3480156103b857600080fd5b5060035461027f906001600160a01b031681565b3480156103d857600080fd5b5060015461027f906001600160a01b031681565b3480156103f857600080fd5b50610367610407366004612cbe565b610a90565b34801561041857600080fd5b50610367610427366004612cf1565b610b1b565b34801561043857600080fd5b50610367610447366004612d1b565b610b69565b34801561045857600080fd5b50610337610be0565b34801561046d57600080fd5b5061027f61047c366004612d1b565b610f30565b34801561048d57600080fd5b5061036761049c366004612cf1565b610fbd565b3480156104ad57600080fd5b506103676104bc366004612d36565b611001565b3480156104cd57600080fd5b5061027f7f0000000000000000000000008a59781b415288f9e633b948618726cb6e47e98081565b34801561050157600080fd5b50610305610510366004612c36565b611088565b34801561052157600080fd5b5061027f7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b34801561055557600080fd5b50610305610564366004612d63565b61110d565b34801561057557600080fd5b50610367610584366004612cbe565b611199565b34801561059557600080fd5b5060065461027f906001600160a01b031681565b3480156105b557600080fd5b5061027f7f0000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc9581565b3480156105e957600080fd5b506103056105f8366004612cf1565b61123e565b34801561060957600080fd5b50610305610618366004612c36565b611346565b34801561062957600080fd5b50610305610638366004612d9a565b6113c4565b34801561064957600080fd5b50610305610658366004612db6565b61140f565b34801561066957600080fd5b50610367610678366004612d36565b6114bf565b34801561068957600080fd5b5061036760055481565b34801561069f57600080fd5b506103376106ae366004612c8d565b61150c565b6106c66106c1366004612dcf565b611550565b6040516102939190612ea0565b3480156106df57600080fd5b506103056106ee366004612d9a565b5050565b3480156106fe57600080fd5b5061036761070d366004612cf1565b6116a5565b34801561071e57600080fd5b5061036761072d366004612d1b565b6116fc565b34801561073e57600080fd5b5061076661074d366004612db6565b6007602052600090815260409020805460019091015482565b60408051928352602083019190915201610293565b34801561078757600080fd5b50610305610796366004612c8d565b6117b0565b3480156107a757600080fd5b506103056107b6366004612c36565b61194b565b3480156107c757600080fd5b506103677f000000000000000000000000000000000000000000000000000000000000003681565b3480156107fb57600080fd5b5061027f7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b34801561082f57600080fd5b5060005461027f9061010090046001600160a01b031681565b34801561085457600080fd5b50610395610863366004612db6565b6119c9565b6001546001600160a01b03166108bc5760405163c50656df60e01b815260206004820152601360248201527214195b991a5b99c818591b5a5b881d5b9cd95d606a1b60448201526064015b60405180910390fd5b6001546001600160a01b0316331461090b5760405163973d02cb60e01b81526020600482015260116024820152702737ba103832b73234b7339030b236b4b760791b60448201526064016108b3565b6001805460008054610100600160a81b0319166101006001600160a01b03808516820292909217928390556001600160a01b031990931690935560405191900490911681527f54e4612788f90384e6843298d7854436f3a585b2c3831ab66abf1de63bfa6c2d9060200160405180910390a1604051600081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df359060200160405180910390a1565b60006109bd611a22565b3360009081526002602052604090205460ff166109ed5760405163973d02cb60e01b81526004016108b390612f02565b60006109f884611a97565b90506000610a068285611eb9565b50905080610a275760405163c50656df60e01b81526004016108b390612f28565b509050610a32611fe1565b92915050565b600080610a43611a22565b3360009081526002602052604090205460ff16610a735760405163973d02cb60e01b81526004016108b390612f02565b610a7d8484611eb9565b91509150610a89611fe1565b9250929050565b6000610a9a611a22565b3360009081526002602052604090205460ff16610aca5760405163973d02cb60e01b81526004016108b390612f02565b6000610ad68585611ff4565b9050600080610ae58386611eb9565b9150915081610b075760405163c50656df60e01b81526004016108b390612f28565b5090915050610b14611fe1565b9392505050565b6000610b25611a22565b3360009081526002602052604090205460ff16610b555760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612347565b9050610a32611fe1565b600080610b7583610f30565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a0823190602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b149190612f5f565b6000610bea611a22565b3360009081526002602052604090205460ff16610c1a5760405163973d02cb60e01b81526004016108b390612f02565b600660009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c6a57600080fd5b505af1158015610c7e573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260019350600092507f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031691506370a0823190602401602060405180830381865afa158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216906370a0823190602401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190612f5f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b16906370a0823190602401602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190612f5f565b600354909150610e68907f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52906001600160a01b03168461265b565b600354610ea0907f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906001600160a01b03168361265b565b600354610ed8907f0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0906001600160a01b03168561265b565b60408051851515815260208101859052908101839052606081018290527fc3a2bfdd669309fab32bff187e250ae46596032d10653edb1c04abc3988c44459060800160405180910390a1505050610f2d611fe1565b90565b600080826001811115610f4557610f45612f78565b905060028110610f98576040516354a1577760e11b815260206004820152601960248201527f417373657420696e646578206f7574206f6620626f756e64730000000000000060448201526064016108b3565b60088160028110610fab57610fab612f8e565b01546001600160a01b03169392505050565b6000610fc7611a22565b3360009081526002602052604090205460ff16610ff75760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383611ff4565b600061100b611a22565b3360009081526002602052604090205460ff1661103b5760405163973d02cb60e01b81526004016108b390612f02565b600061104683611a97565b905060006110578262093a80611eb9565b509050806110785760405163c50656df60e01b81526004016108b390612f28565b509050611083611fe1565b919050565b60005461010090046001600160a01b031633146110b85760405163973d02cb60e01b81526004016108b390612fa4565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fa728e84b447788a55ff664fbfb5c3983925f88b80b672a1b0b8271c94b22df35906020015b60405180910390a150565b60005461010090046001600160a01b0316331461113d5760405163973d02cb60e01b81526004016108b390612fa4565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151517905590519182527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4910160405180910390a15050565b60006111a3611a22565b3360009081526002602052604090205460ff166111d35760405163973d02cb60e01b81526004016108b390612f02565b6111dd8383612763565b61122a5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b6112348484612347565b9050610b14611fe1565b611246611a22565b60005461010090046001600160a01b031633146112765760405163973d02cb60e01b81526004016108b390612fa4565b600061128183610f30565b60045490915061129c9082906001600160a01b03168461265b565b6004805460405163bc04f0af60e01b81526001600160a01b03848116938201939093526024810185905291169063bc04f0af90604401600060405180830381600087803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050507f79b317be1efd69d6bf9fcbcd2f3353788aadfc2d546bf7ed03dabab1488b28178383604051611335929190612fe9565b60405180910390a1506106ee611fe1565b60005461010090046001600160a01b031633146113765760405163973d02cb60e01b81526004016108b390612fa4565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f59dea4585e1df1b7a22cafd3486f3c6080e7bd27c1450af2f11f192cb637658b90602001611102565b6113cc611a22565b60005461010090046001600160a01b031633146113fc5760405163973d02cb60e01b81526004016108b390612fa4565b61140782338361265b565b6106ee611fe1565b3360009081526002602052604090205460ff1661143f5760405163973d02cb60e01b81526004016108b390612f02565b61271081111561148a576040516354a1577760e11b8152602060048201526015602482015274536c697070616765206e6f7420696e2072616e676560581b60448201526064016108b3565b60058190556040518181527f32c890dda1c5857193234f885837d184a81efbb9b84bd7697acd063461950bb190602001611102565b60006114c9611a22565b3360009081526002602052604090205460ff166114f95760405163973d02cb60e01b81526004016108b390612f02565b61150282611a97565b9050611083611fe1565b6000611516611a22565b3360009081526002602052604090205460ff166115465760405163973d02cb60e01b81526004016108b390612f02565b610b5f8383612763565b60608167ffffffffffffffff81111561156b5761156b613004565b60405190808252806020026020018201604052801561159e57816020015b60608152602001906001900390816115895790505b50905060005b8281101561169e57600080308686858181106115c2576115c2612f8e565b90506020028101906115d4919061301a565b6040516115e2929190613061565b600060405180830381855af49150503d806000811461161d576040519150601f19603f3d011682016040523d82523d6000602084013e611622565b606091505b50915091508161166d5785858481811061163e5761163e612f8e565b9050602002810190611650919061301a565b8260405163070c497560e21b81526004016108b393929190613071565b8084848151811061168057611680612f8e565b6020026020010181905250505080611697906130cf565b90506115a4565b5092915050565b60006116af611a22565b3360009081526002602052604090205460ff166116df5760405163973d02cb60e01b81526004016108b390612f02565b60006116eb8484611ff4565b90506000610a068262093a80611eb9565b60007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663cc2b27d7670de0b6b3a764000084600181111561174857611748612f78565b6040516001600160e01b031960e085901b1681526004810192909252600f0b6024820152604401602060405180830381865afa15801561178c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a329190612f5f565b6117b8611a22565b3360009081526002602052604090205460ff166117e85760405163973d02cb60e01b81526004016108b390612f02565b6117f28282612763565b61183f5760405163c50656df60e01b815260206004820152601b60248201527f57697468647261772066726f6d20636f6e766578206661696c6564000000000060448201526064016108b3565b7f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d61186c81806000612af5565b611897817f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d85612af5565b604080518082018252600080825260208201529051633eb1719f60e01b81526001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690633eb1719f906118f99087908590309060040161310b565b6000604051808303816000875af1158015611918573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119409190810190613138565b5050506106ee611fe1565b60005461010090046001600160a01b0316331461197b5760405163973d02cb60e01b81526004016108b390612fa4565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f2bebe3801c306ffa893b76894d5baf1cef32807aa974f6449595a9c2392f617490602001611102565b6000806119d4611a22565b3360009081526002602052604090205460ff16611a045760405163973d02cb60e01b81526004016108b390612f02565b611a118362093a80611eb9565b91509150611a1d611fe1565b915091565b600160005460ff166002811115611a3b57611a3b612f78565b14611a805760405163c50656df60e01b8152602060048201526014602482015273131bd8dac8185b1c9958591e4818db185a5b595960621b60448201526064016108b3565b600080546002919060ff19166001835b0217905550565b604080518082019182905260009182919060089060029082845b81546001600160a01b03168152600190910190602001808311611ab1575050505050905060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d90506000611b0582612b28565b60ff1690506000805b6002811015611c4d57868160028110611b2957611b29612f8e565b602002013515611c3b576000611b54868360028110611b4a57611b4a612f8e565b6020020151612b28565b60ff1690506000611b6582866131f6565b9050611b7281600a6132f1565b898460028110611b8457611b84612f8e565b6020020135611b9391906132fd565b611b9d908561331c565b9350611be1878460028110611bb457611bb4612f8e565b60200201517f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b611c38878460028110611bf657611bf6612f8e565b60200201517f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8b8660028110611c2e57611c2e612f8e565b6020020135612af5565b50505b80611c45816130cf565b915050611b0e565b5060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd29190612f5f565b611ce4670de0b6b3a7640000846132fd565b611cee9190613334565b9050600061271060055483611d0391906132fd565b611d0d9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190612f5f565b604051630b4c7e4d60e01b81529091506001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690630b4c7e4d90611dcc908c908690600401613356565b600060405180830381600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e689190612f5f565b611e7291906131f6565b97507f517ddf7483018304eeee2bc47b77b2f2b8b4f0519936b5c1bc4a78e808522c998989604051611ea5929190613356565b60405180910390a150505050505050919050565b6006546000908190611ef6907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d906001600160a01b031686612af5565b60065460405163a41ce7e960e01b815260048101869052602481018590526001600160a01b039091169063a41ce7e9906044016020604051808303816000875af1158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612f5f565b60408051808201825286815260208082018781526000858152600783528490209251835551600192830155825188815290810184905291820181905293509091507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f9060600160405180910390a19250929050565b600080546001919060ff19168280611a90565b60008061200084610f30565b90507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d600061202e82612b28565b60ff169050600061203e84612b28565b61204b9060ff16836131f6565b9050612055612c01565b868189600181111561206957612069612f78565b6002811061207957612079612f8e565b60200201818152505060007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190612f5f565b612118670de0b6b3a76400008a6132fd565b6121229190613334565b905060006127106005548361213791906132fd565b6121419190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa15801561218b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121af9190612f5f565b90506121dd887f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b612208887f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8c612af5565b604051630b4c7e4d60e01b81526001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d1690630b4c7e4d90612256908790869060040161336c565b600060405180830381600087803b15801561227057600080fd5b505af1158015612284573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b038a1691506370a0823190602401602060405180830381865afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190612f5f565b6122fc91906131f6565b98507f92eab167f439529a32b5391965d26b5f172158ac6931fae02a936e50ba8d16608b8b8b60405161233193929190613387565b60405180910390a1505050505050505092915050565b60008061235384610f30565b90507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d600085600181111561238a5761238a612f78565b905060006127106005548761239f91906132fd565b6123a99190613334565b90506000670de0b6b3a76400007f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031663bb7b8b806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190612f5f565b61244290846132fd565b61244c9190613334565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190612f5f565b90506124e8857f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6000612af5565b612513857f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d8a612af5565b604051630d2680e960e11b815260048101899052600f85900b6024820152604481018390527f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031690631a4d01d290606401600060405180830381600087803b15801561258657600080fd5b505af115801561259a573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156125e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126089190612f5f565b61261291906131f6565b96507ff00c2bb112527cee6bc4b721538408ee2f9ecc2ca6998706b4b71b23774e365689898960405161264793929190613387565b60405180910390a150505050505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516126c891906133a6565b6000604051808303816000865af19150503d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b5091509150811580612738575080511580159061273857508080602001905181019061273691906133c2565b155b1561275c5784828260405163e7e40b5b60e01b81526004016108b3939291906133df565b5050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d16906370a0823190602401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190612f5f565b600654604051634ab794a360e01b8152600481018690529192506001600160a01b031690634ab794a390602401600060405180830381600087803b15801561283757600080fd5b505af115801561284b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b031691506370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190612f5f565b90506000856128e984846131f6565b6128f391906131f6565b90506001811115612a2657600654612936907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d906001600160a01b031683612af5565b60065460405163a41ce7e960e01b81526004810183905262093a8060248201526000916001600160a01b03169063a41ce7e9906044016020604051808303816000875af115801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af9190612f5f565b60408051808201825284815262093a80602080830191825260008581526007825284902092518355905160019092019190915581518581529081018390528715158183015290519192507fdb587f4327457f553eae7150dcd48cd4659b0dc3850b87117885bbfa8d20864f919081900360600190a1505b6040516370a0823160e01b8152306004820152600194507f554ea882a1b2a34679dfdcdd2fbca86efdadd76d2fb7902b4f0a31b7b2a7fc98907f000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d6001600160a01b0316906370a0823190602401602060405180830381865afa158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190612f5f565b6040805191825286151560208301520160405180910390a150505092915050565b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b9060640161268a565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691612b6e91906133a6565b600060405180830381855afa9150503d8060008114612ba9576040519150601f19603f3d011682016040523d82523d6000602084013e612bae565b606091505b5091509150811580612bc1575060208151105b15612be55783828260405163e7e40b5b60e01b81526004016108b3939291906133df565b80806020019051810190612bf99190613414565b949350505050565b60405180604001604052806002906020820280368337509192915050565b80356001600160a01b038116811461108357600080fd5b600060208284031215612c4857600080fd5b610b1482612c1f565b8060408101831015610a3257600080fd5b60008060608385031215612c7557600080fd5b612c7f8484612c51565b946040939093013593505050565b60008060408385031215612ca057600080fd5b50508035926020909101359150565b80356002811061108357600080fd5b600080600060608486031215612cd357600080fd5b612cdc84612caf565b95602085013595506040909401359392505050565b60008060408385031215612d0457600080fd5b612d0d83612caf565b946020939093013593505050565b600060208284031215612d2d57600080fd5b610b1482612caf565b600060408284031215612d4857600080fd5b610b148383612c51565b8015158114612d6057600080fd5b50565b60008060408385031215612d7657600080fd5b612d7f83612c1f565b91506020830135612d8f81612d52565b809150509250929050565b60008060408385031215612dad57600080fd5b612d0d83612c1f565b600060208284031215612dc857600080fd5b5035919050565b60008060208385031215612de257600080fd5b823567ffffffffffffffff80821115612dfa57600080fd5b818501915085601f830112612e0e57600080fd5b813581811115612e1d57600080fd5b8660208260051b8501011115612e3257600080fd5b60209290920196919550909350505050565b60005b83811015612e5f578181015183820152602001612e47565b83811115612e6e576000848401525b50505050565b60008151808452612e8c816020860160208601612e44565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef557603f19888603018452612ee3858351612e74565b94509285019290850190600101612ec7565b5092979650505050505050565b6020808252600c908201526b2737ba1037b832b930ba37b960a11b604082015260600190565b6020808252601a908201527f4465706f73697420696e746f20636f6e766578206661696c6564000000000000604082015260600190565b600060208284031215612f7157600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252600990820152682737ba1030b236b4b760b91b604082015260600190565b60028110612fe557634e487b7160e01b600052602160045260246000fd5b9052565b60408101612ff78285612fc7565b8260208301529392505050565b634e487b7160e01b600052604160045260246000fd5b6000808335601e1984360301811261303157600080fd5b83018035915067ffffffffffffffff82111561304c57600080fd5b602001915036819003821315610a8957600080fd5b8183823760009101908152919050565b60408152826040820152828460608301376000606084830101526000601f19601f850116820160608382030160208401526130af6060820185612e74565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016130e1576130e16130b9565b5060010190565b8060005b6002811015612e6e5781518452602093840193909101906001016130ec565b8381526080810161311f60208301856130e8565b6001600160a01b03929092166060919091015292915050565b6000602080838503121561314b57600080fd5b825167ffffffffffffffff8082111561316357600080fd5b818501915085601f83011261317757600080fd5b81518181111561318957613189613004565b8060051b604051601f19603f830116810181811085821117156131ae576131ae613004565b6040529182528482019250838101850191888311156131cc57600080fd5b938501935b828510156131ea578451845293850193928501926131d1565b98975050505050505050565b600082821015613208576132086130b9565b500390565b600181815b8085111561324857816000190482111561322e5761322e6130b9565b8085161561323b57918102915b93841c9390800290613212565b509250929050565b60008261325f57506001610a32565b8161326c57506000610a32565b8160018114613282576002811461328c576132a8565b6001915050610a32565b60ff84111561329d5761329d6130b9565b50506001821b610a32565b5060208310610133831016604e8410600b84101617156132cb575081810a610a32565b6132d5838361320d565b80600019048211156132e9576132e96130b9565b029392505050565b6000610b148383613250565b6000816000190483118215151615613317576133176130b9565b500290565b6000821982111561332f5761332f6130b9565b500190565b60008261335157634e487b7160e01b600052601260045260246000fd5b500490565b6060810160408483378260408301529392505050565b6060810161337a82856130e8565b8260408301529392505050565b606081016133958286612fc7565b602082019390935260400152919050565b600082516133b8818460208701612e44565b9190910192915050565b6000602082840312156133d457600080fd5b8151610b1481612d52565b6001600160a01b0384168152821515602082015260606040820181905260009061340b90830184612e74565b95945050505050565b60006020828403121561342657600080fd5b815160ff81168114610b1457600080fdfea2646970667358221220251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008392f6669292fa56123f71949b52d883ae57e2250000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf90000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d00000000000000000000000000000000000000000000000000000000000026fc0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b0000000000000000000000008a59781b415288f9e633b948618726cb6e47e9800000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc950000000000000000000000000000000000000000000000000000000000000036
-----Decoded View---------------
Arg [0] : params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000008392f6669292fa56123f71949b52d883ae57e225
Arg [1] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [2] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [3] : 000000000000000000000000bc2fb245594a68c927c930fbe2d00680a8c90b9e
Arg [4] : 0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0
Arg [5] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [6] : 000000000000000000000000b657b895b265c38c53fff00166cf7f6a3c70587d
Arg [7] : 00000000000000000000000000000000000000000000000000000000000026fc
Arg [8] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [9] : 0000000000000000000000008a59781b415288f9e633b948618726cb6e47e980
Arg [10] : 0000000000000000000000002b8b301b90eb8801f1eefe73285eec117d2ffc95
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000036
Deployed Bytecode Sourcemap
16067:31124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20218:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;202:32:1;;;184:51;;172:2;157:18;20218:41:0;;;;;;;;20057:38;;;;;;;;;;;;;;;19978:31;;;;;;;;;;-1:-1:-1;19978:31:0;;;;-1:-1:-1;;;;;19978:31:0;;;24856:415;;;;;;;;;;;;;:::i;:::-;;19813:41;;;;;;;;;;-1:-1:-1;19813:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1210:14:1;;1203:22;1185:41;;1173:2;1158:18;19813:41:0;1045:187:1;31910:458:0;;;;;;;;;;-1:-1:-1;31910:458:0;;;;;:::i;:::-;;:::i;:::-;;;1855:25:1;;;1843:2;1828:18;31910:458:0;1709:177:1;28911:226:0;;;;;;;;;;-1:-1:-1;28911:226:0;;;;;:::i;:::-;;:::i;:::-;;;;2337:14:1;;2330:22;2312:41;;2384:2;2369:18;;2362:34;;;;2285:18;28911:226:0;2144:258:1;19900:29:0;;;;;;;;;;-1:-1:-1;19900:29:0;;;;-1:-1:-1;;;;;19900:29:0;;;19745:27;;;;;;;;;;-1:-1:-1;19745:27:0;;;;-1:-1:-1;;;;;19745:27:0;;;33920:472;;;;;;;;;;-1:-1:-1;33920:472:0;;;;;:::i;:::-;;:::i;27962:199::-;;;;;;;;;;-1:-1:-1;27962:199:0;;;;;:::i;:::-;;:::i;23081:191::-;;;;;;;;;;-1:-1:-1;23081:191:0;;;;;:::i;:::-;;:::i;29760:700::-;;;;;;;;;;;;;:::i;23799:290::-;;;;;;;;;;-1:-1:-1;23799:290:0;;;;;:::i;:::-;;:::i;27501:196::-;;;;;;;;;;-1:-1:-1;27501:196:0;;;;;:::i;:::-;;:::i;30915:429::-;;;;;;;;;;-1:-1:-1;30915:429:0;;;;;:::i;:::-;;:::i;20602:59::-;;;;;;;;;;;;;;;24398:140;;;;;;;;;;-1:-1:-1;24398:140:0;;;;;:::i;:::-;;:::i;20138:34::-;;;;;;;;;;;;;;;25469:157;;;;;;;;;;-1:-1:-1;25469:157:0;;;;;:::i;:::-;;:::i;34972:329::-;;;;;;;;;;-1:-1:-1;34972:329:0;;;;;:::i;:::-;;:::i;20851:39::-;;;;;;;;;;-1:-1:-1;20851:39:0;;;;-1:-1:-1;;;;;20851:39:0;;;20716:53;;;;;;;;;;;;;;;36197:365;;;;;;;;;;-1:-1:-1;36197:365:0;;;;;:::i;:::-;;:::i;26022:152::-;;;;;;;;;;-1:-1:-1;26022:152:0;;;;;:::i;:::-;;:::i;36745:147::-;;;;;;;;;;-1:-1:-1;36745:147:0;;;;;:::i;:::-;;:::i;26573:268::-;;;;;;;;;;-1:-1:-1;26573:268:0;;;;;:::i;:::-;;:::i;27054:192::-;;;;;;;;;;-1:-1:-1;27054:192:0;;;;;:::i;:::-;;:::i;20440:30::-;;;;;;;;;;;;;;;;29433:194;;;;;;;;;;-1:-1:-1;29433:194:0;;;;;:::i;:::-;;:::i;392:453::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37035:78::-;;;;;;;;;;-1:-1:-1;37035:78:0;;;;;:::i;:::-;36197:365;;;32870:433;;;;;;;;;;-1:-1:-1;32870:433:0;;;;;:::i;:::-;;:::i;23458:164::-;;;;;;;;;;-1:-1:-1;23458:164:0;;;;;:::i;:::-;;:::i;21048:44::-;;;;;;;;;;-1:-1:-1;21048:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8149:25:1;;;8205:2;8190:18;;8183:34;;;;8122:18;21048:44:0;7975:248:1;35386:628:0;;;;;;;;;;-1:-1:-1;35386:628:0;;;;;:::i;:::-;;:::i;25749:146::-;;;;;;;;;;-1:-1:-1;25749:146:0;;;;;:::i;:::-;;:::i;20944:37::-;;;;;;;;;;;;;;;20514:41;;;;;;;;;;;;;;;19672:20;;;;;;;;;;-1:-1:-1;19672:20:0;;;;;;;-1:-1:-1;;;;;19672:20:0;;;28437:198;;;;;;;;;;-1:-1:-1;28437:198:0;;;;;:::i;:::-;;:::i;24856:415::-;24903:12;;-1:-1:-1;;;;;24903:12:0;24899:101;;24953:35;;-1:-1:-1;;;24953:35:0;;8658:2:1;24953:35:0;;;8640:21:1;8697:2;8677:18;;;8670:30;-1:-1:-1;;;8716:18:1;;;8709:49;8775:18;;24953:35:0;;;;;;;;24899:101;25016:12;;-1:-1:-1;;;;;25016:12:0;25032:10;25016:26;25012:99;;25066:33;;-1:-1:-1;;;25066:33:0;;9006:2:1;25066:33:0;;;8988:21:1;9045:2;9025:18;;;9018:30;-1:-1:-1;;;9064:18:1;;;9057:47;9121:18;;25066:33:0;8804:341:1;25012:99:0;25131:12;;;;25123:20;;-1:-1:-1;;;;;;25123:20:0;25131:12;-1:-1:-1;;;;;25131:12:0;;;25123:20;;;;;;;;;;-1:-1:-1;;;;;;25154:25:0;;;;;;25197:19;;25210:5;;;;;;184:51:1;;25197:19:0;;172:2:1;157:18;25197:19:0;;;;;;;25232:31;;25260:1;184:51:1;;25232:31:0;;172:2:1;157:18;25232:31:0;;;;;;;24856:415::o;31910:458::-;32058:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;32078:27:::2;32108;32127:7;32108:18;:27::i;:::-;32078:57;;32149:12;32167:52;32189:19;32210:8;32167:21;:52::i;:::-;32148:71;;;32237:7;32232:90;;32268:42;;-1:-1:-1::0;;;32268:42:0::2;;;;;;;:::i;32232:90::-;-1:-1:-1::0;32341:19:0;-1:-1:-1;2158:11:0;:9;:11::i;:::-;31910:458;;;;:::o;28911:226::-;29046:12;29060:10;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29090:39:::2;29112:6;29120:8;29090:21;:39::i;:::-;29083:46;;;;2158:11:::0;:9;:11::i;:::-;28911:226;;;;;:::o;33920:472::-;34066:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;34086:27:::2;34116:33;34135:5;34142:6;34116:18;:33::i;:::-;34086:63;;34163:12;34177:10:::0;34191:52:::2;34213:19;34234:8;34191:21;:52::i;:::-;34162:81;;;;34261:7;34256:90;;34292:42;;-1:-1:-1::0;;;34292:42:0::2;;;;;;;:::i;34256:90::-;-1:-1:-1::0;34365:19:0;;-1:-1:-1;;2158:11:0;:9;:11::i;:::-;33920:472;;;;;:::o;27962:199::-;28083:17;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;28120:33:::2;28139:5;28146:6;28120:18;:33::i;:::-;28113:40;;2158:11:::0;:9;:11::i;23081:191::-;23151:7;23171:12;23186:30;23210:5;23186:23;:30::i;:::-;23234;;-1:-1:-1;;;23234:30:0;;23258:4;23234:30;;;184:51:1;23171:45:0;;-1:-1:-1;;;;;;23234:15:0;;;;;157:18:1;;23234:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29760:700::-;29820:12;2119;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29845:15:::2;;;;;;;;;-1:-1:-1::0;;;;;29845:15:0::2;-1:-1:-1::0;;;;;29845:25:0::2;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;29934:39:0::2;::::0;-1:-1:-1;;;29934:39:0;;29967:4:::2;29934:39;::::0;::::2;184:51:1::0;29893:4:0::2;::::0;-1:-1:-1;29910:18:0::2;::::0;-1:-1:-1;29934:14:0::2;-1:-1:-1::0;;;;;29934:24:0::2;::::0;-1:-1:-1;29934:24:0::2;::::0;157:18:1;;29934:39:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30008:35;::::0;-1:-1:-1;;;30008:35:0;;30037:4:::2;30008:35;::::0;::::2;184:51:1::0;29910:63:0;;-1:-1:-1;29984:20:0::2;::::0;-1:-1:-1;;;;;30008:10:0::2;:20;::::0;::::2;::::0;157:18:1;;30008:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30078:36;::::0;-1:-1:-1;;;30078:36:0;;30108:4:::2;30078:36;::::0;::::2;184:51:1::0;29984:59:0;;-1:-1:-1;30054:21:0::2;::::0;-1:-1:-1;;;;;30078:11:0::2;:21;::::0;::::2;::::0;157:18:1;;30078:36:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30171:14;::::0;30054:60;;-1:-1:-1;30127:73:0::2;::::0;30158:10:::2;::::0;-1:-1:-1;;;;;30171:14:0::2;30187:12:::0;30127:22:::2;:73::i;:::-;30256:14;::::0;30211:75:::2;::::0;30242:11:::2;::::0;-1:-1:-1;;;;;30256:14:0::2;30272:13:::0;30211:22:::2;:75::i;:::-;30345:14;::::0;30297:75:::2;::::0;30328:14:::2;::::0;-1:-1:-1;;;;;30345:14:0::2;30361:10:::0;30297:22:::2;:75::i;:::-;30390:62;::::0;;10285:14:1;;10278:22;10260:41;;10332:2;10317:18;;10310:34;;;10360:18;;;10353:34;;;10418:2;10403:18;;10396:34;;;30390:62:0::2;::::0;10247:3:1;10232:19;30390:62:0::2;;;;;;;29834:626;;;2158:11:::0;:9;:11::i;:::-;29760:700;:::o;23799:290::-;23870:6;23889:13;23913:5;23905:14;;;;;;;;:::i;:::-;23889:30;;135:1;23934:5;:25;23930:109;;23983:44;;-1:-1:-1;;;23983:44:0;;10775:2:1;23983:44:0;;;10757:21:1;10814:2;10794:18;;;10787:30;10853:27;10833:18;;;10826:55;10898:18;;23983:44:0;10573:349:1;23930:109:0;24056:18;24075:5;24056:25;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;24056:25:0;;23799:290;-1:-1:-1;;;23799:290:0:o;27501:196::-;27622:14;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;27656:33:::2;27675:5;27682:6;27656:18;:33::i;30915:429::-:0;31026:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;31046:27:::2;31076;31095:7;31076:18;:27::i;:::-;31046:57;;31117:12;31134:61;31156:19;15841:6;31134:21;:61::i;:::-;31116:79;;;31213:7;31208:90;;31244:42;;-1:-1:-1::0;;;31244:42:0::2;;;;;;;:::i;31208:90::-;-1:-1:-1::0;31317:19:0;-1:-1:-1;2158:11:0;:9;:11::i;:::-;30915:429;;;:::o;24398:140::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;24468:12:::1;:20:::0;;-1:-1:-1;;;;;;24468:20:0::1;-1:-1:-1::0;;;;;24468:20:0;::::1;::::0;;::::1;::::0;;;24504:26:::1;::::0;184:51:1;;;24504:26:0::1;::::0;172:2:1;157:18;24504:26:0::1;;;;;;;;24398:140:::0;:::o;25469:157::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;-1:-1:-1;;;;;25550:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:27;;-1:-1:-1;;25550:27:0::1;::::0;::::1;;;::::0;;25593:25;;184:51:1;;;25593:25:0::1;::::0;157:18:1;25593:25:0::1;;;;;;;25469:157:::0;;:::o;34972:329::-;35103:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;35130:34:::2;35153:6;35161:2;35130:22;:34::i;:::-;35125:118;;35188:43;::::0;-1:-1:-1;;;35188:43:0;;11598:2:1;35188:43:0::2;::::0;::::2;11580:21:1::0;11637:2;11617:18;;;11610:30;11676:29;11656:18;;;11649:57;11723:18;;35188:43:0::2;11396:351:1::0;35125:118:0::2;35260:33;35279:5;35286:6;35260:18;:33::i;:::-;35253:40;;2158:11:::0;:9;:11::i;36197:365::-;2119:12;:10;:12::i;:::-;21362:5:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21362:5:0::1;21348:10;:19;21344:84;;21391:25;;-1:-1:-1::0;;;21391:25:0::1;;;;;;;:::i;21344:84::-;36292:12:::2;36307:30;36331:5;36307:23;:30::i;:::-;36387:16;::::0;36292:45;;-1:-1:-1;36348:64:0::2;::::0;36292:45;;-1:-1:-1;;;;;36387:16:0::2;36405:6:::0;36348:22:::2;:64::i;:::-;36445:16;::::0;;36425:77:::2;::::0;-1:-1:-1;;;36425:77:0;;-1:-1:-1;;;;;11944:32:1;;;36425:77:0;;::::2;11926:51:1::0;;;;11993:18;;;11986:34;;;36445:16:0;::::2;::::0;36425:53:::2;::::0;11899:18:1;;36425:77:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36520:34;36540:5;36547:6;36520:34;;;;;;;:::i;:::-;;;;;;;;36281:281;2158:11:::0;:9;:11::i;26022:152::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;26096:16:::1;:24:::0;;-1:-1:-1;;;;;;26096:24:0::1;-1:-1:-1::0;;;;;26096:24:0;::::1;::::0;;::::1;::::0;;;26136:30:::1;::::0;184:51:1;;;26136:30:0::1;::::0;172:2:1;157:18;26136:30:0::1;14:227:1::0;36745:147:0;2119:12;:10;:12::i;:::-;21362:5:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21362:5:0::1;21348:10;:19;21344:84;;21391:25;;-1:-1:-1::0;;;21391:25:0::1;;;;;;;:::i;21344:84::-;36826:58:::2;36857:5;36865:10;36877:6;36826:22;:58::i;:::-;2158:11:::0;:9;:11::i;26573:268::-;21587:10;21577:21;;;;:9;:21;;;;;;;;21572:90;;21622:28;;-1:-1:-1;;;21622:28:0;;;;;;;:::i;21572:90::-;15673:3:::1;26653:5;:26;26649:106;;;26703:40;::::0;-1:-1:-1;;;26703:40:0;;12758:2:1;26703:40:0::1;::::0;::::1;12740:21:1::0;12797:2;12777:18;;;12770:30;-1:-1:-1;;;12816:18:1;;;12809:51;12877:18;;26703:40:0::1;12556:345:1::0;26649:106:0::1;26765:15;:23:::0;;;26804:29:::1;::::0;1855:25:1;;;26804:29:0::1;::::0;1843:2:1;1828:18;26804:29:0::1;1709:177:1::0;27054:192:0;27177:14;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;27211:27:::2;27230:7;27211:18;:27::i;:::-;27204:34;;2158:11:::0;:9;:11::i;29433:194::-;29553:12;2119;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;29585:34:::2;29608:6;29616:2;29585:22;:34::i;392:453::-:0;476:22;533:4;521:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;511:34;;561:9;556:282;576:15;;;556:282;;;614:12;;659:4;678;;683:1;678:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;651:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;613:73;;;;708:7;703:88;;759:4;;764:1;759:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;768:6;743:32;;-1:-1:-1;;;743:32:0;;;;;;;;;;:::i;703:88::-;820:6;807:7;815:1;807:10;;;;;;;;:::i;:::-;;;;;;:19;;;;598:240;;593:3;;;;:::i;:::-;;;556:282;;;;392:453;;;;:::o;32870:433::-;32979:7;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;32999:27:::2;33029:33;33048:5;33055:6;33029:18;:33::i;:::-;32999:63;;33076:12;33093:61;33115:19;15841:6;33093:21;:61::i;23458:164::-:0;23518:7;23545;-1:-1:-1;;;;;23545:30:0;;23576:4;23605:5;23597:14;;;;;;;;:::i;:::-;23545:69;;-1:-1:-1;;;;;;23545:69:0;;;;;;;;;;14862:25:1;;;;14934:2;14923:22;14903:18;;;14896:50;14835:18;;23545:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35386:628::-;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;35482:34:::2;35505:6;35513:2;35482:22;:34::i;:::-;35477:118;;35540:43;::::0;-1:-1:-1;;;35540:43:0;;11598:2:1;35540:43:0::2;::::0;::::2;11580:21:1::0;11637:2;11617:18;;;11610:30;11676:29;11656:18;;;11649:57;11723:18;;35540:43:0::2;11396:351:1::0;35477:118:0::2;35652:7;35674:65;35652:7:::0;;35615:19:::2;35674:21;:65::i;:::-;35750:70;35780:12;35803:7;35813:6;35750:21;:70::i;:::-;35881:55;::::0;;;;::::2;::::0;;:28:::2;:55:::0;;;::::2;::::0;::::2;::::0;35947:59;;-1:-1:-1;;;35947:59:0;;-1:-1:-1;;;;;35947:7:0::2;:24;::::0;::::2;::::0;:59:::2;::::0;35972:6;;35881:55;;36000:4:::2;::::0;35947:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;35947:59:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;;35466:548;;2158:11:::0;:9;:11::i;25749:146::-;21362:5;;;;;-1:-1:-1;;;;;21362:5:0;21348:10;:19;21344:84;;21391:25;;-1:-1:-1;;;21391:25:0;;;;;;;:::i;21344:84::-;25821:14:::1;:22:::0;;-1:-1:-1;;;;;;25821:22:0::1;-1:-1:-1::0;;;;;25821:22:0;::::1;::::0;;::::1;::::0;;;25859:28:::1;::::0;184:51:1;;;25859:28:0::1;::::0;172:2:1;157:18;25859:28:0::1;14:227:1::0;28437:198:0;28535:12;28549:10;2119:12;:10;:12::i;:::-;21587:10:::1;21577:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;21572:90;;21622:28;;-1:-1:-1::0;;;21622:28:0::1;;;;;;;:::i;21572:90::-;28579:48:::2;28601:6;15841;28579:21;:48::i;:::-;28572:55;;;;2158:11:::0;:9;:11::i;:::-;28437:198;;;:::o;2474:277::-;2592:14;2578:10;;;;:28;;;;;;;;:::i;:::-;;2574:104;;2630:36;;-1:-1:-1;;;2630:36:0;;17015:2:1;2630:36:0;;;16997:21:1;17054:2;17034:18;;;17027:30;-1:-1:-1;;;17073:18:1;;;17066:50;17133:18;;2630:36:0;16813:344:1;2574:104:0;2718:10;:25;;2731:12;;2718:10;-1:-1:-1;;2718:25:0;;2731:12;2718:25;;;;;;2474:277::o;37323:2042::-;37456:59;;;;;;;;;;-1:-1:-1;;;;37456:59:0;37497:18;;37456:59;;37497:18;37456:59;;;;-1:-1:-1;;;;;37456:59:0;;;;;;;;;;;;;;;;;;;;;;37528:19;37565:7;37528:46;;37587:23;37613:47;37646:12;37613:24;:47::i;:::-;37587:73;;;;37671:23;37718:9;37713:592;135:1;37733;:20;37713:592;;;37779:7;37787:1;37779:10;;;;;;;:::i;:::-;;;;;37775:29;37796:8;37775:29;37821:21;37847:44;37880:6;37887:1;37880:9;;;;;;;:::i;:::-;;;;;37847:24;:44::i;:::-;37821:70;;;-1:-1:-1;37906:23:0;37932:31;37821:70;37932:15;:31;:::i;:::-;37906:57;-1:-1:-1;38012:19:0;37906:57;38012:2;:19;:::i;:::-;37999:7;38007:1;37999:10;;;;;;;:::i;:::-;;;;;:32;;;;:::i;:::-;37980:51;;;;:::i;:::-;;;38145:62;38175:6;38182:1;38175:9;;;;;;;:::i;:::-;;;;;38195:7;38205:1;38145:21;:62::i;:::-;38222:71;38252:6;38259:1;38252:9;;;;;;;:::i;:::-;;;;;38272:7;38282;38290:1;38282:10;;;;;;;:::i;:::-;;;;;38222:21;:71::i;:::-;37760:545;;37713:592;37755:3;;;;:::i;:::-;;;;37713:592;;;;38383:22;38444:7;-1:-1:-1;;;;;38444:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38408:33;15795:4;38408:15;:33;:::i;:::-;:63;;;;:::i;:::-;38383:88;;38757:25;15673:3;38802:15;;38785:14;:32;;;;:::i;:::-;:53;;;;:::i;:::-;39026:37;;-1:-1:-1;;;39026:37:0;;39057:4;39026:37;;;184:51:1;38757:81:0;;-1:-1:-1;39000:23:0;;-1:-1:-1;;;;;39026:22:0;;;;;157:18:1;;39026:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39119:49;;-1:-1:-1;;;39119:49:0;;39000:63;;-1:-1:-1;;;;;;39119:7:0;:21;;;;:49;;39141:7;;39150:17;;39119:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39250:37:0;;-1:-1:-1;;;39250:37:0;;39281:4;39250:37;;;184:51:1;39290:15:0;;-1:-1:-1;;;;;;39250:22:0;;;-1:-1:-1;39250:22:0;;157:18:1;;39250:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;39241:64;;39323:34;39341:7;39350:6;39323:34;;;;;;;:::i;:::-;;;;;;;;37445:1920;;;;;;;37323:2042;;;:::o;44078:428::-;44246:15;;44161:12;;;;44198:73;;44228:7;;-1:-1:-1;;;;;44246:15:0;44264:6;44198:21;:73::i;:::-;44287:15;;:52;;-1:-1:-1;;;44287:52:0;;;;;8149:25:1;;;8190:18;;;8183:34;;;-1:-1:-1;;;;;44287:15:0;;;;:34;;8122:18:1;;44287:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44362:50;;;;;;;;;;;;;;;;;;-1:-1:-1;44350:9:0;;;:5;:9;;;;;:62;;;;;;;;;;44457:41;;19894:25:1;;;19935:18;;;19928:34;;;19978:18;;;19971:50;;;44350:62:0;-1:-1:-1;44350:9:0;;-1:-1:-1;44457:41:0;;19882:2:1;19867:18;44457:41:0;;;;;;;44078:428;;;;;:::o;2789:76::-;2830:10;:27;;2843:14;;2830:10;-1:-1:-1;;2830:27:0;2843:14;;2830:27;;39617:1743;39721:14;39748:12;39772:30;39796:5;39772:23;:30::i;:::-;39748:54;-1:-1:-1;39850:7:0;39813:19;39898:47;39850:7;39898:24;:47::i;:::-;39872:73;;;;39956:23;40002:40;40035:5;40002:24;:40::i;:::-;39984:58;;;;:15;:58;:::i;:::-;39956:86;;40055:40;;:::i;:::-;40132:6;40106:7;40122:5;40114:14;;;;;;;;:::i;:::-;40106:23;;;;;;;:::i;:::-;;;;:32;;;;;40415:22;40470:7;-1:-1:-1;;;;;40470:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40443:24;15795:4;40443:6;:24;:::i;:::-;:54;;;;:::i;:::-;40415:82;;40508:25;15673:3;40553:15;;40536:14;:32;;;;:::i;:::-;:53;;;;:::i;:::-;40777:37;;-1:-1:-1;;;40777:37:0;;40808:4;40777:37;;;184:51:1;40508:81:0;;-1:-1:-1;40751:23:0;;-1:-1:-1;;;;;40777:22:0;;;;;157:18:1;;40777:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40751:63;;40920:58;40950:5;40966:7;40976:1;40920:21;:58::i;:::-;40989:63;41019:5;41035:7;41045:6;40989:21;:63::i;:::-;41108:49;;-1:-1:-1;;;41108:49:0;;-1:-1:-1;;;;;41108:7:0;:21;;;;:49;;41130:7;;41139:17;;41108:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41239:37:0;;-1:-1:-1;;;41239:37:0;;41270:4;41239:37;;;184:51:1;41279:15:0;;-1:-1:-1;;;;;;41239:22:0;;;-1:-1:-1;41239:22:0;;157:18:1;;41239:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;41230:64;;41312:40;41330:5;41337:6;41345;41312:40;;;;;;;;:::i;:::-;;;;;;;;39737:1623;;;;;;;;39617:1743;;;;:::o;41622:1498::-;41726:17;41756:12;41780:30;41804:5;41780:23;:30::i;:::-;41756:54;-1:-1:-1;41858:7:0;41821:19;41904:5;41896:14;;;;;;;;:::i;:::-;41880:30;;42191:24;15673:3;42227:15;;42218:6;:24;;;;:::i;:::-;:45;;;;:::i;:::-;42191:72;;42274:24;15795:4;42322:7;-1:-1:-1;;;;;42322:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42303:46;;:16;:46;:::i;:::-;:64;;;;:::i;:::-;42575:30;;-1:-1:-1;;;42575:30:0;;42599:4;42575:30;;;184:51:1;42274:93:0;;-1:-1:-1;42549:23:0;;-1:-1:-1;;;;;42575:15:0;;;;;157:18:1;;42575:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42549:56;;42618:65;42648:12;42671:7;42681:1;42618:21;:65::i;:::-;42694:70;42724:12;42747:7;42757:6;42694:21;:70::i;:::-;42825:83;;-1:-1:-1;;;42825:83:0;;;;;20903:25:1;;;20975:2;20964:22;;;20944:18;;;20937:50;21003:18;;;20996:34;;;42825:7:0;-1:-1:-1;;;;;42825:33:0;;;;20876:18:1;;42825:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43003:30:0;;-1:-1:-1;;;43003:30:0;;43027:4;43003:30;;;184:51:1;43036:15:0;;-1:-1:-1;;;;;;43003:15:0;;;-1:-1:-1;43003:15:0;;157:18:1;;43003:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;42991:60;;43069:43;43087:5;43094:6;43102:9;43069:43;;;;;;;;:::i;:::-;;;;;;;;41745:1375;;;;;;41622:1498;;;;:::o;8081:387::-;8234:67;;-1:-1:-1;;;;;11944:32:1;;;8234:67:0;;;11926:51:1;11993:18;;;11986:34;;;8174:12:0;;;;8209:10;;;-1:-1:-1;;;8257:24:0;11899:18:1;;8234:67:0;;;;-1:-1:-1;;8234:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;8234:67:0;-1:-1:-1;;;;;;8234:67:0;;;;;;;;;;8209:103;;;;8234:67;8209:103;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8173:139;;;;8330:7;8329:8;:59;;;-1:-1:-1;8342:11:0;;:16;;;;:45;;;8374:4;8363:24;;;;;;;;;;;;:::i;:::-;8362:25;8342:45;8325:136;;;8428:5;8435:7;8444:4;8412:37;;-1:-1:-1;;;8412:37:0;;;;;;;;;;:::i;8325:136::-;8162:306;;8081:387;;;:::o;44806:1043::-;44935:49;;-1:-1:-1;;;44935:49:0;;44978:4;44935:49;;;184:51:1;44884:12:0;;;;-1:-1:-1;;;;;44950:7:0;44935:34;;;;157:18:1;;44935:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44997:15;;:43;;-1:-1:-1;;;44997:43:0;;;;;1855:25:1;;;44909:75:0;;-1:-1:-1;;;;;;44997:15:0;;:39;;1828:18:1;;44997:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45074:49:0;;-1:-1:-1;;;45074:49:0;;45117:4;45074:49;;;184:51:1;45053:18:0;;-1:-1:-1;45089:7:0;-1:-1:-1;;;;;45074:34:0;;-1:-1:-1;45074:34:0;;157:18:1;;45074:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45053:70;-1:-1:-1;45248:21:0;45303:6;45272:28;45285:15;45053:70;45272:28;:::i;:::-;:37;;;;:::i;:::-;45248:61;;45342:1;45326:13;:17;45322:396;;;45408:15;;45360:80;;45390:7;;-1:-1:-1;;;;;45408:15:0;45426:13;45360:21;:80::i;:::-;45471:15;;:68;;-1:-1:-1;;;45471:68:0;;;;;8149:25:1;;;15841:6:0;8190:18:1;;;8183:34;45455:13:0;;-1:-1:-1;;;;;45471:15:0;;:34;;8122:18:1;;45471:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45569:66;;;;;;;;;;;15841:6;45569:66;;;;;;;-1:-1:-1;45554:12:0;;;:5;:12;;;;;:81;;;;;;;;;;;;;;45655:51;;19894:25:1;;;19935:18;;;19928:34;;;20005:14;;19998:22;19978:18;;;19971:50;45655:51:0;;45554:12;;-1:-1:-1;45655:51:0;;;;;;19882:2:1;45655:51:0;;;45345:373;45322:396;45782:49;;-1:-1:-1;;;45782:49:0;;45825:4;45782:49;;;184:51:1;45740:4:0;;-1:-1:-1;45760:81:0;;45797:7;-1:-1:-1;;;;;45782:34:0;;;;157:18:1;;45782:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45760:81;;;22320:25:1;;;22388:14;;22381:22;22376:2;22361:18;;22354:50;22293:18;45760:81:0;;;;;;;44898:951;;;44806:1043;;;;:::o;8838:379::-;8987:63;;-1:-1:-1;;;;;11944:32:1;;;8987:63:0;;;11926:51:1;11993:18;;;11986:34;;;8927:12:0;;;;8962:10;;;-1:-1:-1;;;9010:23:0;11899:18:1;;8987:63:0;11752:274:1;7325:384:0;7472:56;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7472:56:0;-1:-1:-1;;;7472:56:0;;;7441:98;;7387:5;;;;;;-1:-1:-1;;;;;7441:16:0;;;:98;;7472:56;7441:98;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7405:134;;;;7557:7;7556:8;:28;;;;7582:2;7568:4;:11;:16;7556:28;7552:105;;;7624:5;7631:7;7640:4;7608:37;;-1:-1:-1;;;7608:37:0;;;;;;;;;;:::i;7552:105::-;7687:4;7676:25;;;;;;;;;;;;:::i;:::-;7669:32;7325:384;-1:-1:-1;;;;7325:384:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;676:173:1:-;744:20;;-1:-1:-1;;;;;793:31:1;;783:42;;773:70;;839:1;836;829:12;854:186;913:6;966:2;954:9;945:7;941:23;937:32;934:52;;;982:1;979;972:12;934:52;1005:29;1024:9;1005:29;:::i;1237:159::-;1331:6;1364:2;1352:15;;1349:24;-1:-1:-1;1346:44:1;;;1386:1;1383;1376:12;1401:303;1494:6;1502;1555:2;1543:9;1534:7;1530:23;1526:32;1523:52;;;1571:1;1568;1561:12;1523:52;1594:53;1639:7;1628:9;1594:53;:::i;:::-;1584:63;1694:2;1679:18;;;;1666:32;;-1:-1:-1;;;1401:303:1:o;1891:248::-;1959:6;1967;2020:2;2008:9;1999:7;1995:23;1991:32;1988:52;;;2036:1;2033;2026:12;1988:52;-1:-1:-1;;2059:23:1;;;2129:2;2114:18;;;2101:32;;-1:-1:-1;1891:248:1:o;2407:150::-;2482:20;;2531:1;2521:12;;2511:40;;2547:1;2544;2537:12;2562:342;2652:6;2660;2668;2721:2;2709:9;2700:7;2696:23;2692:32;2689:52;;;2737:1;2734;2727:12;2689:52;2760:36;2786:9;2760:36;:::i;:::-;2750:46;2843:2;2828:18;;2815:32;;-1:-1:-1;2894:2:1;2879:18;;;2866:32;;2562:342;-1:-1:-1;;;2562:342:1:o;2909:274::-;2990:6;2998;3051:2;3039:9;3030:7;3026:23;3022:32;3019:52;;;3067:1;3064;3057:12;3019:52;3090:36;3116:9;3090:36;:::i;:::-;3080:46;3173:2;3158:18;;;;3145:32;;-1:-1:-1;;;2909:274:1:o;3188:206::-;3260:6;3313:2;3301:9;3292:7;3288:23;3284:32;3281:52;;;3329:1;3326;3319:12;3281:52;3352:36;3378:9;3352:36;:::i;3399:235::-;3483:6;3536:2;3524:9;3515:7;3511:23;3507:32;3504:52;;;3552:1;3549;3542:12;3504:52;3575:53;3620:7;3609:9;3575:53;:::i;3876:118::-;3962:5;3955:13;3948:21;3941:5;3938:32;3928:60;;3984:1;3981;3974:12;3928:60;3876:118;:::o;3999:315::-;4064:6;4072;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4164:29;4183:9;4164:29;:::i;:::-;4154:39;;4243:2;4232:9;4228:18;4215:32;4256:28;4278:5;4256:28;:::i;:::-;4303:5;4293:15;;;3999:315;;;;;:::o;5132:254::-;5200:6;5208;5261:2;5249:9;5240:7;5236:23;5232:32;5229:52;;;5277:1;5274;5267:12;5229:52;5300:29;5319:9;5300:29;:::i;5391:180::-;5450:6;5503:2;5491:9;5482:7;5478:23;5474:32;5471:52;;;5519:1;5516;5509:12;5471:52;-1:-1:-1;5542:23:1;;5391:180;-1:-1:-1;5391:180:1:o;5829:626::-;5926:6;5934;5987:2;5975:9;5966:7;5962:23;5958:32;5955:52;;;6003:1;6000;5993:12;5955:52;6043:9;6030:23;6072:18;6113:2;6105:6;6102:14;6099:34;;;6129:1;6126;6119:12;6099:34;6167:6;6156:9;6152:22;6142:32;;6212:7;6205:4;6201:2;6197:13;6193:27;6183:55;;6234:1;6231;6224:12;6183:55;6274:2;6261:16;6300:2;6292:6;6289:14;6286:34;;;6316:1;6313;6306:12;6286:34;6369:7;6364:2;6354:6;6351:1;6347:14;6343:2;6339:23;6335:32;6332:45;6329:65;;;6390:1;6387;6380:12;6329:65;6421:2;6413:11;;;;;6443:6;;-1:-1:-1;5829:626:1;;-1:-1:-1;;;;5829:626:1:o;6460:258::-;6532:1;6542:113;6556:6;6553:1;6550:13;6542:113;;;6632:11;;;6626:18;6613:11;;;6606:39;6578:2;6571:10;6542:113;;;6673:6;6670:1;6667:13;6664:48;;;6708:1;6699:6;6694:3;6690:16;6683:27;6664:48;;6460:258;;;:::o;6723:257::-;6764:3;6802:5;6796:12;6829:6;6824:3;6817:19;6845:63;6901:6;6894:4;6889:3;6885:14;6878:4;6871:5;6867:16;6845:63;:::i;:::-;6962:2;6941:15;-1:-1:-1;;6937:29:1;6928:39;;;;6969:4;6924:50;;6723:257;-1:-1:-1;;6723:257:1:o;6985:800::-;7145:4;7174:2;7214;7203:9;7199:18;7244:2;7233:9;7226:21;7267:6;7302;7296:13;7333:6;7325;7318:22;7371:2;7360:9;7356:18;7349:25;;7433:2;7423:6;7420:1;7416:14;7405:9;7401:30;7397:39;7383:53;;7471:2;7463:6;7459:15;7492:1;7502:254;7516:6;7513:1;7510:13;7502:254;;;7609:2;7605:7;7593:9;7585:6;7581:22;7577:36;7572:3;7565:49;7637:39;7669:6;7660;7654:13;7637:39;:::i;:::-;7627:49;-1:-1:-1;7734:12:1;;;;7699:15;;;;7538:1;7531:9;7502:254;;;-1:-1:-1;7773:6:1;;6985:800;-1:-1:-1;;;;;;;6985:800:1:o;9150:336::-;9352:2;9334:21;;;9391:2;9371:18;;;9364:30;-1:-1:-1;;;9425:2:1;9410:18;;9403:42;9477:2;9462:18;;9150:336::o;9491:350::-;9693:2;9675:21;;;9732:2;9712:18;;;9705:30;9771:28;9766:2;9751:18;;9744:56;9832:2;9817:18;;9491:350::o;9846:184::-;9916:6;9969:2;9957:9;9948:7;9944:23;9940:32;9937:52;;;9985:1;9982;9975:12;9937:52;-1:-1:-1;10008:16:1;;9846:184;-1:-1:-1;9846:184:1:o;10441:127::-;10502:10;10497:3;10493:20;10490:1;10483:31;10533:4;10530:1;10523:15;10557:4;10554:1;10547:15;10927:127;10988:10;10983:3;10979:20;10976:1;10969:31;11019:4;11016:1;11009:15;11043:4;11040:1;11033:15;11059:332;11261:2;11243:21;;;11300:1;11280:18;;;11273:29;-1:-1:-1;;;11333:2:1;11318:18;;11311:39;11382:2;11367:18;;11059:332::o;12031:237::-;12112:1;12105:5;12102:12;12092:143;;12157:10;12152:3;12148:20;12145:1;12138:31;12192:4;12189:1;12182:15;12220:4;12217:1;12210:15;12092:143;12244:18;;12031:237::o;12273:278::-;12446:2;12431:18;;12458:44;12435:9;12484:6;12458:44;:::i;:::-;12538:6;12533:2;12522:9;12518:18;12511:34;12273:278;;;;;:::o;12906:127::-;12967:10;12962:3;12958:20;12955:1;12948:31;12998:4;12995:1;12988:15;13022:4;13019:1;13012:15;13038:521;13115:4;13121:6;13181:11;13168:25;13275:2;13271:7;13260:8;13244:14;13240:29;13236:43;13216:18;13212:68;13202:96;;13294:1;13291;13284:12;13202:96;13321:33;;13373:20;;;-1:-1:-1;13416:18:1;13405:30;;13402:50;;;13448:1;13445;13438:12;13402:50;13481:4;13469:17;;-1:-1:-1;13512:14:1;13508:27;;;13498:38;;13495:58;;;13549:1;13546;13539:12;13564:271;13747:6;13739;13734:3;13721:33;13703:3;13773:16;;13798:13;;;13773:16;13564:271;-1:-1:-1;13564:271:1:o;13840:547::-;14043:2;14032:9;14025:21;14082:6;14077:2;14066:9;14062:18;14055:34;14139:6;14131;14126:2;14115:9;14111:18;14098:48;14195:1;14190:2;14181:6;14170:9;14166:22;14162:31;14155:42;14006:4;14256:2;14252:7;14247:2;14239:6;14235:15;14231:29;14220:9;14216:45;14323:2;14311:9;14307:2;14303:18;14299:27;14292:4;14281:9;14277:20;14270:57;14344:37;14377:2;14373;14369:11;14361:6;14344:37;:::i;:::-;14336:45;13840:547;-1:-1:-1;;;;;;13840:547:1:o;14392:127::-;14453:10;14448:3;14444:20;14441:1;14434:31;14484:4;14481:1;14474:15;14508:4;14505:1;14498:15;14524:135;14563:3;14584:17;;;14581:43;;14604:18;;:::i;:::-;-1:-1:-1;14651:1:1;14640:13;;14524:135::o;14957:326::-;15050:5;15073:1;15083:194;15097:4;15094:1;15091:11;15083:194;;;15156:13;;15144:26;;15193:4;15217:12;;;;15252:15;;;;15117:1;15110:9;15083:194;;15288:410;15537:25;;;15524:3;15509:19;;15571:52;15619:2;15604:18;;15596:6;15571:52;:::i;:::-;-1:-1:-1;;;;;15659:32:1;;;;15654:2;15639:18;;;;15632:60;15288:410;;-1:-1:-1;;15288:410:1:o;15703:1105::-;15798:6;15829:2;15872;15860:9;15851:7;15847:23;15843:32;15840:52;;;15888:1;15885;15878:12;15840:52;15921:9;15915:16;15950:18;15991:2;15983:6;15980:14;15977:34;;;16007:1;16004;15997:12;15977:34;16045:6;16034:9;16030:22;16020:32;;16090:7;16083:4;16079:2;16075:13;16071:27;16061:55;;16112:1;16109;16102:12;16061:55;16141:2;16135:9;16163:2;16159;16156:10;16153:36;;;16169:18;;:::i;:::-;16215:2;16212:1;16208:10;16247:2;16241:9;16310:2;16306:7;16301:2;16297;16293:11;16289:25;16281:6;16277:38;16365:6;16353:10;16350:22;16345:2;16333:10;16330:18;16327:46;16324:72;;;16376:18;;:::i;:::-;16412:2;16405:22;16462:18;;;16496:15;;;;-1:-1:-1;16538:11:1;;;16534:20;;;16566:19;;;16563:39;;;16598:1;16595;16588:12;16563:39;16622:11;;;;16642:135;16658:6;16653:3;16650:15;16642:135;;;16724:10;;16712:23;;16675:12;;;;16755;;;;16642:135;;;16796:6;15703:1105;-1:-1:-1;;;;;;;;15703:1105:1:o;17162:125::-;17202:4;17230:1;17227;17224:8;17221:34;;;17235:18;;:::i;:::-;-1:-1:-1;17272:9:1;;17162:125::o;17292:422::-;17381:1;17424:5;17381:1;17438:270;17459:7;17449:8;17446:21;17438:270;;;17518:4;17514:1;17510:6;17506:17;17500:4;17497:27;17494:53;;;17527:18;;:::i;:::-;17577:7;17567:8;17563:22;17560:55;;;17597:16;;;;17560:55;17676:22;;;;17636:15;;;;17438:270;;;17442:3;17292:422;;;;;:::o;17719:806::-;17768:5;17798:8;17788:80;;-1:-1:-1;17839:1:1;17853:5;;17788:80;17887:4;17877:76;;-1:-1:-1;17924:1:1;17938:5;;17877:76;17969:4;17987:1;17982:59;;;;18055:1;18050:130;;;;17962:218;;17982:59;18012:1;18003:10;;18026:5;;;18050:130;18087:3;18077:8;18074:17;18071:43;;;18094:18;;:::i;:::-;-1:-1:-1;;18150:1:1;18136:16;;18165:5;;17962:218;;18264:2;18254:8;18251:16;18245:3;18239:4;18236:13;18232:36;18226:2;18216:8;18213:16;18208:2;18202:4;18199:12;18195:35;18192:77;18189:159;;;-1:-1:-1;18301:19:1;;;18333:5;;18189:159;18380:34;18405:8;18399:4;18380:34;:::i;:::-;18450:6;18446:1;18442:6;18438:19;18429:7;18426:32;18423:58;;;18461:18;;:::i;:::-;18499:20;;17719:806;-1:-1:-1;;;17719:806:1:o;18530:131::-;18590:5;18619:36;18646:8;18640:4;18619:36;:::i;18666:168::-;18706:7;18772:1;18768;18764:6;18760:14;18757:1;18754:21;18749:1;18742:9;18735:17;18731:45;18728:71;;;18779:18;;:::i;:::-;-1:-1:-1;18819:9:1;;18666:168::o;18839:128::-;18879:3;18910:1;18906:6;18903:1;18900:13;18897:39;;;18916:18;;:::i;:::-;-1:-1:-1;18952:9:1;;18839:128::o;18972:217::-;19012:1;19038;19028:132;;19082:10;19077:3;19073:20;19070:1;19063:31;19117:4;19114:1;19107:15;19145:4;19142:1;19135:15;19028:132;-1:-1:-1;19174:9:1;;18972:217::o;19194:310::-;19404:2;19389:18;;19448:4;19440:6;19393:9;19416:37;19491:6;19484:4;19473:9;19469:20;19462:36;19194:310;;;;;:::o;20032:312::-;20240:2;20225:18;;20252:43;20229:9;20277:6;20252:43;:::i;:::-;20331:6;20326:2;20315:9;20311:18;20304:34;20032:312;;;;;:::o;20349:349::-;20550:2;20535:18;;20562:44;20539:9;20588:6;20562:44;:::i;:::-;20637:2;20622:18;;20615:34;;;;20680:2;20665:18;20658:34;20349:349;;-1:-1:-1;20349:349:1:o;21041:274::-;21170:3;21208:6;21202:13;21224:53;21270:6;21265:3;21258:4;21250:6;21246:17;21224:53;:::i;:::-;21293:16;;;;;21041:274;-1:-1:-1;;21041:274:1:o;21320:245::-;21387:6;21440:2;21428:9;21419:7;21415:23;21411:32;21408:52;;;21456:1;21453;21446:12;21408:52;21488:9;21482:16;21507:28;21529:5;21507:28;:::i;21570:395::-;-1:-1:-1;;;;;21767:32:1;;21749:51;;21843:14;;21836:22;21831:2;21816:18;;21809:50;21895:2;21890;21875:18;;21868:30;;;-1:-1:-1;;21915:44:1;;21940:18;;21932:6;21915:44;:::i;:::-;21907:52;21570:395;-1:-1:-1;;;;;21570:395:1:o;22415:273::-;22483:6;22536:2;22524:9;22515:7;22511:23;22507:32;22504:52;;;22552:1;22549;22542:12;22504:52;22584:9;22578:16;22634:4;22627:5;22623:16;22616:5;22613:27;22603:55;;22654:1;22651;22644:12
Swarm Source
ipfs://251a6c160b472c1629c1866b390108437c06adfc2e17b178cc5c8a998d60d67f
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.