ETH Price: $2,675.62 (+1.54%)

Contract

0x3c394f54dF0D8Db742d67952C4236e41ae343776
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040199383852024-05-24 7:55:1191 days ago1716537311IN
 Create: TokenControllerV3
0 ETH0.028151779.28420266

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenControllerV3

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.