Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 19938385 | 91 days ago | IN | 0 ETH | 0.02815177 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenControllerV3
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-24 */ /** *Submitted for verification at Etherscan.io on 2024-05-08 */ // Dependency file: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT // pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // Dependency file: contracts/interface/IRegistry.sol // pragma solidity 0.6.10; interface IRegistry { function hasAttribute(address _who, bytes32 _attribute) external view returns (bool); } // Dependency file: contracts/interface/IOwnedUpgradeabilityProxy.sol // pragma solidity 0.6.10; interface IOwnedUpgradeabilityProxy { function transferProxyOwnership(address newOwner) external; function claimProxyOwnership() external; function upgradeTo(address implementation) external; } // Dependency file: contracts/interface/ITrueCurrency.sol // pragma solidity 0.6.10; // import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface ITrueCurrency { function mint(address account, uint256 amount) external; function burn(uint256 amount) external; function setCanBurn(address account, bool _canBurn) external; function setBurnBounds(uint256 _min, uint256 _max) external; function reclaimEther(address payable _to) external; function reclaimToken(IERC20 token, address _to) external; function setBlacklisted(address account, bool isBlacklisted) external; function destroyBlackFunds(address _blackListedUser) external; } // Dependency file: contracts/interface/IProofOfReserveToken.sol // pragma solidity 0.6.10; interface IProofOfReserveToken { /*** Admin Functions ***/ function setChainReserveFeed(address newFeed) external; function setChainReserveHeartbeat(uint256 newHeartbeat) external; function enableProofOfReserve() external; function disableProofOfReserve() external; /*** Events ***/ /** * @notice Event emitted when the feed is updated */ event NewChainReserveFeed(address oldFeed, address newFeed); /** * @notice Event emitted when the heartbeat of chain reserve feed is updated */ event NewChainReserveHeartbeat(uint256 oldHeartbeat, uint256 newHeartbeat); /** * @notice Event emitted when Proof of Reserve is enabled */ event ProofOfReserveEnabled(); /** * @notice Event emitted when Proof of Reserve is disabled */ event ProofOfReserveDisabled(); } // Root file: contracts/TokenControllerV3.sol pragma solidity 0.6.10; // import {SafeMath} from "@openzeppelin/contracts/math/SafeMath.sol"; // import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import {IRegistry} from "contracts/interface/IRegistry.sol"; // import {IOwnedUpgradeabilityProxy} from "contracts/interface/IOwnedUpgradeabilityProxy.sol"; // import {ITrueCurrency} from "contracts/interface/ITrueCurrency.sol"; // import {IProofOfReserveToken} from "contracts/interface/IProofOfReserveToken.sol"; /** @title TokenController * @dev This contract allows us to split ownership of the TrueCurrency contract * into two addresses. One, called the "owner" address, has unfettered control of the TrueCurrency contract - * it can mint new tokens, transfer ownership of the contract, etc. However to make * extra sure that TrueCurrency is never compromised, this owner key will not be used in * day-to-day operations, allowing it to be stored at a heightened level of security. * Instead, the owner appoints an various "admin" address. * There are 3 different types of admin addresses; MintKey, MintRatifier, and MintPauser. * MintKey can request and revoke mints one at a time. * MintPausers can pause individual mints or pause all mints. * MintRatifiers can approve and finalize mints with enough approval. * There are three levels of mints: instant mint, ratified mint, and multiSig mint. Each have a different threshold * and deduct from a different pool. * Instant mint has the lowest threshold and finalizes instantly without any ratifiers. Deduct from instant mint pool, * which can be refilled by one ratifier. * Ratify mint has the second lowest threshold and finalizes with one ratifier approval. Deduct from ratify mint pool, * which can be refilled by three ratifiers. * MultiSig mint has the highest threshold and finalizes with three ratifier approvals. Deduct from multiSig mint pool, * which can only be refilled by the owner. */ contract TokenControllerV3 { using SafeMath for uint256; struct MintOperation { address to; uint256 value; uint256 requestedBlock; uint256 numberOfApproval; bool paused; mapping(address => bool) approved; } address payable public owner; address payable public pendingOwner; bool public initialized; uint256 public instantMintThreshold; uint256 public ratifiedMintThreshold; uint256 public multiSigMintThreshold; uint256 public instantMintLimit; uint256 public ratifiedMintLimit; uint256 public multiSigMintLimit; uint256 public instantMintPool; uint256 public ratifiedMintPool; uint256 public multiSigMintPool; address[2] public ratifiedPoolRefillApprovals; uint8 public constant RATIFY_MINT_SIGS = 1; //number of approvals needed to finalize a Ratified Mint uint8 public constant MULTISIG_MINT_SIGS = 3; //number of approvals needed to finalize a MultiSig Mint bool public mintPaused; uint256 public mintReqInvalidBeforeThisBlock; //all mint request before this block are invalid address public mintKey; MintOperation[] public mintOperations; //list of a mint requests ITrueCurrency public token; IRegistry public registry; address public fastPause; // deprecated address public trueRewardManager; // deprecated address public proofOfReserveEnabler; // Registry attributes for admin keys bytes32 public constant IS_MINT_PAUSER = "isTUSDMintPausers"; bytes32 public constant IS_MINT_RATIFIER = "isTUSDMintRatifier"; // bytes32 public constant IS_REDEMPTION_ADMIN = "isTUSDRedemptionAdmin"; // deprecated // bytes32 public constant IS_GAS_REFUNDER = "isGasRefunder"; // deprecated bytes32 public constant IS_REGISTRY_ADMIN = "isRegistryAdmin"; bytes32 public constant IS_BLACKLIST_ADMIN = "isBlacklistAdmin"; // paused version of TrueCurrency in Production // pausing the contract upgrades the proxy to this implementation address public constant PAUSED_IMPLEMENTATION = 0x3c8984DCE8f68FCDEEEafD9E0eca3598562eD291; modifier onlyMintKeyOrOwner() { require(msg.sender == mintKey || msg.sender == owner, "must be mintKey or owner"); _; } modifier onlyMintPauserOrOwner() { require(registry.hasAttribute(msg.sender, IS_MINT_PAUSER) || msg.sender == owner, "must be pauser or owner"); _; } modifier onlyMintRatifierOrOwner() { require(registry.hasAttribute(msg.sender, IS_MINT_RATIFIER) || msg.sender == owner, "must be ratifier or owner"); _; } modifier onlyRegistryAdminOrOwner() { require(registry.hasAttribute(msg.sender, IS_REGISTRY_ADMIN) || msg.sender == owner, "must be registry admin or owner"); _; } modifier onlyBlacklistAdminOrOwner() { require(registry.hasAttribute(msg.sender, IS_BLACKLIST_ADMIN) || msg.sender == owner, "must be blacklist admin or owner"); _; } //mint operations by the mintkey cannot be processed on when mints are paused modifier mintNotPaused() { if (msg.sender != owner) { require(!mintPaused, "minting is paused"); } _; } /// @dev Emitted when ownership of controller was transferred event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @dev Emitted when ownership of controller transfer procedure was started event NewOwnerPending(address indexed currentOwner, address indexed pendingOwner); /// @dev Emitted when new registry was set event SetRegistry(address indexed registry); /// @dev Emitted when owner was transferred for child contract // event TransferChild(address indexed child, address indexed newOwner); /// @dev Emitted when child ownership was claimed event RequestReclaimContract(address indexed other); /// @dev Emitted when child token was changed event SetToken(ITrueCurrency newContract); /// @dev Emitted when mint was requested event RequestMint(address indexed to, uint256 indexed value, uint256 opIndex, address mintKey); /// @dev Emitted when mint was finalized event FinalizeMint(address indexed to, uint256 indexed value, uint256 opIndex, address mintKey); /// @dev Emitted on instant mint event InstantMint(address indexed to, uint256 indexed value, address indexed mintKey); /// @dev Emitted when mint key was replaced event TransferMintKey(address indexed previousMintKey, address indexed newMintKey); /// @dev Emitted when Proof Of Reserve enabler was set event ProofOfReserveEnablerSet(address previousEnabler, address newEnabler); /// @dev Emitted when mint was ratified event MintRatified(uint256 indexed opIndex, address indexed ratifier); /// @dev Emitted when mint is revoked event RevokeMint(uint256 opIndex); /// @dev Emitted when all mining is paused (status=true) or unpaused (status=false) event AllMintsPaused(bool status); /// @dev Emitted when opIndex mint is paused (status=true) or unpaused (status=false) event MintPaused(uint256 opIndex, bool status); /// @dev Emitted when mint is approved event MintApproved(address approver, uint256 opIndex); /// @dev Emitted when fast pause contract is changed event FastPauseSet(address _newFastPause); /// @dev Emitted when mint threshold changes event MintThresholdChanged(uint256 instant, uint256 ratified, uint256 multiSig); /// @dev Emitted when mint limits change event MintLimitsChanged(uint256 instant, uint256 ratified, uint256 multiSig); /// @dev Emitted when instant mint pool is refilled event InstantPoolRefilled(); /// @dev Emitted when instant mint pool is ratified event RatifyPoolRefilled(); /// @dev Emitted when multisig mint pool is ratified event MultiSigPoolRefilled(); /* ======================================== Ownership functions ======================================== */ /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, "only Owner"); _; } /** * @dev Modifier throws if called by any account other than the pendingOwner. */ modifier onlyPendingOwner() { require(msg.sender == pendingOwner); _; } /** * @dev Modifier throws if called by any account other than proofOfReserveEnabler or owner. */ modifier onlyProofOfReserveEnablerOrOwner() { require(msg.sender == proofOfReserveEnabler || msg.sender == owner, "only proofOfReserveEnabler or owner"); _; } /** * @dev Allows the current owner to set the pendingOwner address. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address payable newOwner) external onlyOwner { pendingOwner = newOwner; emit NewOwnerPending(address(owner), address(pendingOwner)); } /** * @dev Allows the pendingOwner address to finalize the transfer. */ function claimOwnership() external onlyPendingOwner { emit OwnershipTransferred(address(owner), address(pendingOwner)); owner = pendingOwner; pendingOwner = address(0); } /* ======================================== proxy functions ======================================== */ function transferTrueCurrencyProxyOwnership(address _newOwner) external onlyOwner { IOwnedUpgradeabilityProxy(address(token)).transferProxyOwnership(_newOwner); } function claimTrueCurrencyProxyOwnership() external onlyOwner { IOwnedUpgradeabilityProxy(address(token)).claimProxyOwnership(); } function upgradeTrueCurrencyProxyImplTo(address _implementation) external onlyOwner { IOwnedUpgradeabilityProxy(address(token)).upgradeTo(_implementation); } /* ======================================== Minting functions ======================================== */ /** * @dev set the threshold for a mint to be considered an instant mint, * ratify mint and multiSig mint. Instant mint requires no approval, * ratify mint requires 1 approval and multiSig mint requires 3 approvals */ function setMintThresholds( uint256 _instant, uint256 _ratified, uint256 _multiSig ) external onlyOwner { require(_instant <= _ratified && _ratified <= _multiSig); instantMintThreshold = _instant; ratifiedMintThreshold = _ratified; multiSigMintThreshold = _multiSig; emit MintThresholdChanged(_instant, _ratified, _multiSig); } /** * @dev set the limit of each mint pool. For example can only instant mint up to the instant mint pool limit * before needing to refill */ function setMintLimits( uint256 _instant, uint256 _ratified, uint256 _multiSig ) external onlyOwner { require(_instant <= _ratified && _ratified <= _multiSig); instantMintLimit = _instant; if (instantMintPool > instantMintLimit) { instantMintPool = instantMintLimit; } ratifiedMintLimit = _ratified; if (ratifiedMintPool > ratifiedMintLimit) { ratifiedMintPool = ratifiedMintLimit; } multiSigMintLimit = _multiSig; if (multiSigMintPool > multiSigMintLimit) { multiSigMintPool = multiSigMintLimit; } emit MintLimitsChanged(_instant, _ratified, _multiSig); } /** * @dev Ratifier can refill instant mint pool */ function refillInstantMintPool() external onlyMintRatifierOrOwner { ratifiedMintPool = ratifiedMintPool.sub(instantMintLimit.sub(instantMintPool)); instantMintPool = instantMintLimit; emit InstantPoolRefilled(); } /** * @dev Owner or 3 ratifiers can refill Ratified Mint Pool */ function refillRatifiedMintPool() external onlyMintRatifierOrOwner { if (msg.sender != owner) { address[2] memory refillApprovals = ratifiedPoolRefillApprovals; require(msg.sender != refillApprovals[0] && msg.sender != refillApprovals[1]); if (refillApprovals[0] == address(0)) { ratifiedPoolRefillApprovals[0] = msg.sender; return; } if (refillApprovals[1] == address(0)) { ratifiedPoolRefillApprovals[1] = msg.sender; return; } } delete ratifiedPoolRefillApprovals; // clears the whole array multiSigMintPool = multiSigMintPool.sub(ratifiedMintLimit.sub(ratifiedMintPool)); ratifiedMintPool = ratifiedMintLimit; emit RatifyPoolRefilled(); } /** * @dev Owner can refill MultiSig Mint Pool */ function refillMultiSigMintPool() external onlyOwner { multiSigMintPool = multiSigMintLimit; emit MultiSigPoolRefilled(); } /** * @dev mintKey initiates a request to mint _value for account _to * @param _to the address to mint to * @param _value the amount requested */ function requestMint(address _to, uint256 _value) external mintNotPaused onlyMintKeyOrOwner { MintOperation memory op = MintOperation(_to, _value, block.number, 0, false); emit RequestMint(_to, _value, mintOperations.length, msg.sender); mintOperations.push(op); } /** * @dev Instant mint without ratification if the amount is less * than instantMintThreshold and instantMintPool * @param _to the address to mint to * @param _value the amount minted */ function instantMint(address _to, uint256 _value) external mintNotPaused onlyMintKeyOrOwner { require(_value <= instantMintThreshold, "over the instant mint threshold"); require(_value <= instantMintPool, "instant mint pool is dry"); instantMintPool = instantMintPool.sub(_value); emit InstantMint(_to, _value, msg.sender); token.mint(_to, _value); } /** * @dev ratifier ratifies a request mint. If the number of * ratifiers that signed off is greater than the number of * approvals required, the request is finalized * @param _index the index of the requestMint to ratify * @param _to the address to mint to * @param _value the amount requested */ function ratifyMint( uint256 _index, address _to, uint256 _value ) external mintNotPaused onlyMintRatifierOrOwner { MintOperation memory op = mintOperations[_index]; require(op.to == _to, "to address does not match"); require(op.value == _value, "amount does not match"); require(!mintOperations[_index].approved[msg.sender], "already approved"); mintOperations[_index].approved[msg.sender] = true; mintOperations[_index].numberOfApproval = mintOperations[_index].numberOfApproval.add(1); emit MintRatified(_index, msg.sender); if (hasEnoughApproval(mintOperations[_index].numberOfApproval, _value)) { finalizeMint(_index); } } /** * @dev finalize a mint request, mint the amount requested to the specified address * @param _index of the request (visible in the RequestMint event accompanying the original request) */ function finalizeMint(uint256 _index) public mintNotPaused { MintOperation memory op = mintOperations[_index]; address to = op.to; uint256 value = op.value; if (msg.sender != owner) { require(canFinalize(_index)); _subtractFromMintPool(value); } delete mintOperations[_index]; token.mint(to, value); emit FinalizeMint(to, value, _index, msg.sender); } /** * assumption: only invoked when canFinalize */ function _subtractFromMintPool(uint256 _value) internal { if (_value <= ratifiedMintPool && _value <= ratifiedMintThreshold) { ratifiedMintPool = ratifiedMintPool.sub(_value); } else { multiSigMintPool = multiSigMintPool.sub(_value); } } /** * @dev compute if the number of approvals is enough for a given mint amount */ function hasEnoughApproval(uint256 _numberOfApproval, uint256 _value) public view returns (bool) { if (_value <= ratifiedMintPool && _value <= ratifiedMintThreshold) { if (_numberOfApproval >= RATIFY_MINT_SIGS) { return true; } } if (_value <= multiSigMintPool && _value <= multiSigMintThreshold) { if (_numberOfApproval >= MULTISIG_MINT_SIGS) { return true; } } if (msg.sender == owner) { return true; } return false; } /** * @dev compute if a mint request meets all the requirements to be finalized * utility function for a front end */ function canFinalize(uint256 _index) public view returns (bool) { MintOperation memory op = mintOperations[_index]; require(op.requestedBlock > mintReqInvalidBeforeThisBlock, "this mint is invalid"); //also checks if request still exists require(!op.paused, "this mint is paused"); require(hasEnoughApproval(op.numberOfApproval, op.value), "not enough approvals"); return true; } /** * @dev revoke a mint request, Delete the mintOperation * @param _index of the request (visible in the RequestMint event accompanying the original request) */ function revokeMint(uint256 _index) external onlyMintKeyOrOwner { delete mintOperations[_index]; emit RevokeMint(_index); } /** * @dev get mint operatino count * @return mint operation count */ function mintOperationCount() public view returns (uint256) { return mintOperations.length; } /* ======================================== Key and role management ======================================== */ /** * @dev Replace the current mintkey with new mintkey * @param _newMintKey address of the new mintKey */ function transferMintKey(address _newMintKey) external onlyOwner { require(_newMintKey != address(0), "new mint key cannot be 0x0"); emit TransferMintKey(mintKey, _newMintKey); mintKey = _newMintKey; } function setProofOfReserveEnabler(address enabler) external onlyOwner { emit ProofOfReserveEnablerSet(proofOfReserveEnabler, enabler); proofOfReserveEnabler = enabler; } /* ======================================== Mint Pausing ======================================== */ /** * @dev invalidates all mint request initiated before the current block */ function invalidateAllPendingMints() external onlyOwner { mintReqInvalidBeforeThisBlock = block.number; } /** * @dev pause any further mint request and mint finalizations */ function pauseMints() external onlyMintPauserOrOwner { mintPaused = true; emit AllMintsPaused(true); } /** * @dev unpause any further mint request and mint finalizations */ function unpauseMints() external onlyOwner { mintPaused = false; emit AllMintsPaused(false); } /** * @dev pause a specific mint request * @param _opIndex the index of the mint request the caller wants to pause */ function pauseMint(uint256 _opIndex) external onlyMintPauserOrOwner { mintOperations[_opIndex].paused = true; emit MintPaused(_opIndex, true); } /** * @dev unpause a specific mint request * @param _opIndex the index of the mint request the caller wants to unpause */ function unpauseMint(uint256 _opIndex) external onlyOwner { mintOperations[_opIndex].paused = false; emit MintPaused(_opIndex, false); } /* ======================================== set and claim contracts, administrative ======================================== */ /** * @dev Update this contract's token pointer to newContract (e.g. if the * contract is upgraded) */ function setToken(ITrueCurrency _newContract) external onlyOwner { token = _newContract; emit SetToken(_newContract); } /** * @dev Update this contract's registry pointer to _registry */ function setRegistry(IRegistry _registry) external onlyOwner { registry = _registry; emit SetRegistry(address(registry)); } /** * @dev Claim ownership of an arbitrary HasOwner contract function issueClaimOwnership(address _other) public onlyOwner { HasOwner other = HasOwner(_other); other.claimOwnership(); } /** * @dev Transfer ownership of _child to _newOwner. * Can be used e.g. to upgrade this TokenController contract. * @param _child contract that tokenController currently Owns * @param _newOwner new owner/pending owner of _child function transferChild(HasOwner _child, address _newOwner) external onlyOwner { _child.transferOwnership(_newOwner); emit TransferChild(address(_child), _newOwner); } */ /** * @dev send all ether in token address to the owner of tokenController */ function requestReclaimEther() external onlyOwner { token.reclaimEther(owner); } /** * @dev transfer all tokens of a particular type in token address to the * owner of tokenController * @param _token token address of the token to transfer */ function requestReclaimToken(IERC20 _token) external onlyOwner { token.reclaimToken(_token, owner); } /** * @dev pause all pausable actions on TrueCurrency, mints/burn/transfer/approve */ function pauseToken() external virtual onlyOwner { IOwnedUpgradeabilityProxy(address(token)).upgradeTo(PAUSED_IMPLEMENTATION); } /** * @dev Change the minimum and maximum amounts that TrueCurrency users can * burn to newMin and newMax * @param _min minimum amount user can burn at a time * @param _max maximum amount user can burn at a time */ function setBurnBounds(uint256 _min, uint256 _max) external onlyOwner { token.setBurnBounds(_min, _max); } /** * @dev Owner can send ether balance in contract address * @param _to address to which the funds will be send to */ function reclaimEther(address payable _to) external onlyOwner { _to.transfer(address(this).balance); } /** * @dev Owner can send erc20 token balance in contract address * @param _token address of the token to send * @param _to address to which the funds will be send to */ function reclaimToken(IERC20 _token, address _to) external onlyOwner { uint256 balance = _token.balanceOf(address(this)); _token.transfer(_to, balance); } /** * @dev Owner can allow address to burn tokens * @param burner address of the token that can burn * @param canBurn true if account is allowed to burn, false otherwise */ function setCanBurn(address burner, bool canBurn) external onlyRegistryAdminOrOwner { token.setCanBurn(burner, canBurn); } /** * @dev Add blacklisted status for the account _evilUser. * @param _evilUser address to set blacklist flag for */ function addBlacklist(address _evilUser) external onlyBlacklistAdminOrOwner { token.setBlacklisted(_evilUser, true); } /** * @dev Remove blacklisted status for the account _clearedUser. * @param _clearedUser address to unset blacklist flag for */ function removeBlacklist(address _clearedUser) external onlyOwner { token.setBlacklisted(_clearedUser, false); } /** * @dev Destroy black funds for the blacklisted user * @param _blackListedUser the blacklisted user */ function destroyBlackFunds(address _blackListedUser) external onlyOwner { token.destroyBlackFunds(_blackListedUser); } /* ======================================== Proof of Reserve, administrative ======================================== */ /** * Set new chainReserveFeed address */ function setChainReserveFeed(address newFeed) external onlyOwner { IProofOfReserveToken(address(token)).setChainReserveFeed(newFeed); } /** * Set new chainReserveHeartbeat */ function setChainReserveHeartbeat(uint256 newHeartbeat) external onlyProofOfReserveEnablerOrOwner { IProofOfReserveToken(address(token)).setChainReserveHeartbeat(newHeartbeat); } /** * Disable Proof of Reserve check */ function disableProofOfReserve() external onlyProofOfReserveEnablerOrOwner { IProofOfReserveToken(address(token)).disableProofOfReserve(); } /** * Enable Proof of Reserve check */ function enableProofOfReserve() external onlyProofOfReserveEnablerOrOwner { IProofOfReserveToken(address(token)).enableProofOfReserve(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"AllMintsPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newFastPause","type":"address"}],"name":"FastPauseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintKey","type":"address"}],"name":"FinalizeMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"mintKey","type":"address"}],"name":"InstantMint","type":"event"},{"anonymous":false,"inputs":[],"name":"InstantPoolRefilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"approver","type":"address"},{"indexed":false,"internalType":"uint256","name":"opIndex","type":"uint256"}],"name":"MintApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"instant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ratified","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiSig","type":"uint256"}],"name":"MintLimitsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"opIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MintPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"opIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"ratifier","type":"address"}],"name":"MintRatified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"instant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ratified","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiSig","type":"uint256"}],"name":"MintThresholdChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"MultiSigPoolRefilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentOwner","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"NewOwnerPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousEnabler","type":"address"},{"indexed":false,"internalType":"address","name":"newEnabler","type":"address"}],"name":"ProofOfReserveEnablerSet","type":"event"},{"anonymous":false,"inputs":[],"name":"RatifyPoolRefilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintKey","type":"address"}],"name":"RequestMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"other","type":"address"}],"name":"RequestReclaimContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"opIndex","type":"uint256"}],"name":"RevokeMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"SetRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ITrueCurrency","name":"newContract","type":"address"}],"name":"SetToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousMintKey","type":"address"},{"indexed":true,"internalType":"address","name":"newMintKey","type":"address"}],"name":"TransferMintKey","type":"event"},{"inputs":[],"name":"IS_BLACKLIST_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_MINT_PAUSER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_MINT_RATIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_REGISTRY_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTISIG_MINT_SIGS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSED_IMPLEMENTATION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RATIFY_MINT_SIGS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evilUser","type":"address"}],"name":"addBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"canFinalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTrueCurrencyProxyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProofOfReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableProofOfReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fastPause","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"finalizeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfApproval","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"hasEnoughApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"instantMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"instantMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"instantMintPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"instantMintThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invalidateAllPendingMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOperationCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintOperations","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"requestedBlock","type":"uint256"},{"internalType":"uint256","name":"numberOfApproval","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReqInvalidBeforeThisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiSigMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiSigMintPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiSigMintThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_opIndex","type":"uint256"}],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofOfReserveEnabler","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratifiedMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratifiedMintPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratifiedMintThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ratifiedPoolRefillApprovals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ratifyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"reclaimEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"reclaimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refillInstantMintPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refillMultiSigMintPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refillRatifiedMintPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clearedUser","type":"address"}],"name":"removeBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"requestMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestReclaimEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"requestReclaimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"revokeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setBurnBounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"},{"internalType":"bool","name":"canBurn","type":"bool"}],"name":"setCanBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeed","type":"address"}],"name":"setChainReserveFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newHeartbeat","type":"uint256"}],"name":"setChainReserveHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_instant","type":"uint256"},{"internalType":"uint256","name":"_ratified","type":"uint256"},{"internalType":"uint256","name":"_multiSig","type":"uint256"}],"name":"setMintLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_instant","type":"uint256"},{"internalType":"uint256","name":"_ratified","type":"uint256"},{"internalType":"uint256","name":"_multiSig","type":"uint256"}],"name":"setMintThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"enabler","type":"address"}],"name":"setProofOfReserveEnabler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRegistry","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITrueCurrency","name":"_newContract","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ITrueCurrency","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newMintKey","type":"address"}],"name":"transferMintKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferTrueCurrencyProxyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trueRewardManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_opIndex","type":"uint256"}],"name":"unpauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"upgradeTrueCurrencyProxyImplTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506135db806100206000396000f3fe608060405234801561001057600080fd5b50600436106104125760003560e01c806387fb79be11610220578063cd0f7a4511610130578063ecae1e0c116100b8578063f3a2796311610087578063f3a27963146109f6578063f3bdc228146109fe578063f3e2aa8314610a24578063fc0c546a14610a2c578063fc46221d14610a3457610412565b8063ecae1e0c1461099a578063ed62b4d6146109c0578063f11db77f146109c8578063f2fde38b146109d057610412565b8063e30c3978116100ff578063e30c3978146108f3578063e4e2bfe4146108fb578063e653aab514610918578063eb91e65114610920578063ec38e8551461094657610412565b8063cd0f7a45146108b5578063d0d2d110146108db578063dc9da8cb146108e3578063df66b8f8146108eb57610412565b8063a22cba6e116101b3578063b81503ee11610182578063b81503ee1461088d578063c0854e0614610895578063c37e21551461089d578063cb4136c7146108a5578063cc7e492e146108ad57610412565b8063a22cba6e1461083a578063a415965c14610857578063a91ee0dc1461085f578063ab15f7231461088557610412565b80638e3af93f116101ef5780638e3af93f146107ab578063912ff46c146107c85780639a6a30a4146107ee5780639cfe42da1461081457610412565b806387fb79be1461076557806388ee39cc1461076d57806389d9b0591461079b5780638da5cb5b146107a357610412565b806334437b16116103265780636c38d4e4116102ae57806379ca5d4c1161027d57806379ca5d4c146106e45780637b1039991461070a5780637e4831d3146107125780637ef7ce921461071a578063807496561461073757610412565b80636c38d4e41461066a57806372df02a71461068757806376f2a59a146106b0578063789083e6146106dc57610412565b80634fe5d431116102f55780634fe5d43114610609578063514472441461062f57806352006050146106375780635e5ae1fe1461065a57806369ebf34e1461066257610412565b806334437b16146105c85780633cb5bc74146105d057806341e92edc146105f95780634e71e0c81461060157610412565b806329a2ce9c116103a95780632c9ebb5d116103785780632c9ebb5d146105675780632e70bd4f1461056f5780633134fe9c1461057757806331a02bce1461057f57806331bac434146105ab57610412565b806329a2ce9c1461051757806329dea3a1146105345780632bbdb18a1461053c5780632c3496271461055f57610412565b806316de7d16116103e557806316de7d16146104a75780631d42953a146104cb5780631d4e135b146104d35780631e38cdb2146104f157610412565b80630e536ff414610417578063144fa6d71461044b578063158ef93e1461047157806315d338381461048d575b600080fd5b6104496004803603606081101561042d57600080fd5b508035906001600160a01b036020820135169060400135610a3c565b005b6104496004803603602081101561046157600080fd5b50356001600160a01b0316610e18565b610479610eb8565b604080519115158252519081900360200190f35b610495610ec8565b60408051918252519081900360200190f35b6104af610ee0565b604080516001600160a01b039092168252519081900360200190f35b610495610eef565b6104db610f08565b6040805160ff9092168252519081900360200190f35b6104496004803603602081101561050757600080fd5b50356001600160a01b0316610f0d565b6104496004803603602081101561052d57600080fd5b5035610fc2565b61049561106d565b6104796004803603604081101561055257600080fd5b5080359060200135611073565b6104496110ec565b6104956111ac565b6104956111b2565b6104956111b8565b6104496004803603604081101561059557600080fd5b506001600160a01b0381351690602001356111be565b610449600480360360208110156105c157600080fd5b5035611416565b6104956114d4565b610449600480360360608110156105e657600080fd5b50803590602081013590604001356114da565b6104496115c6565b610449611674565b6104496004803603602081101561061f57600080fd5b50356001600160a01b03166116ef565b6104af611789565b6104496004803603604081101561064d57600080fd5b5080359060200135611798565b610449611854565b6104af6118a6565b6104496004803603602081101561068057600080fd5b50356118b5565b6104496004803603606081101561069d57600080fd5b5080359060208101359060400135611a19565b610449600480360360408110156106c657600080fd5b506001600160a01b038135169060200135611ad2565b610495611cf0565b610449600480360360208110156106fa57600080fd5b50356001600160a01b0316611cf6565b6104af611d99565b610479611da8565b6104496004803603602081101561073057600080fd5b5035611db1565b6104496004803603604081101561074d57600080fd5b506001600160a01b0381351690602001351515611ea7565b610495611ff2565b6104496004803603604081101561078357600080fd5b506001600160a01b0381358116916020013516611ff8565b61044961213a565b6104af61238c565b610449600480360360208110156107c157600080fd5b503561239b565b610449600480360360208110156107de57600080fd5b50356001600160a01b031661259a565b6104496004803603602081101561080457600080fd5b50356001600160a01b0316612650565b6104496004803603602081101561082a57600080fd5b50356001600160a01b03166126d5565b6104af6004803603602081101561085057600080fd5b5035612820565b61044961283d565b6104496004803603602081101561087557600080fd5b50356001600160a01b03166128ba565b610449612956565b610495612a8b565b610495612aa2565b610495612ab8565b610449612abe565b610449612b6c565b610449600480360360208110156108cb57600080fd5b50356001600160a01b0316612cbd565b610495612dc0565b610449612dc6565b6104af612e62565b6104af612e71565b6104796004803603602081101561091157600080fd5b5035612e80565b610495612ff1565b6104496004803603602081101561093657600080fd5b50356001600160a01b0316612ff7565b6109636004803603602081101561095c57600080fd5b5035613096565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b610449600480360360208110156109b057600080fd5b50356001600160a01b03166130e1565b6104db61317b565b6104af613180565b610449600480360360208110156109e657600080fd5b50356001600160a01b0316613198565b61044961323a565b61044960048036036020811015610a1457600080fd5b50356001600160a01b03166132c6565b610449613360565b6104af6133fb565b61049561340a565b6000546001600160a01b03163314610a9a57600d5460ff1615610a9a576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b505180610b4157506000546001600160a01b031633145b610b8e576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b610b9661351c565b60108481548110610ba357fe5b60009182526020918290206040805160a081018252600690930290910180546001600160a01b03908116808552600183015495850195909552600282015492840192909252600381015460608401526004015460ff1615156080830152909250841614610c57576040805162461bcd60e51b815260206004820152601960248201527f746f206164647265737320646f6573206e6f74206d6174636800000000000000604482015290519081900360640190fd5b81816020015114610ca7576040805162461bcd60e51b81526020600482015260156024820152740c2dadeeadce840c8decae640dcdee840dac2e8c6d605b1b604482015290519081900360640190fd5b60108481548110610cb457fe5b600091825260208083203384526005600690930201919091019052604090205460ff1615610d1c576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b600160108581548110610d2b57fe5b60009182526020808320338452600692909202909101600501905260409020805460ff191691151591909117905560108054610d8e9160019187908110610d6e57fe5b90600052602060002090600602016003015461341090919063ffffffff16565b60108581548110610d9b57fe5b60009182526020822060036006909202010191909155604051339186917f86cc1a29a55449d1229bb301da3d61fcd5490843635df9a79e5a4df4724773d29190a3610e0460108581548110610dec57fe5b90600052602060002090600602016003015483611073565b15610e1257610e128461239b565b50505050565b6000546001600160a01b03163314610e64576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fefc1fd16ea80a922086ee4e995739d59b025c1bcea6d1f67855747480c83214b9181900360200190a150565b600154600160a01b900460ff1681565b706973545553444d696e745061757365727360781b81565b6015546001600160a01b031681565b7134b9aa2aa9a226b4b73a2930ba34b334b2b960711b81565b600181565b6000546001600160a01b03163314610f59576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154604080516378b9ce5760e11b81526001600160a01b0384811660048301529151919092169163f1739cae91602480830192600092919082900301818387803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b5050505050565b6015546001600160a01b0316331480610fe557506000546001600160a01b031633145b6110205760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b60115460408051630a68b3a760e21b81526004810184905290516001600160a01b03909216916329a2ce9c9160248082019260009290919082900301818387803b158015610fa757600080fd5b60035481565b6000600954821115801561108957506003548211155b1561109e576001831061109e575060016110e6565b600a5482111580156110b257506004548211155b156110c757600383106110c7575060016110e6565b6000546001600160a01b03163314156110e2575060016110e6565b5060005b92915050565b6000546001600160a01b03163314611138576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631b2ce7f360e11b8152733c8984dce8f68fcdeeeafd9e0eca3598562ed291600482015290516001600160a01b0390921691633659cfe69160248082019260009290919082900301818387803b15801561119857600080fd5b505af1158015610e12573d6000803e3d6000fd5b60045481565b60105490565b60095481565b6000546001600160a01b0316331461121c57600d5460ff161561121c576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b600f546001600160a01b031633148061123f57506000546001600160a01b031633145b61128b576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b61129361351c565b506040805160a0810182526001600160a01b038416808252602080830185905243838501526000606084018190526080840152601054845190815233918101919091528351929385937f883eab2a74c029007e37f3f118fa7713d39b756c0b7c932a0269fcb995a4724c9281900390910190a36010805460018101825560009190915281517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672600690920291820180546001600160a01b0319166001600160a01b0390921691909117905560208201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67382015560408201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67482015560608201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6758201556080909101517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae676909101805460ff19169115159190911790555050565b6000546001600160a01b03163314611462576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60006010828154811061147157fe5b60009182526020808320600692909202909101600401805460ff191693151593909317909255604080518481529283019190915280517fbe7295ef37ca984ec35808d259aa03f272c2d747c6ce6a47b6e90862afccc5769281900390910190a150565b60075481565b6000546001600160a01b03163314611526576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b8183111580156115365750808211155b61153f57600080fd5b6005839055600854831015611555576005546008555b600682905560095482101561156b576006546009555b6007819055600a5481101561158157600754600a555b604080518481526020810184905280820183905290517fa88ec94782bac5c3e5f7d8e8f27b39f3f9d53da3fc2824db137086185cf2117d9181900360600190a1505050565b6015546001600160a01b03163314806115e957506000546001600160a01b031633145b6116245760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b03166341e92edc6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b6001546001600160a01b0316331461168b57600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b0316331461173b576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631b2ce7f360e11b81526001600160a01b03848116600483015291519190921691633659cfe691602480830192600092919082900301818387803b158015610fa757600080fd5b6014546001600160a01b031681565b6000546001600160a01b031633146117e4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051630520060560e41b8152600481018590526024810184905290516001600160a01b039092169163520060509160448082019260009290919082900301818387803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146118a0576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b43600e55565b600f546001600160a01b031681565b60125460408051631cce309760e21b8152336004820152706973545553444d696e745061757365727360781b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d602081101561194457600080fd5b50518061195b57506000546001600160a01b031633145b6119a6576040805162461bcd60e51b815260206004820152601760248201527636bab9ba103132903830bab9b2b91037b91037bbb732b960491b604482015290519081900360640190fd5b6001601082815481106119b557fe5b600091825260209182902060069190910201600401805460ff1916921515929092179091556040805183815260019281019290925280517fbe7295ef37ca984ec35808d259aa03f272c2d747c6ce6a47b6e90862afccc5769281900390910190a150565b6000546001600160a01b03163314611a65576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b818311158015611a755750808211155b611a7e57600080fd5b600283905560038290556004819055604080518481526020810184905280820183905290517fba6a9f8d54021af0fab65e388ad81cc3dfb17207bed50a5e9a30f7adabb534d19181900360600190a1505050565b6000546001600160a01b03163314611b3057600d5460ff1615611b30576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b600f546001600160a01b0316331480611b5357506000546001600160a01b031633145b611b9f576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b600254811115611bf6576040805162461bcd60e51b815260206004820152601f60248201527f6f7665722074686520696e7374616e74206d696e74207468726573686f6c6400604482015290519081900360640190fd5b600854811115611c4d576040805162461bcd60e51b815260206004820152601860248201527f696e7374616e74206d696e7420706f6f6c206973206472790000000000000000604482015290519081900360640190fd5b600854611c60908263ffffffff61347116565b600855604051339082906001600160a01b038516907fec755a4feb8086d62e216ca919461349221df54bf9ca83300b7a2bf8e5807dfc90600090a4601154604080516340c10f1960e01b81526001600160a01b03858116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b15801561183857600080fd5b60025481565b6000546001600160a01b03163314611d42576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154600080546040805163223b8e7360e21b81526001600160a01b0386811660048301529283166024820152905191909316926388ee39cc92604480830193919282900301818387803b158015610fa757600080fd5b6012546001600160a01b031681565b600d5460ff1681565b600f546001600160a01b0316331480611dd457506000546001600160a01b031633145b611e20576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b60108181548110611e2d57fe5b60009182526020808320600690920290910180546001600160a01b0319168155600181018390556002810183905560038101929092556004909101805460ff191690556040805183815290517fccec691f17b1a3d2b56ac2c39074c2930ba803fc46191a49259706621eac3f8f929181900390910190a150565b60125460408051631cce309760e21b81523360048201526e34b9a932b3b4b9ba393ca0b236b4b760891b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015611f0a57600080fd5b505afa158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b505180611f4b57506000546001600160a01b031633145b611f9c576040805162461bcd60e51b815260206004820152601f60248201527f6d7573742062652072656769737472792061646d696e206f72206f776e657200604482015290519081900360640190fd5b6011546040805163403a4b2b60e11b81526001600160a01b038581166004830152841515602483015291519190921691638074965691604480830192600092919082900301818387803b15801561183857600080fd5b60085481565b6000546001600160a01b03163314612044576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561208e57600080fd5b505afa1580156120a2573d6000803e3d6000fd5b505050506040513d60208110156120b857600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905291519293509085169163a9059cbb916044808201926020929091908290030181600087803b15801561211057600080fd5b505af1158015612124573d6000803e3d6000fd5b505050506040513d6020811015610fbb57600080fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b1580156121a057600080fd5b505afa1580156121b4573d6000803e3d6000fd5b505050506040513d60208110156121ca57600080fd5b5051806121e157506000546001600160a01b031633145b61222e576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b6000546001600160a01b0316331461232257612248613556565b604080518082019182905290600b9060029082845b81546001600160a01b0316815260019091019060200180831161225d57505050505090508060006002811061228e57fe5b60200201516001600160a01b0316336001600160a01b0316141580156122c1575060208101516001600160a01b03163314155b6122ca57600080fd5b80516001600160a01b03166123045733600b60005b0180546001600160a01b0319166001600160a01b03929092169190911790555061238a565b60208101516001600160a01b03166123205733600b60016122df565b505b61232e600b6000613574565b61235761234860095460065461347190919063ffffffff16565b600a549063ffffffff61347116565b600a556006546009556040517f102a997ac4d17915071d5422bc77b9e807c57305cefef394daf2468abacb26c290600090a15b565b6000546001600160a01b031681565b6000546001600160a01b031633146123f957600d5460ff16156123f9576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b61240161351c565b6010828154811061240e57fe5b600091825260208083206040805160a081018252600690940290910180546001600160a01b0390811680865260018301549486018590526002830154938601939093526003820154606086015260049091015460ff16151560808501529354929450929091339116146124965761248484612e80565b61248d57600080fd5b612496816134ce565b601084815481106124a357fe5b60009182526020822060069091020180546001600160a01b03191681556001810182905560028101829055600381018290556004908101805460ff19169055601154604080516340c10f1960e01b81526001600160a01b038781169482019490945260248101869052905191909216926340c10f19926044808201939182900301818387803b15801561253557600080fd5b505af1158015612549573d6000803e3d6000fd5b50506040805187815233602082015281518594506001600160a01b03871693507f9a0dcee498442c144388e9d1dd09acdf74ffc3bce9cb52841186c1d8ac032154929181900390910190a350505050565b6000546001600160a01b031633146125e6576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601554604080516001600160a01b039283168152918316602083015280517fd614f1235138bbaa4590745a4f8569f5798b0224d4e5c0c74f4f7ea437f0f3f49281900390910190a1601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461269c576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156126d1573d6000803e3d6000fd5b5050565b60125460408051631cce309760e21b81523360048201526f34b9a13630b1b5b634b9ba20b236b4b760811b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50518061277a57506000546001600160a01b031633145b6127cb576040805162461bcd60e51b815260206004820181905260248201527f6d75737420626520626c61636b6c6973742061646d696e206f72206f776e6572604482015290519081900360640190fd5b6011546040805163680eeb6960e11b81526001600160a01b038481166004830152600160248301529151919092169163d01dd6d291604480830192600092919082900301818387803b158015610fa757600080fd5b600b816002811061282d57fe5b01546001600160a01b0316905081565b6000546001600160a01b03163314612889576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600754600a556040517ff887efb579b3283f395871614f44a2fd3021ddf59e72a91195f5da936ebaa06d90600090a1565b6000546001600160a01b03163314612906576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b60125460408051631cce309760e21b8152336004820152706973545553444d696e745061757365727360781b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b1580156129bb57600080fd5b505afa1580156129cf573d6000803e3d6000fd5b505050506040513d60208110156129e557600080fd5b5051806129fc57506000546001600160a01b031633145b612a47576040805162461bcd60e51b815260206004820152601760248201527636bab9ba103132903830bab9b2b91037b91037bbb732b960491b604482015290519081900360640190fd5b600d805460ff1916600190811790915560408051918252517f6cb4a816be468261438a85abae2d59de6bc19b06d3a76e2f3acfd656d85a2ee99181900360200190a1565b6f34b9a13630b1b5b634b9ba20b236b4b760811b81565b6e34b9a932b3b4b9ba393ca0b236b4b760891b81565b600a5481565b6015546001600160a01b0316331480612ae157506000546001600160a01b031633145b612b1c5760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663cb4136c76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015612bd257600080fd5b505afa158015612be6573d6000803e3d6000fd5b505050506040513d6020811015612bfc57600080fd5b505180612c1357506000546001600160a01b031633145b612c60576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b612c89612c7a60085460055461347190919063ffffffff16565b6009549063ffffffff61347116565b6009556005546008556040517ffebce9a3dbc55fe4e42cabd1229670f5e1ed4cbf008685f75392a050ab9561fd90600090a1565b6000546001600160a01b03163314612d09576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6001600160a01b038116612d64576040805162461bcd60e51b815260206004820152601a60248201527f6e6577206d696e74206b65792063616e6e6f7420626520307830000000000000604482015290519081900360640190fd5b600f546040516001600160a01b038084169216907ffbd0b5e594e818883d41b4de49805781c984d030597177b02c741cafe04bf21b90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b6000546001600160a01b03163314612e12576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b0316639965b3d66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b6013546001600160a01b031681565b6001546001600160a01b031681565b6000612e8a61351c565b60108381548110612e9757fe5b60009182526020918290206040805160a081018252600690930290910180546001600160a01b0316835260018101549383019390935260028301549082018190526003830154606083015260049092015460ff1615156080820152600e5490925010612f41576040805162461bcd60e51b81526020600482015260146024820152731d1a1a5cc81b5a5b9d081a5cc81a5b9d985b1a5960621b604482015290519081900360640190fd5b806080015115612f8e576040805162461bcd60e51b81526020600482015260136024820152721d1a1a5cc81b5a5b9d081a5cc81c185d5cd959606a1b604482015290519081900360640190fd5b612fa081606001518260200151611073565b612fe8576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f75676820617070726f76616c7360601b604482015290519081900360640190fd5b50600192915050565b60065481565b6000546001600160a01b03163314613043576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6011546040805163680eeb6960e11b81526001600160a01b038481166004830152600060248301819052925193169263d01dd6d29260448084019391929182900301818387803b158015610fa757600080fd5b601081815481106130a357fe5b6000918252602090912060069091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b6000546001600160a01b0316331461312d576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051633b2b878360e21b81526001600160a01b0384811660048301529151919092169163ecae1e0c91602480830192600092919082900301818387803b158015610fa757600080fd5b600381565b733c8984dce8f68fcdeeeafd9e0eca3598562ed29181565b6000546001600160a01b031633146131e4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b03838116919091179182905560008054604051938316939216917fec070b46448fede8b4a9a9f8d7919141b5e1c729397eccb0c59af2d6d9fc2d6c9190a350565b6000546001600160a01b03163314613286576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600d805460ff19169055604080516000815290517f6cb4a816be468261438a85abae2d59de6bc19b06d3a76e2f3acfd656d85a2ee99181900360200190a1565b6000546001600160a01b03163314613312576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631e77b84560e31b81526001600160a01b0384811660048301529151919092169163f3bdc22891602480830192600092919082900301818387803b158015610fa757600080fd5b6000546001600160a01b031633146133ac576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154600080546040805163269a8c2960e21b81526001600160a01b03928316600482015290519190931692639a6a30a492602480830193919282900301818387803b15801561119857600080fd5b6011546001600160a01b031681565b60055481565b60008282018381101561346a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000828211156134c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60095481111580156134e257506003548111155b15613502576009546134fa908263ffffffff61347116565b600955613519565b600a54613515908263ffffffff61347116565b600a555b50565b6040518060a0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000151581525090565b60405180604001604052806002906020820280368337509192915050565b50600081556001016000905556fe6f6e6c792070726f6f664f6652657365727665456e61626c6572206f72206f776e6572a2646970667358221220788726d155334d65a6e28c04950b640e5382d99292b442ff88ea61eca826f9c564736f6c634300060a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104125760003560e01c806387fb79be11610220578063cd0f7a4511610130578063ecae1e0c116100b8578063f3a2796311610087578063f3a27963146109f6578063f3bdc228146109fe578063f3e2aa8314610a24578063fc0c546a14610a2c578063fc46221d14610a3457610412565b8063ecae1e0c1461099a578063ed62b4d6146109c0578063f11db77f146109c8578063f2fde38b146109d057610412565b8063e30c3978116100ff578063e30c3978146108f3578063e4e2bfe4146108fb578063e653aab514610918578063eb91e65114610920578063ec38e8551461094657610412565b8063cd0f7a45146108b5578063d0d2d110146108db578063dc9da8cb146108e3578063df66b8f8146108eb57610412565b8063a22cba6e116101b3578063b81503ee11610182578063b81503ee1461088d578063c0854e0614610895578063c37e21551461089d578063cb4136c7146108a5578063cc7e492e146108ad57610412565b8063a22cba6e1461083a578063a415965c14610857578063a91ee0dc1461085f578063ab15f7231461088557610412565b80638e3af93f116101ef5780638e3af93f146107ab578063912ff46c146107c85780639a6a30a4146107ee5780639cfe42da1461081457610412565b806387fb79be1461076557806388ee39cc1461076d57806389d9b0591461079b5780638da5cb5b146107a357610412565b806334437b16116103265780636c38d4e4116102ae57806379ca5d4c1161027d57806379ca5d4c146106e45780637b1039991461070a5780637e4831d3146107125780637ef7ce921461071a578063807496561461073757610412565b80636c38d4e41461066a57806372df02a71461068757806376f2a59a146106b0578063789083e6146106dc57610412565b80634fe5d431116102f55780634fe5d43114610609578063514472441461062f57806352006050146106375780635e5ae1fe1461065a57806369ebf34e1461066257610412565b806334437b16146105c85780633cb5bc74146105d057806341e92edc146105f95780634e71e0c81461060157610412565b806329a2ce9c116103a95780632c9ebb5d116103785780632c9ebb5d146105675780632e70bd4f1461056f5780633134fe9c1461057757806331a02bce1461057f57806331bac434146105ab57610412565b806329a2ce9c1461051757806329dea3a1146105345780632bbdb18a1461053c5780632c3496271461055f57610412565b806316de7d16116103e557806316de7d16146104a75780631d42953a146104cb5780631d4e135b146104d35780631e38cdb2146104f157610412565b80630e536ff414610417578063144fa6d71461044b578063158ef93e1461047157806315d338381461048d575b600080fd5b6104496004803603606081101561042d57600080fd5b508035906001600160a01b036020820135169060400135610a3c565b005b6104496004803603602081101561046157600080fd5b50356001600160a01b0316610e18565b610479610eb8565b604080519115158252519081900360200190f35b610495610ec8565b60408051918252519081900360200190f35b6104af610ee0565b604080516001600160a01b039092168252519081900360200190f35b610495610eef565b6104db610f08565b6040805160ff9092168252519081900360200190f35b6104496004803603602081101561050757600080fd5b50356001600160a01b0316610f0d565b6104496004803603602081101561052d57600080fd5b5035610fc2565b61049561106d565b6104796004803603604081101561055257600080fd5b5080359060200135611073565b6104496110ec565b6104956111ac565b6104956111b2565b6104956111b8565b6104496004803603604081101561059557600080fd5b506001600160a01b0381351690602001356111be565b610449600480360360208110156105c157600080fd5b5035611416565b6104956114d4565b610449600480360360608110156105e657600080fd5b50803590602081013590604001356114da565b6104496115c6565b610449611674565b6104496004803603602081101561061f57600080fd5b50356001600160a01b03166116ef565b6104af611789565b6104496004803603604081101561064d57600080fd5b5080359060200135611798565b610449611854565b6104af6118a6565b6104496004803603602081101561068057600080fd5b50356118b5565b6104496004803603606081101561069d57600080fd5b5080359060208101359060400135611a19565b610449600480360360408110156106c657600080fd5b506001600160a01b038135169060200135611ad2565b610495611cf0565b610449600480360360208110156106fa57600080fd5b50356001600160a01b0316611cf6565b6104af611d99565b610479611da8565b6104496004803603602081101561073057600080fd5b5035611db1565b6104496004803603604081101561074d57600080fd5b506001600160a01b0381351690602001351515611ea7565b610495611ff2565b6104496004803603604081101561078357600080fd5b506001600160a01b0381358116916020013516611ff8565b61044961213a565b6104af61238c565b610449600480360360208110156107c157600080fd5b503561239b565b610449600480360360208110156107de57600080fd5b50356001600160a01b031661259a565b6104496004803603602081101561080457600080fd5b50356001600160a01b0316612650565b6104496004803603602081101561082a57600080fd5b50356001600160a01b03166126d5565b6104af6004803603602081101561085057600080fd5b5035612820565b61044961283d565b6104496004803603602081101561087557600080fd5b50356001600160a01b03166128ba565b610449612956565b610495612a8b565b610495612aa2565b610495612ab8565b610449612abe565b610449612b6c565b610449600480360360208110156108cb57600080fd5b50356001600160a01b0316612cbd565b610495612dc0565b610449612dc6565b6104af612e62565b6104af612e71565b6104796004803603602081101561091157600080fd5b5035612e80565b610495612ff1565b6104496004803603602081101561093657600080fd5b50356001600160a01b0316612ff7565b6109636004803603602081101561095c57600080fd5b5035613096565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b610449600480360360208110156109b057600080fd5b50356001600160a01b03166130e1565b6104db61317b565b6104af613180565b610449600480360360208110156109e657600080fd5b50356001600160a01b0316613198565b61044961323a565b61044960048036036020811015610a1457600080fd5b50356001600160a01b03166132c6565b610449613360565b6104af6133fb565b61049561340a565b6000546001600160a01b03163314610a9a57600d5460ff1615610a9a576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b505180610b4157506000546001600160a01b031633145b610b8e576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b610b9661351c565b60108481548110610ba357fe5b60009182526020918290206040805160a081018252600690930290910180546001600160a01b03908116808552600183015495850195909552600282015492840192909252600381015460608401526004015460ff1615156080830152909250841614610c57576040805162461bcd60e51b815260206004820152601960248201527f746f206164647265737320646f6573206e6f74206d6174636800000000000000604482015290519081900360640190fd5b81816020015114610ca7576040805162461bcd60e51b81526020600482015260156024820152740c2dadeeadce840c8decae640dcdee840dac2e8c6d605b1b604482015290519081900360640190fd5b60108481548110610cb457fe5b600091825260208083203384526005600690930201919091019052604090205460ff1615610d1c576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b600160108581548110610d2b57fe5b60009182526020808320338452600692909202909101600501905260409020805460ff191691151591909117905560108054610d8e9160019187908110610d6e57fe5b90600052602060002090600602016003015461341090919063ffffffff16565b60108581548110610d9b57fe5b60009182526020822060036006909202010191909155604051339186917f86cc1a29a55449d1229bb301da3d61fcd5490843635df9a79e5a4df4724773d29190a3610e0460108581548110610dec57fe5b90600052602060002090600602016003015483611073565b15610e1257610e128461239b565b50505050565b6000546001600160a01b03163314610e64576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fefc1fd16ea80a922086ee4e995739d59b025c1bcea6d1f67855747480c83214b9181900360200190a150565b600154600160a01b900460ff1681565b706973545553444d696e745061757365727360781b81565b6015546001600160a01b031681565b7134b9aa2aa9a226b4b73a2930ba34b334b2b960711b81565b600181565b6000546001600160a01b03163314610f59576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154604080516378b9ce5760e11b81526001600160a01b0384811660048301529151919092169163f1739cae91602480830192600092919082900301818387803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b5050505050565b6015546001600160a01b0316331480610fe557506000546001600160a01b031633145b6110205760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b60115460408051630a68b3a760e21b81526004810184905290516001600160a01b03909216916329a2ce9c9160248082019260009290919082900301818387803b158015610fa757600080fd5b60035481565b6000600954821115801561108957506003548211155b1561109e576001831061109e575060016110e6565b600a5482111580156110b257506004548211155b156110c757600383106110c7575060016110e6565b6000546001600160a01b03163314156110e2575060016110e6565b5060005b92915050565b6000546001600160a01b03163314611138576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631b2ce7f360e11b8152733c8984dce8f68fcdeeeafd9e0eca3598562ed291600482015290516001600160a01b0390921691633659cfe69160248082019260009290919082900301818387803b15801561119857600080fd5b505af1158015610e12573d6000803e3d6000fd5b60045481565b60105490565b60095481565b6000546001600160a01b0316331461121c57600d5460ff161561121c576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b600f546001600160a01b031633148061123f57506000546001600160a01b031633145b61128b576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b61129361351c565b506040805160a0810182526001600160a01b038416808252602080830185905243838501526000606084018190526080840152601054845190815233918101919091528351929385937f883eab2a74c029007e37f3f118fa7713d39b756c0b7c932a0269fcb995a4724c9281900390910190a36010805460018101825560009190915281517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672600690920291820180546001600160a01b0319166001600160a01b0390921691909117905560208201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67382015560408201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67482015560608201517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6758201556080909101517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae676909101805460ff19169115159190911790555050565b6000546001600160a01b03163314611462576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60006010828154811061147157fe5b60009182526020808320600692909202909101600401805460ff191693151593909317909255604080518481529283019190915280517fbe7295ef37ca984ec35808d259aa03f272c2d747c6ce6a47b6e90862afccc5769281900390910190a150565b60075481565b6000546001600160a01b03163314611526576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b8183111580156115365750808211155b61153f57600080fd5b6005839055600854831015611555576005546008555b600682905560095482101561156b576006546009555b6007819055600a5481101561158157600754600a555b604080518481526020810184905280820183905290517fa88ec94782bac5c3e5f7d8e8f27b39f3f9d53da3fc2824db137086185cf2117d9181900360600190a1505050565b6015546001600160a01b03163314806115e957506000546001600160a01b031633145b6116245760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b03166341e92edc6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b6001546001600160a01b0316331461168b57600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b0316331461173b576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631b2ce7f360e11b81526001600160a01b03848116600483015291519190921691633659cfe691602480830192600092919082900301818387803b158015610fa757600080fd5b6014546001600160a01b031681565b6000546001600160a01b031633146117e4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051630520060560e41b8152600481018590526024810184905290516001600160a01b039092169163520060509160448082019260009290919082900301818387803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146118a0576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b43600e55565b600f546001600160a01b031681565b60125460408051631cce309760e21b8152336004820152706973545553444d696e745061757365727360781b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d602081101561194457600080fd5b50518061195b57506000546001600160a01b031633145b6119a6576040805162461bcd60e51b815260206004820152601760248201527636bab9ba103132903830bab9b2b91037b91037bbb732b960491b604482015290519081900360640190fd5b6001601082815481106119b557fe5b600091825260209182902060069190910201600401805460ff1916921515929092179091556040805183815260019281019290925280517fbe7295ef37ca984ec35808d259aa03f272c2d747c6ce6a47b6e90862afccc5769281900390910190a150565b6000546001600160a01b03163314611a65576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b818311158015611a755750808211155b611a7e57600080fd5b600283905560038290556004819055604080518481526020810184905280820183905290517fba6a9f8d54021af0fab65e388ad81cc3dfb17207bed50a5e9a30f7adabb534d19181900360600190a1505050565b6000546001600160a01b03163314611b3057600d5460ff1615611b30576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b600f546001600160a01b0316331480611b5357506000546001600160a01b031633145b611b9f576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b600254811115611bf6576040805162461bcd60e51b815260206004820152601f60248201527f6f7665722074686520696e7374616e74206d696e74207468726573686f6c6400604482015290519081900360640190fd5b600854811115611c4d576040805162461bcd60e51b815260206004820152601860248201527f696e7374616e74206d696e7420706f6f6c206973206472790000000000000000604482015290519081900360640190fd5b600854611c60908263ffffffff61347116565b600855604051339082906001600160a01b038516907fec755a4feb8086d62e216ca919461349221df54bf9ca83300b7a2bf8e5807dfc90600090a4601154604080516340c10f1960e01b81526001600160a01b03858116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b15801561183857600080fd5b60025481565b6000546001600160a01b03163314611d42576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154600080546040805163223b8e7360e21b81526001600160a01b0386811660048301529283166024820152905191909316926388ee39cc92604480830193919282900301818387803b158015610fa757600080fd5b6012546001600160a01b031681565b600d5460ff1681565b600f546001600160a01b0316331480611dd457506000546001600160a01b031633145b611e20576040805162461bcd60e51b815260206004820152601860248201527736bab9ba1031329036b4b73a25b2bc9037b91037bbb732b960411b604482015290519081900360640190fd5b60108181548110611e2d57fe5b60009182526020808320600690920290910180546001600160a01b0319168155600181018390556002810183905560038101929092556004909101805460ff191690556040805183815290517fccec691f17b1a3d2b56ac2c39074c2930ba803fc46191a49259706621eac3f8f929181900390910190a150565b60125460408051631cce309760e21b81523360048201526e34b9a932b3b4b9ba393ca0b236b4b760891b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015611f0a57600080fd5b505afa158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b505180611f4b57506000546001600160a01b031633145b611f9c576040805162461bcd60e51b815260206004820152601f60248201527f6d7573742062652072656769737472792061646d696e206f72206f776e657200604482015290519081900360640190fd5b6011546040805163403a4b2b60e11b81526001600160a01b038581166004830152841515602483015291519190921691638074965691604480830192600092919082900301818387803b15801561183857600080fd5b60085481565b6000546001600160a01b03163314612044576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561208e57600080fd5b505afa1580156120a2573d6000803e3d6000fd5b505050506040513d60208110156120b857600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905291519293509085169163a9059cbb916044808201926020929091908290030181600087803b15801561211057600080fd5b505af1158015612124573d6000803e3d6000fd5b505050506040513d6020811015610fbb57600080fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b1580156121a057600080fd5b505afa1580156121b4573d6000803e3d6000fd5b505050506040513d60208110156121ca57600080fd5b5051806121e157506000546001600160a01b031633145b61222e576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b6000546001600160a01b0316331461232257612248613556565b604080518082019182905290600b9060029082845b81546001600160a01b0316815260019091019060200180831161225d57505050505090508060006002811061228e57fe5b60200201516001600160a01b0316336001600160a01b0316141580156122c1575060208101516001600160a01b03163314155b6122ca57600080fd5b80516001600160a01b03166123045733600b60005b0180546001600160a01b0319166001600160a01b03929092169190911790555061238a565b60208101516001600160a01b03166123205733600b60016122df565b505b61232e600b6000613574565b61235761234860095460065461347190919063ffffffff16565b600a549063ffffffff61347116565b600a556006546009556040517f102a997ac4d17915071d5422bc77b9e807c57305cefef394daf2468abacb26c290600090a15b565b6000546001600160a01b031681565b6000546001600160a01b031633146123f957600d5460ff16156123f9576040805162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015290519081900360640190fd5b61240161351c565b6010828154811061240e57fe5b600091825260208083206040805160a081018252600690940290910180546001600160a01b0390811680865260018301549486018590526002830154938601939093526003820154606086015260049091015460ff16151560808501529354929450929091339116146124965761248484612e80565b61248d57600080fd5b612496816134ce565b601084815481106124a357fe5b60009182526020822060069091020180546001600160a01b03191681556001810182905560028101829055600381018290556004908101805460ff19169055601154604080516340c10f1960e01b81526001600160a01b038781169482019490945260248101869052905191909216926340c10f19926044808201939182900301818387803b15801561253557600080fd5b505af1158015612549573d6000803e3d6000fd5b50506040805187815233602082015281518594506001600160a01b03871693507f9a0dcee498442c144388e9d1dd09acdf74ffc3bce9cb52841186c1d8ac032154929181900390910190a350505050565b6000546001600160a01b031633146125e6576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601554604080516001600160a01b039283168152918316602083015280517fd614f1235138bbaa4590745a4f8569f5798b0224d4e5c0c74f4f7ea437f0f3f49281900390910190a1601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461269c576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156126d1573d6000803e3d6000fd5b5050565b60125460408051631cce309760e21b81523360048201526f34b9a13630b1b5b634b9ba20b236b4b760811b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50518061277a57506000546001600160a01b031633145b6127cb576040805162461bcd60e51b815260206004820181905260248201527f6d75737420626520626c61636b6c6973742061646d696e206f72206f776e6572604482015290519081900360640190fd5b6011546040805163680eeb6960e11b81526001600160a01b038481166004830152600160248301529151919092169163d01dd6d291604480830192600092919082900301818387803b158015610fa757600080fd5b600b816002811061282d57fe5b01546001600160a01b0316905081565b6000546001600160a01b03163314612889576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600754600a556040517ff887efb579b3283f395871614f44a2fd3021ddf59e72a91195f5da936ebaa06d90600090a1565b6000546001600160a01b03163314612906576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f278c70ced5f3e0e5eeb385b5ff9cb735748ba00a625147e66065ed48fc1562cd90600090a250565b60125460408051631cce309760e21b8152336004820152706973545553444d696e745061757365727360781b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b1580156129bb57600080fd5b505afa1580156129cf573d6000803e3d6000fd5b505050506040513d60208110156129e557600080fd5b5051806129fc57506000546001600160a01b031633145b612a47576040805162461bcd60e51b815260206004820152601760248201527636bab9ba103132903830bab9b2b91037b91037bbb732b960491b604482015290519081900360640190fd5b600d805460ff1916600190811790915560408051918252517f6cb4a816be468261438a85abae2d59de6bc19b06d3a76e2f3acfd656d85a2ee99181900360200190a1565b6f34b9a13630b1b5b634b9ba20b236b4b760811b81565b6e34b9a932b3b4b9ba393ca0b236b4b760891b81565b600a5481565b6015546001600160a01b0316331480612ae157506000546001600160a01b031633145b612b1c5760405162461bcd60e51b81526004018080602001828103825260238152602001806135836023913960400191505060405180910390fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663cb4136c76040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b60125460408051631cce309760e21b81523360048201527134b9aa2aa9a226b4b73a2930ba34b334b2b960711b602482015290516001600160a01b0390921691637338c25c91604480820192602092909190829003018186803b158015612bd257600080fd5b505afa158015612be6573d6000803e3d6000fd5b505050506040513d6020811015612bfc57600080fd5b505180612c1357506000546001600160a01b031633145b612c60576040805162461bcd60e51b815260206004820152601960248201527836bab9ba103132903930ba34b334b2b91037b91037bbb732b960391b604482015290519081900360640190fd5b612c89612c7a60085460055461347190919063ffffffff16565b6009549063ffffffff61347116565b6009556005546008556040517ffebce9a3dbc55fe4e42cabd1229670f5e1ed4cbf008685f75392a050ab9561fd90600090a1565b6000546001600160a01b03163314612d09576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6001600160a01b038116612d64576040805162461bcd60e51b815260206004820152601a60248201527f6e6577206d696e74206b65792063616e6e6f7420626520307830000000000000604482015290519081900360640190fd5b600f546040516001600160a01b038084169216907ffbd0b5e594e818883d41b4de49805781c984d030597177b02c741cafe04bf21b90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b6000546001600160a01b03163314612e12576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b0316639965b3d66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b6013546001600160a01b031681565b6001546001600160a01b031681565b6000612e8a61351c565b60108381548110612e9757fe5b60009182526020918290206040805160a081018252600690930290910180546001600160a01b0316835260018101549383019390935260028301549082018190526003830154606083015260049092015460ff1615156080820152600e5490925010612f41576040805162461bcd60e51b81526020600482015260146024820152731d1a1a5cc81b5a5b9d081a5cc81a5b9d985b1a5960621b604482015290519081900360640190fd5b806080015115612f8e576040805162461bcd60e51b81526020600482015260136024820152721d1a1a5cc81b5a5b9d081a5cc81c185d5cd959606a1b604482015290519081900360640190fd5b612fa081606001518260200151611073565b612fe8576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f75676820617070726f76616c7360601b604482015290519081900360640190fd5b50600192915050565b60065481565b6000546001600160a01b03163314613043576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b6011546040805163680eeb6960e11b81526001600160a01b038481166004830152600060248301819052925193169263d01dd6d29260448084019391929182900301818387803b158015610fa757600080fd5b601081815481106130a357fe5b6000918252602090912060069091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b6000546001600160a01b0316331461312d576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051633b2b878360e21b81526001600160a01b0384811660048301529151919092169163ecae1e0c91602480830192600092919082900301818387803b158015610fa757600080fd5b600381565b733c8984dce8f68fcdeeeafd9e0eca3598562ed29181565b6000546001600160a01b031633146131e4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b03838116919091179182905560008054604051938316939216917fec070b46448fede8b4a9a9f8d7919141b5e1c729397eccb0c59af2d6d9fc2d6c9190a350565b6000546001600160a01b03163314613286576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b600d805460ff19169055604080516000815290517f6cb4a816be468261438a85abae2d59de6bc19b06d3a76e2f3acfd656d85a2ee99181900360200190a1565b6000546001600160a01b03163314613312576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b60115460408051631e77b84560e31b81526001600160a01b0384811660048301529151919092169163f3bdc22891602480830192600092919082900301818387803b158015610fa757600080fd5b6000546001600160a01b031633146133ac576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9027bbb732b960b11b604482015290519081900360640190fd5b601154600080546040805163269a8c2960e21b81526001600160a01b03928316600482015290519190931692639a6a30a492602480830193919282900301818387803b15801561119857600080fd5b6011546001600160a01b031681565b60055481565b60008282018381101561346a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000828211156134c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60095481111580156134e257506003548111155b15613502576009546134fa908263ffffffff61347116565b600955613519565b600a54613515908263ffffffff61347116565b600a555b50565b6040518060a0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000151581525090565b60405180604001604052806002906020820280368337509192915050565b50600081556001016000905556fe6f6e6c792070726f6f664f6652657365727665456e61626c6572206f72206f776e6572a2646970667358221220788726d155334d65a6e28c04950b640e5382d99292b442ff88ea61eca826f9c564736f6c634300060a0033
Deployed Bytecode Sourcemap
14681:23939:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27484:758;;;;;;;;;;;;;;;;-1:-1:-1;27484:758:0;;;-1:-1:-1;;;;;27484:758:0;;;;;;;;;;:::i;:::-;;33517:142;;;;;;;;;;;;;;;;-1:-1:-1;33517:142:0;-1:-1:-1;;;;;33517:142:0;;:::i;15045:23::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;16191:60;;;:::i;:::-;;;;;;;;;;;;;;;;16103:36;;;:::i;:::-;;;;-1:-1:-1;;;;;16103:36:0;;;;;;;;;;;;;;16258:63;;;:::i;15492:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22333:176;;;;;;;;;;;;;;;;-1:-1:-1;22333:176:0;-1:-1:-1;;;;;22333:176:0;;:::i;37990:192::-;;;;;;;;;;;;;;;;-1:-1:-1;37990:192:0;;:::i;15119:36::-;;;:::i;29396:587::-;;;;;;;;;;;;;;;;-1:-1:-1;29396:587:0;;;;;;;:::i;35212:142::-;;;:::i;15162:36::-;;;:::i;31001:107::-;;;:::i;15362:31::-;;;:::i;26204:296::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26204:296:0;;;;;;;;:::i;33069:159::-;;;;;;;;;;;;;;;;-1:-1:-1;33069:159:0;;:::i;15284:32::-;;;:::i;23810:731::-;;;;;;;;;;;;;;;;-1:-1:-1;23810:731:0;;;;;;;;;;;;:::i;38247:154::-;;;:::i;21992:202::-;;;:::i;22669:171::-;;;;;;;;;;;;;;;;-1:-1:-1;22669:171:0;-1:-1:-1;;;;;22669:171:0;;:::i;16048:32::-;;;:::i;35612:120::-;;;;;;;;;;;;;;;;-1:-1:-1;35612:120:0;;;;;;;:::i;32049:119::-;;;:::i;15837:22::-;;;:::i;32748:167::-;;;;;;;;;;;;;;;;-1:-1:-1;32748:167:0;;:::i;23228:409::-;;;;;;;;;;;;;;;;-1:-1:-1;23228:409:0;;;;;;;;;;;;:::i;26731:400::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26731:400:0;;;;;;;;:::i;15077:35::-;;;:::i;34986:115::-;;;;;;;;;;;;;;;;-1:-1:-1;34986:115:0;-1:-1:-1;;;;;34986:115:0;;:::i;15971:25::-;;;:::i;15708:22::-;;;:::i;30754:146::-;;;;;;;;;;;;;;;;-1:-1:-1;30754:146:0;;:::i;36592:136::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36592:136:0;;;;;;;;;;:::i;15325:30::-;;;:::i;36205:177::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36205:177:0;;;;;;;;;;:::i;24953:847::-;;;:::i;14966:28::-;;;:::i;28463:454::-;;;;;;;;;;;;;;;;-1:-1:-1;28463:454:0;;:::i;31626:192::-;;;;;;;;;;;;;;;;-1:-1:-1;31626:192:0;-1:-1:-1;;;;;31626:192:0;;:::i;35882:116::-;;;;;;;;;;;;;;;;-1:-1:-1;35882:116:0;-1:-1:-1;;;;;35882:116:0;;:::i;36876:132::-;;;;;;;;;;;;;;;;-1:-1:-1;36876:132:0;-1:-1:-1;;;;;36876:132:0;;:::i;15438:45::-;;;;;;;;;;;;;;;;-1:-1:-1;15438:45:0;;:::i;25875:146::-;;;:::i;33751:::-;;;;;;;;;;;;;;;;-1:-1:-1;33751:146:0;-1:-1:-1;;;;;33751:146:0;;:::i;32261:125::-;;;:::i;16570:63::-;;;:::i;16502:61::-;;;:::i;15400:31::-;;;:::i;38465:152::-;;;:::i;24618:245::-;;;:::i;31385:233::-;;;;;;;;;;;;;;;;-1:-1:-1;31385:233:0;-1:-1:-1;;;;;31385:233:0;;:::i;15737:44::-;;;:::i;22517:144::-;;;:::i;16003:24::-;;;:::i;15001:35::-;;;:::i;30132:429::-;;;;;;;;;;;;;;;;-1:-1:-1;30132:429:0;;:::i;15245:32::-;;;:::i;37167:126::-;;;;;;;;;;;;;;;;-1:-1:-1;37167:126:0;-1:-1:-1;;;;;37167:126:0;;:::i;15866:37::-;;;;;;;;;;;;;;;;-1:-1:-1;15866:37:0;;:::i;:::-;;;;-1:-1:-1;;;;;15866:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37777:149;;;;;;;;;;;;;;;;-1:-1:-1;37777:149:0;-1:-1:-1;;;;;37777:149:0;;:::i;15598:44::-;;;:::i;16766:90::-;;;:::i;21711:184::-;;;;;;;;;;;;;;;;-1:-1:-1;21711:184:0;-1:-1:-1;;;;;21711:184:0;;:::i;32481:117::-;;;:::i;37430:132::-;;;;;;;;;;;;;;;;-1:-1:-1;37430:132:0;-1:-1:-1;;;;;37430:132:0;;:::i;34694:94::-;;;:::i;15938:26::-;;;:::i;15207:31::-;;;:::i;27484:758::-;17909:5;;-1:-1:-1;;;;;17909:5:0;17895:10;:19;17891:93;;17940:10;;;;17939:11;17931:41;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;;;;17249:8:::1;::::0;:51:::1;::::0;;-1:-1:-1;;;17249:51:0;;17271:10:::1;17249:51;::::0;::::1;::::0;-1:-1:-1;;;17249:51:0;;;;;;-1:-1:-1;;;;;17249:8:0;;::::1;::::0;:21:::1;::::0;:51;;;;;::::1;::::0;;;;;;;;;:8;:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17249:51:0;;:74:::1;;-1:-1:-1::0;17318:5:0::1;::::0;-1:-1:-1;;;;;17318:5:0::1;17304:10;:19;17249:74;17241:112;;;::::0;;-1:-1:-1;;;17241:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17241:112:0;;;;;;;;;;;;;::::1;;27641:23:::2;;:::i;:::-;27667:14;27682:6;27667:22;;;;;;;;;::::0;;;::::2;::::0;;;;27641:48:::2;::::0;;::::2;::::0;::::2;::::0;;27667:22:::2;::::0;;::::2;::::0;;::::2;27641:48:::0;;-1:-1:-1;;;;;27641:48:0;;::::2;::::0;;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;;::::0;::::2;;;;::::0;;;;;;-1:-1:-1;27708:12:0;::::2;;27700:50;;;::::0;;-1:-1:-1;;;27700:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;27781:6;27769:2;:8;;;:18;27761:52;;;::::0;;-1:-1:-1;;;27761:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;27761:52:0;;;;;;;;;;;;;::::2;;27833:14;27848:6;27833:22;;;;;;;;;::::0;;;::::2;::::0;;;27865:10:::2;27833:43:::0;;:31:::2;:22;::::0;;::::2;;:31:::0;;;::::2;:43:::0;;;;;;::::2;;27832:44;27824:73;;;::::0;;-1:-1:-1;;;27824:73:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;27824:73:0;;;;;;;;;;;;;::::2;;27954:4;27908:14;27923:6;27908:22;;;;;;;;;::::0;;;::::2;::::0;;;27940:10:::2;27908:43:::0;;:22:::2;::::0;;;::::2;::::0;;::::2;:31;;:43:::0;;;;;:50;;-1:-1:-1;;27908:50:0::2;::::0;::::2;;::::0;;;::::2;::::0;;28011:14:::2;:22:::0;;:46:::2;::::0;-1:-1:-1;;28026:6:0;;28011:22;::::2;;;;;;;;;;;;;;;:39;;;:43;;:46;;;;:::i;:::-;27969:14;27984:6;27969:22;;;;;;;;;::::0;;;::::2;::::0;;:39:::2;:22;::::0;;::::2;;:39;:88:::0;;;;28073:32:::2;::::0;28094:10:::2;::::0;28086:6;;28073:32:::2;::::0;27969:22;28073:32:::2;28120:66;28138:14;28153:6;28138:22;;;;;;;;;;;;;;;;;;:39;;;28179:6;28120:17;:66::i;:::-;28116:119;;;28203:20;28216:6;28203:12;:20::i;:::-;17364:1;27484:758:::0;;;:::o;33517:142::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;33593:5:::1;:20:::0;;-1:-1:-1;;;;;33593:20:0;::::1;-1:-1:-1::0;;;;;;33593:20:0;;::::1;::::0;::::1;::::0;;;33629:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;33517:142:::0;:::o;15045:23::-;;;-1:-1:-1;;;15045:23:0;;;;;:::o;16191:60::-;-1:-1:-1;;;16191:60:0;:::o;16103:36::-;;;-1:-1:-1;;;;;16103:36:0;;:::o;16258:63::-;-1:-1:-1;;;16258:63:0;:::o;15492:42::-;15533:1;15492:42;:::o;22333:176::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;22460:5:::1;::::0;22426:75:::1;::::0;;-1:-1:-1;;;22426:75:0;;-1:-1:-1;;;;;22426:75:0;;::::1;;::::0;::::1;::::0;;;22460:5;;;::::1;::::0;22426:64:::1;::::0;:75;;;;;22460:5:::1;::::0;22426:75;;;;;;;22460:5;;22426:75;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22333:176:::0;:::o;37990:192::-;21448:21;;-1:-1:-1;;;;;21448:21:0;21434:10;:35;;:58;;-1:-1:-1;21487:5:0;;-1:-1:-1;;;;;21487:5:0;21473:10;:19;21434:58;21426:106;;;;-1:-1:-1;;;21426:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38128:5:::1;::::0;38099:75:::1;::::0;;-1:-1:-1;;;38099:75:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;38128:5:0;;::::1;::::0;38099:61:::1;::::0;:75;;;;;38128:5:::1;::::0;38099:75;;;;;;;;38128:5;;38099:75;::::1;;::::0;::::1;;;;::::0;::::1;15119:36:::0;;;;:::o;29396:587::-;29487:4;29518:16;;29508:6;:26;;:61;;;;;29548:21;;29538:6;:31;;29508:61;29504:182;;;15533:1;29590:37;;29586:89;;-1:-1:-1;29655:4:0;29648:11;;29586:89;29710:16;;29700:6;:26;;:61;;;;;29740:21;;29730:6;:31;;29700:61;29696:184;;;15641:1;29782:39;;29778:91;;-1:-1:-1;29849:4:0;29842:11;;29778:91;29908:5;;-1:-1:-1;;;;;29908:5:0;29894:10;:19;29890:63;;;-1:-1:-1;29937:4:0;29930:11;;29890:63;-1:-1:-1;29970:5:0;29396:587;;;;;:::o;35212:142::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;35306:5:::1;::::0;35272:74:::1;::::0;;-1:-1:-1;;;35272:74:0;;16814:42:::1;35272:74;::::0;::::1;::::0;;;-1:-1:-1;;;;;35306:5:0;;::::1;::::0;35272:51:::1;::::0;:74;;;;;35306:5:::1;::::0;35272:74;;;;;;;;35306:5;;35272:74;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;15162:36:::0;;;;:::o;31001:107::-;31079:14;:21;31001:107;:::o;15362:31::-;;;;:::o;26204:296::-;17909:5;;-1:-1:-1;;;;;17909:5:0;17895:10;:19;17891:93;;17940:10;;;;17939:11;17931:41;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;;;;16928:7:::1;::::0;-1:-1:-1;;;;;16928:7:0::1;16914:10;:21;::::0;:44:::1;;-1:-1:-1::0;16953:5:0::1;::::0;-1:-1:-1;;;;;16953:5:0::1;16939:10;:19;16914:44;16906:81;;;::::0;;-1:-1:-1;;;16906:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16906:81:0;;;;;;;;;;;;;::::1;;26307:23:::2;;:::i;:::-;-1:-1:-1::0;26333:50:0::2;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;26333:50:0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;26360:12:::2;26333:50:::0;;;;-1:-1:-1;26333:50:0;;;;;;;;;;26424:14:::2;:21:::0;26399:59;;;;;26447:10:::2;26399:59:::0;;::::2;::::0;;;;;;26333:50;;26352:6;;26399:59:::2;::::0;;;;;;;;::::2;26469:14;:23:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;26469:23:0;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;26469:23:0::2;-1:-1:-1::0;;;;;26469:23:0;;::::2;::::0;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;26469:23:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;;26204:296:0:o;33069:159::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;33172:5:::1;33138:14;33153:8;33138:24;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;:31;;:39:::0;;-1:-1:-1;;33138:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;33193:27:::1;::::0;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;33069:159:::0;:::o;15284:32::-;;;;:::o;23810:731::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;23973:9:::1;23961:8;:21;;:47;;;;;23999:9;23986;:22;;23961:47;23953:56;;;::::0;::::1;;24020:16;:27:::0;;;24062:15:::1;::::0;:34;-1:-1:-1;24058:101:0::1;;;24131:16;::::0;24113:15:::1;:34:::0;24058:101:::1;24169:17;:29:::0;;;24213:16:::1;::::0;:36;-1:-1:-1;24209:105:0::1;;;24285:17;::::0;24266:16:::1;:36:::0;24209:105:::1;24324:17;:29:::0;;;24368:16:::1;::::0;:36;-1:-1:-1;24364:105:0::1;;;24440:17;::::0;24421:16:::1;:36:::0;24364:105:::1;24484:49;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;23810:731:::0;;;:::o;38247:154::-;21448:21;;-1:-1:-1;;;;;21448:21:0;21434:10;:35;;:58;;-1:-1:-1;21487:5:0;;-1:-1:-1;;;;;21487:5:0;21473:10;:19;21434:58;21426:106;;;;-1:-1:-1;;;21426:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38362:5:::1;;;;;;;;;-1:-1:-1::0;;;;;38362:5:0::1;-1:-1:-1::0;;;;;38333:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;21992:202:::0;21215:12;;-1:-1:-1;;;;;21215:12:0;21201:10;:26;21193:35;;;;;;22105:12:::1;::::0;::::1;22089:5:::0;;22060:59:::1;::::0;-1:-1:-1;;;;;22105:12:0;;::::1;::::0;22089:5;;::::1;::::0;22060:59:::1;::::0;::::1;22138:12;::::0;;::::1;22130:20:::0;;-1:-1:-1;;;;;;22130:20:0;;::::1;-1:-1:-1::0;;;;;22138:12:0;::::1;22130:20;::::0;;;22161:25:::1;::::0;;21992:202::o;22669:171::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;22798:5:::1;::::0;22764:68:::1;::::0;;-1:-1:-1;;;22764:68:0;;-1:-1:-1;;;;;22764:68:0;;::::1;;::::0;::::1;::::0;;;22798:5;;;::::1;::::0;22764:51:::1;::::0;:68;;;;;22798:5:::1;::::0;22764:68;;;;;;;22798:5;;22764:68;::::1;;::::0;::::1;;;;::::0;::::1;16048:32:::0;;;-1:-1:-1;;;;;16048:32:0;;:::o;35612:120::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;35693:5:::1;::::0;:31:::1;::::0;;-1:-1:-1;;;35693:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;35693:5:0;;::::1;::::0;:19:::1;::::0;:31;;;;;:5:::1;::::0;:31;;;;;;;;:5;;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35612:120:::0;;:::o;32049:119::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;32148:12:::1;32116:29;:44:::0;32049:119::o;15837:22::-;;;-1:-1:-1;;;;;15837:22:0;;:::o;32748:167::-;17067:8;;:49;;;-1:-1:-1;;;17067:49:0;;17089:10;17067:49;;;;-1:-1:-1;;;17067:49:0;;;;;;-1:-1:-1;;;;;17067:8:0;;;;:21;;:49;;;;;;;;;;;;;;;:8;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17067:49:0;;:72;;-1:-1:-1;17134:5:0;;-1:-1:-1;;;;;17134:5:0;17120:10;:19;17067:72;17059:108;;;;;-1:-1:-1;;;17059:108:0;;;;;;;;;;;;-1:-1:-1;;;17059:108:0;;;;;;;;;;;;;;;32861:4:::1;32827:14;32842:8;32827:24;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;;:31;;:38:::0;;-1:-1:-1;;32827:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;32881:26:::1;::::0;;;;;-1:-1:-1;32881:26:0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;32748:167:::0;:::o;23228:409::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;23395:9:::1;23383:8;:21;;:47;;;;;23421:9;23408;:22;;23383:47;23375:56;;;::::0;::::1;;23442:20;:31:::0;;;23484:21:::1;:33:::0;;;23528:21:::1;:33:::0;;;23577:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;23228:409:::0;;;:::o;26731:400::-;17909:5;;-1:-1:-1;;;;;17909:5:0;17895:10;:19;17891:93;;17940:10;;;;17939:11;17931:41;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;;;;16928:7:::1;::::0;-1:-1:-1;;;;;16928:7:0::1;16914:10;:21;::::0;:44:::1;;-1:-1:-1::0;16953:5:0::1;::::0;-1:-1:-1;;;;;16953:5:0::1;16939:10;:19;16914:44;16906:81;;;::::0;;-1:-1:-1;;;16906:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16906:81:0;;;;;;;;;;;;;::::1;;26852:20:::2;;26842:6;:30;;26834:74;;;::::0;;-1:-1:-1;;;26834:74:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;26937:15;;26927:6;:25;;26919:62;;;::::0;;-1:-1:-1;;;26919:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;27010:15;::::0;:27:::2;::::0;27030:6;27010:27:::2;:19;:27;:::i;:::-;26992:15;:45:::0;27053:36:::2;::::0;27078:10:::2;::::0;27070:6;;-1:-1:-1;;;;;27053:36:0;::::2;::::0;::::2;::::0;;;::::2;27100:5;::::0;:23:::2;::::0;;-1:-1:-1;;;27100:23:0;;-1:-1:-1;;;;;27100:23:0;;::::2;;::::0;::::2;::::0;;;;;;;;;:5;;;::::2;::::0;:10:::2;::::0;:23;;;;;:5:::2;::::0;:23;;;;;;;:5;;:23;::::2;;::::0;::::2;;;;::::0;::::2;15077:35:::0;;;;:::o;34986:115::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;35060:5:::1;::::0;::::1;35087::::0;;35060:33:::1;::::0;;-1:-1:-1;;;35060:33:0;;-1:-1:-1;;;;;35060:33:0;;::::1;;::::0;::::1;::::0;35087:5;;::::1;35060:33:::0;;;;;;:5;;;::::1;::::0;:18:::1;::::0;:33;;;;;:5;;:33;;;;;:5;;:33;::::1;;::::0;::::1;;;;::::0;::::1;15971:25:::0;;;-1:-1:-1;;;;;15971:25:0;;:::o;15708:22::-;;;;;;:::o;30754:146::-;16928:7;;-1:-1:-1;;;;;16928:7:0;16914:10;:21;;:44;;-1:-1:-1;16953:5:0;;-1:-1:-1;;;;;16953:5:0;16939:10;:19;16914:44;16906:81;;;;;-1:-1:-1;;;16906:81:0;;;;;;;;;;;;-1:-1:-1;;;16906:81:0;;;;;;;;;;;;;;;30836:14:::1;30851:6;30836:22;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;30829:29:::0;;-1:-1:-1;;;;;;30829:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;30829:29:0::1;::::0;;30874:18:::1;::::0;;;;;;;::::1;::::0;;;;;;;;;::::1;30754:146:::0;:::o;36592:136::-;17436:8;;:52;;;-1:-1:-1;;;17436:52:0;;17458:10;17436:52;;;;-1:-1:-1;;;17436:52:0;;;;;;-1:-1:-1;;;;;17436:8:0;;;;:21;;:52;;;;;;;;;;;;;;;:8;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17436:52:0;;:75;;-1:-1:-1;17506:5:0;;-1:-1:-1;;;;;17506:5:0;17492:10;:19;17436:75;17428:119;;;;;-1:-1:-1;;;17428:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36687:5:::1;::::0;:33:::1;::::0;;-1:-1:-1;;;36687:33:0;;-1:-1:-1;;;;;36687:33:0;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;:5;;;::::1;::::0;:16:::1;::::0;:33;;;;;:5:::1;::::0;:33;;;;;;;:5;;:33;::::1;;::::0;::::1;;;;::::0;::::1;15325:30:::0;;;;:::o;36205:177::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;36303:31:::1;::::0;;-1:-1:-1;;;36303:31:0;;36328:4:::1;36303:31;::::0;::::1;::::0;;;36285:15:::1;::::0;-1:-1:-1;;;;;36303:16:0;::::1;::::0;::::1;::::0;:31;;;;;::::1;::::0;;;;;;;;;:16;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36303:31:0;36345:29:::1;::::0;;-1:-1:-1;;;36345:29:0;;-1:-1:-1;;;;;36345:29:0;;::::1;;::::0;::::1;::::0;;;;;;;;;36303:31;;-1:-1:-1;36345:15:0;;::::1;::::0;::::1;::::0;:29;;;;;36303:31:::1;::::0;36345:29;;;;;;;;-1:-1:-1;36345:15:0;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;24953:847:::0;17249:8;;:51;;;-1:-1:-1;;;17249:51:0;;17271:10;17249:51;;;;-1:-1:-1;;;17249:51:0;;;;;;-1:-1:-1;;;;;17249:8:0;;;;:21;;:51;;;;;;;;;;;;;;;:8;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17249:51:0;;:74;;-1:-1:-1;17318:5:0;;-1:-1:-1;;;;;17318:5:0;17304:10;:19;17249:74;17241:112;;;;;-1:-1:-1;;;17241:112:0;;;;;;;;;;;;-1:-1:-1;;;17241:112:0;;;;;;;;;;;;;;;25049:5:::1;::::0;-1:-1:-1;;;;;25049:5:0::1;25035:10;:19;25031:517;;25071:33;;:::i;:::-;:63:::0;;;;;::::1;::::0;;;;;25107:27:::1;::::0;25071:63:::1;::::0;25107:27;25071:63;::::1;::::0;;-1:-1:-1;;;;;25071:63:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;25171:15;25187:1;25171:18;;;;;;;;;;;-1:-1:-1::0;;;;;25157:32:0::1;:10;-1:-1:-1::0;;;;;25157:32:0::1;;;:68;;;;-1:-1:-1::0;25207:18:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;25193:32:0::1;:10;:32;;25157:68;25149:77;;;::::0;::::1;;25245:18:::0;;-1:-1:-1;;;;;25245:32:0::1;25241:141;;25331:10;25298:27;25326:1;25298:30;;:43:::0;;-1:-1:-1;;;;;;25298:43:0::1;-1:-1:-1::0;;;;;25298:43:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;25360:7:0::1;;25241:141;25400:18;::::0;::::1;::::0;-1:-1:-1;;;;;25400:32:0::1;25396:141;;25486:10;25453:27;25481:1;25453:30;::::0;25396:141:::1;25031:517;;25558:34;25565:27;;25558:34;:::i;:::-;25648:61;25669:39;25691:16;;25669:17;;:21;;:39;;;;:::i;:::-;25648:16;::::0;;:61:::1;:20;:61;:::i;:::-;25629:16;:80:::0;25739:17:::1;::::0;25720:16:::1;:36:::0;25772:20:::1;::::0;::::1;::::0;-1:-1:-1;;25772:20:0::1;17364:1;24953:847::o:0;14966:28::-;;;-1:-1:-1;;;;;14966:28:0;;:::o;28463:454::-;17909:5;;-1:-1:-1;;;;;17909:5:0;17895:10;:19;17891:93;;17940:10;;;;17939:11;17931:41;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;-1:-1:-1;;;17931:41:0;;;;;;;;;;;;;;;28533:23:::1;;:::i;:::-;28559:14;28574:6;28559:22;;;;;;;;;::::0;;;::::1;::::0;;;28533:48:::1;::::0;;::::1;::::0;::::1;::::0;;28559:22:::1;::::0;;::::1;::::0;;::::1;28533:48:::0;;-1:-1:-1;;;;;28533:48:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;;28674:5;;28533:48;;-1:-1:-1;28533:48:0;;;28660:10:::1;28674:5:::0;::::1;28660:19;28656:123;;28704:19;28716:6;28704:11;:19::i;:::-;28696:28;;;::::0;::::1;;28739;28761:5;28739:21;:28::i;:::-;28796:14;28811:6;28796:22;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;28789:29:::0;;-1:-1:-1;;;;;;28789:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;28789:29:0::1;::::0;;28829:5:::1;::::0;:21:::1;::::0;;-1:-1:-1;;;28829:21:0;;-1:-1:-1;;;;;28829:21:0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:21;;;;;;;;;;;28796:22;28829:5;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28866:43:0::1;::::0;;;;;28898:10:::1;28866:43;::::0;::::1;::::0;;;28883:5;;-1:-1:-1;;;;;;28866:43:0;::::1;::::0;-1:-1:-1;28866:43:0::1;::::0;;;;;;;;;::::1;17994:1;;;28463:454:::0;:::o;31626:192::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;31737:21:::1;::::0;31712:56:::1;::::0;;-1:-1:-1;;;;;31737:21:0;;::::1;31712:56:::0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;31779:21;:31:::0;;-1:-1:-1;;;;;;31779:31:0::1;-1:-1:-1::0;;;;;31779:31:0;;;::::1;::::0;;;::::1;::::0;;31626:192::o;35882:116::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;35955:35:::1;::::0;-1:-1:-1;;;;;35955:12:0;::::1;::::0;35968:21:::1;35955:35:::0;::::1;;;::::0;::::1;::::0;;;35968:21;35955:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35882:116:::0;:::o;36876:132::-;17631:8;;:53;;;-1:-1:-1;;;17631:53:0;;17653:10;17631:53;;;;-1:-1:-1;;;17631:53:0;;;;;;-1:-1:-1;;;;;17631:8:0;;;;:21;;:53;;;;;;;;;;;;;;;:8;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17631:53:0;;:76;;-1:-1:-1;17702:5:0;;-1:-1:-1;;;;;17702:5:0;17688:10;:19;17631:76;17623:121;;;;;-1:-1:-1;;;17623:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36963:5:::1;::::0;:37:::1;::::0;;-1:-1:-1;;;36963:37:0;;-1:-1:-1;;;;;36963:37:0;;::::1;;::::0;::::1;::::0;:5;:37;;;;;;:5;;;::::1;::::0;:20:::1;::::0;:37;;;;;:5:::1;::::0;:37;;;;;;;:5;;:37;::::1;;::::0;::::1;;;;::::0;::::1;15438:45:::0;;;;;;;;;;;;-1:-1:-1;;;;;15438:45:0;;-1:-1:-1;15438:45:0;:::o;25875:146::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;25958:17:::1;::::0;25939:16:::1;:36:::0;25991:22:::1;::::0;::::1;::::0;-1:-1:-1;;25991:22:0::1;25875:146::o:0;33751:::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;33823:8:::1;:20:::0;;-1:-1:-1;;;;;;33823:20:0::1;-1:-1:-1::0;;;;;33823:20:0;;::::1;::::0;;;::::1;::::0;;;;33859:30:::1;::::0;33879:8;::::1;::::0;33859:30:::1;::::0;-1:-1:-1;;33859:30:0::1;33751:146:::0;:::o;32261:125::-;17067:8;;:49;;;-1:-1:-1;;;17067:49:0;;17089:10;17067:49;;;;-1:-1:-1;;;17067:49:0;;;;;;-1:-1:-1;;;;;17067:8:0;;;;:21;;:49;;;;;;;;;;;;;;;:8;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17067:49:0;;:72;;-1:-1:-1;17134:5:0;;-1:-1:-1;;;;;17134:5:0;17120:10;:19;17067:72;17059:108;;;;;-1:-1:-1;;;17059:108:0;;;;;;;;;;;;-1:-1:-1;;;17059:108:0;;;;;;;;;;;;;;;32325:10:::1;:17:::0;;-1:-1:-1;;32325:17:0::1;32338:4;32325:17:::0;;::::1;::::0;;;32358:20:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;32261:125::o:0;16570:63::-;-1:-1:-1;;;16570:63:0;:::o;16502:61::-;-1:-1:-1;;;16502:61:0;:::o;15400:31::-;;;;:::o;38465:152::-;21448:21;;-1:-1:-1;;;;;21448:21:0;21434:10;:35;;:58;;-1:-1:-1;21487:5:0;;-1:-1:-1;;;;;21487:5:0;21473:10;:19;21434:58;21426:106;;;;-1:-1:-1;;;21426:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38579:5:::1;;;;;;;;;-1:-1:-1::0;;;;;38579:5:0::1;-1:-1:-1::0;;;;;38550:57:0::1;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;24618:245:::0;17249:8;;:51;;;-1:-1:-1;;;17249:51:0;;17271:10;17249:51;;;;-1:-1:-1;;;17249:51:0;;;;;;-1:-1:-1;;;;;17249:8:0;;;;:21;;:51;;;;;;;;;;;;;;;:8;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17249:51:0;;:74;;-1:-1:-1;17318:5:0;;-1:-1:-1;;;;;17318:5:0;17304:10;:19;17249:74;17241:112;;;;;-1:-1:-1;;;17241:112:0;;;;;;;;;;;;-1:-1:-1;;;17241:112:0;;;;;;;;;;;;;;;24714:59:::1;24735:37;24756:15;;24735:16;;:20;;:37;;;;:::i;:::-;24714:16;::::0;;:59:::1;:20;:59;:::i;:::-;24695:16;:78:::0;24802:16:::1;::::0;24784:15:::1;:34:::0;24834:21:::1;::::0;::::1;::::0;-1:-1:-1;;24834:21:0::1;24618:245::o:0;31385:233::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31469:25:0;::::1;31461:64;;;::::0;;-1:-1:-1;;;31461:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31557:7;::::0;31541:37:::1;::::0;-1:-1:-1;;;;;31541:37:0;;::::1;::::0;31557:7:::1;::::0;31541:37:::1;::::0;31557:7:::1;::::0;31541:37:::1;31589:7;:21:::0;;-1:-1:-1;;;;;;31589:21:0::1;-1:-1:-1::0;;;;;31589:21:0;;;::::1;::::0;;;::::1;::::0;;31385:233::o;15737:44::-;;;;:::o;22517:144::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;22624:5:::1;;;;;;;;;-1:-1:-1::0;;;;;22624:5:0::1;-1:-1:-1::0;;;;;22590:61:0::1;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;16003:24:::0;;;-1:-1:-1;;;;;16003:24:0;;:::o;15001:35::-;;;-1:-1:-1;;;;;15001:35:0;;:::o;30132:429::-;30190:4;30207:23;;:::i;:::-;30233:14;30248:6;30233:22;;;;;;;;;;;;;;;;;30207:48;;;;;;;;30233:22;;;;;;;30207:48;;-1:-1:-1;;;;;30207:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30294:29;;30207:48;;-1:-1:-1;;30266:82:0;;;;;-1:-1:-1;;;30266:82:0;;;;;;;;;;;;-1:-1:-1;;;30266:82:0;;;;;;;;;;;;;;;30406:2;:9;;;30405:10;30397:42;;;;;-1:-1:-1;;;30397:42:0;;;;;;;;;;;;-1:-1:-1;;;30397:42:0;;;;;;;;;;;;;;;30458:48;30476:2;:19;;;30497:2;:8;;;30458:17;:48::i;:::-;30450:81;;;;;-1:-1:-1;;;30450:81:0;;;;;;;;;;;;-1:-1:-1;;;30450:81:0;;;;;;;;;;;;;;;-1:-1:-1;30549:4:0;;30132:429;-1:-1:-1;;30132:429:0:o;15245:32::-;;;;:::o;37167:126::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;37244:5:::1;::::0;:41:::1;::::0;;-1:-1:-1;;;37244:41:0;;-1:-1:-1;;;;;37244:41:0;;::::1;;::::0;::::1;::::0;:5:::1;:41:::0;;;;;;;;:5;::::1;::::0;:20:::1;::::0;:41;;;;;:5;;:41;;;;;;:5;;:41;::::1;;::::0;::::1;;;;::::0;::::1;15866:37:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15866:37:0;;;;-1:-1:-1;15866:37:0;;;;;;;:::o;37777:149::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;37882:5:::1;::::0;37853:65:::1;::::0;;-1:-1:-1;;;37853:65:0;;-1:-1:-1;;;;;37853:65:0;;::::1;;::::0;::::1;::::0;;;37882:5;;;::::1;::::0;37853:56:::1;::::0;:65;;;;;37882:5:::1;::::0;37853:65;;;;;;;37882:5;;37853:65;::::1;;::::0;::::1;;;;::::0;::::1;15598:44:::0;15641:1;15598:44;:::o;16766:90::-;16814:42;16766:90;:::o;21711:184::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;21794:12:::1;:23:::0;;-1:-1:-1;;;;;;21794:23:0::1;-1:-1:-1::0;;;;;21794:23:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;21857:5:0;;21833:54:::1;::::0;21873:12;;::::1;::::0;21857:5;::::1;::::0;21833:54:::1;::::0;-1:-1:-1;21833:54:0::1;21711:184:::0;:::o;32481:117::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;32535:10:::1;:18:::0;;-1:-1:-1;;32535:18:0::1;::::0;;32569:21:::1;::::0;;32548:5:::1;32569:21:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;32481:117::o:0;37430:132::-;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;37513:5:::1;::::0;:41:::1;::::0;;-1:-1:-1;;;37513:41:0;;-1:-1:-1;;;;;37513:41:0;;::::1;;::::0;::::1;::::0;;;:5;;;::::1;::::0;:23:::1;::::0;:41;;;;;:5:::1;::::0;:41;;;;;;;:5;;:41;::::1;;::::0;::::1;;;;::::0;::::1;34694:94:::0;21005:5;;-1:-1:-1;;;;;21005:5:0;20991:10;:19;20983:42;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;-1:-1:-1;;;20983:42:0;;;;;;;;;;;;;;;34755:5:::1;::::0;::::1;34774::::0;;34755:25:::1;::::0;;-1:-1:-1;;;34755:25:0;;-1:-1:-1;;;;;34774:5:0;;::::1;34755:25;::::0;::::1;::::0;;;:5;;;::::1;::::0;:18:::1;::::0;:25;;;;;:5;;:25;;;;;:5;;:25;::::1;;::::0;::::1;;;;::::0;::::1;15938:26:::0;;;-1:-1:-1;;;;;15938:26:0;;:::o;15207:31::-;;;;:::o;2913:179::-;2971:7;3003:5;;;3027:6;;;;3019:46;;;;;-1:-1:-1;;;3019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3083:1;2913:179;-1:-1:-1;;;2913:179:0:o;3375:158::-;3433:7;3466:1;3461;:6;;3453:49;;;;;-1:-1:-1;;;3453:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3520:5:0;;;3375:158::o;28993:295::-;29074:16;;29064:6;:26;;:61;;;;;29104:21;;29094:6;:31;;29064:61;29060:221;;;29161:16;;:28;;29182:6;29161:28;:20;:28;:::i;:::-;29142:16;:47;29060:221;;;29241:16;;:28;;29262:6;29241:28;:20;:28;:::i;:::-;29222:16;:47;29060:221;28993:295;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o
Swarm Source
ipfs://788726d155334d65a6e28c04950b640e5382d99292b442ff88ea61eca826f9c5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.