ETH Price: $3,808.98 (-2.24%)
Gas: 10 Gwei

Token

FARM_DAI (fDAI)
 

Overview

Max Total Supply

7,781,423.792363369162799989 fDAI

Holders

186

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7.998100577477616467 fDAI

Value
$0.00
0x1288e3daD9Deb275deb8793F5E206ab17BF11224
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
VaultDAI

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 150 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-31
*/

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following 
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: @openzeppelin/contracts/math/Math.sol

pragma solidity ^0.5.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
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);
}

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: contracts/hardworkInterface/IStrategy.sol

pragma solidity 0.5.16;


interface IStrategy {
    
    function unsalvagableTokens(address tokens) external view returns (bool);
    
    function governance() external view returns (address);
    function controller() external view returns (address);
    function underlying() external view returns (address);
    function vault() external view returns (address);

    function withdrawAllToVault() external;
    function withdrawToVault(uint256 amount) external;

    function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch()

    // should only be called by controller
    function salvage(address recipient, address token, uint256 amount) external;

    function doHardWork() external;
    function depositArbCheck() external view returns(bool);
}

// File: contracts/hardworkInterface/IController.sol

pragma solidity 0.5.16;

interface IController {
    // [Grey list]
    // An EOA can safely interact with the system no matter what.
    // If you're using Metamask, you're using an EOA.
    // Only smart contracts may be affected by this grey list.
    //
    // This contract will not be able to ban any EOA from the system
    // even if an EOA is being added to the greyList, he/she will still be able
    // to interact with the whole system as if nothing happened.
    // Only smart contracts will be affected by being added to the greyList.
    // This grey list is only used in Vault.sol, see the code there for reference
    function greyList(address _target) external returns(bool);

    function addVaultAndStrategy(address _vault, address _strategy) external;
    function doHardWork(address _vault) external;
    function hasVault(address _vault) external returns(bool);

    function salvage(address _token, uint256 amount) external;
    function salvageStrategy(address _strategy, address _token, uint256 amount) external;

    function notifyFee(address _underlying, uint256 fee) external;
    function profitSharingNumerator() external view returns (uint256);
    function profitSharingDenominator() external view returns (uint256);
}

// File: contracts/Storage.sol

pragma solidity 0.5.16;

contract Storage {

  address public governance;
  address public controller;

  constructor() public {
    governance = msg.sender;
  }

  modifier onlyGovernance() {
    require(isGovernance(msg.sender), "Not governance");
    _;
  }

  function setGovernance(address _governance) public onlyGovernance {
    require(_governance != address(0), "new governance shouldn't be empty");
    governance = _governance;
  }

  function setController(address _controller) public onlyGovernance {
    require(_controller != address(0), "new controller shouldn't be empty");
    controller = _controller;
  }

  function isGovernance(address account) public view returns (bool) {
    return account == governance;
  }

  function isController(address account) public view returns (bool) {
    return account == controller;
  }
}

// File: contracts/Governable.sol

pragma solidity 0.5.16;


contract Governable {

  Storage public store;

  constructor(address _store) public {
    require(_store != address(0), "new storage shouldn't be empty");
    store = Storage(_store);
  }

  modifier onlyGovernance() {
    require(store.isGovernance(msg.sender), "Not governance");
    _;
  }

  function setStorage(address _store) public onlyGovernance {
    require(_store != address(0), "new storage shouldn't be empty");
    store = Storage(_store);
  }

  function governance() public view returns (address) {
    return store.governance();
  }
}

// File: contracts/hardworkInterface/IVault.sol

pragma solidity 0.5.16;


interface IVault {
    // the IERC20 part is the share

    function underlyingBalanceInVault() external view returns (uint256);
    function underlyingBalanceWithInvestment() external view returns (uint256);

    function governance() external view returns (address);
    function controller() external view returns (address);
    function underlying() external view returns (address);
    function strategy() external view returns (address);

    function setStrategy(address _strategy) external;
    function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external;

    function deposit(uint256 amountWei) external;
    function depositFor(uint256 amountWei, address holder) external;

    function withdrawAll() external;
    function withdraw(uint256 numberOfShares) external;
    function getPricePerFullShare() external view returns (uint256);

    function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256);

    // hard work should be callable only by the controller (by the hard worker) or by governance
    function doHardWork() external;
    function rebalance() external;
}

// File: contracts/Controllable.sol

pragma solidity 0.5.16;


contract Controllable is Governable {

  constructor(address _storage) Governable(_storage) public {
  }

  modifier onlyController() {
    require(store.isController(msg.sender), "Not a controller");
    _;
  }

  modifier onlyControllerOrGovernance(){
    require((store.isController(msg.sender) || store.isGovernance(msg.sender)),
      "The caller must be controller or governance");
    _;
  }

  function controller() public view returns (address) {
    return store.controller();
  }
}

// File: contracts/Vault.sol

pragma solidity 0.5.16;













contract Vault is ERC20, ERC20Detailed, IVault, Controllable {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  event Withdraw(address indexed beneficiary, uint256 amount);
  event Deposit(address indexed beneficiary, uint256 amount);
  event Invest(uint256 amount);

  IStrategy public strategy;
  IERC20 public underlying;

  uint256 public underlyingUnit;

  mapping(address => uint256) public contributions;
  mapping(address => uint256) public withdrawals;

  uint256 public vaultFractionToInvestNumerator;
  uint256 public vaultFractionToInvestDenominator;

  constructor(address _storage,
      address _underlying,
      uint256 _toInvestNumerator,
      uint256 _toInvestDenominator
  ) ERC20Detailed(
    string(abi.encodePacked("FARM_", ERC20Detailed(_underlying).symbol())),
    string(abi.encodePacked("f", ERC20Detailed(_underlying).symbol())),
    ERC20Detailed(_underlying).decimals()
  ) Controllable(_storage) public {
    underlying = IERC20(_underlying);
    require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%");
    require(_toInvestDenominator != 0, "cannot divide by 0");
    vaultFractionToInvestDenominator = _toInvestDenominator;
    vaultFractionToInvestNumerator = _toInvestNumerator;
    underlyingUnit = 10 ** uint256(ERC20Detailed(address(underlying)).decimals());
  }

  modifier whenStrategyDefined() {
    require(address(strategy) != address(0), "Strategy must be defined");
    _;
  }

  // Only smart contracts will be affected by this modifier
  modifier defense() {
    require(
      (msg.sender == tx.origin) ||                // If it is a normal user and not smart contract,
                                                  // then the requirement will pass
      !IController(controller()).greyList(msg.sender), // If it is a smart contract, then
      "This smart contract has been grey listed"  // make sure that it is not on our greyList.
    );
    _;
  }

  /**
  * Chooses the best strategy and re-invests. If the strategy did not change, it just calls
  * doHardWork on the current strategy. Call this through controller to claim hard rewards.
  */
  function doHardWork() whenStrategyDefined onlyControllerOrGovernance external {
    // ensure that new funds are invested too
    invest();
    strategy.doHardWork();
  }

  /*
  * Returns the cash balance across all users in this contract.
  */
  function underlyingBalanceInVault() view public returns (uint256) {
    return underlying.balanceOf(address(this));
  }

  /* Returns the current underlying (e.g., DAI's) balance together with
   * the invested amount (if DAI is invested elsewhere by the strategy).
  */
  function underlyingBalanceWithInvestment() view public returns (uint256) {
    if (address(strategy) == address(0)) {
      // initial state, when not set
      return underlyingBalanceInVault();
    }
    return underlyingBalanceInVault().add(strategy.investedUnderlyingBalance());
  }

  /*
  * Allows for getting the total contributions ever made.
  */
  function getContributions(address holder) view public returns (uint256) {
    return contributions[holder];
  }

  /*
  * Allows for getting the total withdrawals ever made.
  */
  function getWithdrawals(address holder) view public returns (uint256) {
    return withdrawals[holder];
  }

  function getPricePerFullShare() public view returns (uint256) {
    return totalSupply() == 0
        ? underlyingUnit
        : underlyingUnit.mul(underlyingBalanceWithInvestment()).div(totalSupply());
  }

  /* get the user's share (in underlying)
  */
  function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256) {
    if (totalSupply() == 0) {
      return 0;
    }
    return underlyingBalanceWithInvestment()
        .mul(balanceOf(holder))
        .div(totalSupply());
  }

  function setStrategy(address _strategy) public onlyControllerOrGovernance {
    require(_strategy != address(0), "new _strategy cannot be empty");
    require(IStrategy(_strategy).underlying() == address(underlying), "Vault underlying must match Strategy underlying");
    require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault");

    if (address(_strategy) != address(strategy)) {
      if (address(strategy) != address(0)) { // if the original strategy (no underscore) is defined
        underlying.safeApprove(address(strategy), 0);
        strategy.withdrawAllToVault();
      }
      strategy = IStrategy(_strategy);
      underlying.safeApprove(address(strategy), 0);
      underlying.safeApprove(address(strategy), uint256(~0));
    }
  }

  function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external onlyGovernance {
    require(denominator > 0, "denominator must be greater than 0");
    require(numerator < denominator, "denominator must be greater than numerator");
    vaultFractionToInvestNumerator = numerator;
    vaultFractionToInvestDenominator = denominator;
  }

  function rebalance() external onlyControllerOrGovernance {
    withdrawAll();
    invest();
  }

  function availableToInvestOut() public view returns (uint256) {
    uint256 wantInvestInTotal = underlyingBalanceWithInvestment()
        .mul(vaultFractionToInvestNumerator)
        .div(vaultFractionToInvestDenominator);
    uint256 alreadyInvested = strategy.investedUnderlyingBalance();
    if (alreadyInvested >= wantInvestInTotal) {
      return 0;
    } else {
      uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested);
      return remainingToInvest <= underlyingBalanceInVault()
        // TODO: we think that the "else" branch of the ternary operation is not
        // going to get hit
        ? remainingToInvest : underlyingBalanceInVault();
    }
  }

  function invest() internal whenStrategyDefined {
    uint256 availableAmount = availableToInvestOut();
    if (availableAmount > 0) {
      underlying.safeTransfer(address(strategy), availableAmount);
      emit Invest(availableAmount);
    }
  }

  /*
  * Allows for depositing the underlying asset in exchange for shares.
  * Approval is assumed.
  */
  function deposit(uint256 amount) external defense {
    _deposit(amount, msg.sender, msg.sender);
  }

  /*
  * Allows for depositing the underlying asset in exchange for shares
  * assigned to the holder.
  * This facilitates depositing for someone else (using DepositHelper)
  */
  function depositFor(uint256 amount, address holder) public defense {
    _deposit(amount, msg.sender, holder);
  }

  function withdrawAll() public onlyControllerOrGovernance whenStrategyDefined {
    strategy.withdrawAllToVault();
  }

  function withdraw(uint256 numberOfShares) external {
    require(totalSupply() > 0, "Vault has no shares");
    require(numberOfShares > 0, "numberOfShares must be greater than 0");
    uint256 totalSupply = totalSupply();
    _burn(msg.sender, numberOfShares);

    uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment()
        .mul(numberOfShares)
        .div(totalSupply);

    if (underlyingAmountToWithdraw > underlyingBalanceInVault()) {
      // withdraw everything from the strategy to accurately check the share value
      if (numberOfShares == totalSupply) {
        strategy.withdrawAllToVault();
      } else {
        uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault());
        strategy.withdrawToVault(missing);
      }
      // recalculate to improve accuracy
      underlyingAmountToWithdraw = Math.min(underlyingBalanceWithInvestment()
          .mul(numberOfShares)
          .div(totalSupply), underlyingBalanceInVault());
    }

    underlying.safeTransfer(msg.sender, underlyingAmountToWithdraw);

    // update the withdrawal amount for the holder
    withdrawals[msg.sender] = withdrawals[msg.sender].add(underlyingAmountToWithdraw);
    emit Withdraw(msg.sender, underlyingAmountToWithdraw);
  }

  function _deposit(uint256 amount, address sender, address beneficiary) internal {
    require(amount > 0, "Cannot deposit 0");
    require(beneficiary != address(0), "holder must be defined");

    if (address(strategy) != address(0)) {
      require(strategy.depositArbCheck(), "Too much arb");
    }

    /*
      todo: Potentially exploitable with a flashloan if
      strategy under-reports the value.
    */
    uint256 toMint = totalSupply() == 0
        ? amount
        : amount.mul(totalSupply()).div(underlyingBalanceWithInvestment());
    _mint(beneficiary, toMint);

    underlying.safeTransferFrom(sender, address(this), amount);

    // update the contribution amount for the beneficiary
    contributions[beneficiary] = contributions[beneficiary].add(amount);
    emit Deposit(beneficiary, amount);
  }
}

// File: contracts/vaults/VaultDAI.sol

pragma solidity 0.5.16;


contract VaultDAI is Vault {
  constructor(address _controller,
      address _underlying,
      uint256 _toInvestNumerator,
      uint256 _toInvestDenominator
  ) Vault(
    _controller,
    _underlying,
    _toInvestNumerator,
    _toInvestDenominator
  ) public {
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"availableToInvestOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"depositFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doHardWork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getContributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setVaultFractionToInvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"store","outputs":[{"internalType":"contract Storage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceInVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceWithInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"underlyingBalanceWithInvestmentForHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numberOfShares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200343138038062003431833981810160405260808110156200003757600080fd5b508051602082015160408084015160609094015181516395d89b4160e01b815291519394929390918591859185918591859182916001600160a01b038716916395d89b4191600480820192600092909190829003018186803b1580156200009d57600080fd5b505afa158015620000b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620000dc57600080fd5b8101908080516040519392919084640100000000821115620000fd57600080fd5b9083019060208201858111156200011357600080fd5b82516401000000008111828201881017156200012e57600080fd5b82525081516020918201929091019080838360005b838110156200015d57818101518382015260200162000143565b50505050905090810190601f1680156200018b5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080644641524d5f60d81b81525060050182805190602001908083835b60208310620001d65780518252601f199092019160209182019101620001b5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200024457600080fd5b505afa15801562000259573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200028357600080fd5b8101908080516040519392919084640100000000821115620002a457600080fd5b908301906020820185811115620002ba57600080fd5b8251640100000000811182820188101715620002d557600080fd5b82525081516020918201929091019080838360005b8381101562000304578181015183820152602001620002ea565b50505050905090810190601f168015620003325780820380516001836020036101000a031916815260200191505b506040525050506040516020018080603360f91b81525060010182805190602001908083835b60208310620003795780518252601f19909201916020918201910162000358565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e757600080fd5b505afa158015620003fc573d6000803e3d6000fd5b505050506040513d60208110156200041357600080fd5b505182516200042a90600390602086019062000620565b5081516200044090600490602085019062000620565b506005805460ff191660ff9290921691909117905550506001600160a01b038116620004b3576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b60058054610100600160a81b0319166101006001600160a01b0393841602179055600780546001600160a01b031916918616919091179055508082111562000542576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b806200058a576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b600c819055600b8290556007546040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b158015620005da57600080fd5b505afa158015620005ef573d6000803e3d6000fd5b505050506040513d60208110156200060657600080fd5b505160ff16600a0a60085550620006c59650505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200066357805160ff191683800117855562000693565b8280016001018555821562000693579182015b828111156200069357825182559160200191906001019062000676565b50620006a1929150620006a5565b5090565b620006c291905b80821115620006a15760008155600101620006ac565b90565b612d5c80620006d56000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806370a0823111610130578063a457c2d7116100b8578063b6b55f251161007c578063b6b55f25146105fd578063c2baf3561461061a578063dd62ed3e14610622578063f2768c1e14610650578063f77c47911461065857610227565b8063a457c2d714610572578063a5b1a24d1461059e578063a8c62e76146105c1578063a9059cbb146105c9578063b592c390146105f557610227565b8063853828b6116100ff578063853828b61461050e5780638cb1d67f146105165780639137c1a71461053c57806395d89b4114610562578063975057e71461056a57610227565b806370a08231146104b257806377c7b8fc146104d85780637a9262a2146104e05780637d7c2a1c1461050657610227565b806339509351116101b35780634af1758b116101825780634af1758b1461046e5780634fa5d8541461047657806353ceb01c1461047e5780635aa6e675146104865780636f307dc3146104aa57610227565b806339509351146103d05780633a2b643a146103fc5780633f19d0431461042257806342e94c901461044857610227565b806323b872dd116101fa57806323b872dd1461030b5780632e1a7d4d14610341578063313ce5671461036057806333a100ca1461037e57806336efd16f146103a457610227565b806306fdde031461022c578063095ea7b3146102a957806318160ddd146102e95780631bf8e7be14610303575b600080fd5b610234610660565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b0381351690602001356106f7565b604080519115158252519081900360200190f35b6102f1610715565b60408051918252519081900360200190f35b6102f161071b565b6102d56004803603606081101561032157600080fd5b506001600160a01b038135811691602081013590911690604001356107c8565b61035e6004803603602081101561035757600080fd5b5035610855565b005b610368610ade565b6040805160ff9092168252519081900360200190f35b61035e6004803603602081101561039457600080fd5b50356001600160a01b0316610ae7565b61035e600480360360408110156103ba57600080fd5b50803590602001356001600160a01b0316610ef5565b6102d5600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610fd5565b6102f16004803603602081101561041257600080fd5b50356001600160a01b0316611029565b6102f16004803603602081101561043857600080fd5b50356001600160a01b0316611048565b6102f16004803603602081101561045e57600080fd5b50356001600160a01b0316611063565b6102f1611075565b61035e61107b565b6102f161127d565b61048e611283565b604080516001600160a01b039092168252519081900360200190f35b61048e611304565b6102f1600480360360208110156104c857600080fd5b50356001600160a01b0316611313565b6102f161132e565b6102f1600480360360208110156104f657600080fd5b50356001600160a01b031661136e565b61035e611380565b61035e6114ca565b6102f16004803603602081101561052c57600080fd5b50356001600160a01b03166116aa565b61035e6004803603602081101561055257600080fd5b50356001600160a01b03166116df565b61023461181f565b61048e611880565b6102d56004803603604081101561058857600080fd5b506001600160a01b038135169060200135611894565b61035e600480360360408110156105b457600080fd5b5080359060200135611902565b61048e611a47565b6102d5600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611a56565b6102f1611a6a565b61035e6004803603602081101561061357600080fd5b5035611b4f565b6102f1611c2b565b6102f16004803603604081101561063857600080fd5b506001600160a01b0381358116916020013516611c76565b6102f1611ca1565b61048e611ca7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b505050505090505b90565b600061070b610704611cf7565b8484611cfb565b5060015b92915050565b60025490565b6006546000906001600160a01b031661073d57610736611c2b565b90506106f4565b600654604080516322e80f2560e11b815290516107c3926001600160a01b0316916345d01e4a916004808301926020929190829003018186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d60208110156107ad57600080fd5b50516107b7611c2b565b9063ffffffff611de716565b905090565b60006107d5848484611e48565b61084b846107e1611cf7565b61084685604051806060016040528060288152602001612bec602891396001600160a01b038a1660009081526001602052604081209061081f611cf7565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611fa416565b611cfb565b5060019392505050565b600061085f610715565b116108a7576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b600081116108e65760405162461bcd60e51b8152600401808060200182810382526025815260200180612c146025913960400191505060405180910390fd5b60006108f0610715565b90506108fc338361203b565b60006109268261091a8561090e61071b565b9063ffffffff61213716565b9063ffffffff61219016565b9050610930611c2b565b811115610a5357818314156109ac57600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b50505050610a30565b60006109c66109b9611c2b565b839063ffffffff6121d216565b600654604080516319d1885d60e31b81526004810184905290519293506001600160a01b039091169163ce8c42e89160248082019260009290919082900301818387803b158015610a1657600080fd5b505af1158015610a2a573d6000803e3d6000fd5b50505050505b610a50610a438361091a8661090e61071b565b610a4b611c2b565b612214565b90505b600754610a70906001600160a01b0316338363ffffffff61222a16565b336000908152600a6020526040902054610a90908263ffffffff611de716565b336000818152600a6020908152604091829020939093558051848152905191927f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436492918290030190a2505050565b60055460ff1690565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b158015610b3657600080fd5b505afa158015610b4a573d6000803e3d6000fd5b505050506040513d6020811015610b6057600080fd5b505180610be45750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6020811015610be157600080fd5b50515b610c1f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6001600160a01b038116610c7a576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b60075460408051636f307dc360e01b815290516001600160a01b0392831692841691636f307dc3916004808301926020929190829003018186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d6020811015610ceb57600080fd5b50516001600160a01b031614610d325760405162461bcd60e51b815260040180806020018281038252602f815260200180612b9c602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7557600080fd5b505afa158015610d89573d6000803e3d6000fd5b505050506040513d6020811015610d9f57600080fd5b50516001600160a01b031614610de65760405162461bcd60e51b815260040180806020018281038252602a815260200180612b24602a913960400191505060405180910390fd5b6006546001600160a01b03828116911614610ef2576006546001600160a01b031615610e9957600654600754610e30916001600160a01b039182169116600063ffffffff61228116565b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8057600080fd5b505af1158015610e94573d6000803e3d6000fd5b505050505b600680546001600160a01b0319166001600160a01b038381169190911791829055600754610ecd9290821691166000612281565b600654600754610ef2916001600160a01b03918216911660001963ffffffff61228116565b50565b33321480610f8b5750610f06611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d6020811015610f8757600080fd5b5051155b610fc65760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610fd1823383612394565b5050565b600061070b610fe2611cf7565b846108468560016000610ff3611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611de716565b6001600160a01b0381166000908152600a60205260409020545b919050565b6001600160a01b031660009081526009602052604090205490565b60096020526000908152604090205481565b600b5481565b6006546001600160a01b03166110d3576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051806111d05750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50515b61120b5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6112136125df565b600660009054906101000a90046001600160a01b03166001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050565b60085481565b6000600560019054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b5051905090565b6007546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000611338610715565b1561136757611362611348610715565b61091a61135361071b565b6008549063ffffffff61213716565b6107c3565b5060085490565b600a6020526000908152604090205481565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b50518061147d5750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50515b6114b85760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6114c06114ca565b6114c86125df565b565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051806115c75750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b50515b6116025760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6006546001600160a01b031661165a576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b60006116b4610715565b6116c057506000611043565b61070f6116cb610715565b61091a6116d785611313565b61090e61071b565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b505161179c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166117f7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b60055461010090046001600160a01b031681565b600061070b6118a1611cf7565b8461084685604051806060016040528060258152602001612d0360259139600160006118cb611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611fa416565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516119bf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116119fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a946022913960400191505060405180910390fd5b808210611a3c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612afa602a913960400191505060405180910390fd5b600b91909155600c55565b6006546001600160a01b031681565b600061070b611a63611cf7565b8484611e48565b600080611a81600c5461091a600b5461090e61071b565b90506000600660009054906101000a90046001600160a01b03166001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b50519050818110611b13576000925050506106f4565b6000611b25838363ffffffff6121d216565b9050611b2f611c2b565b811115611b4357611b3e611c2b565b611b45565b805b93505050506106f4565b33321480611be55750611b60611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050506040513d6020811015611be157600080fd5b5051155b611c205760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610ef2813333612394565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156112d357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b6000600560019054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b3390565b6001600160a01b038316611d405760405162461bcd60e51b8152600401808060200182810382526024815260200180612c7f6024913960400191505060405180910390fd5b6001600160a01b038216611d855760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611e41576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316611e8d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c5a6025913960400191505060405180910390fd5b6001600160a01b038216611ed25760405162461bcd60e51b8152600401808060200182810382526023815260200180612a716023913960400191505060405180910390fd5b611f1581604051806060016040528060268152602001612b4e602691396001600160a01b038616600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f4a908263ffffffff611de716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120335760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120805760405162461bcd60e51b8152600401808060200182810382526021815260200180612c396021913960400191505060405180910390fd5b6120c381604051806060016040528060228152602001612ab6602291396001600160a01b038516600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b0383166000908152602081905260409020556002546120ef908263ffffffff6121d216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826121465750600061070f565b8282028284828161215357fe5b0414611e415760405162461bcd60e51b8152600401808060200182810382526021815260200180612bcb6021913960400191505060405180910390fd5b6000611e4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126a2565b6000611e4183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fa4565b60008183106122235781611e41565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261227c908490612707565b505050565b801580612307575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122d957600080fd5b505afa1580156122ed573d6000803e3d6000fd5b505050506040513d602081101561230357600080fd5b5051155b6123425760405162461bcd60e51b8152600401808060200182810382526036815260200180612ccd6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261227c908490612707565b600083116123dc576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b038116612430576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b6006546001600160a01b0316156124fb57600660009054906101000a90046001600160a01b03166001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248f57600080fd5b505afa1580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b50516124fb576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000612505610715565b156125325761252d61251561071b565b61091a612520610715565b879063ffffffff61213716565b612534565b835b905061254082826128bf565b60075461255e906001600160a01b031684308763ffffffff6129af16565b6001600160a01b038216600090815260096020526040902054612587908563ffffffff611de716565b6001600160a01b038316600081815260096020908152604091829020939093558051878152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a250505050565b6006546001600160a01b0316612637576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000612641611a6a565b90508015610ef25760065460075461266c916001600160a01b0391821691168363ffffffff61222a16565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b600081836126f15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ff8578181015183820152602001611fe0565b5060008385816126fd57fe5b0495945050505050565b612719826001600160a01b0316612a09565b61276a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081612866576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112775780806020019051602081101561288257600080fd5b50516112775760405162461bcd60e51b815260040180806020018281038252602a815260200180612ca3602a913960400191505060405180910390fd5b6001600160a01b03821661291a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461292d908263ffffffff611de716565b6002556001600160a01b038216600090815260208190526040902054612959908263ffffffff611de716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611277908590612707565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a3d57508115155b94935050505056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e206e756d657261746f7274686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c83a0ebb56ea7e0594e9d3c0ece67af96818e1ee0af83ae7d181133ce7a1ff8664736f6c63430005100032000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d1970000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c806370a0823111610130578063a457c2d7116100b8578063b6b55f251161007c578063b6b55f25146105fd578063c2baf3561461061a578063dd62ed3e14610622578063f2768c1e14610650578063f77c47911461065857610227565b8063a457c2d714610572578063a5b1a24d1461059e578063a8c62e76146105c1578063a9059cbb146105c9578063b592c390146105f557610227565b8063853828b6116100ff578063853828b61461050e5780638cb1d67f146105165780639137c1a71461053c57806395d89b4114610562578063975057e71461056a57610227565b806370a08231146104b257806377c7b8fc146104d85780637a9262a2146104e05780637d7c2a1c1461050657610227565b806339509351116101b35780634af1758b116101825780634af1758b1461046e5780634fa5d8541461047657806353ceb01c1461047e5780635aa6e675146104865780636f307dc3146104aa57610227565b806339509351146103d05780633a2b643a146103fc5780633f19d0431461042257806342e94c901461044857610227565b806323b872dd116101fa57806323b872dd1461030b5780632e1a7d4d14610341578063313ce5671461036057806333a100ca1461037e57806336efd16f146103a457610227565b806306fdde031461022c578063095ea7b3146102a957806318160ddd146102e95780631bf8e7be14610303575b600080fd5b610234610660565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b0381351690602001356106f7565b604080519115158252519081900360200190f35b6102f1610715565b60408051918252519081900360200190f35b6102f161071b565b6102d56004803603606081101561032157600080fd5b506001600160a01b038135811691602081013590911690604001356107c8565b61035e6004803603602081101561035757600080fd5b5035610855565b005b610368610ade565b6040805160ff9092168252519081900360200190f35b61035e6004803603602081101561039457600080fd5b50356001600160a01b0316610ae7565b61035e600480360360408110156103ba57600080fd5b50803590602001356001600160a01b0316610ef5565b6102d5600480360360408110156103e657600080fd5b506001600160a01b038135169060200135610fd5565b6102f16004803603602081101561041257600080fd5b50356001600160a01b0316611029565b6102f16004803603602081101561043857600080fd5b50356001600160a01b0316611048565b6102f16004803603602081101561045e57600080fd5b50356001600160a01b0316611063565b6102f1611075565b61035e61107b565b6102f161127d565b61048e611283565b604080516001600160a01b039092168252519081900360200190f35b61048e611304565b6102f1600480360360208110156104c857600080fd5b50356001600160a01b0316611313565b6102f161132e565b6102f1600480360360208110156104f657600080fd5b50356001600160a01b031661136e565b61035e611380565b61035e6114ca565b6102f16004803603602081101561052c57600080fd5b50356001600160a01b03166116aa565b61035e6004803603602081101561055257600080fd5b50356001600160a01b03166116df565b61023461181f565b61048e611880565b6102d56004803603604081101561058857600080fd5b506001600160a01b038135169060200135611894565b61035e600480360360408110156105b457600080fd5b5080359060200135611902565b61048e611a47565b6102d5600480360360408110156105df57600080fd5b506001600160a01b038135169060200135611a56565b6102f1611a6a565b61035e6004803603602081101561061357600080fd5b5035611b4f565b6102f1611c2b565b6102f16004803603604081101561063857600080fd5b506001600160a01b0381358116916020013516611c76565b6102f1611ca1565b61048e611ca7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b505050505090505b90565b600061070b610704611cf7565b8484611cfb565b5060015b92915050565b60025490565b6006546000906001600160a01b031661073d57610736611c2b565b90506106f4565b600654604080516322e80f2560e11b815290516107c3926001600160a01b0316916345d01e4a916004808301926020929190829003018186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d60208110156107ad57600080fd5b50516107b7611c2b565b9063ffffffff611de716565b905090565b60006107d5848484611e48565b61084b846107e1611cf7565b61084685604051806060016040528060288152602001612bec602891396001600160a01b038a1660009081526001602052604081209061081f611cf7565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611fa416565b611cfb565b5060019392505050565b600061085f610715565b116108a7576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b600081116108e65760405162461bcd60e51b8152600401808060200182810382526025815260200180612c146025913960400191505060405180910390fd5b60006108f0610715565b90506108fc338361203b565b60006109268261091a8561090e61071b565b9063ffffffff61213716565b9063ffffffff61219016565b9050610930611c2b565b811115610a5357818314156109ac57600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b50505050610a30565b60006109c66109b9611c2b565b839063ffffffff6121d216565b600654604080516319d1885d60e31b81526004810184905290519293506001600160a01b039091169163ce8c42e89160248082019260009290919082900301818387803b158015610a1657600080fd5b505af1158015610a2a573d6000803e3d6000fd5b50505050505b610a50610a438361091a8661090e61071b565b610a4b611c2b565b612214565b90505b600754610a70906001600160a01b0316338363ffffffff61222a16565b336000908152600a6020526040902054610a90908263ffffffff611de716565b336000818152600a6020908152604091829020939093558051848152905191927f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436492918290030190a2505050565b60055460ff1690565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b158015610b3657600080fd5b505afa158015610b4a573d6000803e3d6000fd5b505050506040513d6020811015610b6057600080fd5b505180610be45750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b158015610bb757600080fd5b505afa158015610bcb573d6000803e3d6000fd5b505050506040513d6020811015610be157600080fd5b50515b610c1f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6001600160a01b038116610c7a576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b60075460408051636f307dc360e01b815290516001600160a01b0392831692841691636f307dc3916004808301926020929190829003018186803b158015610cc157600080fd5b505afa158015610cd5573d6000803e3d6000fd5b505050506040513d6020811015610ceb57600080fd5b50516001600160a01b031614610d325760405162461bcd60e51b815260040180806020018281038252602f815260200180612b9c602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7557600080fd5b505afa158015610d89573d6000803e3d6000fd5b505050506040513d6020811015610d9f57600080fd5b50516001600160a01b031614610de65760405162461bcd60e51b815260040180806020018281038252602a815260200180612b24602a913960400191505060405180910390fd5b6006546001600160a01b03828116911614610ef2576006546001600160a01b031615610e9957600654600754610e30916001600160a01b039182169116600063ffffffff61228116565b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8057600080fd5b505af1158015610e94573d6000803e3d6000fd5b505050505b600680546001600160a01b0319166001600160a01b038381169190911791829055600754610ecd9290821691166000612281565b600654600754610ef2916001600160a01b03918216911660001963ffffffff61228116565b50565b33321480610f8b5750610f06611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d6020811015610f8757600080fd5b5051155b610fc65760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610fd1823383612394565b5050565b600061070b610fe2611cf7565b846108468560016000610ff3611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611de716565b6001600160a01b0381166000908152600a60205260409020545b919050565b6001600160a01b031660009081526009602052604090205490565b60096020526000908152604090205481565b600b5481565b6006546001600160a01b03166110d3576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051806111d05750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d60208110156111cd57600080fd5b50515b61120b5760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6112136125df565b600660009054906101000a90046001600160a01b03166001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050565b60085481565b6000600560019054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b5051905090565b6007546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000611338610715565b1561136757611362611348610715565b61091a61135361071b565b6008549063ffffffff61213716565b6107c3565b5060085490565b600a6020526000908152604090205481565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b50518061147d5750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50515b6114b85760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6114c06114ca565b6114c86125df565b565b6005546040805163b429afeb60e01b815233600482015290516101009092046001600160a01b03169163b429afeb91602480820192602092909190829003018186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051806115c75750600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561159a57600080fd5b505afa1580156115ae573d6000803e3d6000fd5b505050506040513d60208110156115c457600080fd5b50515b6116025760405162461bcd60e51b815260040180806020018281038252602b815260200180612a46602b913960400191505060405180910390fd5b6006546001600160a01b031661165a576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b600660009054906101000a90046001600160a01b03166001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561126357600080fd5b60006116b4610715565b6116c057506000611043565b61070f6116cb610715565b61091a6116d785611313565b61090e61071b565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b505161179c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166117f7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106ec5780601f106106c1576101008083540402835291602001916106ec565b60055461010090046001600160a01b031681565b600061070b6118a1611cf7565b8461084685604051806060016040528060258152602001612d0360259139600160006118cb611cf7565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611fa416565b600554604080516337b87c3960e21b815233600482015290516101009092046001600160a01b03169163dee1f0e491602480820192602092909190829003018186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50516119bf576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116119fe5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a946022913960400191505060405180910390fd5b808210611a3c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612afa602a913960400191505060405180910390fd5b600b91909155600c55565b6006546001600160a01b031681565b600061070b611a63611cf7565b8484611e48565b600080611a81600c5461091a600b5461090e61071b565b90506000600660009054906101000a90046001600160a01b03166001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad357600080fd5b505afa158015611ae7573d6000803e3d6000fd5b505050506040513d6020811015611afd57600080fd5b50519050818110611b13576000925050506106f4565b6000611b25838363ffffffff6121d216565b9050611b2f611c2b565b811115611b4357611b3e611c2b565b611b45565b805b93505050506106f4565b33321480611be55750611b60611ca7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611bb757600080fd5b505af1158015611bcb573d6000803e3d6000fd5b505050506040513d6020811015611be157600080fd5b5051155b611c205760405162461bcd60e51b8152600401808060200182810382526028815260200180612b746028913960400191505060405180910390fd5b610ef2813333612394565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156112d357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b6000600560019054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d357600080fd5b3390565b6001600160a01b038316611d405760405162461bcd60e51b8152600401808060200182810382526024815260200180612c7f6024913960400191505060405180910390fd5b6001600160a01b038216611d855760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015611e41576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316611e8d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c5a6025913960400191505060405180910390fd5b6001600160a01b038216611ed25760405162461bcd60e51b8152600401808060200182810382526023815260200180612a716023913960400191505060405180910390fd5b611f1581604051806060016040528060268152602001612b4e602691396001600160a01b038616600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f4a908263ffffffff611de716565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156120335760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120805760405162461bcd60e51b8152600401808060200182810382526021815260200180612c396021913960400191505060405180910390fd5b6120c381604051806060016040528060228152602001612ab6602291396001600160a01b038516600090815260208190526040902054919063ffffffff611fa416565b6001600160a01b0383166000908152602081905260409020556002546120ef908263ffffffff6121d216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826121465750600061070f565b8282028284828161215357fe5b0414611e415760405162461bcd60e51b8152600401808060200182810382526021815260200180612bcb6021913960400191505060405180910390fd5b6000611e4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126a2565b6000611e4183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fa4565b60008183106122235781611e41565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261227c908490612707565b505050565b801580612307575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122d957600080fd5b505afa1580156122ed573d6000803e3d6000fd5b505050506040513d602081101561230357600080fd5b5051155b6123425760405162461bcd60e51b8152600401808060200182810382526036815260200180612ccd6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261227c908490612707565b600083116123dc576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b038116612430576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b6006546001600160a01b0316156124fb57600660009054906101000a90046001600160a01b03166001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248f57600080fd5b505afa1580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b50516124fb576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000612505610715565b156125325761252d61251561071b565b61091a612520610715565b879063ffffffff61213716565b612534565b835b905061254082826128bf565b60075461255e906001600160a01b031684308763ffffffff6129af16565b6001600160a01b038216600090815260096020526040902054612587908563ffffffff611de716565b6001600160a01b038316600081815260096020908152604091829020939093558051878152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a250505050565b6006546001600160a01b0316612637576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000612641611a6a565b90508015610ef25760065460075461266c916001600160a01b0391821691168363ffffffff61222a16565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b600081836126f15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ff8578181015183820152602001611fe0565b5060008385816126fd57fe5b0495945050505050565b612719826001600160a01b0316612a09565b61276a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081612866576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112775780806020019051602081101561288257600080fd5b50516112775760405162461bcd60e51b815260040180806020018281038252602a815260200180612ca3602a913960400191505060405180910390fd5b6001600160a01b03821661291a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025461292d908263ffffffff611de716565b6002556001600160a01b038216600090815260208190526040902054612959908263ffffffff611de716565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611277908590612707565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612a3d57508115155b94935050505056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e206e756d657261746f7274686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c83a0ebb56ea7e0594e9d3c0ece67af96818e1ee0af83ae7d181133ce7a1ff8664736f6c63430005100032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d1970000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : _controller (address): 0xc95CbE4ca30055c787CB784BE99D6a8494d0d197
Arg [1] : _underlying (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [2] : _toInvestNumerator (uint256): 9000
Arg [3] : _toInvestDenominator (uint256): 10000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002328
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710


Deployed Bytecode Sourcemap

42039:284:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42039:284:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26335:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26335:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19879:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19879:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18900:91;;;:::i;:::-;;;;;;;;;;;;;;;;35725:292;;;:::i;20503:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20503:304:0;;;;;;;;;;;;;;;;;:::i;39823:1293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39823:1293:0;;:::i;:::-;;27187:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36936:804;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36936:804:0;-1:-1:-1;;;;;36936:804:0;;:::i;39576:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39576:116:0;;;;;;-1:-1:-1;;;;;39576:116:0;;:::i;21216:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21216:210:0;;;;;;;;:::i;36282:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36282:109:0;-1:-1:-1;;;;;36282:109:0;;:::i;36094:113::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36094:113:0;-1:-1:-1;;;;;36094:113:0;;:::i;33373:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33373:48:0;-1:-1:-1;;;;;33373:48:0;;:::i;33479:45::-;;;:::i;35188:174::-;;;:::i;33337:29::-;;;:::i;30937:90::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30937:90:0;;;;;;;;;;;;;;33306:24;;;:::i;19054:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19054:110:0;-1:-1:-1;;;;;19054:110:0;;:::i;36397:210::-;;;:::i;33426:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33426:46:0;-1:-1:-1;;;;;33426:46:0;;:::i;38112:98::-;;;:::i;39698:119::-;;;:::i;36662:268::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36662:268:0;-1:-1:-1;;;;;36662:268:0;;:::i;30767:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30767:164:0;-1:-1:-1;;;;;30767:164:0;;:::i;26537:87::-;;;:::i;30483:20::-;;;:::i;21929:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21929:261:0;;;;;;;;:::i;37746:360::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37746:360:0;;;;;;;:::i;33276:25::-;;;:::i;19377:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19377:158:0;;;;;;;;:::i;38216:693::-;;;:::i;39283:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39283:103:0;;:::i;35445:121::-;;;:::i;19598:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19598:134:0;;;;;;;;;;:::i;33529:47::-;;;:::i;32774:90::-;;;:::i;26335:83::-;26405:5;26398:12;;;;;;;;-1:-1:-1;;26398:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26372:13;;26398:12;;26405:5;;26398:12;;26405:5;26398:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26335:83;;:::o;19879:152::-;19945:4;19962:39;19971:12;:10;:12::i;:::-;19985:7;19994:6;19962:8;:39::i;:::-;-1:-1:-1;20019:4:0;19879:152;;;;;:::o;18900:91::-;18971:12;;18900:91;:::o;35725:292::-;35817:8;;35789:7;;-1:-1:-1;;;;;35817:8:0;35805:125;;35896:26;:24;:26::i;:::-;35889:33;;;;35805:125;35974:8;;:36;;;-1:-1:-1;;;35974:36:0;;;;35943:68;;-1:-1:-1;;;;;35974:8:0;;:34;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;35974:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35974:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35974:36:0;35943:26;:24;:26::i;:::-;:30;:68;:30;:68;:::i;:::-;35936:75;;35725:292;:::o;20503:304::-;20592:4;20609:36;20619:6;20627:9;20638:6;20609:9;:36::i;:::-;20656:121;20665:6;20673:12;:10;:12::i;:::-;20687:89;20725:6;20687:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20687:19:0;;;;;;:11;:19;;;;;;20707:12;:10;:12::i;:::-;-1:-1:-1;;;;;20687:33:0;;;;;;;;;;;;-1:-1:-1;20687:33:0;;;:89;;:37;:89;:::i;:::-;20656:8;:121::i;:::-;-1:-1:-1;20795:4:0;20503:304;;;;;:::o;39823:1293::-;39905:1;39889:13;:11;:13::i;:::-;:17;39881:49;;;;;-1:-1:-1;;;39881:49:0;;;;;;;;;;;;-1:-1:-1;;;39881:49:0;;;;;;;;;;;;;;;39962:1;39945:14;:18;39937:68;;;;-1:-1:-1;;;39937:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40012:19;40034:13;:11;:13::i;:::-;40012:35;;40054:33;40060:10;40072:14;40054:5;:33::i;:::-;40096:34;40133:90;40211:11;40133:63;40181:14;40133:33;:31;:33::i;:::-;:47;:63;:47;:63;:::i;:::-;:77;:90;:77;:90;:::i;:::-;40096:127;;40265:26;:24;:26::i;:::-;40236;:55;40232:605;;;40408:11;40390:14;:29;40386:232;;;40432:8;;;;;;;;;-1:-1:-1;;;;;40432:8:0;-1:-1:-1;;;;;40432:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40432:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40432:29:0;;;;40386:232;;;40488:15;40506:58;40537:26;:24;:26::i;:::-;40506;;:58;:30;:58;:::i;:::-;40575:8;;:33;;;-1:-1:-1;;;40575:33:0;;;;;;;;;;40488:76;;-1:-1:-1;;;;;;40575:8:0;;;;:24;;:33;;;;;:8;;:33;;;;;;;;:8;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;40575:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40575:33:0;;;;40386:232;;40697:132;40706:94;40788:11;40706:65;40756:14;40706:33;:31;:33::i;:94::-;40802:26;:24;:26::i;:::-;40697:8;:132::i;:::-;40668:161;;40232:605;40845:10;;:63;;-1:-1:-1;;;;;40845:10:0;40869;40881:26;40845:63;:23;:63;:::i;:::-;41007:10;40995:23;;;;:11;:23;;;;;;:55;;41023:26;40995:55;:27;:55;:::i;:::-;40981:10;40969:23;;;;:11;:23;;;;;;;;;:81;;;;41062:48;;;;;;;40981:10;;41062:48;;;;;;;;;39823:1293;;;:::o;27187:83::-;27253:9;;;;27187:83;:::o;36936:804::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37025:23:0;;37017:65;;;;;-1:-1:-1;;;37017:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37142:10;;37097:33;;;-1:-1:-1;;;37097:33:0;;;;-1:-1:-1;;;;;37142:10:0;;;;37097:31;;;;;:33;;;;;;;;;;;;;;:31;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;37097:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37097:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37097:33:0;-1:-1:-1;;;;;37097:56:0;;37089:116;;;;-1:-1:-1;;;37089:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37260:4;-1:-1:-1;;;;;37220:45:0;37230:9;-1:-1:-1;;;;;37220:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37220:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37220:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37220:28:0;-1:-1:-1;;;;;37220:45:0;;37212:100;;;;-1:-1:-1;;;37212:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37355:8;;-1:-1:-1;;;;;37325:39:0;;;37355:8;;37325:39;37321:414;;37387:8;;-1:-1:-1;;;;;37387:8:0;37379:31;37375:197;;37509:8;;37478:10;;:44;;-1:-1:-1;;;;;37478:10:0;;;;37509:8;;37478:44;:22;:44;:::i;:::-;37533:8;;;;;;;;;-1:-1:-1;;;;;37533:8:0;-1:-1:-1;;;;;37533:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37533:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37533:29:0;;;;37375:197;37580:8;:31;;-1:-1:-1;;;;;;37580:31:0;-1:-1:-1;;;;;37580:31:0;;;;;;;;;;;37620:10;;:44;;:10;;;;37651:8;-1:-1:-1;37620:22:0;:44::i;:::-;37704:8;;37673:10;;:54;;-1:-1:-1;;;;;37673:10:0;;;;37704:8;-1:-1:-1;;37673:54:0;:22;:54;:::i;:::-;36936:804;:::o;39576:116::-;34598:10;34612:9;34598:23;;34597:233;;;34796:12;:10;:12::i;:::-;-1:-1:-1;;;;;34784:34:0;;34819:10;34784:46;;;;;;;;;;;;;-1:-1:-1;;;;;34784:46:0;-1:-1:-1;;;;;34784:46:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34784:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34784:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34784:46:0;34783:47;34597:233;34581:388;;;;-1:-1:-1;;;34581:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39650:36;39659:6;39667:10;39679:6;39650:8;:36::i;:::-;39576:116;;:::o;21216:210::-;21296:4;21313:83;21322:12;:10;:12::i;:::-;21336:7;21345:50;21384:10;21345:11;:25;21357:12;:10;:12::i;:::-;-1:-1:-1;;;;;21345:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21345:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;36282:109::-;-1:-1:-1;;;;;36366:19:0;;36343:7;36366:19;;;:11;:19;;;;;;36282:109;;;;:::o;36094:113::-;-1:-1:-1;;;;;36180:21:0;36157:7;36180:21;;;:13;:21;;;;;;;36094:113::o;33373:48::-;;;;;;;;;;;;;:::o;33479:45::-;;;;:::o;35188:174::-;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35320:8;:6;:8::i;:::-;35335;;;;;;;;;-1:-1:-1;;;;;35335:8:0;-1:-1:-1;;;;;35335:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35335:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35335:21:0;;;;35188:174::o;33337:29::-;;;;:::o;30937:90::-;30980:7;31003:5;;;;;;;;;-1:-1:-1;;;;;31003:5:0;-1:-1:-1;;;;;31003:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31003:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31003:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31003:18:0;;-1:-1:-1;30937:90:0;:::o;33306:24::-;;;-1:-1:-1;;;;;33306:24:0;;:::o;19054:110::-;-1:-1:-1;;;;;19138:18:0;19111:7;19138:18;;;;;;;;;;;;19054:110::o;36397:210::-;36450:7;36473:13;:11;:13::i;:::-;:18;:128;;36529:72;36587:13;:11;:13::i;:::-;36529:53;36548:33;:31;:33::i;:::-;36529:14;;;:53;:18;:53;:::i;:72::-;36473:128;;;-1:-1:-1;36503:14:0;;;36397:210::o;33426:46::-;;;;;;;;;;;;;:::o;38112:98::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38176:13;:11;:13::i;:::-;38196:8;:6;:8::i;:::-;38112:98::o;39698:119::-;32634:5;;:30;;;-1:-1:-1;;;32634:30:0;;32653:10;32634:30;;;;;;:5;;;;-1:-1:-1;;;;;32634:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32634:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32634:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32634:30:0;;:64;;-1:-1:-1;32668:5:0;;:30;;;-1:-1:-1;;;32668:30:0;;32687:10;32668:30;;;;;;:5;;;;-1:-1:-1;;;;;32668:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;32668:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32668:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32668:30:0;32634:64;32625:129;;;;-1:-1:-1;;;32625:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;39782:8;;;;;;;;;-1:-1:-1;;;;;39782:8:0;-1:-1:-1;;;;;39782:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;36662:268:0;36751:7;36771:13;:11;:13::i;:::-;36767:49;;-1:-1:-1;36807:1:0;36800:8;;36767:49;36829:95;36910:13;:11;:13::i;:::-;36829:66;36877:17;36887:6;36877:9;:17::i;:::-;36829:33;:31;:33::i;30767:164::-;30698:5;;:30;;;-1:-1:-1;;;30698:30:0;;30717:10;30698:30;;;;;;:5;;;;-1:-1:-1;;;;;30698:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;30698:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30698:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30698:30:0;30690:57;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30840:20:0;;30832:63;;;;;-1:-1:-1;;;30832:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30902:5;:23;;-1:-1:-1;;;;;30902:23:0;;;;;-1:-1:-1;;;;;;30902:23:0;;;;;;;;;30767:164::o;26537:87::-;26609:7;26602:14;;;;;;;;-1:-1:-1;;26602:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26576:13;;26602:14;;26609:7;;26602:14;;26609:7;26602:14;;;;;;;;;;;;;;;;;;;;;;;;30483:20;;;;;;-1:-1:-1;;;;;30483:20:0;;:::o;21929:261::-;22014:4;22031:129;22040:12;:10;:12::i;:::-;22054:7;22063:96;22102:15;22063:96;;;;;;;;;;;;;;;;;:11;:25;22075:12;:10;:12::i;:::-;-1:-1:-1;;;;;22063:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;22063:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;37746:360::-;30698:5;;:30;;;-1:-1:-1;;;30698:30:0;;30717:10;30698:30;;;;;;:5;;;;-1:-1:-1;;;;;30698:5:0;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;30698:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30698:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30698:30:0;30690:57;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;-1:-1:-1;;;30690:57:0;;;;;;;;;;;;;;;37873:1;37859:11;:15;37851:62;;;;-1:-1:-1;;;37851:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37940:11;37928:9;:23;37920:78;;;;-1:-1:-1;;;37920:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38005:30;:42;;;;38054:32;:46;37746:360::o;33276:25::-;;;-1:-1:-1;;;;;33276:25:0;;:::o;19377:158::-;19446:4;19463:42;19473:12;:10;:12::i;:::-;19487:9;19498:6;19463:9;:42::i;38216:693::-;38269:7;38285:25;38313:127;38407:32;;38313:79;38361:30;;38313:33;:31;:33::i;:127::-;38285:155;;38447:23;38473:8;;;;;;;;;-1:-1:-1;;;;;38473:8:0;-1:-1:-1;;;;;38473:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38473:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38473:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38473:36:0;;-1:-1:-1;38520:36:0;;;38516:388;;38574:1;38567:8;;;;;;38516:388;38598:25;38626:38;:17;38648:15;38626:38;:21;:38;:::i;:::-;38598:66;;38701:26;:24;:26::i;:::-;38680:17;:47;;:216;;38870:26;:24;:26::i;:::-;38680:216;;;38850:17;38680:216;38673:223;;;;;;;39283:103;34598:10;34612:9;34598:23;;34597:233;;;34796:12;:10;:12::i;:::-;-1:-1:-1;;;;;34784:34:0;;34819:10;34784:46;;;;;;;;;;;;;-1:-1:-1;;;;;34784:46:0;-1:-1:-1;;;;;34784:46:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34784:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34784:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34784:46:0;34783:47;34597:233;34581:388;;;;-1:-1:-1;;;34581:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39340:40;39349:6;39357:10;39369;39340:8;:40::i;35445:121::-;35525:10;;:35;;;-1:-1:-1;;;35525:35:0;;35554:4;35525:35;;;;;;35502:7;;-1:-1:-1;;;;;35525:10:0;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;5:2:-1;;;;30:1;27;20:12;19598:134:0;-1:-1:-1;;;;;19697:18:0;;;19670:7;19697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19598:134::o;33529:47::-;;;;:::o;32774:90::-;32817:7;32840:5;;;;;;;;;-1:-1:-1;;;;;32840:5:0;-1:-1:-1;;;;;32840:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;16991:98:0;17071:10;16991:98;:::o;24860:338::-;-1:-1:-1;;;;;24954:19:0;;24946:68;;;;-1:-1:-1;;;24946:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25033:21:0;;25025:68;;;;-1:-1:-1;;;25025:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25106:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25158:32;;;;;;;;;;;;;;;;;24860:338;;;:::o;4843:181::-;4901:7;4933:5;;;4957:6;;;;4949:46;;;;;-1:-1:-1;;;4949:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5015:1;4843:181;-1:-1:-1;;;4843:181:0:o;22680:471::-;-1:-1:-1;;;;;22778:20:0;;22770:70;;;;-1:-1:-1;;;22770:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22859:23:0;;22851:71;;;;-1:-1:-1;;;22851:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22955;22977:6;22955:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22955:17:0;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;22935:17:0;;;:9;:17;;;;;;;;;;;:91;;;;23060:20;;;;;;;:32;;23085:6;23060:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;23037:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;23108:35;;;;;;;23037:20;;23108:35;;;;;;;;;;;;;22680:471;;;:::o;5772:192::-;5858:7;5894:12;5886:6;;;;5878:29;;;;-1:-1:-1;;;5878:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5878:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5930:5:0;;;5772:192::o;24072:348::-;-1:-1:-1;;;;;24148:21:0;;24140:67;;;;-1:-1:-1;;;24140:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24241:68;24264:6;24241:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24241:18:0;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;24220:18:0;;:9;:18;;;;;;;;;;:89;24335:12;;:24;;24352:6;24335:24;:16;:24;:::i;:::-;24320:12;:39;24375:37;;;;;;;;24401:1;;-1:-1:-1;;;;;24375:37:0;;;;;;;;;;;;24072:348;;:::o;6215:471::-;6273:7;6518:6;6514:47;;-1:-1:-1;6548:1:0;6541:8;;6514:47;6585:5;;;6589:1;6585;:5;:1;6609:5;;;;;:10;6601:56;;;;-1:-1:-1;;;6601:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7154:132;7212:7;7239:39;7243:1;7246;7239:39;;;;;;;;;;;;;;;;;:3;:39::i;5299:136::-;5357:7;5384:43;5388:1;5391;5384:43;;;;;;;;;;;;;;;;;:3;:43::i;3505:106::-;3563:7;3594:1;3590;:5;:13;;3602:1;3590:13;;;-1:-1:-1;3598:1:0;;3505:106;-1:-1:-1;3505:106:0:o;12973:176::-;13082:58;;;-1:-1:-1;;;;;13082:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13082:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13056:85:0;;13075:5;;13056:18;:85::i;:::-;12973:176;;;:::o;13369:621::-;13739:10;;;13738:62;;-1:-1:-1;13755:39:0;;;-1:-1:-1;;;13755:39:0;;13779:4;13755:39;;;;-1:-1:-1;;;;;13755:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13755:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13755:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13755:39:0;:44;13738:62;13730:152;;;;-1:-1:-1;;;13730:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13919:62;;;-1:-1:-1;;;;;13919:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13919:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13893:89:0;;13912:5;;13893:18;:89::i;41122:839::-;41226:1;41217:6;:10;41209:39;;;;;-1:-1:-1;;;41209:39:0;;;;;;;;;;;;-1:-1:-1;;;41209:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41263:25:0;;41255:60;;;;;-1:-1:-1;;;41255:60:0;;;;;;;;;;;;-1:-1:-1;;;41255:60:0;;;;;;;;;;;;;;;41336:8;;-1:-1:-1;;;;;41336:8:0;41328:31;41324:105;;41378:8;;;;;;;;;-1:-1:-1;;;;;41378:8:0;-1:-1:-1;;;;;41378:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41378:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41378:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41378:26:0;41370:51;;;;;-1:-1:-1;;;41370:51:0;;;;;;;;;;;;-1:-1:-1;;;41370:51:0;;;;;;;;;;;;;;;41551:14;41568:13;:11;:13::i;:::-;:18;:112;;41616:64;41646:33;:31;:33::i;:::-;41616:25;41627:13;:11;:13::i;:::-;41616:6;;:25;:10;:25;:::i;:64::-;41568:112;;;41598:6;41568:112;41551:129;;41687:26;41693:11;41706:6;41687:5;:26::i;:::-;41722:10;;:58;;-1:-1:-1;;;;;41722:10:0;41750:6;41766:4;41773:6;41722:58;:27;:58;:::i;:::-;-1:-1:-1;;;;;41877:26:0;;;;;;:13;:26;;;;;;:38;;41908:6;41877:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;41848:26:0;;;;;;:13;:26;;;;;;;;;:67;;;;41927:28;;;;;;;41848:26;;41927:28;;;;;;;;;41122:839;;;;:::o;38915:252::-;34422:8;;-1:-1:-1;;;;;34422:8:0;34406:68;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;-1:-1:-1;;;34406:68:0;;;;;;;;;;;;;;;38969:23;38995:22;:20;:22::i;:::-;38969:48;-1:-1:-1;39028:19:0;;39024:138;;39090:8;;39058:10;;:59;;-1:-1:-1;;;;;39058:10:0;;;;39090:8;39101:15;39058:59;:23;:59;:::i;:::-;39131:23;;;;;;;;;;;;;;;;;34481:1;38915:252::o;7816:345::-;7902:7;8004:12;7997:5;7989:28;;;;-1:-1:-1;;;7989:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7989:28:0;;8028:9;8044:1;8040;:5;;;;;;;7816:345;-1:-1:-1;;;;;7816:345:0:o;15012:1114::-;15616:27;15624:5;-1:-1:-1;;;;;15616:25:0;;:27::i;:::-;15608:71;;;;;-1:-1:-1;;;15608:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:12;15767:23;15802:5;-1:-1:-1;;;;;15794:19:0;15814:4;15794:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15794:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15752:67:0;;;;15838:7;15830:52;;;;;-1:-1:-1;;;15830:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15899:17;;:21;15895:224;;16041:10;16030:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16030:30:0;16022:85;;;;-1:-1:-1;;;16022:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23432:308;-1:-1:-1;;;;;23508:21:0;;23500:65;;;;;-1:-1:-1;;;23500:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23593:12;;:24;;23610:6;23593:24;:16;:24;:::i;:::-;23578:12;:39;-1:-1:-1;;;;;23649:18:0;;:9;:18;;;;;;;;;;;:30;;23672:6;23649:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;23628:18:0;;:9;:18;;;;;;;;;;;:51;;;;23695:37;;;;;;;23628:18;;:9;;23695:37;;;;;;;;;;23432:308;;:::o;13157:204::-;13284:68;;;-1:-1:-1;;;;;13284:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13284:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13258:95:0;;13277:5;;13258:18;:95::i;763:619::-;823:4;1291:20;;1134:66;1331:23;;;;;;:42;;-1:-1:-1;1358:15:0;;;1331:42;1323:51;763:619;-1:-1:-1;;;;763:619:0:o

Swarm Source

bzzr://c83a0ebb56ea7e0594e9d3c0ece67af96818e1ee0af83ae7d181133ce7a1ff86
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.