Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 567 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Update Token Pri... | 19141712 | 326 days ago | IN | 0 ETH | 0.00074708 | ||||
Update Token Pri... | 19131789 | 328 days ago | IN | 0 ETH | 0.00048394 | ||||
Update Token Pri... | 19124961 | 329 days ago | IN | 0 ETH | 0.00049429 | ||||
Update Token Pri... | 19117694 | 330 days ago | IN | 0 ETH | 0.00098015 | ||||
Update Token Pri... | 19110391 | 331 days ago | IN | 0 ETH | 0.00024274 | ||||
Update Token Pri... | 19105408 | 331 days ago | IN | 0 ETH | 0.00038216 | ||||
Update Token Pri... | 19096129 | 333 days ago | IN | 0 ETH | 0.00032603 | ||||
Update Token Pri... | 19088796 | 334 days ago | IN | 0 ETH | 0.00053215 | ||||
Update Token Pri... | 19081706 | 335 days ago | IN | 0 ETH | 0.00029933 | ||||
Update Token Pri... | 19074888 | 336 days ago | IN | 0 ETH | 0.00022602 | ||||
Update Token Pri... | 19067580 | 337 days ago | IN | 0 ETH | 0.00026348 | ||||
Update Token Pri... | 19060634 | 338 days ago | IN | 0 ETH | 0.00029101 | ||||
Update Token Pri... | 19054873 | 339 days ago | IN | 0 ETH | 0.00030835 | ||||
Update Token Pri... | 19054828 | 339 days ago | IN | 0 ETH | 0.00027038 | ||||
Update Token Pri... | 19047390 | 340 days ago | IN | 0 ETH | 0.00046909 | ||||
Update Token Pri... | 19042523 | 340 days ago | IN | 0 ETH | 0.00098164 | ||||
Update Token Pri... | 19042421 | 340 days ago | IN | 0 ETH | 0.00107941 | ||||
Update Token Pri... | 19033309 | 342 days ago | IN | 0 ETH | 0.00088738 | ||||
Update Token Pri... | 19024685 | 343 days ago | IN | 0 ETH | 0.00089068 | ||||
Update Token Pri... | 19021174 | 343 days ago | IN | 0 ETH | 0.00142032 | ||||
Update Token Pri... | 19013081 | 344 days ago | IN | 0 ETH | 0.00091128 | ||||
Update Token Pri... | 19004776 | 346 days ago | IN | 0 ETH | 0.00111859 | ||||
Update Token Pri... | 18999797 | 346 days ago | IN | 0 ETH | 0.00072114 | ||||
Update Token Pri... | 18989454 | 348 days ago | IN | 0 ETH | 0.00054396 | ||||
Update Token Pri... | 18985653 | 348 days ago | IN | 0 ETH | 0.00071895 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AdminGamma
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-25 */ // File: contracts_ETH/main/libraries/Math.sol // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) pragma solidity ^0.8.4; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/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: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: contracts_ETH/main/libraries/SafeERC20.sol pragma solidity ^0.8.4; library SafeERC20 { function safeSymbol(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(0x95d89b41) ); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(0x06fdde03) ); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) public view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(0x313ce567) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(0xa9059cbb, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: Transfer failed" ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(0x23b872dd, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "SafeERC20: TransferFrom failed" ); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts_ETH/main/Token.sol pragma solidity ^0.8.4; /** * @author Formation.Fi. * @notice A common Implementation for tokens ALPHA, BETA and GAMMA. */ contract Token is ERC20, Ownable { struct Deposit{ uint256 amount; uint256 time; } address public proxyInvestement; address private proxyAdmin; mapping(address => Deposit[]) public depositPerAddress; mapping(address => bool) public whitelist; event SetProxyInvestement(address _address); constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) { } modifier onlyProxy() { require( (proxyInvestement != address(0)) && (proxyAdmin != address(0)), "Formation.Fi: zero address" ); require( (msg.sender == proxyInvestement) || (msg.sender == proxyAdmin), "Formation.Fi: not the proxy" ); _; } modifier onlyProxyInvestement() { require(proxyInvestement != address(0), "Formation.Fi: zero address" ); require(msg.sender == proxyInvestement, "Formation.Fi: not the proxy" ); _; } /** * @dev Update the proxyInvestement. * @param _proxyInvestement. * @notice Emits a {SetProxyInvestement} event with `_proxyInvestement`. */ function setProxyInvestement(address _proxyInvestement) external onlyOwner { require( _proxyInvestement!= address(0), "Formation.Fi: zero address" ); proxyInvestement = _proxyInvestement; emit SetProxyInvestement( _proxyInvestement); } /** * @dev Add a contract address to the whitelist * @param _contract The address of the contract. */ function addToWhitelist(address _contract) external onlyOwner { require( _contract!= address(0), "Formation.Fi: zero address" ); whitelist[_contract] = true; } /** * @dev Remove a contract address from the whitelist * @param _contract The address of the contract. */ function removeFromWhitelist(address _contract) external onlyOwner { require( whitelist[_contract] == true, "Formation.Fi: no whitelist" ); require( _contract!= address(0), "Formation.Fi: zero address" ); whitelist[_contract] = false; } /** * @dev Update the proxyAdmin. * @param _proxyAdmin. */ function setAdmin(address _proxyAdmin) external onlyOwner { require( _proxyAdmin!= address(0), "Formation.Fi: zero address" ); proxyAdmin = _proxyAdmin; } /** * @dev add user's deposit. * @param _account The user's address. * @param _amount The user's deposit amount. * @param _time The deposit time. */ function addDeposit(address _account, uint256 _amount, uint256 _time) external onlyProxyInvestement { require( _account!= address(0), "Formation.Fi: zero address" ); require( _amount!= 0, "Formation.Fi: zero amount" ); require( _time!= 0, "Formation.Fi: zero time" ); Deposit memory _deposit = Deposit(_amount, _time); depositPerAddress[_account].push(_deposit); } /** * @dev mint the token product for the user. * @notice To receive the token product, the user has to deposit * the required StableCoin in this product. * @param _account The user's address. * @param _amount The amount to be minted. */ function mint(address _account, uint256 _amount) external onlyProxy { require( _account!= address(0), "Formation.Fi: zero address" ); require( _amount!= 0, "Formation.Fi: zero amount" ); _mint(_account, _amount); } /** * @dev burn the token product of the user. * @notice When the user withdraws his Stablecoins, his tokens * product are burned. * @param _account The user's address. * @param _amount The amount to be burned. */ function burn(address _account, uint256 _amount) external onlyProxy { require( _account!= address(0), "Formation.Fi: zero address" ); require( _amount!= 0, "Formation.Fi: zero amount" ); _burn( _account, _amount); } /** * @dev Verify the lock up condition for a user's withdrawal request. * @param _account The user's address. * @param _amount The amount to be withdrawn. * @param _period The lock up period. * @return _success is true if the lock up condition is satisfied. */ function checklWithdrawalRequest(address _account, uint256 _amount, uint256 _period) external view returns (bool _success){ require( _account!= address(0), "Formation.Fi: zero address" ); require( _amount!= 0, "Formation.Fi: zero amount" ); Deposit[] memory _deposit = depositPerAddress[_account]; uint256 _amountTotal = 0; for (uint256 i = 0; i < _deposit.length; i++) { require ((block.timestamp - _deposit[i].time) >= _period, "Formation.Fi: position locked"); if (_amount<= (_amountTotal + _deposit[i].amount)){ break; } _amountTotal = _amountTotal + _deposit[i].amount; } _success= true; } /** * @dev update the user's token data. * @notice this function is called after each desposit request * validation by the manager. * @param _account The user's address. * @param _amount The deposit amount validated by the manager. */ function updateTokenData( address _account, uint256 _amount) external onlyProxyInvestement { _updateTokenData(_account, _amount); } function _updateTokenData( address _account, uint256 _amount) internal { require( _account!= address(0), "Formation.Fi: zero address" ); require( _amount!= 0, "Formation.Fi: zero amount" ); Deposit[] memory _deposit = depositPerAddress[_account]; uint256 _amountlocal = 0; uint256 _amountTotal = 0; uint256 _newAmount; uint256 k =0; for (uint256 i = 0; i < _deposit.length; i++) { _amountlocal = Math.min(_deposit[i].amount, _amount - _amountTotal); _amountTotal = _amountTotal + _amountlocal; _newAmount = _deposit[i].amount - _amountlocal; depositPerAddress[_account][k].amount = _newAmount; if (_newAmount == 0){ _deleteTokenData(_account, k); } else { k = k+1; } if (_amountTotal == _amount){ break; } } } /** * @dev delete the user's token data. * @notice This function is called when the user's withdrawal request is * validated by the manager. * @param _account The user's address. * @param _index The index of the user in 'amountDepositPerAddress'. */ function _deleteTokenData(address _account, uint256 _index) internal { require( _account!= address(0), "Formation.Fi: zero address" ); uint256 _size = depositPerAddress[_account].length - 1; require( _index <= _size, "Formation.Fi: index is out" ); for (uint256 i = _index; i< _size; i++){ depositPerAddress[ _account][i] = depositPerAddress[ _account][i+1]; } depositPerAddress[ _account].pop(); } /** * @dev update the token data of both the sender and the receiver when the product token is transferred. * @param from The sender's address. * @param to The receiver's address. * @param amount The transferred amount. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual override{ if ((to != address(0)) && (to != proxyInvestement) && (to != proxyAdmin) && (from != address(0)) && (!whitelist[to])){ _updateTokenData(from, amount); Deposit memory _deposit = Deposit(amount, block.timestamp); depositPerAddress[to].push(_deposit); } } } // File: contracts_ETH/main/Admin.sol pragma solidity ^0.8.4; /** * @author Formation.Fi. * @notice Implementation of the contract Admin. */ contract Admin is Ownable { using SafeERC20 for IERC20; uint256 public constant FACTOR_FEES_DECIMALS = 1e4; uint256 public constant FACTOR_PRICE_DECIMALS = 1e6; uint256 public constant SECONDES_PER_YEAR = 365 days; uint256 public slippageTolerance = 200; uint256 public amountScaleDecimals = 1; uint256 public depositFeeRate = 50; uint256 public depositFeeRateParity= 15; uint256 public managementFeeRate = 200; uint256 public performanceFeeRate = 2000; uint256 public performanceFees; uint256 public managementFees; uint256 public managementFeesTime; uint256 public tokenPrice = 1e6; uint256 public tokenPriceMean = 1e6; uint256 public minAmount= 100 * 1e18; uint256 public lockupPeriodUser = 604800; uint public netDepositInd; uint256 public netAmountEvent; address public manager; address public treasury; address public investement; address private safeHouse; bool public isCancel; Token public token; IERC20 public stableToken; constructor( address _manager, address _treasury, address _stableTokenAddress, address _tokenAddress) { require( _manager != address(0), "Formation.Fi: zero address" ); require( _treasury != address(0), "Formation.Fi: zero address" ); require( _stableTokenAddress != address(0), "Formation.Fi: zero address" ); require( _tokenAddress != address(0), "Formation.Fi: zero address" ); manager = _manager; treasury = _treasury; stableToken = IERC20(_stableTokenAddress); token = Token(_tokenAddress); uint8 _stableTokenDecimals = ERC20( _stableTokenAddress).decimals(); if ( _stableTokenDecimals == 6) { amountScaleDecimals= 1e12; } } modifier onlyInvestement() { require(investement != address(0), "Formation.Fi: zero address" ); require(msg.sender == investement, "Formation.Fi: not investement" ); _; } modifier onlyManager() { require(msg.sender == manager, "Formation.Fi: not manager"); _; } /** * @dev Setter functions to update the Portfolio Parameters. */ function setTreasury(address _treasury) external onlyOwner { require( _treasury != address(0), "Formation.Fi: zero address" ); treasury = _treasury; } function setManager(address _manager) external onlyOwner { require( _manager != address(0), "Formation.Fi: zero address" ); manager = _manager; } function setInvestement(address _investement) external onlyOwner { require( _investement!= address(0), "Formation.Fi: zero address" ); investement = _investement; } function setSafeHouse(address _safeHouse) external onlyOwner { require( _safeHouse!= address(0), "Formation.Fi: zero address" ); safeHouse = _safeHouse; } function setCancel(bool _cancel) external onlyManager { isCancel= _cancel; } function setLockupPeriodUser(uint256 _lockupPeriodUser) external onlyManager { lockupPeriodUser = _lockupPeriodUser; } function setDepositFeeRate(uint256 _rate) external onlyManager { depositFeeRate= _rate; } function setDepositFeeRateParity(uint256 _rate) external onlyManager { depositFeeRateParity= _rate; } function setManagementFeeRate(uint256 _rate) external onlyManager { managementFeeRate = _rate; } function setPerformanceFeeRate(uint256 _rate) external onlyManager { performanceFeeRate = _rate; } function setMinAmount(uint256 _minAmount) external onlyManager { minAmount= _minAmount; } function updateTokenPrice(uint256 _price) external onlyManager { require( _price > 0, "Formation.Fi: zero price" ); tokenPrice = _price; } function updateTokenPriceMean(uint256 _price) external onlyInvestement { require( _price > 0, "Formation.Fi: zero price" ); tokenPriceMean = _price; } function updateManagementFeeTime(uint256 _time) external onlyInvestement { managementFeesTime = _time; } /** * @dev Calculate performance Fees. */ function calculatePerformanceFees() external onlyManager { require(performanceFees == 0, "Formation.Fi: fees on pending"); uint256 _deltaPrice = 0; if (tokenPrice > tokenPriceMean) { _deltaPrice = tokenPrice - tokenPriceMean; tokenPriceMean = tokenPrice; performanceFees = (token.totalSupply() * _deltaPrice * performanceFeeRate) / (tokenPrice * FACTOR_FEES_DECIMALS); } } /** * @dev Calculate management Fees. */ function calculateManagementFees() external onlyManager { require(managementFees == 0, "Formation.Fi: fees on pending"); if (managementFeesTime!= 0){ uint256 _deltaTime; _deltaTime = block.timestamp - managementFeesTime; managementFees = (token.totalSupply() * managementFeeRate * _deltaTime ) /(FACTOR_FEES_DECIMALS * SECONDES_PER_YEAR); managementFeesTime = block.timestamp; } } /** * @dev Mint Fees. */ function mintFees() external onlyManager { require ((performanceFees + managementFees) > 0, "Formation.Fi: zero fees"); token.mint(treasury, performanceFees + managementFees); performanceFees = 0; managementFees = 0; } /** * @dev Calculate net deposit indicator * @param _depositAmountTotal the total requested deposit amount by users. * @param _withdrawalAmountTotal the total requested withdrawal amount by users. * @param _maxDepositAmount the maximum accepted deposit amount by event. * @param _maxWithdrawalAmount the maximum accepted withdrawal amount by event. * @return net Deposit indicator: 1 if net deposit case, 0 otherwise (net withdrawal case). */ function calculateNetDepositInd(uint256 _depositAmountTotal, uint256 _withdrawalAmountTotal, uint256 _maxDepositAmount, uint256 _maxWithdrawalAmount) external onlyInvestement returns( uint256) { _depositAmountTotal = Math.min( _depositAmountTotal, _maxDepositAmount); _withdrawalAmountTotal = (_withdrawalAmountTotal * tokenPrice) / FACTOR_PRICE_DECIMALS; _withdrawalAmountTotal= Math.min(_withdrawalAmountTotal, _maxWithdrawalAmount); uint256 _depositAmountTotalAfterFees = _depositAmountTotal - ( _depositAmountTotal * depositFeeRate)/ FACTOR_FEES_DECIMALS; if ( _depositAmountTotalAfterFees >= _withdrawalAmountTotal) { netDepositInd = 1 ; } else { netDepositInd = 0; } return netDepositInd; } /** * @dev Calculate net amount * @param _depositAmountTotal the total requested deposit amount by users. * @param _withdrawalAmountTotal the total requested withdrawal amount by users. * @param _maxDepositAmount the maximum accepted deposit amount by event. * @param _maxWithdrawalAmount the maximum accepted withdrawal amount by event. * @return net amount. */ function calculateNetAmountEvent(uint256 _depositAmountTotal, uint256 _withdrawalAmountTotal, uint256 _maxDepositAmount, uint256 _maxWithdrawalAmount) external onlyInvestement returns(uint256) { _depositAmountTotal = Math.min( _depositAmountTotal, _maxDepositAmount); _withdrawalAmountTotal = (_withdrawalAmountTotal * tokenPrice) / FACTOR_PRICE_DECIMALS; _withdrawalAmountTotal= Math.min(_withdrawalAmountTotal, _maxWithdrawalAmount); uint256 _depositAmountTotalAfterFees = _depositAmountTotal - ( _depositAmountTotal * depositFeeRate)/ FACTOR_FEES_DECIMALS; if (netDepositInd == 1) { netAmountEvent = _depositAmountTotalAfterFees - _withdrawalAmountTotal; } else { netAmountEvent = _withdrawalAmountTotal - _depositAmountTotalAfterFees; } return netAmountEvent; } /** * @dev Protect against slippage due to assets sale. * @param _withdrawalAmount the value of sold assets in Stablecoin. * _withdrawalAmount has to be sent to the contract. * treasury has to approve the contract for both Stablecoin and token. * @return Missed amount to send to the contract due to slippage. */ function protectAgainstSlippage(uint256 _withdrawalAmount) external onlyManager returns (uint256) { require(_withdrawalAmount != 0, "Formation.Fi: zero amount"); require(netDepositInd == 0, "Formation.Fi: no slippage"); uint256 _amount = 0; uint256 _deltaAmount =0; uint256 _slippage = 0; uint256 _tokenAmount = 0; uint256 _balanceTokenTreasury = token.balanceOf(treasury); uint256 _balanceStableTreasury = stableToken.balanceOf(treasury) * amountScaleDecimals; if (_withdrawalAmount< netAmountEvent){ _amount = netAmountEvent - _withdrawalAmount; _slippage = (_amount * FACTOR_FEES_DECIMALS ) / netAmountEvent; if (_slippage >= slippageTolerance) { return netAmountEvent; } else { _deltaAmount = Math.min( _amount, _balanceStableTreasury); if ( _deltaAmount > 0){ stableToken.safeTransferFrom(treasury, investement, _deltaAmount/amountScaleDecimals); _tokenAmount = (_deltaAmount * FACTOR_PRICE_DECIMALS)/tokenPrice; token.mint(treasury, _tokenAmount); return _amount - _deltaAmount; } else { return _amount; } } } else { _amount = _withdrawalAmount - netAmountEvent; _tokenAmount = (_amount * FACTOR_PRICE_DECIMALS)/tokenPrice; _tokenAmount = Math.min(_tokenAmount, _balanceTokenTreasury); if (_tokenAmount >0) { _deltaAmount = (_tokenAmount * tokenPrice)/FACTOR_PRICE_DECIMALS; stableToken.safeTransfer(treasury, _deltaAmount/amountScaleDecimals); token.burn( treasury, _tokenAmount); } if ((_amount - _deltaAmount) > 0) { stableToken.safeTransfer(safeHouse, (_amount - _deltaAmount)/amountScaleDecimals); } } return 0; } /** * @dev Send Stablecoin from the manager to the contract. * @param _amount tha amount to send. */ function sendStableTocontract(uint256 _amount) external onlyManager { require( _amount > 0, "Formation.Fi: zero amount"); stableToken.safeTransferFrom(msg.sender, address(this), _amount/amountScaleDecimals); } /** * @dev Send Stablecoin from the contract to the contract Investement. */ function sendStableFromcontract() external onlyManager { require(investement != address(0), "Formation.Fi: zero address" ); stableToken.safeTransfer(investement, stableToken.balanceOf(address(this))); } } // File: contracts_ETH/Gamma/AdminGamma.sol pragma solidity ^0.8.4; /** * @author Formation.Fi. * @notice Implementation of the contract AdminGamma. */ contract AdminGamma is Admin { constructor(address _manager, address _treasury, address _stableToken, address _token) Admin( _manager, _treasury, _stableToken, _token){ } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_stableToken","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FACTOR_FEES_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTOR_PRICE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDES_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountScaleDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateManagementFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositAmountTotal","type":"uint256"},{"internalType":"uint256","name":"_withdrawalAmountTotal","type":"uint256"},{"internalType":"uint256","name":"_maxDepositAmount","type":"uint256"},{"internalType":"uint256","name":"_maxWithdrawalAmount","type":"uint256"}],"name":"calculateNetAmountEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositAmountTotal","type":"uint256"},{"internalType":"uint256","name":"_withdrawalAmountTotal","type":"uint256"},{"internalType":"uint256","name":"_maxDepositAmount","type":"uint256"},{"internalType":"uint256","name":"_maxWithdrawalAmount","type":"uint256"}],"name":"calculateNetDepositInd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calculatePerformanceFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFeeRateParity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investement","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupPeriodUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFeesTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"netAmountEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"netDepositInd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalAmount","type":"uint256"}],"name":"protectAgainstSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendStableFromcontract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendStableTocontract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_cancel","type":"bool"}],"name":"setCancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setDepositFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setDepositFeeRateParity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investement","type":"address"}],"name":"setInvestement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockupPeriodUser","type":"uint256"}],"name":"setLockupPeriodUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setManagementFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmount","type":"uint256"}],"name":"setMinAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setPerformanceFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_safeHouse","type":"address"}],"name":"setSafeHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageTolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceMean","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"updateManagementFeeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateTokenPriceMean","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260c860015560016002556032600355600f60045560c86005556107d0600655620f4240600a55620f4240600b5568056bc75e2d63100000600c5562093a80600d553480156200005257600080fd5b50604051620040ef380380620040ef833981810160405281019062000078919062000515565b838383836200009c620000906200041b60201b60201c565b6200042360201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200010f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010690620005fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000179906200061d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001ec906200061d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000268576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025f906200061d565b60405180910390fd5b83601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003b557600080fd5b505afa158015620003ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f0919062000581565b905060068160ff1614156200040c5764e8d4a510006002819055505b50505050505050505062000717565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620004f881620006e3565b92915050565b6000815190506200050f81620006fd565b92915050565b600080600080608085870312156200052c57600080fd5b60006200053c87828801620004e7565b94505060206200054f87828801620004e7565b93505060406200056287828801620004e7565b92505060606200057587828801620004e7565b91505092959194509250565b6000602082840312156200059457600080fd5b6000620005a484828501620004fe565b91505092915050565b6000620005bc601a836200063f565b9150620005c98262000691565b602082019050919050565b6000620005e3601b836200063f565b9150620005f082620006ba565b602082019050919050565b600060208201905081810360008301526200061681620005ad565b9050919050565b600060208201905081810360008301526200063881620005d4565b9050919050565b600082825260208201905092915050565b60006200065d8262000664565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060ff82169050919050565b7f466f726d6174696f6e2e46693a207a65726f2061646472657373000000000000600082015250565b7f466f726d6174696f6e2e46693a20207a65726f20616464726573730000000000600082015250565b620006ee8162000650565b8114620006fa57600080fd5b50565b620007088162000684565b81146200071457600080fd5b50565b6139c880620007276000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80637ff9b59611610182578063d03153aa116100e9578063f0f44260116100a2578063f9892d141161007c578063f9892d14146107bc578063fa2daa2e146107da578063fbeb2ff3146107f6578063fc0c546a14610812576102bb565b8063f0f4426014610766578063f1a503ef14610782578063f2fde38b146107a0576102bb565b8063d03153aa146106ca578063d0ebdbe7146106e8578063d99ab10e14610704578063e0a83dd314610722578063e542a13414610752578063ef9520331461075c576102bb565b80638e691b9a1161013b5780638e691b9a1461061a57806391a543b6146106365780639b2cb5d814610654578063a0aed99a14610672578063a9d75b2b14610690578063cf04327a146106ae576102bb565b80637ff9b5961461057c578063852cb9b81461059a578063858d8a9f146105b8578063897b0637146105d65780638da5cb5b146105f25780638de2d00414610610576102bb565b8063406db022116102265780636395a3ea116101df5780636395a3ea146104e0578063676c0d77146104fe5780636b5ce3ee1461051a578063715018a61461053857806373c45d031461054257806375ce8b7e14610560576102bb565b8063406db0221461043257806347d708e51461044e578063481c6a751461046a57806348d973af146104885780635cdfd08c146104a457806361d027b3146104c2576102bb565b80631befd829116102785780631befd8291461036e5780631cb364421461038c57806326682cc4146103aa5780632d4bbdef146103da5780633df10ef2146103f85780633e95e09114610414576102bb565b80630e857401146102c05780630ffbfda4146102f0578063127f3b611461030e57806313602d8e1461032a578063151d710a146103345780631930840f14610352575b600080fd5b6102da60048036038101906102d59190612f1f565b610830565b6040516102e7919061349a565b60405180910390f35b6102f8610f36565b604051610305919061349a565b60405180910390f35b61032860048036038101906103239190612f1f565b610f3c565b005b610332610fd6565b005b61033c6111ac565b604051610349919061349a565b60405180910390f35b61036c60048036038101906103679190612f1f565b6111b3565b005b610376611322565b604051610383919061349a565b60405180910390f35b610394611328565b6040516103a191906132a9565b60405180910390f35b6103c460048036038101906103bf9190612f71565b61133b565b6040516103d1919061349a565b60405180910390f35b6103e2611501565b6040516103ef919061349a565b60405180910390f35b610412600480360381019061040d9190612ecd565b611507565b005b61041c6115b4565b604051610429919061322e565b60405180910390f35b61044c60048036038101906104479190612f1f565b6115da565b005b61046860048036038101906104639190612f1f565b611674565b005b6104726117a6565b60405161047f919061322e565b60405180910390f35b6104a2600480360381019061049d9190612ea4565b6117cc565b005b6104ac6118fc565b6040516104b9919061349a565b60405180910390f35b6104ca611902565b6040516104d7919061322e565b60405180910390f35b6104e8611928565b6040516104f5919061349a565b60405180910390f35b61051860048036038101906105139190612f1f565b61192e565b005b610522611a0b565b60405161052f919061349a565b60405180910390f35b610540611a11565b005b61054a611a99565b604051610557919061349a565b60405180910390f35b61057a60048036038101906105759190612ea4565b611a9f565b005b610584611bcf565b604051610591919061349a565b60405180910390f35b6105a2611bd5565b6040516105af919061349a565b60405180910390f35b6105c0611bdb565b6040516105cd919061349a565b60405180910390f35b6105f060048036038101906105eb9190612f1f565b611be1565b005b6105fa611c7b565b604051610607919061322e565b60405180910390f35b610618611ca4565b005b610634600480360381019061062f9190612f1f565b611e7e565b005b61063e611f18565b60405161064b919061349a565b60405180910390f35b61065c611f1e565b604051610669919061349a565b60405180910390f35b61067a611f24565b604051610687919061349a565b60405180910390f35b610698611f2a565b6040516106a591906132c4565b60405180910390f35b6106c860048036038101906106c39190612f1f565b611f50565b005b6106d2611fea565b6040516106df919061349a565b60405180910390f35b61070260048036038101906106fd9190612ea4565b611ff0565b005b61070c612120565b604051610719919061349a565b60405180910390f35b61073c60048036038101906107379190612f71565b612128565b604051610749919061349a565b60405180910390f35b61075a6122d6565b005b61076461248a565b005b610780600480360381019061077b9190612ea4565b6126c7565b005b61078a6127f7565b604051610797919061349a565b60405180910390f35b6107ba60048036038101906107b59190612ea4565b6127fd565b005b6107c46128f5565b6040516107d1919061349a565b60405180910390f35b6107f460048036038101906107ef9190612f1f565b6128fb565b005b610810600480360381019061080b9190612f1f565b612a27565b005b61081a612ac1565b60405161082791906132df565b60405180910390f35b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906133da565b60405180910390fd5b6000821415610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd9061347a565b60405180910390fd5b6000600e541461094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906133ba565b60405180910390fd5b6000806000806000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109d0919061322e565b60206040518083038186803b1580156109e857600080fd5b505afa1580156109fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a209190612f48565b90506000600254601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610aa4919061322e565b60206040518083038186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190612f48565b610afe9190613563565b9050600f54881015610cfb5787600f54610b1891906135bd565b9550600f5461271087610b2b9190613563565b610b359190613532565b93506001548410610b5057600f549650505050505050610f31565b610b5a8682612ae7565b94506000851115610ced57610c05601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660025488610bbc9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b00909392919063ffffffff16565b600a54620f424086610c179190613563565b610c219190613532565b9250601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610ca2929190613280565b600060405180830381600087803b158015610cbc57600080fd5b505af1158015610cd0573d6000803e3d6000fd5b505050508486610ce091906135bd565b9650505050505050610f31565b859650505050505050610f31565b600f5488610d0991906135bd565b9550600a54620f424087610d1d9190613563565b610d279190613532565b9250610d338383612ae7565b92506000831115610e8a57620f4240600a5484610d509190613563565b610d5a9190613532565b9450610dd8601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660025487610d909190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610e57929190613280565b600060405180830381600087803b158015610e7157600080fd5b505af1158015610e85573d6000803e3d6000fd5b505050505b60008587610e9891906135bd565b1115610f2657610f25601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002548789610ed391906135bd565b610edd9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b5b600096505050505050505b919050565b60065481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906133da565b60405180910390fd5b8060068190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d906133da565b60405180910390fd5b6000600854146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a29061339a565b60405180910390fd5b6000600954146111aa576000600954426110c591906135bd565b90506301e133806127106110d99190613563565b81600554601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612f48565b6111879190613563565b6111919190613563565b61119b9190613532565b60088190555042600981905550505b565b620f424081565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c9061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc9061335a565b60405180910390fd5b60008111611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f9061343a565b60405180910390fd5b80600b8190555050565b60095481565b601360149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c59061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114559061335a565b60405180910390fd5b6114688584612ae7565b9450620f4240600a548561147c9190613563565b6114869190613532565b93506114928483612ae7565b93506000612710600354876114a79190613563565b6114b19190613532565b866114bc91906135bd565b90506001600e5414156114e05784816114d591906135bd565b600f819055506114f3565b80856114ec91906135bd565b600f819055505b600f54915050949350505050565b600f5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e906133da565b60405180910390fd5b80601360146101000a81548160ff02191690831515021790555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906133da565b60405180910390fd5b80600d8190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906133da565b60405180910390fd5b60008111611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e9061347a565b60405180910390fd5b6117a333306002548461175a9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b00909392919063ffffffff16565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117d4612d6f565b73ffffffffffffffffffffffffffffffffffffffff166117f2611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af9061331a565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b5906133da565b60405180910390fd5b60008111611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061343a565b60405180910390fd5b80600a8190555050565b60045481565b611a19612d6f565b73ffffffffffffffffffffffffffffffffffffffff16611a37611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a84906133fa565b60405180910390fd5b611a976000612d77565b565b61271081565b611aa7612d6f565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b12906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b829061331a565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60035481565b60025481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906133da565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b906133da565b60405180910390fd5b600060075414611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d709061339a565b60405180910390fd5b6000600b54600a541115611e7b57600b54600a54611d9791906135bd565b9050600a54600b81905550612710600a54611db29190613563565b60065482601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612f48565b611e609190613563565b611e6a9190613563565b611e749190613532565b6007819055505b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f05906133da565b60405180910390fd5b8060038190555050565b60055481565b600c5481565b60075481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd7906133da565b60405180910390fd5b8060058190555050565b60015481565b611ff8612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612016611c7b565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d39061331a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6301e1338081565b60008073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b29061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461224b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122429061335a565b60405180910390fd5b6122558584612ae7565b9450620f4240600a54856122699190613563565b6122739190613532565b935061227f8483612ae7565b93506000612710600354876122949190613563565b61229e9190613532565b866122a991906135bd565b90508481106122bf576001600e819055506122c8565b6000600e819055505b600e54915050949350505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d906133da565b60405180910390fd5b600060085460075461237891906134dc565b116123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906132fa565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660085460075461242991906134dc565b6040518363ffffffff1660e01b8152600401612446929190613280565b600060405180830381600087803b15801561246057600080fd5b505af1158015612474573d6000803e3d6000fd5b5050505060006007819055506000600881905550565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612511906133da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a39061331a565b60405180910390fd5b6126c5601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161262d919061322e565b60206040518083038186803b15801561264557600080fd5b505afa158015612659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267d9190612f48565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b565b6126cf612d6f565b73ffffffffffffffffffffffffffffffffffffffff166126ed611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9061331a565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b612805612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612823611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614612879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612870906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e09061333a565b60405180910390fd5b6128f281612d77565b50565b600b5481565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129849061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a149061335a565b60405180910390fd5b8060098190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae906133da565b60405180910390fd5b8060048190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000818310612af65781612af8565b825b905092915050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612b3493929190613249565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612b829190613217565b6000604051808303816000865af19150503d8060008114612bbf576040519150601f19603f3d011682016040523d82523d6000602084013e612bc4565b606091505b5091509150818015612bf25750600081511480612bf1575080806020019051810190612bf09190612ef6565b5b5b612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c289061337a565b60405180910390fd5b505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612c6b929190613280565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612cb99190613217565b6000604051808303816000865af19150503d8060008114612cf6576040519150601f19603f3d011682016040523d82523d6000602084013e612cfb565b606091505b5091509150818015612d295750600081511480612d28575080806020019051810190612d279190612ef6565b5b5b612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f9061341a565b60405180910390fd5b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081359050612e4a8161394d565b92915050565b600081359050612e5f81613964565b92915050565b600081519050612e7481613964565b92915050565b600081359050612e898161397b565b92915050565b600081519050612e9e8161397b565b92915050565b600060208284031215612eb657600080fd5b6000612ec484828501612e3b565b91505092915050565b600060208284031215612edf57600080fd5b6000612eed84828501612e50565b91505092915050565b600060208284031215612f0857600080fd5b6000612f1684828501612e65565b91505092915050565b600060208284031215612f3157600080fd5b6000612f3f84828501612e7a565b91505092915050565b600060208284031215612f5a57600080fd5b6000612f6884828501612e8f565b91505092915050565b60008060008060808587031215612f8757600080fd5b6000612f9587828801612e7a565b9450506020612fa687828801612e7a565b9350506040612fb787828801612e7a565b9250506060612fc887828801612e7a565b91505092959194509250565b612fdd816135f1565b82525050565b612fec81613603565b82525050565b6000612ffd826134b5565b61300781856134c0565b9350613017818560208601613681565b80840191505092915050565b61302c81613639565b82525050565b61303b8161365d565b82525050565b600061304e6017836134cb565b915061305982613712565b602082019050919050565b6000613071601a836134cb565b915061307c8261373b565b602082019050919050565b60006130946026836134cb565b915061309f82613764565b604082019050919050565b60006130b7601e836134cb565b91506130c2826137b3565b602082019050919050565b60006130da601e836134cb565b91506130e5826137dc565b602082019050919050565b60006130fd601d836134cb565b915061310882613805565b602082019050919050565b60006131206019836134cb565b915061312b8261382e565b602082019050919050565b60006131436019836134cb565b915061314e82613857565b602082019050919050565b60006131666020836134cb565b915061317182613880565b602082019050919050565b6000613189601a836134cb565b9150613194826138a9565b602082019050919050565b60006131ac6018836134cb565b91506131b7826138d2565b602082019050919050565b60006131cf601b836134cb565b91506131da826138fb565b602082019050919050565b60006131f26019836134cb565b91506131fd82613924565b602082019050919050565b6132118161362f565b82525050565b60006132238284612ff2565b915081905092915050565b60006020820190506132436000830184612fd4565b92915050565b600060608201905061325e6000830186612fd4565b61326b6020830185612fd4565b6132786040830184613208565b949350505050565b60006040820190506132956000830185612fd4565b6132a26020830184613208565b9392505050565b60006020820190506132be6000830184612fe3565b92915050565b60006020820190506132d96000830184613023565b92915050565b60006020820190506132f46000830184613032565b92915050565b6000602082019050818103600083015261331381613041565b9050919050565b6000602082019050818103600083015261333381613064565b9050919050565b6000602082019050818103600083015261335381613087565b9050919050565b60006020820190508181036000830152613373816130aa565b9050919050565b60006020820190508181036000830152613393816130cd565b9050919050565b600060208201905081810360008301526133b3816130f0565b9050919050565b600060208201905081810360008301526133d381613113565b9050919050565b600060208201905081810360008301526133f381613136565b9050919050565b6000602082019050818103600083015261341381613159565b9050919050565b600060208201905081810360008301526134338161317c565b9050919050565b600060208201905081810360008301526134538161319f565b9050919050565b60006020820190508181036000830152613473816131c2565b9050919050565b60006020820190508181036000830152613493816131e5565b9050919050565b60006020820190506134af6000830184613208565b92915050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006134e78261362f565b91506134f28361362f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613527576135266136b4565b5b828201905092915050565b600061353d8261362f565b91506135488361362f565b925082613558576135576136e3565b5b828204905092915050565b600061356e8261362f565b91506135798361362f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135b2576135b16136b4565b5b828202905092915050565b60006135c88261362f565b91506135d38361362f565b9250828210156135e6576135e56136b4565b5b828203905092915050565b60006135fc8261360f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006136448261364b565b9050919050565b60006136568261360f565b9050919050565b60006136688261366f565b9050919050565b600061367a8261360f565b9050919050565b60005b8381101561369f578082015181840152602081019050613684565b838111156136ae576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f466f726d6174696f6e2e46693a207a65726f2066656573000000000000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f2061646472657373000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466f726d6174696f6e2e46693a20206e6f7420696e76657374656d656e740000600082015250565b7f5361666545524332303a205472616e7366657246726f6d206661696c65640000600082015250565b7f466f726d6174696f6e2e46693a2066656573206f6e2070656e64696e67000000600082015250565b7f466f726d6174696f6e2e46693a206e6f20736c69707061676500000000000000600082015250565b7f466f726d6174696f6e2e46693a206e6f74206d616e6167657200000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5361666545524332303a205472616e73666572206661696c6564000000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f2070726963650000000000000000600082015250565b7f466f726d6174696f6e2e46693a20207a65726f20616464726573730000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f20616d6f756e7400000000000000600082015250565b613956816135f1565b811461396157600080fd5b50565b61396d81613603565b811461397857600080fd5b50565b6139848161362f565b811461398f57600080fd5b5056fea264697066735822122055a93757067a788a0f5defb5b0a620484a6e18a916a2601c5c53b0551fa98ce964736f6c63430008040033000000000000000000000000106356b682aec76b528f1e7958bf635aae995694000000000000000000000000fd77a8d6850fa961b56d848a1d7abc8cf82f02ac000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000095c0b40c060ae86d436bafae58679af1b06c7dad
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80637ff9b59611610182578063d03153aa116100e9578063f0f44260116100a2578063f9892d141161007c578063f9892d14146107bc578063fa2daa2e146107da578063fbeb2ff3146107f6578063fc0c546a14610812576102bb565b8063f0f4426014610766578063f1a503ef14610782578063f2fde38b146107a0576102bb565b8063d03153aa146106ca578063d0ebdbe7146106e8578063d99ab10e14610704578063e0a83dd314610722578063e542a13414610752578063ef9520331461075c576102bb565b80638e691b9a1161013b5780638e691b9a1461061a57806391a543b6146106365780639b2cb5d814610654578063a0aed99a14610672578063a9d75b2b14610690578063cf04327a146106ae576102bb565b80637ff9b5961461057c578063852cb9b81461059a578063858d8a9f146105b8578063897b0637146105d65780638da5cb5b146105f25780638de2d00414610610576102bb565b8063406db022116102265780636395a3ea116101df5780636395a3ea146104e0578063676c0d77146104fe5780636b5ce3ee1461051a578063715018a61461053857806373c45d031461054257806375ce8b7e14610560576102bb565b8063406db0221461043257806347d708e51461044e578063481c6a751461046a57806348d973af146104885780635cdfd08c146104a457806361d027b3146104c2576102bb565b80631befd829116102785780631befd8291461036e5780631cb364421461038c57806326682cc4146103aa5780632d4bbdef146103da5780633df10ef2146103f85780633e95e09114610414576102bb565b80630e857401146102c05780630ffbfda4146102f0578063127f3b611461030e57806313602d8e1461032a578063151d710a146103345780631930840f14610352575b600080fd5b6102da60048036038101906102d59190612f1f565b610830565b6040516102e7919061349a565b60405180910390f35b6102f8610f36565b604051610305919061349a565b60405180910390f35b61032860048036038101906103239190612f1f565b610f3c565b005b610332610fd6565b005b61033c6111ac565b604051610349919061349a565b60405180910390f35b61036c60048036038101906103679190612f1f565b6111b3565b005b610376611322565b604051610383919061349a565b60405180910390f35b610394611328565b6040516103a191906132a9565b60405180910390f35b6103c460048036038101906103bf9190612f71565b61133b565b6040516103d1919061349a565b60405180910390f35b6103e2611501565b6040516103ef919061349a565b60405180910390f35b610412600480360381019061040d9190612ecd565b611507565b005b61041c6115b4565b604051610429919061322e565b60405180910390f35b61044c60048036038101906104479190612f1f565b6115da565b005b61046860048036038101906104639190612f1f565b611674565b005b6104726117a6565b60405161047f919061322e565b60405180910390f35b6104a2600480360381019061049d9190612ea4565b6117cc565b005b6104ac6118fc565b6040516104b9919061349a565b60405180910390f35b6104ca611902565b6040516104d7919061322e565b60405180910390f35b6104e8611928565b6040516104f5919061349a565b60405180910390f35b61051860048036038101906105139190612f1f565b61192e565b005b610522611a0b565b60405161052f919061349a565b60405180910390f35b610540611a11565b005b61054a611a99565b604051610557919061349a565b60405180910390f35b61057a60048036038101906105759190612ea4565b611a9f565b005b610584611bcf565b604051610591919061349a565b60405180910390f35b6105a2611bd5565b6040516105af919061349a565b60405180910390f35b6105c0611bdb565b6040516105cd919061349a565b60405180910390f35b6105f060048036038101906105eb9190612f1f565b611be1565b005b6105fa611c7b565b604051610607919061322e565b60405180910390f35b610618611ca4565b005b610634600480360381019061062f9190612f1f565b611e7e565b005b61063e611f18565b60405161064b919061349a565b60405180910390f35b61065c611f1e565b604051610669919061349a565b60405180910390f35b61067a611f24565b604051610687919061349a565b60405180910390f35b610698611f2a565b6040516106a591906132c4565b60405180910390f35b6106c860048036038101906106c39190612f1f565b611f50565b005b6106d2611fea565b6040516106df919061349a565b60405180910390f35b61070260048036038101906106fd9190612ea4565b611ff0565b005b61070c612120565b604051610719919061349a565b60405180910390f35b61073c60048036038101906107379190612f71565b612128565b604051610749919061349a565b60405180910390f35b61075a6122d6565b005b61076461248a565b005b610780600480360381019061077b9190612ea4565b6126c7565b005b61078a6127f7565b604051610797919061349a565b60405180910390f35b6107ba60048036038101906107b59190612ea4565b6127fd565b005b6107c46128f5565b6040516107d1919061349a565b60405180910390f35b6107f460048036038101906107ef9190612f1f565b6128fb565b005b610810600480360381019061080b9190612f1f565b612a27565b005b61081a612ac1565b60405161082791906132df565b60405180910390f35b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906133da565b60405180910390fd5b6000821415610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd9061347a565b60405180910390fd5b6000600e541461094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906133ba565b60405180910390fd5b6000806000806000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109d0919061322e565b60206040518083038186803b1580156109e857600080fd5b505afa1580156109fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a209190612f48565b90506000600254601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610aa4919061322e565b60206040518083038186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190612f48565b610afe9190613563565b9050600f54881015610cfb5787600f54610b1891906135bd565b9550600f5461271087610b2b9190613563565b610b359190613532565b93506001548410610b5057600f549650505050505050610f31565b610b5a8682612ae7565b94506000851115610ced57610c05601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660025488610bbc9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b00909392919063ffffffff16565b600a54620f424086610c179190613563565b610c219190613532565b9250601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610ca2929190613280565b600060405180830381600087803b158015610cbc57600080fd5b505af1158015610cd0573d6000803e3d6000fd5b505050508486610ce091906135bd565b9650505050505050610f31565b859650505050505050610f31565b600f5488610d0991906135bd565b9550600a54620f424087610d1d9190613563565b610d279190613532565b9250610d338383612ae7565b92506000831115610e8a57620f4240600a5484610d509190613563565b610d5a9190613532565b9450610dd8601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660025487610d909190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610e57929190613280565b600060405180830381600087803b158015610e7157600080fd5b505af1158015610e85573d6000803e3d6000fd5b505050505b60008587610e9891906135bd565b1115610f2657610f25601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002548789610ed391906135bd565b610edd9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b5b600096505050505050505b919050565b60065481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc3906133da565b60405180910390fd5b8060068190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d906133da565b60405180910390fd5b6000600854146110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a29061339a565b60405180910390fd5b6000600954146111aa576000600954426110c591906135bd565b90506301e133806127106110d99190613563565b81600554601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612f48565b6111879190613563565b6111919190613563565b61119b9190613532565b60088190555042600981905550505b565b620f424081565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c9061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc9061335a565b60405180910390fd5b60008111611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f9061343a565b60405180910390fd5b80600b8190555050565b60095481565b601360149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c59061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114559061335a565b60405180910390fd5b6114688584612ae7565b9450620f4240600a548561147c9190613563565b6114869190613532565b93506114928483612ae7565b93506000612710600354876114a79190613563565b6114b19190613532565b866114bc91906135bd565b90506001600e5414156114e05784816114d591906135bd565b600f819055506114f3565b80856114ec91906135bd565b600f819055505b600f54915050949350505050565b600f5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e906133da565b60405180910390fd5b80601360146101000a81548160ff02191690831515021790555050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906133da565b60405180910390fd5b80600d8190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb906133da565b60405180910390fd5b60008111611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e9061347a565b60405180910390fd5b6117a333306002548461175a9190613532565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b00909392919063ffffffff16565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117d4612d6f565b73ffffffffffffffffffffffffffffffffffffffff166117f2611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af9061331a565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b5906133da565b60405180910390fd5b60008111611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061343a565b60405180910390fd5b80600a8190555050565b60045481565b611a19612d6f565b73ffffffffffffffffffffffffffffffffffffffff16611a37611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a84906133fa565b60405180910390fd5b611a976000612d77565b565b61271081565b611aa7612d6f565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b12906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b829061331a565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60035481565b60025481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906133da565b60405180910390fd5b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b906133da565b60405180910390fd5b600060075414611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d709061339a565b60405180910390fd5b6000600b54600a541115611e7b57600b54600a54611d9791906135bd565b9050600a54600b81905550612710600a54611db29190613563565b60065482601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612f48565b611e609190613563565b611e6a9190613563565b611e749190613532565b6007819055505b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f05906133da565b60405180910390fd5b8060038190555050565b60055481565b600c5481565b60075481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd7906133da565b60405180910390fd5b8060058190555050565b60015481565b611ff8612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612016611c7b565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d39061331a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6301e1338081565b60008073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b29061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461224b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122429061335a565b60405180910390fd5b6122558584612ae7565b9450620f4240600a54856122699190613563565b6122739190613532565b935061227f8483612ae7565b93506000612710600354876122949190613563565b61229e9190613532565b866122a991906135bd565b90508481106122bf576001600e819055506122c8565b6000600e819055505b600e54915050949350505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d906133da565b60405180910390fd5b600060085460075461237891906134dc565b116123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906132fa565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660085460075461242991906134dc565b6040518363ffffffff1660e01b8152600401612446929190613280565b600060405180830381600087803b15801561246057600080fd5b505af1158015612474573d6000803e3d6000fd5b5050505060006007819055506000600881905550565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612511906133da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a39061331a565b60405180910390fd5b6126c5601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161262d919061322e565b60206040518083038186803b15801561264557600080fd5b505afa158015612659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267d9190612f48565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c399092919063ffffffff16565b565b6126cf612d6f565b73ffffffffffffffffffffffffffffffffffffffff166126ed611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa9061331a565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b612805612d6f565b73ffffffffffffffffffffffffffffffffffffffff16612823611c7b565b73ffffffffffffffffffffffffffffffffffffffff1614612879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612870906133fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e09061333a565b60405180910390fd5b6128f281612d77565b50565b600b5481565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129849061345a565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a149061335a565b60405180910390fd5b8060098190555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae906133da565b60405180910390fd5b8060048190555050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000818310612af65781612af8565b825b905092915050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612b3493929190613249565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612b829190613217565b6000604051808303816000865af19150503d8060008114612bbf576040519150601f19603f3d011682016040523d82523d6000602084013e612bc4565b606091505b5091509150818015612bf25750600081511480612bf1575080806020019051810190612bf09190612ef6565b5b5b612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c289061337a565b60405180910390fd5b505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612c6b929190613280565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612cb99190613217565b6000604051808303816000865af19150503d8060008114612cf6576040519150601f19603f3d011682016040523d82523d6000602084013e612cfb565b606091505b5091509150818015612d295750600081511480612d28575080806020019051810190612d279190612ef6565b5b5b612d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5f9061341a565b60405180910390fd5b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081359050612e4a8161394d565b92915050565b600081359050612e5f81613964565b92915050565b600081519050612e7481613964565b92915050565b600081359050612e898161397b565b92915050565b600081519050612e9e8161397b565b92915050565b600060208284031215612eb657600080fd5b6000612ec484828501612e3b565b91505092915050565b600060208284031215612edf57600080fd5b6000612eed84828501612e50565b91505092915050565b600060208284031215612f0857600080fd5b6000612f1684828501612e65565b91505092915050565b600060208284031215612f3157600080fd5b6000612f3f84828501612e7a565b91505092915050565b600060208284031215612f5a57600080fd5b6000612f6884828501612e8f565b91505092915050565b60008060008060808587031215612f8757600080fd5b6000612f9587828801612e7a565b9450506020612fa687828801612e7a565b9350506040612fb787828801612e7a565b9250506060612fc887828801612e7a565b91505092959194509250565b612fdd816135f1565b82525050565b612fec81613603565b82525050565b6000612ffd826134b5565b61300781856134c0565b9350613017818560208601613681565b80840191505092915050565b61302c81613639565b82525050565b61303b8161365d565b82525050565b600061304e6017836134cb565b915061305982613712565b602082019050919050565b6000613071601a836134cb565b915061307c8261373b565b602082019050919050565b60006130946026836134cb565b915061309f82613764565b604082019050919050565b60006130b7601e836134cb565b91506130c2826137b3565b602082019050919050565b60006130da601e836134cb565b91506130e5826137dc565b602082019050919050565b60006130fd601d836134cb565b915061310882613805565b602082019050919050565b60006131206019836134cb565b915061312b8261382e565b602082019050919050565b60006131436019836134cb565b915061314e82613857565b602082019050919050565b60006131666020836134cb565b915061317182613880565b602082019050919050565b6000613189601a836134cb565b9150613194826138a9565b602082019050919050565b60006131ac6018836134cb565b91506131b7826138d2565b602082019050919050565b60006131cf601b836134cb565b91506131da826138fb565b602082019050919050565b60006131f26019836134cb565b91506131fd82613924565b602082019050919050565b6132118161362f565b82525050565b60006132238284612ff2565b915081905092915050565b60006020820190506132436000830184612fd4565b92915050565b600060608201905061325e6000830186612fd4565b61326b6020830185612fd4565b6132786040830184613208565b949350505050565b60006040820190506132956000830185612fd4565b6132a26020830184613208565b9392505050565b60006020820190506132be6000830184612fe3565b92915050565b60006020820190506132d96000830184613023565b92915050565b60006020820190506132f46000830184613032565b92915050565b6000602082019050818103600083015261331381613041565b9050919050565b6000602082019050818103600083015261333381613064565b9050919050565b6000602082019050818103600083015261335381613087565b9050919050565b60006020820190508181036000830152613373816130aa565b9050919050565b60006020820190508181036000830152613393816130cd565b9050919050565b600060208201905081810360008301526133b3816130f0565b9050919050565b600060208201905081810360008301526133d381613113565b9050919050565b600060208201905081810360008301526133f381613136565b9050919050565b6000602082019050818103600083015261341381613159565b9050919050565b600060208201905081810360008301526134338161317c565b9050919050565b600060208201905081810360008301526134538161319f565b9050919050565b60006020820190508181036000830152613473816131c2565b9050919050565b60006020820190508181036000830152613493816131e5565b9050919050565b60006020820190506134af6000830184613208565b92915050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006134e78261362f565b91506134f28361362f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613527576135266136b4565b5b828201905092915050565b600061353d8261362f565b91506135488361362f565b925082613558576135576136e3565b5b828204905092915050565b600061356e8261362f565b91506135798361362f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135b2576135b16136b4565b5b828202905092915050565b60006135c88261362f565b91506135d38361362f565b9250828210156135e6576135e56136b4565b5b828203905092915050565b60006135fc8261360f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006136448261364b565b9050919050565b60006136568261360f565b9050919050565b60006136688261366f565b9050919050565b600061367a8261360f565b9050919050565b60005b8381101561369f578082015181840152602081019050613684565b838111156136ae576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f466f726d6174696f6e2e46693a207a65726f2066656573000000000000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f2061646472657373000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f466f726d6174696f6e2e46693a20206e6f7420696e76657374656d656e740000600082015250565b7f5361666545524332303a205472616e7366657246726f6d206661696c65640000600082015250565b7f466f726d6174696f6e2e46693a2066656573206f6e2070656e64696e67000000600082015250565b7f466f726d6174696f6e2e46693a206e6f20736c69707061676500000000000000600082015250565b7f466f726d6174696f6e2e46693a206e6f74206d616e6167657200000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5361666545524332303a205472616e73666572206661696c6564000000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f2070726963650000000000000000600082015250565b7f466f726d6174696f6e2e46693a20207a65726f20616464726573730000000000600082015250565b7f466f726d6174696f6e2e46693a207a65726f20616d6f756e7400000000000000600082015250565b613956816135f1565b811461396157600080fd5b50565b61396d81613603565b811461397857600080fd5b50565b6139848161362f565b811461398f57600080fd5b5056fea264697066735822122055a93757067a788a0f5defb5b0a620484a6e18a916a2601c5c53b0551fa98ce964736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000106356b682aec76b528f1e7958bf635aae995694000000000000000000000000fd77a8d6850fa961b56d848a1d7abc8cf82f02ac000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000095c0b40c060ae86d436bafae58679af1b06c7dad
-----Decoded View---------------
Arg [0] : _manager (address): 0x106356B682Aec76B528f1E7958bf635AAe995694
Arg [1] : _treasury (address): 0xfd77a8d6850FA961b56d848A1D7abc8cf82f02ac
Arg [2] : _stableToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : _token (address): 0x95C0B40C060AE86D436BAFAe58679aF1B06C7dAD
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000106356b682aec76b528f1e7958bf635aae995694
Arg [1] : 000000000000000000000000fd77a8d6850fa961b56d848a1d7abc8cf82f02ac
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 00000000000000000000000095c0b40c060ae86d436bafae58679af1b06c7dad
Deployed Bytecode Sourcemap
44933:197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41860:2146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33104:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36585:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37974:476;;;:::i;:::-;;32758:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37023:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33224:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33627:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40545:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33467:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35992:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33562:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36092:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44141:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33503:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35769:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33188:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33532:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33387:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36816:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33012:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22586:103;;;:::i;:::-;;32700:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35536:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33264:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32969:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32922:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36704:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21935:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37433:468;;;:::i;:::-;;36233:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33059:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33344:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33151:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33679:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36467:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32877:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35323:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32816:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39265:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38505:261;;;:::i;:::-;;44495:258;;;:::i;:::-;;35105:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33435:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22844:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33302:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37241:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36344:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33654:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41860:2146;41959:7;34945;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42008:1:::1;41987:17;:22;;41979:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42077:1;42060:13;;:18;42052:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42127:15;42157:20:::0;42190:17:::1;42221:21:::0;42256:29:::1;42288:5;;;;;;;;;;;:15;;;42304:8;;;;;;;;;;;42288:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42256:57;;42323:30;42390:19;;42356:11;;;;;;;;;;;:21;;;42378:8;;;;;;;;;;;42356:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;42323:86;;42451:14;;42432:17;:33;42428:1550;;;42508:17;42491:14;;:34;;;;:::i;:::-;42481:44;;42591:14;;32747:3;42556:7;:30;;;;:::i;:::-;42555:50;;;;:::i;:::-;42543:62;;42637:17;;42624:9;:30;42620:653;;42682:14;;42675:21;;;;;;;;;;42620:653;42766:42;42776:7;42785:22;42766:8;:42::i;:::-;42751:57;;42848:1;42832:12;:17;42827:429;;;42873:85;42902:8;;;;;;;;;;;42912:11;;;;;;;;;;;42938:19;;42925:12;:32;;;;:::i;:::-;42873:11;;;;;;;;;;;:28;;;;:85;;;;;;:::i;:::-;43035:10;;32806:3;42997:12;:36;;;;:::i;:::-;42996:49;;;;:::i;:::-;42981:64;;43068:5;;;;;;;;;;;:10;;;43079:8;;;;;;;;;;;43089:12;43068:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43142:12;43132:7;:22;;;;:::i;:::-;43125:29;;;;;;;;;;42827:429;43228:7;43221:14;;;;;;;;;;42428:1550;43358:14;;43338:17;:34;;;;:::i;:::-;43328:44;;43437:10;;32806:3;43404:7;:31;;;;:::i;:::-;43403:44;;;;:::i;:::-;43388:59;;43475:45;43484:12;43498:21;43475:8;:45::i;:::-;43460:60;;43551:1;43537:12;:15;43533:258;;;32806:3;43602:10;;43587:12;:25;;;;:::i;:::-;43586:49;;;;:::i;:::-;43571:64;;43652:68;43677:8;;;;;;;;;;;43700:19;;43687:12;:32;;;;:::i;:::-;43652:11;;;;;;;;;;;:24;;;;:68;;;;;:::i;:::-;43740:5;;;;;;;;;;;:10;;;43752:8;;;;;;;;;;;43762:12;43740:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43533:258;43835:1;43819:12;43809:7;:22;;;;:::i;:::-;43808:28;43804:163;;;43869:81;43894:9;;;;;;;;;;;43930:19;;43916:12;43906:7;:22;;;;:::i;:::-;43905:44;;;;:::i;:::-;43869:11;;;;;;;;;;;:24;;;;:81;;;;;:::i;:::-;43804:163;43995:1;43988:8;;;;;;;;35003:1;41860:2146:::0;;;:::o;33104:40::-;;;;:::o;36585:113::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36685:5:::1;36663:18;:27;;;;36585:113:::0;:::o;37974:476::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38067:1:::1;38049:14;;:19;38041:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38138:1;38117:18;;:22;38113:330;;38154:18;38218;;38199:15;:37;;;;:::i;:::-;38186:50;;32861:8;32747:3;38339:40;;;;:::i;:::-;38311:10;38291:17;;38269:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;:52;;;;:::i;:::-;38268:112;;;;:::i;:::-;38251:14;:129;;;;38415:15;38394:18;:36;;;;38113:330;;37974:476::o:0;32758:51::-;32806:3;32758:51;:::o;37023:210::-;34699:1;34676:25;;:11;;;;;;;;;;;:25;;;;34668:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;34791:11;;;;;;;;;;;34777:25;;:10;:25;;;34769:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;37137:1:::1;37128:6;:10;37105:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37219:6;37201:14;:24;;;;37023:210:::0;:::o;33224:33::-;;;;:::o;33627:20::-;;;;;;;;;;;;;:::o;40545:953::-;40749:7;34699:1;34676:25;;:11;;;;;;;;;;;:25;;;;34668:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;34791:11;;;;;;;;;;;34777:25;;:10;:25;;;34769:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;40791:60:::1;40802:19;40833:17;40791:8;:60::i;:::-;40769:82;;32806:3;40914:10;;40889:22;:35;;;;:::i;:::-;40888:61;;;;:::i;:::-;40862:87;;40984:63;40993:22;41026:20;40984:8;:63::i;:::-;40960:87;;41059:37;32747:3;41155:14;;41133:19;:36;;;;:::i;:::-;41131:61;;;;:::i;:::-;41099:19;:93;;;;:::i;:::-;41059:133;;41234:1;41217:13;;:18;41213:246;;;41302:22;41271:28;:53;;;;:::i;:::-;41253:14;:71;;;;41213:246;;;41409:28;41384:22;:53;;;;:::i;:::-;41367:14;:70;;;;41213:246;41476:14;;41469:21;;;40545:953:::0;;;;;;:::o;33467:29::-;;;;:::o;35992:90::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36067:7:::1;36057:8;;:17;;;;;;;;;;;;;;;;;;35992:90:::0;:::o;33562:26::-;;;;;;;;;;;;;:::o;36092:132::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36199:17:::1;36180:16;:36;;;;36092:132:::0;:::o;44141:246::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44244:1:::1;44234:7;:11;44225:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;44287:92;44316:10;44336:4;44359:19;;44351:7;:27;;;;:::i;:::-;44287:11;;;;;;;;;;;:28;;;;:92;;;;;;:::i;:::-;44141:246:::0;:::o;33503:22::-;;;;;;;;;;;;;:::o;35769:214::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35884:1:::1;35863:23;;:10;:23;;;;35841:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;35965:10;35953:9;;:22;;;;;;;;;;;;;;;;;;35769:214:::0;:::o;33188:29::-;;;;:::o;33532:23::-;;;;;;;;;;;;;:::o;33387:40::-;;;;:::o;36816:199::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36922:1:::1;36913:6;:10;36890:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37001:6;36988:10;:19;;;;36816:199:::0;:::o;33012:39::-;;;;:::o;22586:103::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22651:30:::1;22678:1;22651:18;:30::i;:::-;22586:103::o:0;32700:50::-;32747:3;32700:50;:::o;35536:224::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35657:1:::1;35634:25;;:12;:25;;;;35612:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;35740:12;35726:11;;:26;;;;;;;;;;;;;;;;;;35536:224:::0;:::o;33264:31::-;;;;:::o;32969:34::-;;;;:::o;32922:39::-;;;;:::o;36704:104::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36789:10:::1;36778:9;:21;;;;36704:104:::0;:::o;21935:87::-;21981:7;22008:6;;;;;;;;;;;22001:13;;21935:87;:::o;37433:468::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37528:1:::1;37509:15;;:20;37501:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37576:19;37627:14;;37614:10;;:27;37610:284;;;37685:14;;37672:10;;:27;;;;:::i;:::-;37658:41;;37731:10;;37714:14;:27;;;;32747:3;37847:10;;:33;;;;:::i;:::-;37824:18;;37810:11;37775:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;:::-;:67;;;;:::i;:::-;37774:107;;;;:::i;:::-;37756:15;:125;;;;37610:284;35003:1;37433:468::o:0;36233:103::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36323:5:::1;36307:14;:21;;;;36233:103:::0;:::o;33059:38::-;;;;:::o;33344:36::-;;;;:::o;33151:30::-;;;;:::o;33679:25::-;;;;;;;;;;;;;:::o;36467:110::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36564:5:::1;36544:17;:25;;;;36467:110:::0;:::o;32877:38::-;;;;:::o;35323:205::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35433:1:::1;35413:22;;:8;:22;;;;35391:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35512:8;35502:7;;:18;;;;;;;;;;;;;;;;;;35323:205:::0;:::o;32816:53::-;32861:8;32816:53;:::o;39265:861::-;39469:7;34699:1;34676:25;;:11;;;;;;;;;;;:25;;;;34668:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;34791:11;;;;;;;;;;;34777:25;;:10;:25;;;34769:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;39511:60:::1;39522:19;39553:17;39511:8;:60::i;:::-;39489:82;;32806:3;39634:10;;39609:22;:35;;;;:::i;:::-;39608:61;;;;:::i;:::-;39582:87;;39704:63;39713:22;39746:20;39704:8;:63::i;:::-;39680:87;;39778:37;32747:3;39874:14;;39852:19;:36;;;;:::i;:::-;39850:61;;;;:::i;:::-;39818:19;:93;;;;:::i;:::-;39778:133;;39960:22;39928:28;:54;39922:166;;40015:1;39999:13;:17;;;;39922:166;;;40075:1;40059:13;:17;;;;39922:166;40105:13;;40098:20;;;39265:861:::0;;;;;;:::o;38505:261::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38603:1:::1;38585:14;;38567:15;;:32;;;;:::i;:::-;38566:38;38557:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38645:5;;;;;;;;;;;:10;;;38656:8;;;;;;;;;;;38684:14;;38666:15;;:32;;;;:::i;:::-;38645:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38728:1;38710:15;:19;;;;38757:1;38740:14;:18;;;;38505:261::o:0;44495:258::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44602:1:::1;44579:25;;:11;;;;;;;;;;;:25;;;;44571:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44670:75;44695:11;;;;;;;;;;;44708;;;;;;;;;;;:21;;;44738:4;44708:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44670:11;;;;;;;;;;;:24;;;;:75;;;;;:::i;:::-;44495:258::o:0;35105:210::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35218:1:::1;35197:23;;:9;:23;;;;35175:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;35298:9;35287:8;;:20;;;;;;;;;;;;;;;;;;35105:210:::0;:::o;33435:25::-;;;;:::o;22844:201::-;22166:12;:10;:12::i;:::-;22155:23;;:7;:5;:7::i;:::-;:23;;;22147:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22953:1:::1;22933:22;;:8;:22;;;;22925:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23009:28;23028:8;23009:18;:28::i;:::-;22844:201:::0;:::o;33302:35::-;;;;:::o;37241:118::-;34699:1;34676:25;;:11;;;;;;;;;;;:25;;;;34668:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;34791:11;;;;;;;;;;;34777:25;;:10;:25;;;34769:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;37346:5:::1;37325:18;:26;;;;37241:118:::0;:::o;36344:115::-;34945:7;;;;;;;;;;;34931:21;;:10;:21;;;34923:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36446:5:::1;36424:20;:27;;;;36344:115:::0;:::o;33654:18::-;;;;;;;;;;;;;:::o;484:106::-;542:7;573:1;569;:5;:13;;581:1;569:13;;;577:1;569:13;562:20;;484:106;;;;:::o;6607:434::-;6753:12;6767:17;6796:5;6788:19;;6845:10;6857:4;6863:2;6867:6;6822:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6788:97;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6752:133;;;;6918:7;:57;;;;;6945:1;6930:4;:11;:16;:44;;;;6961:4;6950:24;;;;;;;;;;;;:::i;:::-;6930:44;6918:57;6896:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6607:434;;;;;;:::o;6202:397::-;6321:12;6335:17;6364:5;6356:19;;6413:10;6425:2;6429:6;6390:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6356:91;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6320:127;;;;6480:7;:57;;;;;6507:1;6492:4;:11;:16;:44;;;;6523:4;6512:24;;;;;;;;;;;;:::i;:::-;6492:44;6480:57;6458:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;6202:397;;;;;:::o;7727:98::-;7780:7;7807:10;7800:17;;7727:98;:::o;23205:191::-;23279:16;23298:6;;;;;;;;;;;23279:25;;23324:8;23315:6;;:17;;;;;;;;;;;;;;;;;;23379:8;23348:40;;23369:8;23348:40;;;;;;;;;;;;23205:191;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;351:77;;;;:::o;434:139::-;480:5;518:6;505:20;496:29;;534:33;561:5;534:33;:::i;:::-;486:87;;;;:::o;579:143::-;636:5;667:6;661:13;652:22;;683:33;710:5;683:33;:::i;:::-;642:80;;;;:::o;728:262::-;787:6;836:2;824:9;815:7;811:23;807:32;804:2;;;852:1;849;842:12;804:2;895:1;920:53;965:7;956:6;945:9;941:22;920:53;:::i;:::-;910:63;;866:117;794:196;;;;:::o;996:256::-;1052:6;1101:2;1089:9;1080:7;1076:23;1072:32;1069:2;;;1117:1;1114;1107:12;1069:2;1160:1;1185:50;1227:7;1218:6;1207:9;1203:22;1185:50;:::i;:::-;1175:60;;1131:114;1059:193;;;;:::o;1258:278::-;1325:6;1374:2;1362:9;1353:7;1349:23;1345:32;1342:2;;;1390:1;1387;1380:12;1342:2;1433:1;1458:61;1511:7;1502:6;1491:9;1487:22;1458:61;:::i;:::-;1448:71;;1404:125;1332:204;;;;:::o;1542:262::-;1601:6;1650:2;1638:9;1629:7;1625:23;1621:32;1618:2;;;1666:1;1663;1656:12;1618:2;1709:1;1734:53;1779:7;1770:6;1759:9;1755:22;1734:53;:::i;:::-;1724:63;;1680:117;1608:196;;;;:::o;1810:284::-;1880:6;1929:2;1917:9;1908:7;1904:23;1900:32;1897:2;;;1945:1;1942;1935:12;1897:2;1988:1;2013:64;2069:7;2060:6;2049:9;2045:22;2013:64;:::i;:::-;2003:74;;1959:128;1887:207;;;;:::o;2100:698::-;2186:6;2194;2202;2210;2259:3;2247:9;2238:7;2234:23;2230:33;2227:2;;;2276:1;2273;2266:12;2227:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2446:2;2472:53;2517:7;2508:6;2497:9;2493:22;2472:53;:::i;:::-;2462:63;;2417:118;2574:2;2600:53;2645:7;2636:6;2625:9;2621:22;2600:53;:::i;:::-;2590:63;;2545:118;2702:2;2728:53;2773:7;2764:6;2753:9;2749:22;2728:53;:::i;:::-;2718:63;;2673:118;2217:581;;;;;;;:::o;2804:118::-;2891:24;2909:5;2891:24;:::i;:::-;2886:3;2879:37;2869:53;;:::o;2928:109::-;3009:21;3024:5;3009:21;:::i;:::-;3004:3;2997:34;2987:50;;:::o;3043:373::-;3147:3;3175:38;3207:5;3175:38;:::i;:::-;3229:88;3310:6;3305:3;3229:88;:::i;:::-;3222:95;;3326:52;3371:6;3366:3;3359:4;3352:5;3348:16;3326:52;:::i;:::-;3403:6;3398:3;3394:16;3387:23;;3151:265;;;;;:::o;3422:159::-;3523:51;3568:5;3523:51;:::i;:::-;3518:3;3511:64;3501:80;;:::o;3587:159::-;3688:51;3733:5;3688:51;:::i;:::-;3683:3;3676:64;3666:80;;:::o;3752:366::-;3894:3;3915:67;3979:2;3974:3;3915:67;:::i;:::-;3908:74;;3991:93;4080:3;3991:93;:::i;:::-;4109:2;4104:3;4100:12;4093:19;;3898:220;;;:::o;4124:366::-;4266:3;4287:67;4351:2;4346:3;4287:67;:::i;:::-;4280:74;;4363:93;4452:3;4363:93;:::i;:::-;4481:2;4476:3;4472:12;4465:19;;4270:220;;;:::o;4496:366::-;4638:3;4659:67;4723:2;4718:3;4659:67;:::i;:::-;4652:74;;4735:93;4824:3;4735:93;:::i;:::-;4853:2;4848:3;4844:12;4837:19;;4642:220;;;:::o;4868:366::-;5010:3;5031:67;5095:2;5090:3;5031:67;:::i;:::-;5024:74;;5107:93;5196:3;5107:93;:::i;:::-;5225:2;5220:3;5216:12;5209:19;;5014:220;;;:::o;5240:366::-;5382:3;5403:67;5467:2;5462:3;5403:67;:::i;:::-;5396:74;;5479:93;5568:3;5479:93;:::i;:::-;5597:2;5592:3;5588:12;5581:19;;5386:220;;;:::o;5612:366::-;5754:3;5775:67;5839:2;5834:3;5775:67;:::i;:::-;5768:74;;5851:93;5940:3;5851:93;:::i;:::-;5969:2;5964:3;5960:12;5953:19;;5758:220;;;:::o;5984:366::-;6126:3;6147:67;6211:2;6206:3;6147:67;:::i;:::-;6140:74;;6223:93;6312:3;6223:93;:::i;:::-;6341:2;6336:3;6332:12;6325:19;;6130:220;;;:::o;6356:366::-;6498:3;6519:67;6583:2;6578:3;6519:67;:::i;:::-;6512:74;;6595:93;6684:3;6595:93;:::i;:::-;6713:2;6708:3;6704:12;6697:19;;6502:220;;;:::o;6728:366::-;6870:3;6891:67;6955:2;6950:3;6891:67;:::i;:::-;6884:74;;6967:93;7056:3;6967:93;:::i;:::-;7085:2;7080:3;7076:12;7069:19;;6874:220;;;:::o;7100:366::-;7242:3;7263:67;7327:2;7322:3;7263:67;:::i;:::-;7256:74;;7339:93;7428:3;7339:93;:::i;:::-;7457:2;7452:3;7448:12;7441:19;;7246:220;;;:::o;7472:366::-;7614:3;7635:67;7699:2;7694:3;7635:67;:::i;:::-;7628:74;;7711:93;7800:3;7711:93;:::i;:::-;7829:2;7824:3;7820:12;7813:19;;7618:220;;;:::o;7844:366::-;7986:3;8007:67;8071:2;8066:3;8007:67;:::i;:::-;8000:74;;8083:93;8172:3;8083:93;:::i;:::-;8201:2;8196:3;8192:12;8185:19;;7990:220;;;:::o;8216:366::-;8358:3;8379:67;8443:2;8438:3;8379:67;:::i;:::-;8372:74;;8455:93;8544:3;8455:93;:::i;:::-;8573:2;8568:3;8564:12;8557:19;;8362:220;;;:::o;8588:118::-;8675:24;8693:5;8675:24;:::i;:::-;8670:3;8663:37;8653:53;;:::o;8712:271::-;8842:3;8864:93;8953:3;8944:6;8864:93;:::i;:::-;8857:100;;8974:3;8967:10;;8846:137;;;;:::o;8989:222::-;9082:4;9120:2;9109:9;9105:18;9097:26;;9133:71;9201:1;9190:9;9186:17;9177:6;9133:71;:::i;:::-;9087:124;;;;:::o;9217:442::-;9366:4;9404:2;9393:9;9389:18;9381:26;;9417:71;9485:1;9474:9;9470:17;9461:6;9417:71;:::i;:::-;9498:72;9566:2;9555:9;9551:18;9542:6;9498:72;:::i;:::-;9580;9648:2;9637:9;9633:18;9624:6;9580:72;:::i;:::-;9371:288;;;;;;:::o;9665:332::-;9786:4;9824:2;9813:9;9809:18;9801:26;;9837:71;9905:1;9894:9;9890:17;9881:6;9837:71;:::i;:::-;9918:72;9986:2;9975:9;9971:18;9962:6;9918:72;:::i;:::-;9791:206;;;;;:::o;10003:210::-;10090:4;10128:2;10117:9;10113:18;10105:26;;10141:65;10203:1;10192:9;10188:17;10179:6;10141:65;:::i;:::-;10095:118;;;;:::o;10219:250::-;10326:4;10364:2;10353:9;10349:18;10341:26;;10377:85;10459:1;10448:9;10444:17;10435:6;10377:85;:::i;:::-;10331:138;;;;:::o;10475:250::-;10582:4;10620:2;10609:9;10605:18;10597:26;;10633:85;10715:1;10704:9;10700:17;10691:6;10633:85;:::i;:::-;10587:138;;;;:::o;10731:419::-;10897:4;10935:2;10924:9;10920:18;10912:26;;10984:9;10978:4;10974:20;10970:1;10959:9;10955:17;10948:47;11012:131;11138:4;11012:131;:::i;:::-;11004:139;;10902:248;;;:::o;11156:419::-;11322:4;11360:2;11349:9;11345:18;11337:26;;11409:9;11403:4;11399:20;11395:1;11384:9;11380:17;11373:47;11437:131;11563:4;11437:131;:::i;:::-;11429:139;;11327:248;;;:::o;11581:419::-;11747:4;11785:2;11774:9;11770:18;11762:26;;11834:9;11828:4;11824:20;11820:1;11809:9;11805:17;11798:47;11862:131;11988:4;11862:131;:::i;:::-;11854:139;;11752:248;;;:::o;12006:419::-;12172:4;12210:2;12199:9;12195:18;12187:26;;12259:9;12253:4;12249:20;12245:1;12234:9;12230:17;12223:47;12287:131;12413:4;12287:131;:::i;:::-;12279:139;;12177:248;;;:::o;12431:419::-;12597:4;12635:2;12624:9;12620:18;12612:26;;12684:9;12678:4;12674:20;12670:1;12659:9;12655:17;12648:47;12712:131;12838:4;12712:131;:::i;:::-;12704:139;;12602:248;;;:::o;12856:419::-;13022:4;13060:2;13049:9;13045:18;13037:26;;13109:9;13103:4;13099:20;13095:1;13084:9;13080:17;13073:47;13137:131;13263:4;13137:131;:::i;:::-;13129:139;;13027:248;;;:::o;13281:419::-;13447:4;13485:2;13474:9;13470:18;13462:26;;13534:9;13528:4;13524:20;13520:1;13509:9;13505:17;13498:47;13562:131;13688:4;13562:131;:::i;:::-;13554:139;;13452:248;;;:::o;13706:419::-;13872:4;13910:2;13899:9;13895:18;13887:26;;13959:9;13953:4;13949:20;13945:1;13934:9;13930:17;13923:47;13987:131;14113:4;13987:131;:::i;:::-;13979:139;;13877:248;;;:::o;14131:419::-;14297:4;14335:2;14324:9;14320:18;14312:26;;14384:9;14378:4;14374:20;14370:1;14359:9;14355:17;14348:47;14412:131;14538:4;14412:131;:::i;:::-;14404:139;;14302:248;;;:::o;14556:419::-;14722:4;14760:2;14749:9;14745:18;14737:26;;14809:9;14803:4;14799:20;14795:1;14784:9;14780:17;14773:47;14837:131;14963:4;14837:131;:::i;:::-;14829:139;;14727:248;;;:::o;14981:419::-;15147:4;15185:2;15174:9;15170:18;15162:26;;15234:9;15228:4;15224:20;15220:1;15209:9;15205:17;15198:47;15262:131;15388:4;15262:131;:::i;:::-;15254:139;;15152:248;;;:::o;15406:419::-;15572:4;15610:2;15599:9;15595:18;15587:26;;15659:9;15653:4;15649:20;15645:1;15634:9;15630:17;15623:47;15687:131;15813:4;15687:131;:::i;:::-;15679:139;;15577:248;;;:::o;15831:419::-;15997:4;16035:2;16024:9;16020:18;16012:26;;16084:9;16078:4;16074:20;16070:1;16059:9;16055:17;16048:47;16112:131;16238:4;16112:131;:::i;:::-;16104:139;;16002:248;;;:::o;16256:222::-;16349:4;16387:2;16376:9;16372:18;16364:26;;16400:71;16468:1;16457:9;16453:17;16444:6;16400:71;:::i;:::-;16354:124;;;;:::o;16484:98::-;16535:6;16569:5;16563:12;16553:22;;16542:40;;;:::o;16588:147::-;16689:11;16726:3;16711:18;;16701:34;;;;:::o;16741:169::-;16825:11;16859:6;16854:3;16847:19;16899:4;16894:3;16890:14;16875:29;;16837:73;;;;:::o;16916:305::-;16956:3;16975:20;16993:1;16975:20;:::i;:::-;16970:25;;17009:20;17027:1;17009:20;:::i;:::-;17004:25;;17163:1;17095:66;17091:74;17088:1;17085:81;17082:2;;;17169:18;;:::i;:::-;17082:2;17213:1;17210;17206:9;17199:16;;16960:261;;;;:::o;17227:185::-;17267:1;17284:20;17302:1;17284:20;:::i;:::-;17279:25;;17318:20;17336:1;17318:20;:::i;:::-;17313:25;;17357:1;17347:2;;17362:18;;:::i;:::-;17347:2;17404:1;17401;17397:9;17392:14;;17269:143;;;;:::o;17418:348::-;17458:7;17481:20;17499:1;17481:20;:::i;:::-;17476:25;;17515:20;17533:1;17515:20;:::i;:::-;17510:25;;17703:1;17635:66;17631:74;17628:1;17625:81;17620:1;17613:9;17606:17;17602:105;17599:2;;;17710:18;;:::i;:::-;17599:2;17758:1;17755;17751:9;17740:20;;17466:300;;;;:::o;17772:191::-;17812:4;17832:20;17850:1;17832:20;:::i;:::-;17827:25;;17866:20;17884:1;17866:20;:::i;:::-;17861:25;;17905:1;17902;17899:8;17896:2;;;17910:18;;:::i;:::-;17896:2;17955:1;17952;17948:9;17940:17;;17817:146;;;;:::o;17969:96::-;18006:7;18035:24;18053:5;18035:24;:::i;:::-;18024:35;;18014:51;;;:::o;18071:90::-;18105:7;18148:5;18141:13;18134:21;18123:32;;18113:48;;;:::o;18167:126::-;18204:7;18244:42;18237:5;18233:54;18222:65;;18212:81;;;:::o;18299:77::-;18336:7;18365:5;18354:16;;18344:32;;;:::o;18382:154::-;18446:9;18479:51;18524:5;18479:51;:::i;:::-;18466:64;;18456:80;;;:::o;18542:127::-;18606:9;18639:24;18657:5;18639:24;:::i;:::-;18626:37;;18616:53;;;:::o;18675:154::-;18739:9;18772:51;18817:5;18772:51;:::i;:::-;18759:64;;18749:80;;;:::o;18835:127::-;18899:9;18932:24;18950:5;18932:24;:::i;:::-;18919:37;;18909:53;;;:::o;18968:307::-;19036:1;19046:113;19060:6;19057:1;19054:13;19046:113;;;19145:1;19140:3;19136:11;19130:18;19126:1;19121:3;19117:11;19110:39;19082:2;19079:1;19075:10;19070:15;;19046:113;;;19177:6;19174:1;19171:13;19168:2;;;19257:1;19248:6;19243:3;19239:16;19232:27;19168:2;19017:258;;;;:::o;19281:180::-;19329:77;19326:1;19319:88;19426:4;19423:1;19416:15;19450:4;19447:1;19440:15;19467:180;19515:77;19512:1;19505:88;19612:4;19609:1;19602:15;19636:4;19633:1;19626:15;19653:173;19793:25;19789:1;19781:6;19777:14;19770:49;19759:67;:::o;19832:176::-;19972:28;19968:1;19960:6;19956:14;19949:52;19938:70;:::o;20014:225::-;20154:34;20150:1;20142:6;20138:14;20131:58;20223:8;20218:2;20210:6;20206:15;20199:33;20120:119;:::o;20245:180::-;20385:32;20381:1;20373:6;20369:14;20362:56;20351:74;:::o;20431:180::-;20571:32;20567:1;20559:6;20555:14;20548:56;20537:74;:::o;20617:179::-;20757:31;20753:1;20745:6;20741:14;20734:55;20723:73;:::o;20802:175::-;20942:27;20938:1;20930:6;20926:14;20919:51;20908:69;:::o;20983:175::-;21123:27;21119:1;21111:6;21107:14;21100:51;21089:69;:::o;21164:182::-;21304:34;21300:1;21292:6;21288:14;21281:58;21270:76;:::o;21352:176::-;21492:28;21488:1;21480:6;21476:14;21469:52;21458:70;:::o;21534:174::-;21674:26;21670:1;21662:6;21658:14;21651:50;21640:68;:::o;21714:177::-;21854:29;21850:1;21842:6;21838:14;21831:53;21820:71;:::o;21897:175::-;22037:27;22033:1;22025:6;22021:14;22014:51;22003:69;:::o;22078:122::-;22151:24;22169:5;22151:24;:::i;:::-;22144:5;22141:35;22131:2;;22190:1;22187;22180:12;22131:2;22121:79;:::o;22206:116::-;22276:21;22291:5;22276:21;:::i;:::-;22269:5;22266:32;22256:2;;22312:1;22309;22302:12;22256:2;22246:76;:::o;22328:122::-;22401:24;22419:5;22401:24;:::i;:::-;22394:5;22391:35;22381:2;;22440:1;22437;22430:12;22381:2;22371:79;:::o
Swarm Source
ipfs://55a93757067a788a0f5defb5b0a620484a6e18a916a2601c5c53b0551fa98ce9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.