ETH Price: $3,483.15 (+2.20%)
Gas: 9 Gwei

Token

GRAPES (GRAPES)
 

Overview

Max Total Supply

3,436,002.000000000000391819 GRAPES

Holders

258

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
atomiccoffeebro.eth
Balance
20,250 GRAPES

Value
$0.00
0x022dfc5e6e5f61a50b95e3c2911045bee2fb7240
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:
grapes

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-24
*/

// SPDX-License-Identifier: MIT

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



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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



pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override 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 virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}


pragma solidity ^0.8.4;



interface DuckNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}
interface DucklingNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}
interface AlphaNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

contract grapes is ERC20Burnable, Ownable {
    uint256 public constant MAX_SUPPLY = 200000000 * 1 ether;
    uint256 public constant ALPHA_EMISSION_RATE = 17; // 17 per day
    uint256 public constant DUCK_EMISSION_RATE = 10; // 10 per day
    uint256 public constant DUCKLING_EMISSION_RATE = 5; // 5 per day
    address public DUCK_ADDRESS = 0x36D7b711390D34e8fe26ad8f2bB14E7C8f0c56e9; 
    address public DUCKLING_ADDRESS = 0xeB4A28587503d84dc29DE8e4Fc8bF0A57A7Ddb0d;
    address public ALPHA_ADDRESS = 0x7dC0503Cd5F4c4a11b0f4AA326E15C464632Ede9;
    bool public live = false;

    mapping(uint256 => uint256) internal duckTimeStaked;
    mapping(uint256 => address) internal duckStaker;
    mapping(address => uint256[]) internal stakerToDuck;
    
    mapping(uint256 => uint256) internal ducklingTimeStaked;
    mapping(uint256 => address) internal ducklingStaker;
    mapping(address => uint256[]) internal stakerToDuckling;
    
    mapping(uint256 => uint256) internal alphaTimeStaked;
    mapping(uint256 => address) internal alphaStaker;
    mapping(address => uint256[]) internal stakerToAlpha;


    DuckNFT private _duckContract = DuckNFT(DUCK_ADDRESS);
    DucklingNFT private _ducklingContract = DucklingNFT(DUCKLING_ADDRESS);
    AlphaNFT private _alphaContract = AlphaNFT(ALPHA_ADDRESS);

    constructor() ERC20("GRAPES", "GRAPES") {
        _mint(msg.sender, 2100 * 1 ether);
    }

    modifier stakingEnabled {
        require(live, "NOT_LIVE");
        _;
    }

    function getStakedDuck(address staker) public view returns (uint256[] memory) {
        return stakerToDuck[staker];
    }
    
    function getStakedAmount(address staker) public view returns (uint256) {
        return stakerToDuck[staker].length + stakerToDuckling[staker].length + stakerToAlpha[staker].length;
    }

    function getDuckStaker(uint256 tokenId) public view returns (address) {
        return duckStaker[tokenId];
    }

    function getStakedDuckling(address staker) public view returns (uint256[] memory) {
        return stakerToDuckling[staker];
    }
    
    function getDucklingStakedAmount(address staker) public view returns (uint256) {
        return stakerToDuckling[staker].length;
    }

    function getDucklingStaker(uint256 tokenId) public view returns (address) {
        return ducklingStaker[tokenId];
    }

    function getStakedAlpha(address staker) public view returns (uint256[] memory) {
        return stakerToAlpha[staker];
    }
    
    function getAlphaStakedAmount(address staker) public view returns (uint256) {
        return stakerToAlpha[staker].length;
    }

    function getAlphaStaker(uint256 tokenId) public view returns (address) {
        return alphaStaker[tokenId];
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;

        uint256[] memory duckTokens = stakerToDuck[staker];
        for (uint256 i = 0; i < duckTokens.length; i++) {
            totalRewards += getReward(duckTokens[i]);
        }

        uint256[] memory ducklingTokens = stakerToDuckling[staker];
        for (uint256 i = 0; i < ducklingTokens.length; i++) {
            totalRewards += getDucklingReward(ducklingTokens[i]);
        }

        uint256[] memory alphaTokens = stakerToAlpha[staker];
        for (uint256 i = 0; i < alphaTokens.length; i++) {
            totalRewards += getAlphaReward(alphaTokens[i]);
        }

        return totalRewards;
    }

    function stakeDuckById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _duckContract.transferFrom(msg.sender, address(this), id);

            stakerToDuck[msg.sender].push(id);
            duckTimeStaked[id] = block.timestamp;
            duckStaker[id] = msg.sender;
        }
    }

    function unstakeDuckByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(duckStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _duckContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            removeTokenIdFromArray(stakerToDuck[msg.sender], id);
            duckStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function stakeDucklingsById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _ducklingContract.transferFrom(msg.sender, address(this), id);

            stakerToDuckling[msg.sender].push(id);
            ducklingTimeStaked[id] = block.timestamp;
            ducklingStaker[id] = msg.sender;
        }
    }

    function unstakeDucklingsByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(ducklingStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _ducklingContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getDucklingReward(id);

            removeTokenIdFromArray(stakerToDuckling[msg.sender], id);
            ducklingStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function stakeAlphaById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _alphaContract.transferFrom(msg.sender, address(this), id);

            stakerToAlpha[msg.sender].push(id);
            alphaTimeStaked[id] = block.timestamp;
            alphaStaker[id] = msg.sender;
        }
    }

    function unstakeAlphaByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(alphaStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _alphaContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getAlphaReward(id);

            removeTokenIdFromArray(stakerToAlpha[msg.sender], id);
            alphaStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function unstakeAll() external {
        require(getStakedAmount(msg.sender) > 0 || getDucklingStakedAmount(msg.sender) > 0 || getAlphaStakedAmount(msg.sender) > 0, "None Staked");
        uint256 totalRewards = 0;

        for (uint256 i = stakerToDuck[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToDuck[msg.sender][i - 1];

            _duckContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            stakerToDuck[msg.sender].pop();
            duckStaker[id] = address(0);
        }

        for (uint256 i = stakerToDuckling[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToDuckling[msg.sender][i - 1];

            _ducklingContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getDucklingReward(id);

            stakerToDuckling[msg.sender].pop();
            ducklingStaker[id] = address(0);
        }

        for (uint256 i = stakerToAlpha[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToAlpha[msg.sender][i - 1];

            _alphaContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getAlphaReward(id);

            stakerToAlpha[msg.sender].pop();
            alphaStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function claimAll() external {
        uint256 totalRewards = 0;

        uint256[] memory duckTokens = stakerToDuck[msg.sender];
        for (uint256 i = 0; i < duckTokens.length; i++) {
            uint256 id = duckTokens[i];

            totalRewards += getReward(duckTokens[i]);
            duckTimeStaked[id] = block.timestamp;
        }

        uint256[] memory ducklingTokens = stakerToDuckling[msg.sender];
        for (uint256 i = 0; i < ducklingTokens.length; i++) {
            uint256 id = ducklingTokens[i];

            totalRewards += getDucklingReward(ducklingTokens[i]);
            ducklingTimeStaked[id] = block.timestamp;
        }

        uint256[] memory alphaTokens = stakerToAlpha[msg.sender];
        for (uint256 i = 0; i < alphaTokens.length; i++) {
            uint256 id = alphaTokens[i];

            totalRewards += getAlphaReward(alphaTokens[i]);
            alphaTimeStaked[id] = block.timestamp;
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

        function Grapedrop(address[] calldata _to, uint256[] calldata _amount)
        external
        onlyOwner
    {
        for (uint256 i; i < _to.length; ) {
            require(
                totalSupply() + _amount[i] - 1 <= MAX_SUPPLY,
                "Not enough supply"
            );
            _mint(_to[i], _amount[i]);

            unchecked {
                i++;
            }
        }
    }


    function burn(address from, uint256 amount) external {
        _burn(from, amount);
    }

    function setAlphaAddress(address ALPHA_ADDRESS_) public onlyOwner {
        ALPHA_ADDRESS = ALPHA_ADDRESS_;
    }
    
    function toggle() external onlyOwner {
        live = !live;
    }

    function getReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - duckTimeStaked[tokenId]) * DUCK_EMISSION_RATE / 86400 * 1 ether;
    }

    function getDucklingReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - ducklingTimeStaked[tokenId]) * DUCKLING_EMISSION_RATE / 86400 * 1 ether;
    }

    function getAlphaReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - alphaTimeStaked[tokenId]) * ALPHA_EMISSION_RATE / 86400 * 1 ether;
    }

    function removeTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"ALPHA_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALPHA_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCKLING_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCKLING_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCK_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCK_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"Grapedrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAlphaStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAlphaStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDuckStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getDucklingStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDucklingStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAlpha","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedDuck","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedDuckling","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ALPHA_ADDRESS_","type":"address"}],"name":"setAlphaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeAlphaById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeDuckById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeDucklingsById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeAlphaByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeDuckByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeDucklingsByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600680546001600160a01b03199081167336d7b711390d34e8fe26ad8f2bb14e7c8f0c56e990811790925560078054821673eb4a28587503d84dc29de8e4fc8bf0a57a7ddb0d908117909155600880546001600160a81b031916737dc0503cd5f4c4a11b0f4aa326e15c464632ede99081179091556012805484169094179093556013805483169091179055601480549091169091179055348015620000a957600080fd5b5060408051808201825260068082526547524150455360d01b602080840182815285518087019096529285528401528151919291620000eb9160039162000277565b5080516200010190600490602084019062000277565b5050506200011e620001186200013960201b60201c565b6200013d565b62000133336871d75ab9b9205000006200018f565b62000381565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001ea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620001fe91906200031d565b90915550506001600160a01b038216600090815260208190526040812080548392906200022d9084906200031d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620002859062000344565b90600052602060002090601f016020900481019282620002a95760008555620002f4565b82601f10620002c457805160ff1916838001178555620002f4565b82800160010185558215620002f4579182015b82811115620002f4578251825591602001919060010190620002d7565b506200030292915062000306565b5090565b5b8082111562000302576000815560010162000307565b600082198211156200033f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200035957607f821691505b602082108114156200037b57634e487b7160e01b600052602260045260246000fd5b50919050565b6128aa80620003916000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c8063715018a61161015c578063bb93a4e6116100ce578063dd62ed3e11610087578063dd62ed3e146105ee578063e6923cf814610627578063ecce86651461063a578063ed5669001461064d578063f2031a9914610660578063f2fde38b1461067357600080fd5b8063bb93a4e614610587578063c3b334c0146105b0578063c80d491b146105c3578063c9ecc9dd146105d6578063d1058e59146105de578063d25d5a7b146105e657600080fd5b806395d89b411161012057806395d89b41146105205780639dc29fac14610528578063a05287c31461053b578063a457c2d71461054e578063a9059cbb14610561578063b3fb20cf1461057457600080fd5b8063715018a6146104b7578063774464f5146104bf57806379cc6790146104e85780638da5cb5b146104fb578063957aa58c1461050c57600080fd5b8063362a3fad1161020057806342966c68116101b957806342966c681461042257806349a2f1f2146104355780634a2ba8e7146104485780634da6a5561461046857806358620c3a1461047b57806370a082311461048e57600080fd5b8063362a3fad146103b0578063363da4c9146103c357806339509351146103ec5780633bedb844146103ff57806340a3d2461461041257806340bfa0121461041a57600080fd5b80632203cf45116102525780632203cf451461034c57806323b872dd146103615780632d6c8e3c14610374578063313ce5671461038757806332cb6b0c1461039657806335322f37146103a857600080fd5b806306fdde031461028f578063093a2455146102ad578063095ea7b3146102ee57806318160ddd146103115780631d3a53c014610323575b600080fd5b610297610686565b6040516102a4919061242c565b60405180910390f35b6102d66102bb366004612481565b6000908152601060205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102a4565b6103016102fc3660046124b6565b610718565b60405190151581526020016102a4565b6002545b6040519081526020016102a4565b6103156103313660046124e0565b6001600160a01b03166000908152600e602052604090205490565b61035f61035a36600461254e565b61072e565b005b61030161036f366004612590565b61089f565b61035f6103823660046125cc565b610949565b604051601281526020016102a4565b6103156aa56fa5b99019a5c800000081565b61035f610a5b565b6103156103be3660046124e0565b610e9b565b6102d66103d1366004612481565b6000908152600a60205260409020546001600160a01b031690565b6103016103fa3660046124b6565b6110c3565b61035f61040d36600461254e565b6110ff565b61035f61121d565b610315600a81565b61035f610430366004612481565b611268565b61035f61044336600461254e565b611275565b61045b6104563660046124e0565b61139d565b6040516102a49190612638565b6103156104763660046124e0565b611409565b6006546102d6906001600160a01b031681565b61031561049c3660046124e0565b6001600160a01b031660009081526020819052604090205490565b61035f611451565b6102d66104cd366004612481565b6000908152600d60205260409020546001600160a01b031690565b61035f6104f63660046124b6565b611487565b6005546001600160a01b03166102d6565b60085461030190600160a01b900460ff1681565b610297611508565b61035f6105363660046124b6565b611517565b61035f61054936600461254e565b611521565b61030161055c3660046124b6565b61163a565b61030161056f3660046124b6565b6116d3565b61045b6105823660046124e0565b6116e0565b6103156105953660046124e0565b6001600160a01b031660009081526011602052604090205490565b61035f6105be36600461254e565b61174a565b6008546102d6906001600160a01b031681565b610315601181565b61035f611872565b610315600581565b6103156105fc36600461267c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007546102d6906001600160a01b031681565b61035f6106483660046124e0565b611b0c565b61045b61065b3660046124e0565b611b58565b61035f61066e36600461254e565b611bc2565b61035f6106813660046124e0565b611cdb565b606060038054610695906126af565b80601f01602080910402602001604051908101604052809291908181526020018280546106c1906126af565b801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b5050505050905090565b6000610725338484611d73565b50600192915050565b6000805b8281101561085f57600084848381811061074e5761074e6126ea565b602090810292909201356000818152600d909352604090922054919250506001600160a01b0316331461079c5760405162461bcd60e51b815260040161079390612700565b60405180910390fd5b6013546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906107d09030903390869060040161272b565b600060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b5050505061080b81611e97565b6108159084612765565b336000908152600e602052604090209093506108319082611ede565b6000908152600d6020526040902080546001600160a01b0319169055806108578161277d565b915050610732565b50600061086b60025490565b610880906aa56fa5b99019a5c8000000612798565b9050610899338284116108935783611f9d565b82611f9d565b50505050565b60006108ac84848461207c565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610793565b61093e8533858403611d73565b506001949350505050565b6005546001600160a01b031633146109735760405162461bcd60e51b8152600401610793906127af565b60005b83811015610a54576aa56fa5b99019a5c8000000600184848481811061099e5761099e6126ea565b905060200201356109ae60025490565b6109b89190612765565b6109c29190612798565b1115610a045760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b6044820152606401610793565b610a4c858583818110610a1957610a196126ea565b9050602002016020810190610a2e91906124e0565b848484818110610a4057610a406126ea565b90506020020135611f9d565b600101610976565b5050505050565b6000610a6633611409565b1180610a7f5750336000908152600e6020526040812054115b80610a97575033600090815260116020526040812054115b610ad15760405162461bcd60e51b815260206004820152600b60248201526a139bdb994814dd185ad95960aa1b6044820152606401610793565b336000908152600b60205260408120545b8015610c0157336000908152600b60205260408120610b02600184612798565b81548110610b1257610b126126ea565b6000918252602090912001546012546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610b539030903390869060040161272b565b600060405180830381600087803b158015610b6d57600080fd5b505af1158015610b81573d6000803e3d6000fd5b50505050610b8e8161224a565b610b989084612765565b336000908152600b6020526040902080549194509080610bba57610bba6127e4565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610bf9816127fa565b915050610ae2565b50336000908152600e60205260409020545b8015610d3257336000908152600e60205260408120610c33600184612798565b81548110610c4357610c436126ea565b6000918252602090912001546013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610c849030903390869060040161272b565b600060405180830381600087803b158015610c9e57600080fd5b505af1158015610cb2573d6000803e3d6000fd5b50505050610cbf81611e97565b610cc99084612765565b336000908152600e6020526040902080549194509080610ceb57610ceb6127e4565b600082815260208082208301600019908101839055909201909255918152600d9091526040902080546001600160a01b031916905580610d2a816127fa565b915050610c13565b50336000908152601160205260409020545b8015610e6357336000908152601160205260408120610d64600184612798565b81548110610d7457610d746126ea565b6000918252602090912001546014546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610db59030903390869060040161272b565b600060405180830381600087803b158015610dcf57600080fd5b505af1158015610de3573d6000803e3d6000fd5b50505050610df08161226b565b610dfa9084612765565b33600090815260116020526040902080549194509080610e1c57610e1c6127e4565b60008281526020808220830160001990810183905590920190925591815260109091526040902080546001600160a01b031916905580610e5b816127fa565b915050610d44565b506000610e6f60025490565b610e84906aa56fa5b99019a5c8000000612798565b9050610e97338284116108935783611f9d565b5050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610efd57602002820191906000526020600020905b815481526020019060010190808311610ee9575b5050505050905060005b8151811015610f5057610f32828281518110610f2557610f256126ea565b602002602001015161224a565b610f3c9084612765565b925080610f488161277d565b915050610f07565b506001600160a01b0384166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015610fb157602002820191906000526020600020905b815481526020019060010190808311610f9d575b5050505050905060005b815181101561100457610fe6828281518110610fd957610fd96126ea565b6020026020010151611e97565b610ff09085612765565b935080610ffc8161277d565b915050610fbb565b506001600160a01b03851660009081526011602090815260408083208054825181850281018501909352808352919290919083018282801561106557602002820191906000526020600020905b815481526020019060010190808311611051575b5050505050905060005b81518110156110b85761109a82828151811061108d5761108d6126ea565b602002602001015161226b565b6110a49086612765565b9450806110b08161277d565b91505061106f565b509295945050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107259185906110fa908690612765565b611d73565b600854600160a01b900460ff166111285760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611147576111476126ea565b6012546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd91506111889033903090869060040161272b565b600060405180830381600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b031916909317909255508190506112108161277d565b91505061112b565b505050565b6005546001600160a01b031633146112475760405162461bcd60e51b8152600401610793906127af565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b611272338261228c565b50565b6000805b8281101561085f576000848483818110611295576112956126ea565b6020908102929092013560008181526010909352604090922054919250506001600160a01b031633146112da5760405162461bcd60e51b815260040161079390612700565b6014546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061130e9030903390869060040161272b565b600060405180830381600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050506113498161226b565b6113539084612765565b33600090815260116020526040902090935061136f9082611ede565b600090815260106020526040902080546001600160a01b0319169055806113958161277d565b915050611279565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020905b8154815260200190600101908083116113e9575b50505050509050919050565b6001600160a01b038116600090815260116020908152604080832054600e835281842054600b90935290832054909161144191612765565b61144b9190612765565b92915050565b6005546001600160a01b0316331461147b5760405162461bcd60e51b8152600401610793906127af565b61148560006123da565b565b600061149383336105fc565b9050818110156114f15760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610793565b6114fe8333848403611d73565b611218838361228c565b606060048054610695906126af565b610e97828261228c565b600854600160a01b900460ff1661154a5760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611569576115696126ea565b6013546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd91506115aa9033903090869060040161272b565b600060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b5050336000818152600e60209081526040808320805460018101825590845282842001879055958252600c8152858220429055600d90529390932080546001600160a01b031916909317909255508190506116328161277d565b91505061154d565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116bc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610793565b6116c93385858403611d73565b5060019392505050565b600061072533848461207c565b6001600160a01b0381166000908152601160209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020908154815260200190600101908083116113e95750505050509050919050565b6000805b8281101561085f57600084848381811061176a5761176a6126ea565b602090810292909201356000818152600a909352604090922054919250506001600160a01b031633146117af5760405162461bcd60e51b815260040161079390612700565b6012546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117e39030903390869060040161272b565b600060405180830381600087803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b5050505061181e8161224a565b6118289084612765565b336000908152600b602052604090209093506118449082611ede565b6000908152600a6020526040902080546001600160a01b03191690558061186a8161277d565b91505061174e565b336000908152600b60209081526040808320805482518185028101850190935280835284938301828280156118c657602002820191906000526020600020905b8154815260200190600101908083116118b2575b5050505050905060005b815181101561193c5760008282815181106118ed576118ed6126ea565b6020026020010151905061190c838381518110610f2557610f256126ea565b6119169085612765565b6000918252600960205260409091204290559250806119348161277d565b9150506118d0565b50336000908152600e602090815260408083208054825181850281018501909352808352919290919083018282801561199457602002820191906000526020600020905b815481526020019060010190808311611980575b5050505050905060005b8151811015611a0a5760008282815181106119bb576119bb6126ea565b602002602001015190506119da838381518110610fd957610fd96126ea565b6119e49086612765565b6000918252600c6020526040909120429055935080611a028161277d565b91505061199e565b5033600090815260116020908152604080832080548251818502810185019093528083529192909190830182828015611a6257602002820191906000526020600020905b815481526020019060010190808311611a4e575b5050505050905060005b8151811015611ad8576000828281518110611a8957611a896126ea565b60200260200101519050611aa883838151811061108d5761108d6126ea565b611ab29087612765565b6000918252600f6020526040909120429055945080611ad08161277d565b915050611a6c565b506000611ae460025490565b611af9906aa56fa5b99019a5c8000000612798565b9050610a54338287116108935786611f9d565b6005546001600160a01b03163314611b365760405162461bcd60e51b8152600401610793906127af565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020908154815260200190600101908083116113e95750505050509050919050565b600854600160a01b900460ff16611beb5760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611c0a57611c0a6126ea565b6014546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd9150611c4b9033903090869060040161272b565b600060405180830381600087803b158015611c6557600080fd5b505af1158015611c79573d6000803e3d6000fd5b5050336000818152601160209081526040808320805460018101825590845282842001879055958252600f8152858220429055601090529390932080546001600160a01b03191690931790925550819050611cd38161277d565b915050611bee565b6005546001600160a01b03163314611d055760405162461bcd60e51b8152600401610793906127af565b6001600160a01b038116611d6a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b611272816123da565b6001600160a01b038316611dd55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6001600160a01b038216611e365760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610793565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000818152600c60205260408120546201518090600590611eb89042612798565b611ec29190612833565b611ecc9190612852565b61144b90670de0b6b3a7640000612833565b815460005b818110156108995782848281548110611efe57611efe6126ea565b90600052602060002001541415611f8b5781611f19816127fa565b92505081811015611f6057838281548110611f3657611f366126ea565b9060005260206000200154848281548110611f5357611f536126ea565b6000918252602090912001555b83805480611f7057611f706127e4565b60019003818190600052602060002001600090559055610899565b80611f958161277d565b915050611ee3565b6001600160a01b038216611ff35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610793565b80600260008282546120059190612765565b90915550506001600160a01b03821660009081526020819052604081208054839290612032908490612765565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166120e05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610793565b6001600160a01b0382166121425760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610793565b6001600160a01b038316600090815260208190526040902054818110156121ba5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610793565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121f1908490612765565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161223d91815260200190565b60405180910390a3610899565b6000818152600960205260408120546201518090600a90611eb89042612798565b6000818152600f60205260408120546201518090601190611eb89042612798565b6001600160a01b0382166122ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610793565b6001600160a01b038216600090815260208190526040902054818110156123605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610793565b6001600160a01b038316600090815260208190526040812083830390556002805484929061238f908490612798565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b818110156124595785810183015185820160400152820161243d565b8181111561246b576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561249357600080fd5b5035919050565b80356001600160a01b03811681146124b157600080fd5b919050565b600080604083850312156124c957600080fd5b6124d28361249a565b946020939093013593505050565b6000602082840312156124f257600080fd5b6124fb8261249a565b9392505050565b60008083601f84011261251457600080fd5b50813567ffffffffffffffff81111561252c57600080fd5b6020830191508360208260051b850101111561254757600080fd5b9250929050565b6000806020838503121561256157600080fd5b823567ffffffffffffffff81111561257857600080fd5b61258485828601612502565b90969095509350505050565b6000806000606084860312156125a557600080fd5b6125ae8461249a565b92506125bc6020850161249a565b9150604084013590509250925092565b600080600080604085870312156125e257600080fd5b843567ffffffffffffffff808211156125fa57600080fd5b61260688838901612502565b9096509450602087013591508082111561261f57600080fd5b5061262c87828801612502565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561267057835183529284019291840191600101612654565b50909695505050505050565b6000806040838503121561268f57600080fd5b6126988361249a565b91506126a66020840161249a565b90509250929050565b600181811c908216806126c357607f821691505b602082108114156126e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601190820152702722a2a229afaa27afa122afa7aba722a960791b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127785761277861274f565b500190565b60006000198214156127915761279161274f565b5060010190565b6000828210156127aa576127aa61274f565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603160045260246000fd5b6000816128095761280961274f565b506000190190565b6020808252600890820152674e4f545f4c49564560c01b604082015260600190565b600081600019048311821515161561284d5761284d61274f565b500290565b60008261286f57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122011e5bdedaef6b0df8d83086d18cd3e54bad132ce9365de643da7a1e1f33da9de64736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c8063715018a61161015c578063bb93a4e6116100ce578063dd62ed3e11610087578063dd62ed3e146105ee578063e6923cf814610627578063ecce86651461063a578063ed5669001461064d578063f2031a9914610660578063f2fde38b1461067357600080fd5b8063bb93a4e614610587578063c3b334c0146105b0578063c80d491b146105c3578063c9ecc9dd146105d6578063d1058e59146105de578063d25d5a7b146105e657600080fd5b806395d89b411161012057806395d89b41146105205780639dc29fac14610528578063a05287c31461053b578063a457c2d71461054e578063a9059cbb14610561578063b3fb20cf1461057457600080fd5b8063715018a6146104b7578063774464f5146104bf57806379cc6790146104e85780638da5cb5b146104fb578063957aa58c1461050c57600080fd5b8063362a3fad1161020057806342966c68116101b957806342966c681461042257806349a2f1f2146104355780634a2ba8e7146104485780634da6a5561461046857806358620c3a1461047b57806370a082311461048e57600080fd5b8063362a3fad146103b0578063363da4c9146103c357806339509351146103ec5780633bedb844146103ff57806340a3d2461461041257806340bfa0121461041a57600080fd5b80632203cf45116102525780632203cf451461034c57806323b872dd146103615780632d6c8e3c14610374578063313ce5671461038757806332cb6b0c1461039657806335322f37146103a857600080fd5b806306fdde031461028f578063093a2455146102ad578063095ea7b3146102ee57806318160ddd146103115780631d3a53c014610323575b600080fd5b610297610686565b6040516102a4919061242c565b60405180910390f35b6102d66102bb366004612481565b6000908152601060205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102a4565b6103016102fc3660046124b6565b610718565b60405190151581526020016102a4565b6002545b6040519081526020016102a4565b6103156103313660046124e0565b6001600160a01b03166000908152600e602052604090205490565b61035f61035a36600461254e565b61072e565b005b61030161036f366004612590565b61089f565b61035f6103823660046125cc565b610949565b604051601281526020016102a4565b6103156aa56fa5b99019a5c800000081565b61035f610a5b565b6103156103be3660046124e0565b610e9b565b6102d66103d1366004612481565b6000908152600a60205260409020546001600160a01b031690565b6103016103fa3660046124b6565b6110c3565b61035f61040d36600461254e565b6110ff565b61035f61121d565b610315600a81565b61035f610430366004612481565b611268565b61035f61044336600461254e565b611275565b61045b6104563660046124e0565b61139d565b6040516102a49190612638565b6103156104763660046124e0565b611409565b6006546102d6906001600160a01b031681565b61031561049c3660046124e0565b6001600160a01b031660009081526020819052604090205490565b61035f611451565b6102d66104cd366004612481565b6000908152600d60205260409020546001600160a01b031690565b61035f6104f63660046124b6565b611487565b6005546001600160a01b03166102d6565b60085461030190600160a01b900460ff1681565b610297611508565b61035f6105363660046124b6565b611517565b61035f61054936600461254e565b611521565b61030161055c3660046124b6565b61163a565b61030161056f3660046124b6565b6116d3565b61045b6105823660046124e0565b6116e0565b6103156105953660046124e0565b6001600160a01b031660009081526011602052604090205490565b61035f6105be36600461254e565b61174a565b6008546102d6906001600160a01b031681565b610315601181565b61035f611872565b610315600581565b6103156105fc36600461267c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007546102d6906001600160a01b031681565b61035f6106483660046124e0565b611b0c565b61045b61065b3660046124e0565b611b58565b61035f61066e36600461254e565b611bc2565b61035f6106813660046124e0565b611cdb565b606060038054610695906126af565b80601f01602080910402602001604051908101604052809291908181526020018280546106c1906126af565b801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b5050505050905090565b6000610725338484611d73565b50600192915050565b6000805b8281101561085f57600084848381811061074e5761074e6126ea565b602090810292909201356000818152600d909352604090922054919250506001600160a01b0316331461079c5760405162461bcd60e51b815260040161079390612700565b60405180910390fd5b6013546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906107d09030903390869060040161272b565b600060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b5050505061080b81611e97565b6108159084612765565b336000908152600e602052604090209093506108319082611ede565b6000908152600d6020526040902080546001600160a01b0319169055806108578161277d565b915050610732565b50600061086b60025490565b610880906aa56fa5b99019a5c8000000612798565b9050610899338284116108935783611f9d565b82611f9d565b50505050565b60006108ac84848461207c565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610793565b61093e8533858403611d73565b506001949350505050565b6005546001600160a01b031633146109735760405162461bcd60e51b8152600401610793906127af565b60005b83811015610a54576aa56fa5b99019a5c8000000600184848481811061099e5761099e6126ea565b905060200201356109ae60025490565b6109b89190612765565b6109c29190612798565b1115610a045760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b6044820152606401610793565b610a4c858583818110610a1957610a196126ea565b9050602002016020810190610a2e91906124e0565b848484818110610a4057610a406126ea565b90506020020135611f9d565b600101610976565b5050505050565b6000610a6633611409565b1180610a7f5750336000908152600e6020526040812054115b80610a97575033600090815260116020526040812054115b610ad15760405162461bcd60e51b815260206004820152600b60248201526a139bdb994814dd185ad95960aa1b6044820152606401610793565b336000908152600b60205260408120545b8015610c0157336000908152600b60205260408120610b02600184612798565b81548110610b1257610b126126ea565b6000918252602090912001546012546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610b539030903390869060040161272b565b600060405180830381600087803b158015610b6d57600080fd5b505af1158015610b81573d6000803e3d6000fd5b50505050610b8e8161224a565b610b989084612765565b336000908152600b6020526040902080549194509080610bba57610bba6127e4565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610bf9816127fa565b915050610ae2565b50336000908152600e60205260409020545b8015610d3257336000908152600e60205260408120610c33600184612798565b81548110610c4357610c436126ea565b6000918252602090912001546013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610c849030903390869060040161272b565b600060405180830381600087803b158015610c9e57600080fd5b505af1158015610cb2573d6000803e3d6000fd5b50505050610cbf81611e97565b610cc99084612765565b336000908152600e6020526040902080549194509080610ceb57610ceb6127e4565b600082815260208082208301600019908101839055909201909255918152600d9091526040902080546001600160a01b031916905580610d2a816127fa565b915050610c13565b50336000908152601160205260409020545b8015610e6357336000908152601160205260408120610d64600184612798565b81548110610d7457610d746126ea565b6000918252602090912001546014546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610db59030903390869060040161272b565b600060405180830381600087803b158015610dcf57600080fd5b505af1158015610de3573d6000803e3d6000fd5b50505050610df08161226b565b610dfa9084612765565b33600090815260116020526040902080549194509080610e1c57610e1c6127e4565b60008281526020808220830160001990810183905590920190925591815260109091526040902080546001600160a01b031916905580610e5b816127fa565b915050610d44565b506000610e6f60025490565b610e84906aa56fa5b99019a5c8000000612798565b9050610e97338284116108935783611f9d565b5050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610efd57602002820191906000526020600020905b815481526020019060010190808311610ee9575b5050505050905060005b8151811015610f5057610f32828281518110610f2557610f256126ea565b602002602001015161224a565b610f3c9084612765565b925080610f488161277d565b915050610f07565b506001600160a01b0384166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015610fb157602002820191906000526020600020905b815481526020019060010190808311610f9d575b5050505050905060005b815181101561100457610fe6828281518110610fd957610fd96126ea565b6020026020010151611e97565b610ff09085612765565b935080610ffc8161277d565b915050610fbb565b506001600160a01b03851660009081526011602090815260408083208054825181850281018501909352808352919290919083018282801561106557602002820191906000526020600020905b815481526020019060010190808311611051575b5050505050905060005b81518110156110b85761109a82828151811061108d5761108d6126ea565b602002602001015161226b565b6110a49086612765565b9450806110b08161277d565b91505061106f565b509295945050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107259185906110fa908690612765565b611d73565b600854600160a01b900460ff166111285760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611147576111476126ea565b6012546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd91506111889033903090869060040161272b565b600060405180830381600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b031916909317909255508190506112108161277d565b91505061112b565b505050565b6005546001600160a01b031633146112475760405162461bcd60e51b8152600401610793906127af565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b611272338261228c565b50565b6000805b8281101561085f576000848483818110611295576112956126ea565b6020908102929092013560008181526010909352604090922054919250506001600160a01b031633146112da5760405162461bcd60e51b815260040161079390612700565b6014546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061130e9030903390869060040161272b565b600060405180830381600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050506113498161226b565b6113539084612765565b33600090815260116020526040902090935061136f9082611ede565b600090815260106020526040902080546001600160a01b0319169055806113958161277d565b915050611279565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020905b8154815260200190600101908083116113e9575b50505050509050919050565b6001600160a01b038116600090815260116020908152604080832054600e835281842054600b90935290832054909161144191612765565b61144b9190612765565b92915050565b6005546001600160a01b0316331461147b5760405162461bcd60e51b8152600401610793906127af565b61148560006123da565b565b600061149383336105fc565b9050818110156114f15760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610793565b6114fe8333848403611d73565b611218838361228c565b606060048054610695906126af565b610e97828261228c565b600854600160a01b900460ff1661154a5760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611569576115696126ea565b6013546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd91506115aa9033903090869060040161272b565b600060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b5050336000818152600e60209081526040808320805460018101825590845282842001879055958252600c8152858220429055600d90529390932080546001600160a01b031916909317909255508190506116328161277d565b91505061154d565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116bc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610793565b6116c93385858403611d73565b5060019392505050565b600061072533848461207c565b6001600160a01b0381166000908152601160209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020908154815260200190600101908083116113e95750505050509050919050565b6000805b8281101561085f57600084848381811061176a5761176a6126ea565b602090810292909201356000818152600a909352604090922054919250506001600160a01b031633146117af5760405162461bcd60e51b815260040161079390612700565b6012546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117e39030903390869060040161272b565b600060405180830381600087803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b5050505061181e8161224a565b6118289084612765565b336000908152600b602052604090209093506118449082611ede565b6000908152600a6020526040902080546001600160a01b03191690558061186a8161277d565b91505061174e565b336000908152600b60209081526040808320805482518185028101850190935280835284938301828280156118c657602002820191906000526020600020905b8154815260200190600101908083116118b2575b5050505050905060005b815181101561193c5760008282815181106118ed576118ed6126ea565b6020026020010151905061190c838381518110610f2557610f256126ea565b6119169085612765565b6000918252600960205260409091204290559250806119348161277d565b9150506118d0565b50336000908152600e602090815260408083208054825181850281018501909352808352919290919083018282801561199457602002820191906000526020600020905b815481526020019060010190808311611980575b5050505050905060005b8151811015611a0a5760008282815181106119bb576119bb6126ea565b602002602001015190506119da838381518110610fd957610fd96126ea565b6119e49086612765565b6000918252600c6020526040909120429055935080611a028161277d565b91505061199e565b5033600090815260116020908152604080832080548251818502810185019093528083529192909190830182828015611a6257602002820191906000526020600020905b815481526020019060010190808311611a4e575b5050505050905060005b8151811015611ad8576000828281518110611a8957611a896126ea565b60200260200101519050611aa883838151811061108d5761108d6126ea565b611ab29087612765565b6000918252600f6020526040909120429055945080611ad08161277d565b915050611a6c565b506000611ae460025490565b611af9906aa56fa5b99019a5c8000000612798565b9050610a54338287116108935786611f9d565b6005546001600160a01b03163314611b365760405162461bcd60e51b8152600401610793906127af565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60209081526040918290208054835181840281018401909452808452606093928301828280156113fd57602002820191906000526020600020908154815260200190600101908083116113e95750505050509050919050565b600854600160a01b900460ff16611beb5760405162461bcd60e51b815260040161079390612811565b60005b81811015611218576000838383818110611c0a57611c0a6126ea565b6014546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd9150611c4b9033903090869060040161272b565b600060405180830381600087803b158015611c6557600080fd5b505af1158015611c79573d6000803e3d6000fd5b5050336000818152601160209081526040808320805460018101825590845282842001879055958252600f8152858220429055601090529390932080546001600160a01b03191690931790925550819050611cd38161277d565b915050611bee565b6005546001600160a01b03163314611d055760405162461bcd60e51b8152600401610793906127af565b6001600160a01b038116611d6a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b611272816123da565b6001600160a01b038316611dd55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6001600160a01b038216611e365760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610793565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000818152600c60205260408120546201518090600590611eb89042612798565b611ec29190612833565b611ecc9190612852565b61144b90670de0b6b3a7640000612833565b815460005b818110156108995782848281548110611efe57611efe6126ea565b90600052602060002001541415611f8b5781611f19816127fa565b92505081811015611f6057838281548110611f3657611f366126ea565b9060005260206000200154848281548110611f5357611f536126ea565b6000918252602090912001555b83805480611f7057611f706127e4565b60019003818190600052602060002001600090559055610899565b80611f958161277d565b915050611ee3565b6001600160a01b038216611ff35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610793565b80600260008282546120059190612765565b90915550506001600160a01b03821660009081526020819052604081208054839290612032908490612765565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166120e05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610793565b6001600160a01b0382166121425760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610793565b6001600160a01b038316600090815260208190526040902054818110156121ba5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610793565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121f1908490612765565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161223d91815260200190565b60405180910390a3610899565b6000818152600960205260408120546201518090600a90611eb89042612798565b6000818152600f60205260408120546201518090601190611eb89042612798565b6001600160a01b0382166122ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610793565b6001600160a01b038216600090815260208190526040902054818110156123605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610793565b6001600160a01b038316600090815260208190526040812083830390556002805484929061238f908490612798565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b818110156124595785810183015185820160400152820161243d565b8181111561246b576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561249357600080fd5b5035919050565b80356001600160a01b03811681146124b157600080fd5b919050565b600080604083850312156124c957600080fd5b6124d28361249a565b946020939093013593505050565b6000602082840312156124f257600080fd5b6124fb8261249a565b9392505050565b60008083601f84011261251457600080fd5b50813567ffffffffffffffff81111561252c57600080fd5b6020830191508360208260051b850101111561254757600080fd5b9250929050565b6000806020838503121561256157600080fd5b823567ffffffffffffffff81111561257857600080fd5b61258485828601612502565b90969095509350505050565b6000806000606084860312156125a557600080fd5b6125ae8461249a565b92506125bc6020850161249a565b9150604084013590509250925092565b600080600080604085870312156125e257600080fd5b843567ffffffffffffffff808211156125fa57600080fd5b61260688838901612502565b9096509450602087013591508082111561261f57600080fd5b5061262c87828801612502565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561267057835183529284019291840191600101612654565b50909695505050505050565b6000806040838503121561268f57600080fd5b6126988361249a565b91506126a66020840161249a565b90509250929050565b600181811c908216806126c357607f821691505b602082108114156126e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601190820152702722a2a229afaa27afa122afa7aba722a960791b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127785761277861274f565b500190565b60006000198214156127915761279161274f565b5060010190565b6000828210156127aa576127aa61274f565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603160045260246000fd5b6000816128095761280961274f565b506000190190565b6020808252600890820152674e4f545f4c49564560c01b604082015260600190565b600081600019048311821515161561284d5761284d61274f565b500290565b60008261286f57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122011e5bdedaef6b0df8d83086d18cd3e54bad132ce9365de643da7a1e1f33da9de64736f6c634300080b0033

Deployed Bytecode Sourcemap

20317:11179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8719:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22994:117;;;;;;:::i;:::-;23056:7;23083:20;;;:11;:20;;;;;;-1:-1:-1;;;;;23083:20:0;;22994:117;;;;-1:-1:-1;;;;;965:32:1;;;947:51;;935:2;920:18;22994:117:0;801:203:1;10886:169:0;;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;10886:169:0;1446:187:1;9839:108:0;9927:12;;9839:108;;;1784:25:1;;;1772:2;1757:18;9839:108:0;1638:177:1;22443:136:0;;;;;;:::i;:::-;-1:-1:-1;;;;;22540:24:0;22513:7;22540:24;;;:16;:24;;;;;:31;;22443:136;25383:687;;;;;;:::i;:::-;;:::i;:::-;;11537:492;;;;;;:::i;:::-;;:::i;29763:419::-;;;;;;:::i;:::-;;:::i;9681:93::-;;;9764:2;4078:36:1;;4066:2;4051:18;9681:93:0;3936:184:1;20366:56:0;;20403:19;20366:56;;27173:1457;;;:::i;23119:741::-;;;;;;:::i;:::-;;:::i;22176:115::-;;;;;;:::i;:::-;22237:7;22264:19;;;:10;:19;;;;;;-1:-1:-1;;;;;22264:19:0;;22176:115;12438:215;;;;;;:::i;:::-;;:::i;23868:406::-;;;;;;:::i;:::-;;:::i;30418:68::-;;;:::i;20498:47::-;;20543:2;20498:47;;19171:91;;;;;;:::i;:::-;;:::i;26497:668::-;;;;;;:::i;:::-;;:::i;21843:124::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21979:189::-;;;;;;:::i;:::-;;:::i;20636:72::-;;;;;-1:-1:-1;;;;;20636:72:0;;;10010:127;;;;;;:::i;:::-;-1:-1:-1;;;;;10111:18:0;10084:7;10111:18;;;;;;;;;;;;10010:127;2523:94;;;:::i;22587:123::-;;;;;;:::i;:::-;22652:7;22679:23;;;:14;:23;;;;;;-1:-1:-1;;;;;22679:23:0;;22587:123;19581:368;;;;;;:::i;:::-;;:::i;1872:87::-;1945:6;;-1:-1:-1;;;;;1945:6:0;1872:87;;20879:24;;;;;-1:-1:-1;;;20879:24:0;;;;;;8938:104;;;:::i;30192:91::-;;;;;;:::i;:::-;;:::i;24948:427::-;;;;;;:::i;:::-;;:::i;13156:413::-;;;;;;:::i;:::-;;:::i;10350:175::-;;;;;;:::i;:::-;;:::i;22718:126::-;;;;;;:::i;:::-;;:::i;22856:130::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22950:21:0;22923:7;22950:21;;;:13;:21;;;;;:28;;22856:130;24282:658;;;;;;:::i;:::-;;:::i;20799:73::-;;;;;-1:-1:-1;;;;;20799:73:0;;;20429:48;;20475:2;20429:48;;28638:1113;;;:::i;20566:50::-;;20615:1;20566:50;;10588:151;;;;;;:::i;:::-;-1:-1:-1;;;;;10704:18:0;;;10677:7;10704:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10588:151;20716:76;;;;;-1:-1:-1;;;;;20716:76:0;;;30291:115;;;;;;:::i;:::-;;:::i;22299:132::-;;;;;;:::i;:::-;;:::i;26078:411::-;;;;;;:::i;:::-;;:::i;2772:192::-;;;;;;:::i;:::-;;:::i;8719:100::-;8773:13;8806:5;8799:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8719:100;:::o;10886:169::-;10969:4;10986:39;740:10;11009:7;11018:6;10986:8;:39::i;:::-;-1:-1:-1;11043:4:0;10886:169;;;;:::o;25383:687::-;25463:20;25505:9;25500:423;25520:19;;;25500:423;;;25561:10;25574:8;;25583:1;25574:11;;;;;;;:::i;:::-;;;;;;;;;;25608:18;;;;:14;:18;;;;;;;;25574:11;;-1:-1:-1;;;;;;;25608:18:0;25630:10;25608:32;25600:62;;;;-1:-1:-1;;;25600:62:0;;;;;;;:::i;:::-;;;;;;;;;25679:17;;:61;;-1:-1:-1;;;25679:61:0;;-1:-1:-1;;;;;25679:17:0;;;;:30;;:61;;25718:4;;25725:10;;25737:2;;25679:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25771:21;25789:2;25771:17;:21::i;:::-;25755:37;;;;:::i;:::-;25849:10;25832:28;;;;:16;:28;;;;;25755:37;;-1:-1:-1;25809:56:0;;25862:2;25809:22;:56::i;:::-;25909:1;25880:18;;;:14;:18;;;;;:31;;-1:-1:-1;;;;;;25880:31:0;;;25541:3;;;;:::i;:::-;;;;25500:423;;;;25935:17;25968:13;9927:12;;;9839:108;25968:13;25955:26;;20403:19;25955:26;:::i;:::-;25935:46;;25992:70;25998:10;26025:9;26010:12;:24;:51;;26049:12;25992:5;:70::i;26010:51::-;26037:9;25992:5;:70::i;:::-;25452:618;;25383:687;;:::o;11537:492::-;11677:4;11694:36;11704:6;11712:9;11723:6;11694:9;:36::i;:::-;-1:-1:-1;;;;;11770:19:0;;11743:24;11770:19;;;:11;:19;;;;;;;;740:10;11770:33;;;;;;;;11822:26;;;;11814:79;;;;-1:-1:-1;;;11814:79:0;;7007:2:1;11814:79:0;;;6989:21:1;7046:2;7026:18;;;7019:30;7085:34;7065:18;;;7058:62;-1:-1:-1;;;7136:18:1;;;7129:38;7184:19;;11814:79:0;6805:404:1;11814:79:0;11929:57;11938:6;740:10;11979:6;11960:16;:25;11929:8;:57::i;:::-;-1:-1:-1;12017:4:0;;11537:492;-1:-1:-1;;;;11537:492:0:o;29763:419::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;29892:9:::1;29887:288;29903:14:::0;;::::1;29887:288;;;20403:19;29991:1;29978:7;;29986:1;29978:10;;;;;;;:::i;:::-;;;;;;;29962:13;9927:12:::0;;;9839:108;29962:13:::1;:26;;;;:::i;:::-;:30;;;;:::i;:::-;:44;;29936:123;;;::::0;-1:-1:-1;;;29936:123:0;;7777:2:1;29936:123:0::1;::::0;::::1;7759:21:1::0;7816:2;7796:18;;;7789:30;-1:-1:-1;;;7835:18:1;;;7828:47;7892:18;;29936:123:0::1;7575:341:1::0;29936:123:0::1;30074:25;30080:3;;30084:1;30080:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;30088:7;;30096:1;30088:10;;;;;;;:::i;:::-;;;;;;;30074:5;:25::i;:::-;30145:3;;29887:288;;;;29763:419:::0;;;;:::o;27173:1457::-;27253:1;27223:27;27239:10;27223:15;:27::i;:::-;:31;:74;;;-1:-1:-1;27282:10:0;27296:1;22540:24;;;:16;:24;;;;;:31;27258:39;27223:74;:114;;;-1:-1:-1;27322:10:0;27336:1;22950:21;;;:13;:21;;;;;:28;27301:36;27223:114;27215:138;;;;-1:-1:-1;;;27215:138:0;;8123:2:1;27215:138:0;;;8105:21:1;8162:2;8142:18;;;8135:30;-1:-1:-1;;;8181:18:1;;;8174:41;8232:18;;27215:138:0;7921:335:1;27215:138:0;27431:10;27364:20;27418:24;;;:12;:24;;;;;:31;27401:340;27451:5;;27401:340;;27504:10;27478;27491:24;;;:12;:24;;;;;27516:5;27520:1;27516;:5;:::i;:::-;27491:31;;;;;;;;:::i;:::-;;;;;;;;;;;27539:13;;:57;;-1:-1:-1;;;27539:57:0;;27491:31;;-1:-1:-1;;;;;;27539:13:0;;:26;;:57;;27574:4;;27581:10;;27491:31;;27539:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27627:13;27637:2;27627:9;:13::i;:::-;27611:29;;;;:::i;:::-;27670:10;27657:24;;;;:12;:24;;;;;:30;;27611:29;;-1:-1:-1;27657:24:0;:30;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;27657:30:0;;;;;;;;;;;;27702:14;;;:10;:14;;;;;;:27;;-1:-1:-1;;;;;;27702:27:0;;;27458:3;;;;:::i;:::-;;;;27401:340;;;-1:-1:-1;27787:10:0;27758:9;27770:28;;;:16;:28;;;;;:35;27753:368;27807:5;;27753:368;;27864:10;27834;27847:28;;;:16;:28;;;;;27876:5;27880:1;27876;:5;:::i;:::-;27847:35;;;;;;;;:::i;:::-;;;;;;;;;;;27899:17;;:61;;-1:-1:-1;;;27899:61:0;;27847:35;;-1:-1:-1;;;;;;27899:17:0;;:30;;:61;;27938:4;;27945:10;;27847:35;;27899:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27991:21;28009:2;27991:17;:21::i;:::-;27975:37;;;;:::i;:::-;28046:10;28029:28;;;;:16;:28;;;;;:34;;27975:37;;-1:-1:-1;28029:28:0;:34;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;28029:34:0;;;;;;;;;;;;28078:18;;;:14;:18;;;;;;:31;;-1:-1:-1;;;;;;28078:31:0;;;27814:3;;;;:::i;:::-;;;;27753:368;;;-1:-1:-1;28164:10:0;28138:9;28150:25;;;:13;:25;;;;;:32;28133:350;28184:5;;28133:350;;28238:10;28211;28224:25;;;:13;:25;;;;;28250:5;28254:1;28250;:5;:::i;:::-;28224:32;;;;;;;;:::i;:::-;;;;;;;;;;;28273:14;;:58;;-1:-1:-1;;;28273:58:0;;28224:32;;-1:-1:-1;;;;;;28273:14:0;;:27;;:58;;28309:4;;28316:10;;28224:32;;28273:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28362:18;28377:2;28362:14;:18::i;:::-;28346:34;;;;:::i;:::-;28411:10;28397:25;;;;:13;:25;;;;;:31;;28346:34;;-1:-1:-1;28397:25:0;:31;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;28397:31:0;;;;;;;;;;;;28443:15;;;:11;:15;;;;;;:28;;-1:-1:-1;;;;;;28443:28:0;;;28191:3;;;;:::i;:::-;;;;28133:350;;;;28495:17;28528:13;9927:12;;;9839:108;28528:13;28515:26;;20403:19;28515:26;:::i;:::-;28495:46;;28552:70;28558:10;28585:9;28570:12;:24;:51;;28609:12;25992:5;:70::i;28552:::-;27204:1426;;27173:1457::o;23119:741::-;-1:-1:-1;;;;;23266:20:0;;23179:7;23266:20;;;:12;:20;;;;;;;;23236:50;;;;;;;;;;;;;;;;;23179:7;;;;23236:50;23266:20;23236:50;;;23266:20;23236:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23302:9;23297:115;23321:10;:17;23317:1;:21;23297:115;;;23376:24;23386:10;23397:1;23386:13;;;;;;;;:::i;:::-;;;;;;;23376:9;:24::i;:::-;23360:40;;;;:::i;:::-;;-1:-1:-1;23340:3:0;;;;:::i;:::-;;;;23297:115;;;-1:-1:-1;;;;;;23458:24:0;;23424:31;23458:24;;;:16;:24;;;;;;;;23424:58;;;;;;;;;;;;;;;;;;;23458:24;;23424:58;;;23458:24;23424:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23498:9;23493:131;23517:14;:21;23513:1;:25;23493:131;;;23576:36;23594:14;23609:1;23594:17;;;;;;;;:::i;:::-;;;;;;;23576;:36::i;:::-;23560:52;;;;:::i;:::-;;-1:-1:-1;23540:3:0;;;;:::i;:::-;;;;23493:131;;;-1:-1:-1;;;;;;23667:21:0;;23636:28;23667:21;;;:13;:21;;;;;;;;23636:52;;;;;;;;;;;;;;;;;;;23667:21;;23636:52;;;23667:21;23636:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23704:9;23699:122;23723:11;:18;23719:1;:22;23699:122;;;23779:30;23794:11;23806:1;23794:14;;;;;;;;:::i;:::-;;;;;;;23779;:30::i;:::-;23763:46;;;;:::i;:::-;;-1:-1:-1;23743:3:0;;;;:::i;:::-;;;;23699:122;;;-1:-1:-1;23840:12:0;;23119:741;-1:-1:-1;;;;;23119:741:0:o;12438:215::-;740:10;12526:4;12575:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12575:34:0;;;;;;;;;;12526:4;;12543:80;;12566:7;;12575:47;;12612:10;;12575:47;:::i;:::-;12543:8;:80::i;23868:406::-;21798:4;;-1:-1:-1;;;21798:4:0;;;;21790:25;;;;-1:-1:-1;;;21790:25:0;;;;;;;:::i;:::-;23960:9:::1;23955:312;23975:19:::0;;::::1;23955:312;;;24016:10;24029:8;;24038:1;24029:11;;;;;;;:::i;:::-;24055:13;::::0;:57:::1;::::0;-1:-1:-1;;;24055:57:0;;24029:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;24055:13:0;;::::1;::::0;:26:::1;::::0;-1:-1:-1;24055:57:0::1;::::0;24082:10:::1;::::0;24102:4:::1;::::0;24029:11;;24055:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;24142:10:0::1;24129:24;::::0;;;:12:::1;:24;::::0;;;;;;;:33;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;24177:18;;;:14:::1;:18:::0;;;;;24198:15:::1;24177:36:::0;;24228:10:::1;:14:::0;;;;;;:27;;-1:-1:-1;;;;;;24228:27:0::1;::::0;;::::1;::::0;;;-1:-1:-1;23996:3:0;;-1:-1:-1;23996:3:0::1;::::0;::::1;:::i;:::-;;;;23955:312;;;;23868:406:::0;;:::o;30418:68::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;30474:4:::1;::::0;;-1:-1:-1;;;;30466:12:0;::::1;-1:-1:-1::0;;;30474:4:0;;;::::1;;;30473:5;30466:12:::0;;::::1;;::::0;;30418:68::o;19171:91::-;19227:27;740:10;19247:6;19227:5;:27::i;:::-;19171:91;:::o;26497:668::-;26573:20;26615:9;26610:408;26630:19;;;26610:408;;;26671:10;26684:8;;26693:1;26684:11;;;;;;;:::i;:::-;;;;;;;;;;26718:15;;;;:11;:15;;;;;;;;26684:11;;-1:-1:-1;;;;;;;26718:15:0;26737:10;26718:29;26710:59;;;;-1:-1:-1;;;26710:59:0;;;;;;;:::i;:::-;26786:14;;:58;;-1:-1:-1;;;26786:58:0;;-1:-1:-1;;;;;26786:14:0;;;;:27;;:58;;26822:4;;26829:10;;26841:2;;26786:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26875:18;26890:2;26875:14;:18::i;:::-;26859:34;;;;:::i;:::-;26947:10;26933:25;;;;:13;:25;;;;;26859:34;;-1:-1:-1;26910:53:0;;26960:2;26910:22;:53::i;:::-;27004:1;26978:15;;;:11;:15;;;;;:28;;-1:-1:-1;;;;;;26978:28:0;;;26651:3;;;;:::i;:::-;;;;26610:408;;21843:124;-1:-1:-1;;;;;21939:20:0;;;;;;:12;:20;;;;;;;;;21932:27;;;;;;;;;;;;;;;;;21903:16;;21932:27;;;21939:20;21932:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21843:124;;;:::o;21979:189::-;-1:-1:-1;;;;;22132:21:0;;22041:7;22132:21;;;:13;:21;;;;;;;;:28;22098:16;:24;;;;;:31;22068:12;:20;;;;;;:27;22132:28;;22068:61;;;:::i;:::-;:92;;;;:::i;:::-;22061:99;21979:189;-1:-1:-1;;21979:189:0:o;2523:94::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;2588:21:::1;2606:1;2588:9;:21::i;:::-;2523:94::o:0;19581:368::-;19658:24;19685:32;19695:7;740:10;10588:151;:::i;19685:32::-;19658:59;;19756:6;19736:16;:26;;19728:75;;;;-1:-1:-1;;;19728:75:0;;9072:2:1;19728:75:0;;;9054:21:1;9111:2;9091:18;;;9084:30;9150:34;9130:18;;;9123:62;-1:-1:-1;;;9201:18:1;;;9194:34;9245:19;;19728:75:0;8870:400:1;19728:75:0;19839:58;19848:7;740:10;19890:6;19871:16;:25;19839:8;:58::i;:::-;19919:22;19925:7;19934:6;19919:5;:22::i;8938:104::-;8994:13;9027:7;9020:14;;;;;:::i;30192:91::-;30256:19;30262:4;30268:6;30256:5;:19::i;24948:427::-;21798:4;;-1:-1:-1;;;21798:4:0;;;;21790:25;;;;-1:-1:-1;;;21790:25:0;;;;;;;:::i;:::-;25045:9:::1;25040:328;25060:19:::0;;::::1;25040:328;;;25101:10;25114:8;;25123:1;25114:11;;;;;;;:::i;:::-;25140:17;::::0;:61:::1;::::0;-1:-1:-1;;;25140:61:0;;25114:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;25140:17:0;;::::1;::::0;:30:::1;::::0;-1:-1:-1;25140:61:0::1;::::0;25171:10:::1;::::0;25191:4:::1;::::0;25114:11;;25140:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25235:10:0::1;25218:28;::::0;;;:16:::1;:28;::::0;;;;;;;:37;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;25270:22;;;:18:::1;:22:::0;;;;;25295:15:::1;25270:40:::0;;25325:14:::1;:18:::0;;;;;;:31;;-1:-1:-1;;;;;;25325:31:0::1;::::0;;::::1;::::0;;;-1:-1:-1;25081:3:0;;-1:-1:-1;25081:3:0::1;::::0;::::1;:::i;:::-;;;;25040:328;;13156:413:::0;740:10;13249:4;13293:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13293:34:0;;;;;;;;;;13346:35;;;;13338:85;;;;-1:-1:-1;;;13338:85:0;;9477:2:1;13338:85:0;;;9459:21:1;9516:2;9496:18;;;9489:30;9555:34;9535:18;;;9528:62;-1:-1:-1;;;9606:18:1;;;9599:35;9651:19;;13338:85:0;9275:401:1;13338:85:0;13459:67;740:10;13482:7;13510:15;13491:16;:34;13459:8;:67::i;:::-;-1:-1:-1;13557:4:0;;13156:413;-1:-1:-1;;;13156:413:0:o;10350:175::-;10436:4;10453:42;740:10;10477:9;10488:6;10453:9;:42::i;22718:126::-;-1:-1:-1;;;;;22815:21:0;;;;;;:13;:21;;;;;;;;;22808:28;;;;;;;;;;;;;;;;;22779:16;;22808:28;;;22815:21;22808:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22718:126;;;:::o;24282:658::-;24357:20;24399:9;24394:399;24414:19;;;24394:399;;;24455:10;24468:8;;24477:1;24468:11;;;;;;;:::i;:::-;;;;;;;;;;24502:14;;;;:10;:14;;;;;;;;24468:11;;-1:-1:-1;;;;;;;24502:14:0;24520:10;24502:28;24494:58;;;;-1:-1:-1;;;24494:58:0;;;;;;;:::i;:::-;24569:13;;:57;;-1:-1:-1;;;24569:57:0;;-1:-1:-1;;;;;24569:13:0;;;;:26;;:57;;24604:4;;24611:10;;24623:2;;24569:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24657:13;24667:2;24657:9;:13::i;:::-;24641:29;;;;:::i;:::-;24723:10;24710:24;;;;:12;:24;;;;;24641:29;;-1:-1:-1;24687:52:0;;24736:2;24687:22;:52::i;:::-;24779:1;24754:14;;;:10;:14;;;;;:27;;-1:-1:-1;;;;;;24754:27:0;;;24435:3;;;;:::i;:::-;;;;24394:399;;28638:1113;28758:10;28678:20;28745:24;;;:12;:24;;;;;;;;28715:54;;;;;;;;;;;;;;;;;28678:20;;28715:54;;28745:24;28715:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28785:9;28780:209;28804:10;:17;28800:1;:21;28780:209;;;28843:10;28856;28867:1;28856:13;;;;;;;;:::i;:::-;;;;;;;28843:26;;28902:24;28912:10;28923:1;28912:13;;;;;;;;:::i;28902:24::-;28886:40;;;;:::i;:::-;28941:18;;;;:14;:18;;;;;;28962:15;28941:36;;28886:40;-1:-1:-1;28823:3:0;;;;:::i;:::-;;;;28780:209;;;-1:-1:-1;29052:10:0;29001:31;29035:28;;;:16;:28;;;;;;;;29001:62;;;;;;;;;;;;;;;;;;;29035:28;;29001:62;;;29035:28;29001:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29079:9;29074:233;29098:14;:21;29094:1;:25;29074:233;;;29141:10;29154:14;29169:1;29154:17;;;;;;;;:::i;:::-;;;;;;;29141:30;;29204:36;29222:14;29237:1;29222:17;;;;;;;;:::i;29204:36::-;29188:52;;;;:::i;:::-;29255:22;;;;:18;:22;;;;;;29280:15;29255:40;;29188:52;-1:-1:-1;29121:3:0;;;;:::i;:::-;;;;29074:233;;;-1:-1:-1;29364:10:0;29319:28;29350:25;;;:13;:25;;;;;;;;29319:56;;;;;;;;;;;;;;;;;;;29350:25;;29319:56;;;29350:25;29319:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29391:9;29386:218;29410:11;:18;29406:1;:22;29386:218;;;29450:10;29463:11;29475:1;29463:14;;;;;;;;:::i;:::-;;;;;;;29450:27;;29510:30;29525:11;29537:1;29525:14;;;;;;;;:::i;29510:30::-;29494:46;;;;:::i;:::-;29555:19;;;;:15;:19;;;;;;29577:15;29555:37;;29494:46;-1:-1:-1;29430:3:0;;;;:::i;:::-;;;;29386:218;;;;29616:17;29649:13;9927:12;;;9839:108;29649:13;29636:26;;20403:19;29636:26;:::i;:::-;29616:46;;29673:70;29679:10;29706:9;29691:12;:24;:51;;29730:12;25992:5;:70::i;30291:115::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;30368:13:::1;:30:::0;;-1:-1:-1;;;;;;30368:30:0::1;-1:-1:-1::0;;;;;30368:30:0;;;::::1;::::0;;;::::1;::::0;;30291:115::o;22299:132::-;-1:-1:-1;;;;;22399:24:0;;;;;;:16;:24;;;;;;;;;22392:31;;;;;;;;;;;;;;;;;22363:16;;22392:31;;;22399:24;22392:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22299:132;;;:::o;26078:411::-;21798:4;;-1:-1:-1;;;21798:4:0;;;;21790:25;;;;-1:-1:-1;;;21790:25:0;;;;;;;:::i;:::-;26171:9:::1;26166:316;26186:19:::0;;::::1;26166:316;;;26227:10;26240:8;;26249:1;26240:11;;;;;;;:::i;:::-;26266:14;::::0;:58:::1;::::0;-1:-1:-1;;;26266:58:0;;26240:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;26266:14:0;;::::1;::::0;:27:::1;::::0;-1:-1:-1;26266:58:0::1;::::0;26294:10:::1;::::0;26314:4:::1;::::0;26240:11;;26266:58:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26355:10:0::1;26341:25;::::0;;;:13:::1;:25;::::0;;;;;;;:34;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;26390:19;;;:15:::1;:19:::0;;;;;26412:15:::1;26390:37:::0;;26442:11:::1;:15:::0;;;;;;:28;;-1:-1:-1;;;;;;26442:28:0::1;::::0;;::::1;::::0;;;-1:-1:-1;26207:3:0;;-1:-1:-1;26207:3:0::1;::::0;::::1;:::i;:::-;;;;26166:316;;2772:192:::0;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2861:22:0;::::1;2853:73;;;::::0;-1:-1:-1;;;2853:73:0;;9883:2:1;2853:73:0::1;::::0;::::1;9865:21:1::0;9922:2;9902:18;;;9895:30;9961:34;9941:18;;;9934:62;-1:-1:-1;;;10012:18:1;;;10005:36;10058:19;;2853:73:0::1;9681:402:1::0;2853:73:0::1;2937:19;2947:8;2937:9;:19::i;16840:380::-:0;-1:-1:-1;;;;;16976:19:0;;16968:68;;;;-1:-1:-1;;;16968:68:0;;10290:2:1;16968:68:0;;;10272:21:1;10329:2;10309:18;;;10302:30;10368:34;10348:18;;;10341:62;-1:-1:-1;;;10419:18:1;;;10412:34;10463:19;;16968:68:0;10088:400:1;16968:68:0;-1:-1:-1;;;;;17055:21:0;;17047:68;;;;-1:-1:-1;;;17047:68:0;;10695:2:1;17047:68:0;;;10677:21:1;10734:2;10714:18;;;10707:30;10773:34;10753:18;;;10746:62;-1:-1:-1;;;10824:18:1;;;10817:32;10866:19;;17047:68:0;10493:398:1;17047:68:0;-1:-1:-1;;;;;17128:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17180:32;;1784:25:1;;;17180:32:0;;1757:18:1;17180:32:0;;;;;;;16840:380;;;:::o;30677:191::-;30743:7;30789:27;;;:18;:27;;;;;;30845:5;;20615:1;;30771:45;;:15;:45;:::i;:::-;30770:72;;;;:::i;:::-;:80;;;;:::i;:::-;:90;;30853:7;30770:90;:::i;31066:427::-;31177:12;;31160:14;31200:286;31224:6;31220:1;:10;31200:286;;;31268:7;31256:5;31262:1;31256:8;;;;;;;;:::i;:::-;;;;;;;;;:19;31252:223;;;31296:8;;;;:::i;:::-;;;;31331:6;31327:1;:10;31323:83;;;31373:5;31379:6;31373:13;;;;;;;;:::i;:::-;;;;;;;;;31362:5;31368:1;31362:8;;;;;;;;:::i;:::-;;;;;;;;;;:24;31323:83;31424:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31454:5;;31252:223;31232:3;;;;:::i;:::-;;;;31200:286;;15079:399;-1:-1:-1;;;;;15163:21:0;;15155:65;;;;-1:-1:-1;;;15155:65:0;;11493:2:1;15155:65:0;;;11475:21:1;11532:2;11512:18;;;11505:30;11571:33;11551:18;;;11544:61;11622:18;;15155:65:0;11291:355:1;15155:65:0;15311:6;15295:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15328:18:0;;:9;:18;;;;;;;;;;:28;;15350:6;;15328:9;:28;;15350:6;;15328:28;:::i;:::-;;;;-1:-1:-1;;15372:37:0;;1784:25:1;;;-1:-1:-1;;;;;15372:37:0;;;15389:1;;15372:37;;1772:2:1;1757:18;15372:37:0;;;;;;;27204:1426;;27173:1457::o;14059:733::-;-1:-1:-1;;;;;14199:20:0;;14191:70;;;;-1:-1:-1;;;14191:70:0;;11853:2:1;14191:70:0;;;11835:21:1;11892:2;11872:18;;;11865:30;11931:34;11911:18;;;11904:62;-1:-1:-1;;;11982:18:1;;;11975:35;12027:19;;14191:70:0;11651:401:1;14191:70:0;-1:-1:-1;;;;;14280:23:0;;14272:71;;;;-1:-1:-1;;;14272:71:0;;12259:2:1;14272:71:0;;;12241:21:1;12298:2;12278:18;;;12271:30;12337:34;12317:18;;;12310:62;-1:-1:-1;;;12388:18:1;;;12381:33;12431:19;;14272:71:0;12057:399:1;14272:71:0;-1:-1:-1;;;;;14440:17:0;;14416:21;14440:17;;;;;;;;;;;14476:23;;;;14468:74;;;;-1:-1:-1;;;14468:74:0;;12663:2:1;14468:74:0;;;12645:21:1;12702:2;12682:18;;;12675:30;12741:34;12721:18;;;12714:62;-1:-1:-1;;;12792:18:1;;;12785:36;12838:19;;14468:74:0;12461:402:1;14468:74:0;-1:-1:-1;;;;;14578:17:0;;;:9;:17;;;;;;;;;;;14598:22;;;14578:42;;14642:20;;;;;;;;:30;;14614:6;;14578:9;14642:30;;14614:6;;14642:30;:::i;:::-;;;;;;;;14707:9;-1:-1:-1;;;;;14690:35:0;14699:6;-1:-1:-1;;;;;14690:35:0;;14718:6;14690:35;;;;1784:25:1;;1772:2;1757:18;;1638:177;14690:35:0;;;;;;;;14738:46;23868:406;30494:175;30552:7;30598:23;;;:14;:23;;;;;;30646:5;;20543:2;;30580:41;;:15;:41;:::i;30876:182::-;30939:7;30985:24;;;:15;:24;;;;;;31035:5;;20475:2;;30967:42;;:15;:42;:::i;15811:591::-;-1:-1:-1;;;;;15895:21:0;;15887:67;;;;-1:-1:-1;;;15887:67:0;;13070:2:1;15887:67:0;;;13052:21:1;13109:2;13089:18;;;13082:30;13148:34;13128:18;;;13121:62;-1:-1:-1;;;13199:18:1;;;13192:31;13240:19;;15887:67:0;12868:397:1;15887:67:0;-1:-1:-1;;;;;16054:18:0;;16029:22;16054:18;;;;;;;;;;;16091:24;;;;16083:71;;;;-1:-1:-1;;;16083:71:0;;13472:2:1;16083:71:0;;;13454:21:1;13511:2;13491:18;;;13484:30;13550:34;13530:18;;;13523:62;-1:-1:-1;;;13601:18:1;;;13594:32;13643:19;;16083:71:0;13270:398:1;16083:71:0;-1:-1:-1;;;;;16190:18:0;;:9;:18;;;;;;;;;;16211:23;;;16190:44;;16256:12;:22;;16228:6;;16190:9;16256:22;;16228:6;;16256:22;:::i;:::-;;;;-1:-1:-1;;16296:37:0;;1784:25:1;;;16322:1:0;;-1:-1:-1;;;;;16296:37:0;;;;;1772:2:1;1757:18;16296:37:0;;;;;;;23955:312:::1;23868:406:::0;;:::o;2972:173::-;3047:6;;;-1:-1:-1;;;;;3064:17:0;;;-1:-1:-1;;;;;;3064:17:0;;;;;;;3097:40;;3047:6;;;3064:17;3047:6;;3097:40;;3028:16;;3097:40;3017:128;2972:173;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:180::-;675:6;728:2;716:9;707:7;703:23;699:32;696:52;;;744:1;741;734:12;696:52;-1:-1:-1;767:23:1;;616:180;-1:-1:-1;616:180:1:o;1009:173::-;1077:20;;-1:-1:-1;;;;;1126:31:1;;1116:42;;1106:70;;1172:1;1169;1162:12;1106:70;1009:173;;;:::o;1187:254::-;1255:6;1263;1316:2;1304:9;1295:7;1291:23;1287:32;1284:52;;;1332:1;1329;1322:12;1284:52;1355:29;1374:9;1355:29;:::i;:::-;1345:39;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1187:254:1:o;1820:186::-;1879:6;1932:2;1920:9;1911:7;1907:23;1903:32;1900:52;;;1948:1;1945;1938:12;1900:52;1971:29;1990:9;1971:29;:::i;:::-;1961:39;1820:186;-1:-1:-1;;;1820:186:1:o;2011:367::-;2074:8;2084:6;2138:3;2131:4;2123:6;2119:17;2115:27;2105:55;;2156:1;2153;2146:12;2105:55;-1:-1:-1;2179:20:1;;2222:18;2211:30;;2208:50;;;2254:1;2251;2244:12;2208:50;2291:4;2283:6;2279:17;2267:29;;2351:3;2344:4;2334:6;2331:1;2327:14;2319:6;2315:27;2311:38;2308:47;2305:67;;;2368:1;2365;2358:12;2305:67;2011:367;;;;;:::o;2383:437::-;2469:6;2477;2530:2;2518:9;2509:7;2505:23;2501:32;2498:52;;;2546:1;2543;2536:12;2498:52;2586:9;2573:23;2619:18;2611:6;2608:30;2605:50;;;2651:1;2648;2641:12;2605:50;2690:70;2752:7;2743:6;2732:9;2728:22;2690:70;:::i;:::-;2779:8;;2664:96;;-1:-1:-1;2383:437:1;-1:-1:-1;;;;2383:437:1:o;2825:328::-;2902:6;2910;2918;2971:2;2959:9;2950:7;2946:23;2942:32;2939:52;;;2987:1;2984;2977:12;2939:52;3010:29;3029:9;3010:29;:::i;:::-;3000:39;;3058:38;3092:2;3081:9;3077:18;3058:38;:::i;:::-;3048:48;;3143:2;3132:9;3128:18;3115:32;3105:42;;2825:328;;;;;:::o;3158:773::-;3280:6;3288;3296;3304;3357:2;3345:9;3336:7;3332:23;3328:32;3325:52;;;3373:1;3370;3363:12;3325:52;3413:9;3400:23;3442:18;3483:2;3475:6;3472:14;3469:34;;;3499:1;3496;3489:12;3469:34;3538:70;3600:7;3591:6;3580:9;3576:22;3538:70;:::i;:::-;3627:8;;-1:-1:-1;3512:96:1;-1:-1:-1;3715:2:1;3700:18;;3687:32;;-1:-1:-1;3731:16:1;;;3728:36;;;3760:1;3757;3750:12;3728:36;;3799:72;3863:7;3852:8;3841:9;3837:24;3799:72;:::i;:::-;3158:773;;;;-1:-1:-1;3890:8:1;-1:-1:-1;;;;3158:773:1:o;4125:632::-;4296:2;4348:21;;;4418:13;;4321:18;;;4440:22;;;4267:4;;4296:2;4519:15;;;;4493:2;4478:18;;;4267:4;4562:169;4576:6;4573:1;4570:13;4562:169;;;4637:13;;4625:26;;4706:15;;;;4671:12;;;;4598:1;4591:9;4562:169;;;-1:-1:-1;4748:3:1;;4125:632;-1:-1:-1;;;;;;4125:632:1:o;4762:260::-;4830:6;4838;4891:2;4879:9;4870:7;4866:23;4862:32;4859:52;;;4907:1;4904;4897:12;4859:52;4930:29;4949:9;4930:29;:::i;:::-;4920:39;;4978:38;5012:2;5001:9;4997:18;4978:38;:::i;:::-;4968:48;;4762:260;;;;;:::o;5027:380::-;5106:1;5102:12;;;;5149;;;5170:61;;5224:4;5216:6;5212:17;5202:27;;5170:61;5277:2;5269:6;5266:14;5246:18;5243:38;5240:161;;;5323:10;5318:3;5314:20;5311:1;5304:31;5358:4;5355:1;5348:15;5386:4;5383:1;5376:15;5240:161;;5027:380;;;:::o;5412:127::-;5473:10;5468:3;5464:20;5461:1;5454:31;5504:4;5501:1;5494:15;5528:4;5525:1;5518:15;5544:341;5746:2;5728:21;;;5785:2;5765:18;;;5758:30;-1:-1:-1;;;5819:2:1;5804:18;;5797:47;5876:2;5861:18;;5544:341::o;5890:375::-;-1:-1:-1;;;;;6148:15:1;;;6130:34;;6200:15;;;;6195:2;6180:18;;6173:43;6247:2;6232:18;;6225:34;;;;6080:2;6065:18;;5890:375::o;6270:127::-;6331:10;6326:3;6322:20;6319:1;6312:31;6362:4;6359:1;6352:15;6386:4;6383:1;6376:15;6402:128;6442:3;6473:1;6469:6;6466:1;6463:13;6460:39;;;6479:18;;:::i;:::-;-1:-1:-1;6515:9:1;;6402:128::o;6535:135::-;6574:3;-1:-1:-1;;6595:17:1;;6592:43;;;6615:18;;:::i;:::-;-1:-1:-1;6662:1:1;6651:13;;6535:135::o;6675:125::-;6715:4;6743:1;6740;6737:8;6734:34;;;6748:18;;:::i;:::-;-1:-1:-1;6785:9:1;;6675:125::o;7214:356::-;7416:2;7398:21;;;7435:18;;;7428:30;7494:34;7489:2;7474:18;;7467:62;7561:2;7546:18;;7214:356::o;8261:127::-;8322:10;8317:3;8313:20;8310:1;8303:31;8353:4;8350:1;8343:15;8377:4;8374:1;8367:15;8393:136;8432:3;8460:5;8450:39;;8469:18;;:::i;:::-;-1:-1:-1;;;8505:18:1;;8393:136::o;8534:331::-;8736:2;8718:21;;;8775:1;8755:18;;;8748:29;-1:-1:-1;;;8808:2:1;8793:18;;8786:38;8856:2;8841:18;;8534:331::o;10896:168::-;10936:7;11002:1;10998;10994:6;10990:14;10987:1;10984:21;10979:1;10972:9;10965:17;10961:45;10958:71;;;11009:18;;:::i;:::-;-1:-1:-1;11049:9:1;;10896:168::o;11069:217::-;11109:1;11135;11125:132;;11179:10;11174:3;11170:20;11167:1;11160:31;11214:4;11211:1;11204:15;11242:4;11239:1;11232:15;11125:132;-1:-1:-1;11271:9:1;;11069:217::o

Swarm Source

ipfs://11e5bdedaef6b0df8d83086d18cd3e54bad132ce9365de643da7a1e1f33da9de
Loading...
Loading
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.