Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12265538 | 1261 days ago | IN | 0 ETH | 0.13612557 |
Loading...
Loading
Contract Name:
ZeroxWrapper
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-18 */ pragma solidity =0.7.6; pragma experimental ABIEncoderV2; interface IERC20 { function totalSupply() external view returns (uint256 supply); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); function decimals() external view returns (uint256 digits); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /// @dev Edited so it always first approves 0 and then the value, because of non standard tokens function safeApprove( IERC20 token, address spender, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract DSMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, ""); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, ""); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, ""); } function div(uint256 x, uint256 y) internal pure returns (uint256 z) { return x / y; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { return x <= y ? x : y; } function max(uint256 x, uint256 y) internal pure returns (uint256 z) { return x >= y ? x : y; } function imin(int256 x, int256 y) internal pure returns (int256 z) { return x <= y ? x : y; } function imax(int256 x, int256 y) internal pure returns (int256 z) { return x >= y ? x : y; } uint256 constant WAD = 10**18; uint256 constant RAY = 10**27; function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), WAD / 2) / WAD; } function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), RAY / 2) / RAY; } function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, WAD), y / 2) / y; } function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, RAY), y / 2) / y; } // This famous algorithm is called "exponentiation by squaring" // and calculates x^n with x as fixed-point and n as regular unsigned. // // It's O(log n), instead of O(n) for naive repeated multiplication. // // These facts are why it works: // // If n is even, then x^n = (x^2)^(n/2). // If n is odd, then x^n = x * x^(n-1), // and applying the equation for even x gives // x^n = x * (x^2)^((n-1) / 2). // // Also, EVM division is flooring and // floor[(n-1) / 2] = floor[n / 2]. // function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) { z = n % 2 != 0 ? x : RAY; for (n /= 2; n != 0; n /= 2) { x = rmul(x, x); if (n % 2 != 0) { z = rmul(z, x); } } } } abstract contract IDFSRegistry { function getAddr(bytes32 _id) public view virtual returns (address); function addNewContract( bytes32 _id, address _contractAddr, uint256 _waitPeriod ) public virtual; function startContractChange(bytes32 _id, address _newContractAddr) public virtual; function approveContractChange(bytes32 _id) public virtual; function cancelContractChange(bytes32 _id) public virtual; function changeWaitPeriod(bytes32 _id, uint256 _newWaitPeriod) public virtual; } /// @title A stateful contract that holds and can change owner/admin contract AdminVault { address public owner; address public admin; constructor() { owner = msg.sender; admin = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9; } /// @notice Admin is able to change owner /// @param _owner Address of new owner function changeOwner(address _owner) public { require(admin == msg.sender, "msg.sender not admin"); owner = _owner; } /// @notice Admin is able to set new admin /// @param _admin Address of multisig that becomes new admin function changeAdmin(address _admin) public { require(admin == msg.sender, "msg.sender not admin"); admin = _admin; } } /// @title AdminAuth Handles owner/admin privileges over smart contracts contract AdminAuth { using SafeERC20 for IERC20; address public constant ADMIN_VAULT_ADDR = 0xCCf3d848e08b94478Ed8f46fFead3008faF581fD; AdminVault public constant adminVault = AdminVault(ADMIN_VAULT_ADDR); modifier onlyOwner() { require(adminVault.owner() == msg.sender, "msg.sender not owner"); _; } modifier onlyAdmin() { require(adminVault.admin() == msg.sender, "msg.sender not admin"); _; } /// @notice withdraw stuck funds function withdrawStuckFunds(address _token, address _receiver, uint256 _amount) public onlyOwner { if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) { payable(_receiver).transfer(_amount); } else { IERC20(_token).safeTransfer(_receiver, _amount); } } /// @notice Destroy the contract function kill() public onlyAdmin { selfdestruct(payable(msg.sender)); } } abstract contract IWETH { function allowance(address, address) public virtual returns (uint256); function balanceOf(address) public virtual returns (uint256); function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual returns (bool); function transferFrom( address, address, uint256 ) public virtual returns (bool); function deposit() public payable virtual; function withdraw(uint256) public virtual; } library TokenUtils { using SafeERC20 for IERC20; address public constant WETH_ADDR = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant ETH_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function approveToken( address _tokenAddr, address _to, uint256 _amount ) internal { if (_tokenAddr == ETH_ADDR) return; if (IERC20(_tokenAddr).allowance(address(this), _to) < _amount) { IERC20(_tokenAddr).safeApprove(_to, _amount); } } function pullTokensIfNeeded( address _token, address _from, uint256 _amount ) internal returns (uint256) { // handle max uint amount if (_amount == type(uint256).max) { uint256 userAllowance = IERC20(_token).allowance(_from, address(this)); uint256 balance = getBalance(_token, _from); // pull max allowance amount if balance is bigger than allowance _amount = (balance > userAllowance) ? userAllowance : balance; } if (_from != address(0) && _from != address(this) && _token != ETH_ADDR && _amount != 0) { IERC20(_token).safeTransferFrom(_from, address(this), _amount); } return _amount; } function withdrawTokens( address _token, address _to, uint256 _amount ) internal returns (uint256) { if (_amount == type(uint256).max) { _amount = getBalance(_token, address(this)); } if (_to != address(0) && _to != address(this) && _amount != 0) { if (_token != ETH_ADDR) { IERC20(_token).safeTransfer(_to, _amount); } else { payable(_to).transfer(_amount); } } return _amount; } function depositWeth(uint256 _amount) internal { IWETH(WETH_ADDR).deposit{value: _amount}(); } function withdrawWeth(uint256 _amount) internal { IWETH(WETH_ADDR).withdraw(_amount); } function getBalance(address _tokenAddr, address _acc) internal view returns (uint256) { if (_tokenAddr == ETH_ADDR) { return _acc.balance; } else { return IERC20(_tokenAddr).balanceOf(_acc); } } function getTokenDecimals(address _token) internal view returns (uint256) { if (_token == ETH_ADDR) return 18; return IERC20(_token).decimals(); } } contract Discount { address public owner; mapping(address => CustomServiceFee) public serviceFees; uint256 constant MAX_SERVICE_FEE = 400; struct CustomServiceFee { bool active; uint256 amount; } constructor() { owner = msg.sender; } function isCustomFeeSet(address _user) public view returns (bool) { return serviceFees[_user].active; } function getCustomServiceFee(address _user) public view returns (uint256) { return serviceFees[_user].amount; } function setServiceFee(address _user, uint256 _fee) public { require(msg.sender == owner, "Only owner"); require(_fee >= MAX_SERVICE_FEE || _fee == 0, "Wrong fee value"); serviceFees[_user] = CustomServiceFee({active: true, amount: _fee}); } function disableServiceFee(address _user) public { require(msg.sender == owner, "Only owner"); serviceFees[_user] = CustomServiceFee({active: false, amount: 0}); } } contract DFSExchangeHelper { using TokenUtils for address; string public constant ERR_OFFCHAIN_DATA_INVALID = "Offchain data invalid"; using SafeERC20 for IERC20; function sendLeftover( address _srcAddr, address _destAddr, address payable _to ) internal { // clean out any eth leftover TokenUtils.ETH_ADDR.withdrawTokens(_to, type(uint256).max); _srcAddr.withdrawTokens(_to, type(uint256).max); _destAddr.withdrawTokens(_to, type(uint256).max); } function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) { require(bs.length >= start + 32, "slicing out of range"); uint256 x; assembly { x := mload(add(bs, add(0x20, start))) } return x; } function writeUint256( bytes memory _b, uint256 _index, uint256 _input ) internal pure { if (_b.length < _index + 32) { revert(ERR_OFFCHAIN_DATA_INVALID); } bytes32 input = bytes32(_input); _index += 32; // Read the bytes32 from array memory assembly { mstore(add(_b, _index), input) } } } contract DFSExchangeData { // first is empty to keep the legacy order in place enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX } enum ExchangeActionType { SELL, BUY } struct OffchainData { address wrapper; address exchangeAddr; address allowanceTarget; uint256 price; uint256 protocolFee; bytes callData; } struct ExchangeData { address srcAddr; address destAddr; uint256 srcAmount; uint256 destAmount; uint256 minPrice; uint256 dfsFeeDivider; // service fee divider address user; // user to check special fee address wrapper; bytes wrapperData; OffchainData offchainData; } function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) { return abi.encode(_exData); } function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) { _exData = abi.decode(_data, (ExchangeData)); } } abstract contract IOffchainWrapper is DFSExchangeData { function takeOrder( ExchangeData memory _exData, ExchangeActionType _type ) virtual public payable returns (bool success, uint256); } contract ZeroxWrapper is IOffchainWrapper, DFSExchangeHelper, AdminAuth, DSMath { using TokenUtils for address; string public constant ERR_SRC_AMOUNT = "Not enough funds"; string public constant ERR_PROTOCOL_FEE = "Not enough eth for protocol fee"; string public constant ERR_TOKENS_SWAPPED_ZERO = "Order success but amount 0"; using SafeERC20 for IERC20; /// @notice Takes order from 0x and returns bool indicating if it is successful /// @param _exData Exchange data /// @param _type Action type (buy or sell) function takeOrder( ExchangeData memory _exData, ExchangeActionType _type ) override public payable returns (bool success, uint256) { // check that contract have enough balance for exchange and protocol fee require(_exData.srcAddr.getBalance(address(this)) >= _exData.srcAmount, ERR_SRC_AMOUNT); require(TokenUtils.ETH_ADDR.getBalance(address(this)) >= _exData.offchainData.protocolFee, ERR_PROTOCOL_FEE); /// @dev 0x always uses max approve in v1, so we approve the exact amount we want to sell /// @dev safeApprove is modified to always first set approval to 0, then to exact amount if (_type == ExchangeActionType.SELL) { IERC20(_exData.srcAddr).safeApprove(_exData.offchainData.allowanceTarget, _exData.srcAmount); } else { uint srcAmount = wdiv(_exData.destAmount, _exData.offchainData.price) + 1; // + 1 so we round up IERC20(_exData.srcAddr).safeApprove(_exData.offchainData.allowanceTarget, srcAmount); } uint256 tokensBefore = _exData.destAddr.getBalance(address(this)); (success, ) = _exData.offchainData.exchangeAddr.call{value: _exData.offchainData.protocolFee}(_exData.offchainData.callData); uint256 tokensSwapped = 0; if (success) { // get the current balance of the swapped tokens tokensSwapped = sub(_exData.destAddr.getBalance(address(this)), tokensBefore); require(tokensSwapped > 0, ERR_TOKENS_SWAPPED_ZERO); } // returns all funds from src addr, dest addr and eth funds (protocol fee leftovers) sendLeftover(_exData.srcAddr, _exData.destAddr, msg.sender); return (success, tokensSwapped); } // solhint-disable-next-line no-empty-blocks receive() external virtual payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ADMIN_VAULT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_OFFCHAIN_DATA_INVALID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_PROTOCOL_FEE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_SRC_AMOUNT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_TOKENS_SWAPPED_ZERO","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminVault","outputs":[{"internalType":"contract AdminVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"name":"packExchangeData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"},{"internalType":"enum DFSExchangeData.ExchangeActionType","name":"_type","type":"uint8"}],"name":"takeOrder","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"unpackExchangeData","outputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506115d1806100206000396000f3fe6080604052600436106100a05760003560e01c80638cedca71116100645780638cedca7114610144578063a3b8e5d114610166578063ae08fd1014610193578063c579d490146101a8578063cd4709cb14610144578063d59de696146101c8576100a7565b806308d4f52a146100ac57806326aa2bd2146100e257806341c0e1b5146100f75780634b9cb5081461010e57806365937d1f1461012f576100a7565b366100a757005b600080fd5b3480156100b857600080fd5b506100cc6100c73660046110af565b6101dd565b6040516100d99190611354565b60405180910390f35b3480156100ee57600080fd5b506100cc610207565b34801561010357600080fd5b5061010c610233565b005b61012161011c3660046111e6565b6102f4565b6040516100d9929190611344565b34801561013b57600080fd5b506100cc6105a3565b34801561015057600080fd5b506101596105dc565b6040516100d991906112fb565b34801561017257600080fd5b5061018661018136600461107c565b6105f4565b6040516100d99190611455565b34801561019f57600080fd5b506100cc610616565b3480156101b457600080fd5b5061010c6101c336600461101c565b610647565b3480156101d457600080fd5b506100cc610776565b6060816040516020016101f09190611455565b60405160208183030381529060405290505b919050565b6040518060400160405280601081526020016f4e6f7420656e6f7567682066756e647360801b81525081565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b15801561028a57600080fd5b505afa15801561029e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c29190611000565b6001600160a01b0316146102f15760405162461bcd60e51b81526004016102e890611395565b60405180910390fd5b33ff5b604082015182516000918291610313906001600160a01b0316306107af565b10156040518060400160405280601081526020016f4e6f7420656e6f7567682066756e647360801b8152509061035c5760405162461bcd60e51b81526004016102e89190611354565b506101208401516080015161038573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee306107af565b10156040518060400160405280601f81526020017f4e6f7420656e6f7567682065746820666f722070726f746f636f6c2066656500815250906103db5760405162461bcd60e51b81526004016102e89190611354565b5060008360018111156103ea57fe5b14156104245761041f84610120015160400151856040015186600001516001600160a01b031661086a9092919063ffffffff16565b610467565b600061043d8560600151866101200151606001516108e0565b6101208601516040015186516001929092019250610465916001600160a01b0316908361086a565b505b6020840151600090610482906001600160a01b0316306107af565b9050846101200151602001516001600160a01b03168561012001516080015186610120015160a001516040516104b891906112df565b60006040518083038185875af1925050503d80600081146104f5576040519150601f19603f3d011682016040523d82523d6000602084013e6104fa565b606091505b5050809350506000831561058657602086015161052a90610524906001600160a01b0316306107af565b83610910565b9050600081116040518060400160405280601a81526020017f4f7264657220737563636573732062757420616d6f756e742030000000000000815250906105845760405162461bcd60e51b81526004016102e89190611354565b505b6105998660000151876020015133610933565b9150509250929050565b6040518060400160405280601a81526020017f4f7264657220737563636573732062757420616d6f756e74203000000000000081525081565b73ccf3d848e08b94478ed8f46ffead3008faf581fd81565b6105fc610c69565b8180602001905181019061061091906110e2565b92915050565b6040518060400160405280601581526020017413d99998da185a5b8819185d18481a5b9d985b1a59605a1b81525081565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190611000565b6001600160a01b0316146106fc5760405162461bcd60e51b81526004016102e890611367565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416141561075d576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610757573d6000803e3d6000fd5b50610771565b6107716001600160a01b0384168383610988565b505050565b6040518060400160405280601f81526020017f4e6f7420656e6f7567682065746820666f722070726f746f636f6c206665650081525081565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156107e757506001600160a01b03811631610610565b6040516370a0823160e01b81526001600160a01b038416906370a08231906108139085906004016112fb565b60206040518083038186803b15801561082b57600080fd5b505afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611239565b9392505050565b6108c18363095ea7b360e01b84600060405160240161088a92919061130f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526109a7565b6107718363095ea7b360e01b848460405160240161088a92919061132b565b6000816109016108f885670de0b6b3a7640000610a36565b60028504610a6d565b8161090857fe5b049392505050565b808203828111156106105760405162461bcd60e51b81526004016102e8906113c3565b61095473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82600019610a90565b5061096b6001600160a01b03841682600019610a90565b506109826001600160a01b03831682600019610a90565b50505050565b6107718363a9059cbb60e01b848460405160240161088a92919061132b565b60006109fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610b569092919063ffffffff16565b8051909150156107715780806020019051810190610a1a919061105c565b6107715760405162461bcd60e51b81526004016102e89061140b565b6000811580610a5157505080820282828281610a4e57fe5b04145b6106105760405162461bcd60e51b81526004016102e8906113c3565b808201828110156106105760405162461bcd60e51b81526004016102e8906113c3565b6000600019821415610aa957610aa684306107af565b91505b6001600160a01b03831615801590610aca57506001600160a01b0383163014155b8015610ad557508115155b15610b4f576001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b1757610b126001600160a01b0385168484610988565b610b4f565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610b4d573d6000803e3d6000fd5b505b5092915050565b6060610b658484600085610b6d565b949350505050565b6060610b7885610c30565b610b945760405162461bcd60e51b81526004016102e8906113d4565b600080866001600160a01b03168587604051610bb091906112df565b60006040518083038185875af1925050503d8060008114610bed576040519150601f19603f3d011682016040523d82523d6000602084013e610bf2565b606091505b50915091508115610c06579150610b659050565b805115610c165780518082602001fd5b8360405162461bcd60e51b81526004016102e89190611354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610b65575050151592915050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001610ce0610ce5565b905290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b803561020281611583565b805161020281611583565b600082601f830112610d5c578081fd5b8135610d6f610d6a82611535565b611511565b818152846020838601011115610d83578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112610dad578081fd5b8151610dbb610d6a82611535565b818152846020838601011115610dcf578283fd5b610b65826020830160208701611557565b6000610140808385031215610df3578182fd5b610dfc81611511565b915050610e0882610d36565b8152610e1660208301610d36565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a0820152610e4f60c08301610d36565b60c0820152610e6060e08301610d36565b60e08201526101008083013567ffffffffffffffff80821115610e8257600080fd5b610e8e86838701610d4c565b83850152610120925082850135915080821115610eaa57600080fd5b50610eb785828601610ec3565b82840152505092915050565b600060c08284031215610ed4578081fd5b60405160c0810167ffffffffffffffff8282108183111715610ef257fe5b81604052829350610f0285610d36565b8352610f1060208601610d36565b6020840152610f2160408601610d36565b6040840152606085013560608401526080850135608084015260a0850135915080821115610f4e57600080fd5b50610f5b85828601610d4c565b60a0830152505092915050565b600060c08284031215610f79578081fd5b60405160c0810167ffffffffffffffff8282108183111715610f9757fe5b81604052829350610fa785610d41565b8352610fb560208601610d41565b6020840152610fc660408601610d41565b6040840152606085015160608401526080850151608084015260a0850151915080821115610ff357600080fd5b50610f5b85828601610d9d565b600060208284031215611011578081fd5b815161086381611583565b600080600060608486031215611030578182fd5b833561103b81611583565b9250602084013561104b81611583565b929592945050506040919091013590565b60006020828403121561106d578081fd5b81518015158114610863578182fd5b60006020828403121561108d578081fd5b813567ffffffffffffffff8111156110a3578182fd5b610b6584828501610d4c565b6000602082840312156110c0578081fd5b813567ffffffffffffffff8111156110d6578182fd5b610b6584828501610de0565b6000602082840312156110f3578081fd5b815167ffffffffffffffff8082111561110a578283fd5b8184019150610140808387031215611120578384fd5b61112981611511565b905061113483610d41565b815261114260208401610d41565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261117b60c08401610d41565b60c082015261118c60e08401610d41565b60e082015261010080840151838111156111a4578586fd5b6111b088828701610d9d565b82840152505061012080840151838111156111c9578586fd5b6111d588828701610f68565b918301919091525095945050505050565b600080604083850312156111f8578081fd5b823567ffffffffffffffff81111561120e578182fd5b61121a85828601610de0565b92505060208301356002811061122e578182fd5b809150509250929050565b60006020828403121561124a578081fd5b5051919050565b6001600160a01b03169052565b60008151808452611276816020860160208601611557565b601f01601f19169290920160200192915050565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610b6560c085018261125e565b600082516112f1818460208701611557565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b600060208252610863602083018461125e565b60208082526014908201527336b9b39739b2b73232b9103737ba1037bbb732b960611b604082015260600190565b60208082526014908201527336b9b39739b2b73232b9103737ba1030b236b4b760611b604082015260600190565b602080825260009082015260400190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252611469602083018451611251565b602083015161147b6040840182611251565b506040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c08301516114b660e0840182611251565b5060e08301516101006114cb81850183611251565b8085015191505061014061012081818601526114eb61016086018461125e565b90860151858203601f190183870152909250611507838261128a565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561152d57fe5b604052919050565b600067ffffffffffffffff82111561154957fe5b50601f01601f191660200190565b60005b8381101561157257818101518382015260200161155a565b838111156109825750506000910152565b6001600160a01b038116811461159857600080fd5b5056fea2646970667358221220505c849832242a7364ef8f801add4d0c3081cbb1a7135582ca7fcc9c9c16f10864736f6c63430007060033
Deployed Bytecode
0x6080604052600436106100a05760003560e01c80638cedca71116100645780638cedca7114610144578063a3b8e5d114610166578063ae08fd1014610193578063c579d490146101a8578063cd4709cb14610144578063d59de696146101c8576100a7565b806308d4f52a146100ac57806326aa2bd2146100e257806341c0e1b5146100f75780634b9cb5081461010e57806365937d1f1461012f576100a7565b366100a757005b600080fd5b3480156100b857600080fd5b506100cc6100c73660046110af565b6101dd565b6040516100d99190611354565b60405180910390f35b3480156100ee57600080fd5b506100cc610207565b34801561010357600080fd5b5061010c610233565b005b61012161011c3660046111e6565b6102f4565b6040516100d9929190611344565b34801561013b57600080fd5b506100cc6105a3565b34801561015057600080fd5b506101596105dc565b6040516100d991906112fb565b34801561017257600080fd5b5061018661018136600461107c565b6105f4565b6040516100d99190611455565b34801561019f57600080fd5b506100cc610616565b3480156101b457600080fd5b5061010c6101c336600461101c565b610647565b3480156101d457600080fd5b506100cc610776565b6060816040516020016101f09190611455565b60405160208183030381529060405290505b919050565b6040518060400160405280601081526020016f4e6f7420656e6f7567682066756e647360801b81525081565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b15801561028a57600080fd5b505afa15801561029e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c29190611000565b6001600160a01b0316146102f15760405162461bcd60e51b81526004016102e890611395565b60405180910390fd5b33ff5b604082015182516000918291610313906001600160a01b0316306107af565b10156040518060400160405280601081526020016f4e6f7420656e6f7567682066756e647360801b8152509061035c5760405162461bcd60e51b81526004016102e89190611354565b506101208401516080015161038573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee306107af565b10156040518060400160405280601f81526020017f4e6f7420656e6f7567682065746820666f722070726f746f636f6c2066656500815250906103db5760405162461bcd60e51b81526004016102e89190611354565b5060008360018111156103ea57fe5b14156104245761041f84610120015160400151856040015186600001516001600160a01b031661086a9092919063ffffffff16565b610467565b600061043d8560600151866101200151606001516108e0565b6101208601516040015186516001929092019250610465916001600160a01b0316908361086a565b505b6020840151600090610482906001600160a01b0316306107af565b9050846101200151602001516001600160a01b03168561012001516080015186610120015160a001516040516104b891906112df565b60006040518083038185875af1925050503d80600081146104f5576040519150601f19603f3d011682016040523d82523d6000602084013e6104fa565b606091505b5050809350506000831561058657602086015161052a90610524906001600160a01b0316306107af565b83610910565b9050600081116040518060400160405280601a81526020017f4f7264657220737563636573732062757420616d6f756e742030000000000000815250906105845760405162461bcd60e51b81526004016102e89190611354565b505b6105998660000151876020015133610933565b9150509250929050565b6040518060400160405280601a81526020017f4f7264657220737563636573732062757420616d6f756e74203000000000000081525081565b73ccf3d848e08b94478ed8f46ffead3008faf581fd81565b6105fc610c69565b8180602001905181019061061091906110e2565b92915050565b6040518060400160405280601581526020017413d99998da185a5b8819185d18481a5b9d985b1a59605a1b81525081565b336001600160a01b031673ccf3d848e08b94478ed8f46ffead3008faf581fd6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190611000565b6001600160a01b0316146106fc5760405162461bcd60e51b81526004016102e890611367565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416141561075d576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610757573d6000803e3d6000fd5b50610771565b6107716001600160a01b0384168383610988565b505050565b6040518060400160405280601f81526020017f4e6f7420656e6f7567682065746820666f722070726f746f636f6c206665650081525081565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156107e757506001600160a01b03811631610610565b6040516370a0823160e01b81526001600160a01b038416906370a08231906108139085906004016112fb565b60206040518083038186803b15801561082b57600080fd5b505afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611239565b9392505050565b6108c18363095ea7b360e01b84600060405160240161088a92919061130f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526109a7565b6107718363095ea7b360e01b848460405160240161088a92919061132b565b6000816109016108f885670de0b6b3a7640000610a36565b60028504610a6d565b8161090857fe5b049392505050565b808203828111156106105760405162461bcd60e51b81526004016102e8906113c3565b61095473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82600019610a90565b5061096b6001600160a01b03841682600019610a90565b506109826001600160a01b03831682600019610a90565b50505050565b6107718363a9059cbb60e01b848460405160240161088a92919061132b565b60006109fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610b569092919063ffffffff16565b8051909150156107715780806020019051810190610a1a919061105c565b6107715760405162461bcd60e51b81526004016102e89061140b565b6000811580610a5157505080820282828281610a4e57fe5b04145b6106105760405162461bcd60e51b81526004016102e8906113c3565b808201828110156106105760405162461bcd60e51b81526004016102e8906113c3565b6000600019821415610aa957610aa684306107af565b91505b6001600160a01b03831615801590610aca57506001600160a01b0383163014155b8015610ad557508115155b15610b4f576001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b1757610b126001600160a01b0385168484610988565b610b4f565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610b4d573d6000803e3d6000fd5b505b5092915050565b6060610b658484600085610b6d565b949350505050565b6060610b7885610c30565b610b945760405162461bcd60e51b81526004016102e8906113d4565b600080866001600160a01b03168587604051610bb091906112df565b60006040518083038185875af1925050503d8060008114610bed576040519150601f19603f3d011682016040523d82523d6000602084013e610bf2565b606091505b50915091508115610c06579150610b659050565b805115610c165780518082602001fd5b8360405162461bcd60e51b81526004016102e89190611354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610b65575050151592915050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001610ce0610ce5565b905290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b803561020281611583565b805161020281611583565b600082601f830112610d5c578081fd5b8135610d6f610d6a82611535565b611511565b818152846020838601011115610d83578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112610dad578081fd5b8151610dbb610d6a82611535565b818152846020838601011115610dcf578283fd5b610b65826020830160208701611557565b6000610140808385031215610df3578182fd5b610dfc81611511565b915050610e0882610d36565b8152610e1660208301610d36565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a0820152610e4f60c08301610d36565b60c0820152610e6060e08301610d36565b60e08201526101008083013567ffffffffffffffff80821115610e8257600080fd5b610e8e86838701610d4c565b83850152610120925082850135915080821115610eaa57600080fd5b50610eb785828601610ec3565b82840152505092915050565b600060c08284031215610ed4578081fd5b60405160c0810167ffffffffffffffff8282108183111715610ef257fe5b81604052829350610f0285610d36565b8352610f1060208601610d36565b6020840152610f2160408601610d36565b6040840152606085013560608401526080850135608084015260a0850135915080821115610f4e57600080fd5b50610f5b85828601610d4c565b60a0830152505092915050565b600060c08284031215610f79578081fd5b60405160c0810167ffffffffffffffff8282108183111715610f9757fe5b81604052829350610fa785610d41565b8352610fb560208601610d41565b6020840152610fc660408601610d41565b6040840152606085015160608401526080850151608084015260a0850151915080821115610ff357600080fd5b50610f5b85828601610d9d565b600060208284031215611011578081fd5b815161086381611583565b600080600060608486031215611030578182fd5b833561103b81611583565b9250602084013561104b81611583565b929592945050506040919091013590565b60006020828403121561106d578081fd5b81518015158114610863578182fd5b60006020828403121561108d578081fd5b813567ffffffffffffffff8111156110a3578182fd5b610b6584828501610d4c565b6000602082840312156110c0578081fd5b813567ffffffffffffffff8111156110d6578182fd5b610b6584828501610de0565b6000602082840312156110f3578081fd5b815167ffffffffffffffff8082111561110a578283fd5b8184019150610140808387031215611120578384fd5b61112981611511565b905061113483610d41565b815261114260208401610d41565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261117b60c08401610d41565b60c082015261118c60e08401610d41565b60e082015261010080840151838111156111a4578586fd5b6111b088828701610d9d565b82840152505061012080840151838111156111c9578586fd5b6111d588828701610f68565b918301919091525095945050505050565b600080604083850312156111f8578081fd5b823567ffffffffffffffff81111561120e578182fd5b61121a85828601610de0565b92505060208301356002811061122e578182fd5b809150509250929050565b60006020828403121561124a578081fd5b5051919050565b6001600160a01b03169052565b60008151808452611276816020860160208601611557565b601f01601f19169290920160200192915050565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610b6560c085018261125e565b600082516112f1818460208701611557565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b600060208252610863602083018461125e565b60208082526014908201527336b9b39739b2b73232b9103737ba1037bbb732b960611b604082015260600190565b60208082526014908201527336b9b39739b2b73232b9103737ba1030b236b4b760611b604082015260600190565b602080825260009082015260400190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252611469602083018451611251565b602083015161147b6040840182611251565b506040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c08301516114b660e0840182611251565b5060e08301516101006114cb81850183611251565b8085015191505061014061012081818601526114eb61016086018461125e565b90860151858203601f190183870152909250611507838261128a565b9695505050505050565b60405181810167ffffffffffffffff8111828210171561152d57fe5b604052919050565b600067ffffffffffffffff82111561154957fe5b50601f01601f191660200190565b60005b8381101561157257818101518382015260200161155a565b838111156109825750506000910152565b6001600160a01b038116811461159857600080fd5b5056fea2646970667358221220505c849832242a7364ef8f801add4d0c3081cbb1a7135582ca7fcc9c9c16f10864736f6c63430007060033
Deployed Bytecode Sourcemap
19844:2434:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19278:134;;;;;;;;;;-1:-1:-1;19278:134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19970:58;;;;;;;;;;;;;:::i;12967:85::-;;;;;;;;;;;;;:::i;:::-;;20409:1771;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;20117:77::-;;;;;;;;;;;;;:::i;12240:68::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19420:159::-;;;;;;;;;;-1:-1:-1;19420:159:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17295:74::-;;;;;;;;;;;;;:::i;12605:316::-;;;;;;;;;;-1:-1:-1;12605:316:0;;;;;:::i;:::-;;:::i;20035:75::-;;;;;;;;;;;;;:::i;19278:134::-;19353:12;19396:7;19385:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;19378:26;;19278:134;;;;:::o;19970:58::-;;;;;;;;;;;;;;-1:-1:-1;;;19970:58:0;;;;:::o;12967:85::-;12504:10;-1:-1:-1;;;;;12482:32:0;12189:42;-1:-1:-1;;;;;12482:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12482:32:0;;12474:65;;;;-1:-1:-1;;;12474:65:0;;;;;;;:::i;:::-;;;;;;;;;13032:10:::1;13011:33;20409:1771:::0;20710:17;;;;20665:15;;20541:12;;;;20665:41;;-1:-1:-1;;;;;20665:26:0;20700:4;20665:26;:41::i;:::-;:62;;20729:14;;;;;;;;;;;;;-1:-1:-1;;;20729:14:0;;;20657:87;;;;;-1:-1:-1;;;20657:87:0;;;;;;;;:::i;:::-;-1:-1:-1;20812:20:0;;;;:32;;;20763:45;13792:42;20802:4;20763:30;:45::i;:::-;:81;;20846:16;;;;;;;;;;;;;;;;;20755:108;;;;;-1:-1:-1;;;20755:108:0;;;;;;;;:::i;:::-;-1:-1:-1;21086:23:0;21077:5;:32;;;;;;;;;21073:384;;;21126:92;21162:7;:20;;;:36;;;21200:7;:17;;;21133:7;:15;;;-1:-1:-1;;;;;21126:35:0;;;:92;;;;;:::i;:::-;21073:384;;;21251:14;21268:52;21273:7;:18;;;21293:7;:20;;;:26;;;21268:4;:52::i;:::-;21397:20;;;;:36;;;21368:15;;21323:1;21268:56;;;;;-1:-1:-1;21361:84:0;;-1:-1:-1;;;;;21361:35:0;;21268:56;21361:35;:84::i;:::-;21073:384;;21492:16;;;;21469:20;;21492:42;;-1:-1:-1;;;;;21492:27:0;21528:4;21492:27;:42::i;:::-;21469:65;;21559:7;:20;;;:33;;;-1:-1:-1;;;;;21559:38:0;21605:7;:20;;;:32;;;21639:7;:20;;;:29;;;21559:110;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21545:124;;;;;21680:21;21722:7;21718:245;;;21828:16;;;;21824:61;;21828:42;;-1:-1:-1;;;;;21828:27:0;21864:4;21828:27;:42::i;:::-;21872:12;21824:3;:61::i;:::-;21808:77;;21924:1;21908:13;:17;21927:23;;;;;;;;;;;;;;;;;21900:51;;;;;-1:-1:-1;;;21900:51:0;;;;;;;;:::i;:::-;;21718:245;22069:59;22082:7;:15;;;22099:7;:16;;;22117:10;22069:12;:59::i;:::-;22158:13;-1:-1:-1;;20409:1771:0;;;;;:::o;20117:77::-;;;;;;;;;;;;;;;;;;;:::o;12240:68::-;12189:42;12240:68;:::o;19420:159::-;19488:27;;:::i;:::-;19549:5;19538:33;;;;;;;;;;;;:::i;:::-;19528:43;19420:159;-1:-1:-1;;19420:159:0:o;17295:74::-;;;;;;;;;;;;;;-1:-1:-1;;;17295:74:0;;;;:::o;12605:316::-;12379:10;-1:-1:-1;;;;;12357:32:0;12189:42;-1:-1:-1;;;;;12357:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12357:32:0;;12349:65;;;;-1:-1:-1;;;12349:65:0;;;;;;;:::i;:::-;12727:42:::1;-1:-1:-1::0;;;;;12717:52:0;::::1;;12713:201;;;12786:36;::::0;-1:-1:-1;;;;;12786:27:0;::::1;::::0;:36;::::1;;;::::0;12814:7;;12786:36:::1;::::0;;;12814:7;12786:27;:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;12713:201;;;12855:47;-1:-1:-1::0;;;;;12855:27:0;::::1;12883:9:::0;12894:7;12855:27:::1;:47::i;:::-;12605:316:::0;;;:::o;20035:75::-;;;;;;;;;;;;;;;;;;;:::o;15711:252::-;15788:7;-1:-1:-1;;;;;15812:22:0;;13792:42;15812:22;15808:148;;;-1:-1:-1;;;;;;15858:12:0;;;15851:19;;15808:148;15910:34;;-1:-1:-1;;;15910:34:0;;-1:-1:-1;;;;;15910:28:0;;;;;:34;;15939:4;;15910:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15903:41;15711:252;-1:-1:-1;;;15711:252:0:o;6598:316::-;6719:86;6739:5;6769:22;;;6793:7;6802:1;6746:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6746:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;6746:58:0;-1:-1:-1;;;;;;6746:58:0;;;;;;;;;;6719:19;:86::i;:::-;6816:90;6836:5;6866:22;;;6890:7;6899:5;6843:62;;;;;;;;;:::i;9533:120::-;9592:9;9644:1;9618:23;9622:11;9626:1;9222:6;9622:3;:11::i;:::-;9639:1;9635;:5;9618:3;:23::i;:::-;:27;;;;;;;9533:120;-1:-1:-1;;;9533:120:0:o;8363:117::-;8456:5;;;8451:16;;;;8443:29;;;;-1:-1:-1;;;8443:29:0;;;;;;;:::i;17413:358::-;17586:58;13792:42;17621:3;-1:-1:-1;;17586:34:0;:58::i;:::-;-1:-1:-1;17657:47:0;-1:-1:-1;;;;;17657:23:0;;17681:3;-1:-1:-1;;17657:23:0;:47::i;:::-;-1:-1:-1;17715:48:0;-1:-1:-1;;;;;17715:24:0;;17740:3;-1:-1:-1;;17715:24:0;:48::i;:::-;;17413:358;;;:::o;5984:211::-;6101:86;6121:5;6151:23;;;6176:2;6180:5;6128:58;;;;;;;;;:::i;7734:468::-;7815:23;7841:106;7883:4;7841:106;;;;;;;;;;;;;;;;;7849:5;-1:-1:-1;;;;;7841:27:0;;;:106;;;;;:::i;:::-;7962:17;;7815:132;;-1:-1:-1;7962:21:0;7958:237;;8117:10;8106:30;;;;;;;;;;;;:::i;:::-;8098:85;;;;-1:-1:-1;;;8098:85:0;;;;;;;:::i;8488:131::-;8546:9;8576:6;;;:30;;-1:-1:-1;;8591:5:0;;;8605:1;8600;8591:5;8600:1;8586:15;;;;;:20;8576:30;8568:43;;;;-1:-1:-1;;;8568:43:0;;;;;;;:::i;8238:117::-;8331:5;;;8326:16;;;;8318:29;;;;-1:-1:-1;;;8318:29:0;;;;;;;:::i;14926:552::-;15048:7;-1:-1:-1;;15072:7:0;:28;15068:104;;;15127:33;15138:6;15154:4;15127:10;:33::i;:::-;15117:43;;15068:104;-1:-1:-1;;;;;15188:17:0;;;;;;:41;;-1:-1:-1;;;;;;15209:20:0;;15224:4;15209:20;;15188:41;:57;;;;-1:-1:-1;15233:12:0;;;15188:57;15184:260;;;-1:-1:-1;;;;;15266:18:0;;13792:42;15266:18;15262:171;;15305:41;-1:-1:-1;;;;;15305:27:0;;15333:3;15338:7;15305:27;:41::i;:::-;15262:171;;;15387:30;;-1:-1:-1;;;;;15387:21:0;;;:30;;;;;15409:7;;15387:30;;;;15409:7;15387:21;:30;;;;;;;;;;;;;;;;;;;;;15262:171;-1:-1:-1;15463:7:0;14926:552;-1:-1:-1;;14926:552:0:o;2084:230::-;2221:12;2253:53;2276:6;2284:4;2290:1;2293:12;2253:22;:53::i;:::-;2246:60;2084:230;-1:-1:-1;;;;2084:230:0:o;2970:1020::-;3143:12;3176:18;3187:6;3176:10;:18::i;:::-;3168:60;;;;-1:-1:-1;;;3168:60:0;;;;;;;:::i;:::-;3302:12;3316:23;3343:6;-1:-1:-1;;;;;3343:11:0;3362:8;3372:4;3343:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3301:76;;;;3392:7;3388:595;;;3423:10;-1:-1:-1;3416:17:0;;-1:-1:-1;3416:17:0;3388:595;3537:17;;:21;3533:439;;3800:10;3794:17;3861:15;3848:10;3844:2;3840:19;3833:44;3748:148;3943:12;3936:20;;-1:-1:-1;;;3936:20:0;;;;;;;;:::i;849:641::-;909:4;1390:20;;1220:66;1439:23;;;;;;:42;;-1:-1:-1;;1466:15:0;;;1431:51;-1:-1:-1;;849:641:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:142::-;238:13;;260:33;238:13;260:33;:::i;304:485::-;;401:3;394:4;386:6;382:17;378:27;368:2;;423:5;416;409:20;368:2;463:6;450:20;494:49;509:33;539:2;509:33;:::i;:::-;494:49;:::i;:::-;568:2;559:7;552:19;614:3;607:4;602:2;594:6;590:15;586:26;583:35;580:2;;;635:5;628;621:20;580:2;704;697:4;689:6;685:17;678:4;669:7;665:18;652:55;727:16;;;745:4;723:27;716:42;;;;731:7;358:431;-1:-1:-1;;358:431:1:o;794:447::-;;902:3;895:4;887:6;883:17;879:27;869:2;;924:5;917;910:20;869:2;957:6;951:13;988:49;1003:33;1033:2;1003:33;:::i;988:49::-;1062:2;1053:7;1046:19;1108:3;1101:4;1096:2;1088:6;1084:15;1080:26;1077:35;1074:2;;;1129:5;1122;1115:20;1074:2;1146:64;1207:2;1200:4;1191:7;1187:18;1180:4;1172:6;1168:17;1146:64;:::i;1246:1205::-;;1338:6;1381:2;1369:9;1364:3;1360:19;1356:28;1353:2;;;1401:5;1394;1387:20;1353:2;1427:18;1442:2;1427:18;:::i;:::-;1418:27;;;1468:31;1489:9;1468:31;:::i;:::-;1461:5;1454:46;1532:40;1568:2;1557:9;1553:18;1532:40;:::i;:::-;1527:2;1520:5;1516:14;1509:64;1633:2;1622:9;1618:18;1605:32;1600:2;1593:5;1589:14;1582:56;1698:2;1687:9;1683:18;1670:32;1665:2;1658:5;1654:14;1647:56;1764:3;1753:9;1749:19;1736:33;1730:3;1723:5;1719:15;1712:58;1831:3;1820:9;1816:19;1803:33;1797:3;1790:5;1786:15;1779:58;1870:41;1906:3;1895:9;1891:19;1870:41;:::i;:::-;1864:3;1857:5;1853:15;1846:66;1945:41;1981:3;1970:9;1966:19;1945:41;:::i;:::-;1939:3;1932:5;1928:15;1921:66;2006:3;2060:2;2049:9;2045:18;2032:32;2083:18;2124:2;2116:6;2113:14;2110:2;;;2140:1;2137;2130:12;2110:2;2176:47;2219:3;2210:6;2199:9;2195:22;2176:47;:::i;:::-;2171:2;2164:5;2160:14;2153:71;2243:3;2233:13;;2299:2;2288:9;2284:18;2271:32;2255:48;;2328:2;2318:8;2315:16;2312:2;;;2344:1;2341;2334:12;2312:2;;2380:64;2440:3;2429:8;2418:9;2414:24;2380:64;:::i;:::-;2375:2;2368:5;2364:14;2357:88;;;1318:1133;;;;:::o;2456:905::-;;2566:4;2554:9;2549:3;2545:19;2541:30;2538:2;;;2588:5;2581;2574:20;2538:2;2625;2619:9;2667:4;2659:6;2655:17;2691:18;2759:6;2747:10;2744:22;2739:2;2727:10;2724:18;2721:46;2718:2;;;2770:9;2718:2;2801:10;2797:2;2790:22;2830:6;2821:15;;2860:31;2881:9;2860:31;:::i;:::-;2852:6;2845:47;2925:40;2961:2;2950:9;2946:18;2925:40;:::i;:::-;2920:2;2912:6;2908:15;2901:65;2999:40;3035:2;3024:9;3020:18;2999:40;:::i;:::-;2994:2;2986:6;2982:15;2975:65;3101:2;3090:9;3086:18;3073:32;3068:2;3060:6;3056:15;3049:57;3168:3;3157:9;3153:19;3140:33;3134:3;3126:6;3122:16;3115:59;3225:3;3214:9;3210:19;3197:33;3183:47;;3253:2;3245:6;3242:14;3239:2;;;3269:1;3266;3259:12;3239:2;;3307:47;3350:3;3341:6;3330:9;3326:22;3307:47;:::i;:::-;3301:3;3293:6;3289:16;3282:73;;;2528:833;;;;:::o;3366:939::-;;3487:4;3475:9;3470:3;3466:19;3462:30;3459:2;;;3509:5;3502;3495:20;3459:2;3546;3540:9;3588:4;3580:6;3576:17;3612:18;3680:6;3668:10;3665:22;3660:2;3648:10;3645:18;3642:46;3639:2;;;3691:9;3639:2;3722:10;3718:2;3711:22;3751:6;3742:15;;3781:42;3813:9;3781:42;:::i;:::-;3773:6;3766:58;3857:51;3904:2;3893:9;3889:18;3857:51;:::i;:::-;3852:2;3844:6;3840:15;3833:76;3942:51;3989:2;3978:9;3974:18;3942:51;:::i;:::-;3937:2;3929:6;3925:15;3918:76;4048:2;4037:9;4033:18;4027:25;4022:2;4014:6;4010:15;4003:50;4108:3;4097:9;4093:19;4087:26;4081:3;4073:6;4069:16;4062:52;4158:3;4147:9;4143:19;4137:26;4123:40;;4186:2;4178:6;4175:14;4172:2;;;4202:1;4199;4192:12;4172:2;;4240:58;4294:3;4285:6;4274:9;4270:22;4240:58;:::i;4310:263::-;;4433:2;4421:9;4412:7;4408:23;4404:32;4401:2;;;4454:6;4446;4439:22;4401:2;4491:9;4485:16;4510:33;4537:5;4510:33;:::i;4578:470::-;;;;4724:2;4712:9;4703:7;4699:23;4695:32;4692:2;;;4745:6;4737;4730:22;4692:2;4789:9;4776:23;4808:33;4835:5;4808:33;:::i;:::-;4860:5;-1:-1:-1;4917:2:1;4902:18;;4889:32;4930:35;4889:32;4930:35;:::i;:::-;4682:366;;4984:7;;-1:-1:-1;;;5038:2:1;5023:18;;;;5010:32;;4682:366::o;5053:297::-;;5173:2;5161:9;5152:7;5148:23;5144:32;5141:2;;;5194:6;5186;5179:22;5141:2;5231:9;5225:16;5284:5;5277:13;5270:21;5263:5;5260:32;5250:2;;5311:6;5303;5296:22;5355:342;;5476:2;5464:9;5455:7;5451:23;5447:32;5444:2;;;5497:6;5489;5482:22;5444:2;5542:9;5529:23;5575:18;5567:6;5564:30;5561:2;;;5612:6;5604;5597:22;5561:2;5640:51;5683:7;5674:6;5663:9;5659:22;5640:51;:::i;5702:378::-;;5844:2;5832:9;5823:7;5819:23;5815:32;5812:2;;;5865:6;5857;5850:22;5812:2;5910:9;5897:23;5943:18;5935:6;5932:30;5929:2;;;5980:6;5972;5965:22;5929:2;6008:66;6066:7;6057:6;6046:9;6042:22;6008:66;:::i;6085:1449::-;;6238:2;6226:9;6217:7;6213:23;6209:32;6206:2;;;6259:6;6251;6244:22;6206:2;6297:9;6291:16;6326:18;6367:2;6359:6;6356:14;6353:2;;;6388:6;6380;6373:22;6353:2;6431:6;6420:9;6416:22;6406:32;;6457:6;6497:2;6492;6483:7;6479:16;6475:25;6472:2;;;6518:6;6510;6503:22;6472:2;6549:18;6564:2;6549:18;:::i;:::-;6536:31;;6590:35;6622:2;6590:35;:::i;:::-;6583:5;6576:50;6658:44;6698:2;6694;6690:11;6658:44;:::i;:::-;6653:2;6646:5;6642:14;6635:68;6749:2;6745;6741:11;6735:18;6730:2;6723:5;6719:14;6712:42;6800:2;6796;6792:11;6786:18;6781:2;6774:5;6770:14;6763:42;6852:3;6848:2;6844:12;6838:19;6832:3;6825:5;6821:15;6814:44;6905:3;6901:2;6897:12;6891:19;6885:3;6878:5;6874:15;6867:44;6944:45;6984:3;6980:2;6976:12;6944:45;:::i;:::-;6938:3;6931:5;6927:15;6920:70;7023:45;7063:3;7059:2;7055:12;7023:45;:::i;:::-;7017:3;7010:5;7006:15;6999:70;7088:3;7130:2;7126;7122:11;7116:18;7159:2;7149:8;7146:16;7143:2;;;7180:6;7172;7165:22;7143:2;7221:57;7270:7;7259:8;7255:2;7251:17;7221:57;:::i;:::-;7216:2;7209:5;7205:14;7198:81;;;7298:3;7340:2;7336;7332:11;7326:18;7369:2;7359:8;7356:16;7353:2;;;7390:6;7382;7375:22;7353:2;7431:72;7495:7;7484:8;7480:2;7476:17;7431:72;:::i;:::-;7415:14;;;7408:96;;;;-1:-1:-1;7419:5:1;6196:1338;-1:-1:-1;;;;;6196:1338:1:o;7539:555::-;;;7721:2;7709:9;7700:7;7696:23;7692:32;7689:2;;;7742:6;7734;7727:22;7689:2;7787:9;7774:23;7820:18;7812:6;7809:30;7806:2;;;7857:6;7849;7842:22;7806:2;7885:66;7943:7;7934:6;7923:9;7919:22;7885:66;:::i;:::-;7875:76;;;8001:2;7990:9;7986:18;7973:32;8034:1;8027:5;8024:12;8014:2;;8055:6;8047;8040:22;8014:2;8083:5;8073:15;;;7679:415;;;;;:::o;8099:194::-;;8222:2;8210:9;8201:7;8197:23;8193:32;8190:2;;;8243:6;8235;8228:22;8190:2;-1:-1:-1;8271:16:1;;8180:113;-1:-1:-1;8180:113:1:o;8298:106::-;-1:-1:-1;;;;;8366:31:1;8354:44;;8344:60::o;8409:259::-;;8490:5;8484:12;8517:6;8512:3;8505:19;8533:63;8589:6;8582:4;8577:3;8573:14;8566:4;8559:5;8555:16;8533:63;:::i;:::-;8650:2;8629:15;-1:-1:-1;;8625:29:1;8616:39;;;;8657:4;8612:50;;8460:208;-1:-1:-1;;8460:208:1:o;8673:549::-;;8776:1;8772;8767:3;8763:11;8759:19;8817:2;8809:5;8803:12;8799:21;8794:3;8787:34;8882:2;8874:4;8867:5;8863:16;8857:23;8853:32;8846:4;8841:3;8837:14;8830:56;8947:2;8939:4;8932:5;8928:16;8922:23;8918:32;8911:4;8906:3;8902:14;8895:56;;9000:4;8993:5;8989:16;8983:23;8976:4;8971:3;8967:14;8960:47;9056:4;9049:5;9045:16;9039:23;9032:4;9027:3;9023:14;9016:47;9109:4;9102:5;9098:16;9092:23;9147:4;9140;9135:3;9131:14;9124:28;9168:48;9210:4;9205:3;9201:14;9187:12;9168:48;:::i;9227:274::-;;9394:6;9388:13;9410:53;9456:6;9451:3;9444:4;9436:6;9432:17;9410:53;:::i;:::-;9479:16;;;;;9364:137;-1:-1:-1;;9364:137:1:o;9506:203::-;-1:-1:-1;;;;;9670:32:1;;;;9652:51;;9640:2;9625:18;;9607:102::o;9714:291::-;-1:-1:-1;;;;;9912:32:1;;;;9894:51;;9993:4;9981:17;9976:2;9961:18;;9954:45;9882:2;9867:18;;9849:156::o;10010:274::-;-1:-1:-1;;;;;10202:32:1;;;;10184:51;;10266:2;10251:18;;10244:34;10172:2;10157:18;;10139:145::o;10289:258::-;10482:14;;10475:22;10457:41;;10529:2;10514:18;;10507:34;10445:2;10430:18;;10412:135::o;10552:219::-;;10699:2;10688:9;10681:21;10719:46;10761:2;10750:9;10746:18;10738:6;10719:46;:::i;11229:344::-;11431:2;11413:21;;;11470:2;11450:18;;;11443:30;-1:-1:-1;;;11504:2:1;11489:18;;11482:50;11564:2;11549:18;;11403:170::o;11578:344::-;11780:2;11762:21;;;11819:2;11799:18;;;11792:30;-1:-1:-1;;;11853:2:1;11838:18;;11831:50;11913:2;11898:18;;11752:170::o;11927:287::-;12129:2;12111:21;;;11927:287;12148:18;;;12141:32;12205:2;12190:18;;12101:113::o;12219:353::-;12421:2;12403:21;;;12460:2;12440:18;;;12433:30;12499:31;12494:2;12479:18;;12472:59;12563:2;12548:18;;12393:179::o;12577:406::-;12779:2;12761:21;;;12818:2;12798:18;;;12791:30;12857:34;12852:2;12837:18;;12830:62;-1:-1:-1;;;12923:2:1;12908:18;;12901:40;12973:3;12958:19;;12751:232::o;12988:1295::-;;13177:2;13166:9;13159:21;13189:55;13240:2;13229:9;13225:18;13216:6;13210:13;13189:55;:::i;:::-;13291:2;13283:6;13279:15;13273:22;13304:54;13354:2;13343:9;13339:18;13325:12;13304:54;:::i;:::-;;13412:2;13404:6;13400:15;13394:22;13389:2;13378:9;13374:18;13367:50;13472:2;13464:6;13460:15;13454:22;13448:3;13437:9;13433:19;13426:51;13532:3;13524:6;13520:16;13514:23;13508:3;13497:9;13493:19;13486:52;13593:3;13585:6;13581:16;13575:23;13569:3;13558:9;13554:19;13547:52;13648:3;13640:6;13636:16;13630:23;13662:57;13714:3;13703:9;13699:19;13683:14;13662:57;:::i;:::-;;13768:3;13760:6;13756:16;13750:23;13792:3;13804:56;13856:2;13845:9;13841:18;13825:14;13804:56;:::i;:::-;13909:2;13901:6;13897:15;13891:22;13869:44;;;13932:6;13957:3;13996:2;13991;13980:9;13976:18;13969:30;14022:55;14072:3;14061:9;14057:19;14041:14;14022:55;:::i;:::-;14114:15;;;14108:22;14170;;;-1:-1:-1;;14166:36:1;14146:18;;;14139:64;14008:69;;-1:-1:-1;14220:57:1;14008:69;14108:22;14220:57;:::i;:::-;14212:65;13149:1134;-1:-1:-1;;;;;;13149:1134:1:o;14288:242::-;14358:2;14352:9;14388:17;;;14435:18;14420:34;;14456:22;;;14417:62;14414:2;;;14482:9;14414:2;14509;14502:22;14332:198;;-1:-1:-1;14332:198:1:o;14535:181::-;;14618:18;14610:6;14607:30;14604:2;;;14640:9;14604:2;-1:-1:-1;14699:2:1;14676:17;-1:-1:-1;;14672:31:1;14705:4;14668:42;;14594:122::o;14721:258::-;14793:1;14803:113;14817:6;14814:1;14811:13;14803:113;;;14893:11;;;14887:18;14874:11;;;14867:39;14839:2;14832:10;14803:113;;;14934:6;14931:1;14928:13;14925:2;;;-1:-1:-1;;14969:1:1;14951:16;;14944:27;14774:205::o;14984:133::-;-1:-1:-1;;;;;15061:31:1;;15051:42;;15041:2;;15107:1;15104;15097:12;15041:2;15031:86;:::o
Swarm Source
ipfs://505c849832242a7364ef8f801add4d0c3081cbb1a7135582ca7fcc9c9c16f108
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.