ETH Price: $3,432.52 (-0.29%)
Gas: 2 Gwei

Token

Wyverns Breath ($BREATH)
 

Overview

Max Total Supply

200,960 $BREATH

Holders

420

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
150 $BREATH

Value
$0.00
0x41e4c6db0baf2081a70cc6e943a54eb683c0a9ae
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:
WYVERNSBREATH

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-29
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-28
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

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

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

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

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

    /**
     * @dev Returns the bep token owner.
   */
    function getOwner() external view returns (address);

    /**
     * @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);
}

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

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

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

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @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.
 */
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 ()  {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
   */
    function owner() public view 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 Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
   */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
    internal
    returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
        functionCallWithValue(
            target,
            data,
            value,
            "Address: low-level call with value failed"
        );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
        target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

contract WYVERNSBREATH is Context, IERC20, Ownable {
    using Address for address;
    using SafeMath for uint256;

    mapping(uint => uint) public lastUpdate;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(uint => uint) public wyvernTypeToEarningsPerDay;
    mapping(uint => uint) public wyvernTokenToWyvernType;
    uint deployedTime = 1637427600; //epoch time deployed at 20th Nov 2021 ETC
    uint public timeInSecsInADay = 24*60*60; 
    event mintOverflown (uint amountGiven, uint notgiven, string message);

    //todo : write a setter for maxSupply
    uint private maxSupply = 10000000 * (10 ** 18); // 10 million Breath tokens
    uint256 private _totalSupply;
    uint8 public _decimals;
    string public _symbol;
    string public _name;
    IERC721 private nft;
    

    constructor()  {
        _name = "Wyverns Breath";
        _symbol = "$BREATH";
        _decimals = 18;
        _totalSupply = 0;

        nft = IERC721(0x01fE2358CC2CA3379cb5eD11442e85881997F22C);

        // 1 means Genesis
        wyvernTypeToEarningsPerDay[1] = 5;
        // 2 means Ascension
        wyvernTypeToEarningsPerDay[2] = 25;
    }

    // function setWyvernTokenToWyvernType(uint _fromId, uint _tillId, uint wyvernType) external onlyOwner{
    //     for (uint i = _fromId; i <= _tillId; i++) {
    //         wyvernTokenToWyvernType[i] = wyvernType;
    //         //  code 1  means Genesis
    //         //  code 2  means Ascension
    //     }
    // }

    /**
     * @dev Returns the bep token owner.
   */
    function getOwner() external override view returns (address) {
        return owner();
    }

    /**
     * @dev Returns the token decimals.
   */
    function decimals() external override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
   */
    function symbol() external override view returns (string memory) {
        return _symbol;
    }

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

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

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

    //private setter
    function setWyvernTypeCodeAndEarnings(uint wyvernTypeCode, uint _amount) external onlyOwner {
        wyvernTypeToEarningsPerDay[wyvernTypeCode] = _amount;
    }
    //private setter
    function addTokenWyvernType(uint[] memory tokenIds, uint[] memory wyvernTypeCodes) external onlyOwner {
        require(tokenIds.length == wyvernTypeCodes.length, "Inputs provided with different no of values, should be EQUAL.");
        for (uint i = 0; i < tokenIds.length; i++) {
            wyvernTokenToWyvernType[tokenIds[i]] = wyvernTypeCodes[i];
        }
    }

    function setMaxSupply(uint newMaxSupply) external onlyOwner{
        maxSupply = newMaxSupply;
    }
    // public getter//trait1=>25
    function showWyvernTypeEarningsPerDay(uint wyvernTypeCode) external view returns (uint) {
        return wyvernTypeToEarningsPerDay[wyvernTypeCode];
    }

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

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

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

    /**
     * @dev See {ERC20-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) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    /**
     * @dev Burn `amount` tokens and decreasing the total supply.
   */
    function burn(uint256 amount) public returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }

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

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

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

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

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

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

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

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

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

    function modifytimeInSec(uint _timeInSec) external onlyOwner {
        timeInSecsInADay = _timeInSec;
    }

    function getTypeOfToken(uint tokenId) internal view returns(uint) {
        if (tokenId >= 1 && tokenId <= 3500) {
            return 1;
        }
        else {
            return wyvernTokenToWyvernType[tokenId];
            }
    }

    function claimToken(uint[] memory tokenIds) external {
        uint amount = 0;
        uint today_count = block.timestamp / timeInSecsInADay;
        for (uint i = 0; i < tokenIds.length; i++) {
            if (nft.ownerOf(tokenIds[i]) == msg.sender) {
                uint tokenAccumulation = getPendingReward(tokenIds[i], today_count, getTypeOfToken(tokenIds[i]));
                if (tokenAccumulation > 0) {
                    if (maxSupply < _totalSupply + amount + tokenAccumulation) {
                        emit mintOverflown(amount, tokenAccumulation, "Minting Limit Reached");
                        break;
                    }
                    amount += tokenAccumulation;
                    lastUpdate[tokenIds[i]] = today_count;
                }
            }
        }
        require (amount > 0,"NO positive number of $BREATH tokens are available to mint");
        _mint(msg.sender, amount);
    }

    function getPendingReward(uint tokenId, uint todayCount, uint wyvernTypeCode) internal view  returns (uint){
        uint wyvernEarningsPerDay;
        if (lastUpdate[tokenId] == 0) {
            if (wyvernTypeCode == 1) {// 1 means Genesis
                wyvernEarningsPerDay = wyvernTypeToEarningsPerDay[wyvernTypeCode];
                uint daysPassedSinceNFTMinted = block.timestamp - deployedTime;
                daysPassedSinceNFTMinted = (daysPassedSinceNFTMinted / timeInSecsInADay);
                return (daysPassedSinceNFTMinted * wyvernEarningsPerDay * (10 ** _decimals));
            } else if(wyvernTypeCode == 2){  // 2 means Ascension
                return 25 * (10 ** _decimals);
            }else{
                return 0;
            }
        } else {
            if (todayCount - lastUpdate[tokenId] >= 1) {
                uint daysElapsedSinceLastUpdate = todayCount - lastUpdate[tokenId];
                wyvernEarningsPerDay = wyvernTypeToEarningsPerDay[wyvernTypeCode];
                return daysElapsedSinceLastUpdate * (wyvernEarningsPerDay * (10 ** _decimals));
            } else {
                return 0;
            }
        }
    }
}

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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountGiven","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"notgiven","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"mintOverflown","type":"event"},{"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"wyvernTypeCodes","type":"uint256[]"}],"name":"addTokenWyvernType","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimToken","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":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeInSec","type":"uint256"}],"name":"modifytimeInSec","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wyvernTypeCode","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setWyvernTypeCodeAndEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wyvernTypeCode","type":"uint256"}],"name":"showWyvernTypeEarningsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeInSecsInADay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wyvernTokenToWyvernType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wyvernTypeToEarningsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526361992990600655620151806007556a084595161401484a0000006008553480156200002f57600080fd5b506000620000426200022f60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060400160405280600e81526020017f57797665726e7320427265617468000000000000000000000000000000000000815250600c90805190602001906200012d92919062000237565b506040518060400160405280600781526020017f2442524541544800000000000000000000000000000000000000000000000000815250600b90805190602001906200017b92919062000237565b506012600a60006101000a81548160ff021916908360ff16021790555060006009819055507301fe2358cc2ca3379cb5ed11442e85881997f22c600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560046000600181526020019081526020016000208190555060196004600060028152602001908152602001600020819055506200034c565b600033905090565b8280546200024590620002e7565b90600052602060002090601f016020900481019282620002695760008555620002b5565b82601f106200028457805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b457825182559160200191906001019062000297565b5b509050620002c49190620002c8565b5090565b5b80821115620002e3576000816000905550600101620002c9565b5090565b600060028204905060018216806200030057607f821691505b602082108114156200031757620003166200031d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ed6806200035c6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a5d598f711610097578063b9a7e7a411610071578063b9a7e7a414610543578063d28d885214610573578063dd62ed3e14610591578063f2fde38b146105c1576101c4565b8063a5d598f7146104d9578063a9059cbb146104f5578063b09f126614610525576101c4565b806392fbe481116100d357806392fbe4811461043f57806395d89b411461045b5780639b95c3ca14610479578063a457c2d7146104a9576101c4565b806370a08231146103d3578063893d20e8146104035780638da5cb5b14610421576101c4565b8063313ce5671161016657806342966c681161014057806342966c681461034f57806351617c001461037f5780636c7451c51461039b5780636f8b44b0146103b7576101c4565b8063313ce567146102e357806332424aa314610301578063395093511461031f576101c4565b806318160ddd116101a257806318160ddd146102475780631c0686361461026557806323b872dd146102955780632f0e92d0146102c5576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630bc5dec414610217575b600080fd5b6101d16105dd565b6040516101de919061270d565b60405180910390f35b61020160048036038101906101fc91906120e4565b61066f565b60405161020e91906126f2565b60405180910390f35b610231600480360381019061022c91906121cd565b61068d565b60405161023e919061288f565b60405180910390f35b61024f6106a5565b60405161025c919061288f565b60405180910390f35b61027f600480360381019061027a91906121cd565b6106af565b60405161028c919061288f565b60405180910390f35b6102af60048036038101906102aa9190612095565b6106cc565b6040516102bc91906126f2565b60405180910390f35b6102cd6107a5565b6040516102da919061288f565b60405180910390f35b6102eb6107ab565b6040516102f891906128e6565b60405180910390f35b6103096107c2565b60405161031691906128e6565b60405180910390f35b610339600480360381019061033491906120e4565b6107d5565b60405161034691906126f2565b60405180910390f35b610369600480360381019061036491906121cd565b610888565b60405161037691906126f2565b60405180910390f35b610399600480360381019061039491906121cd565b6108a4565b005b6103b560048036038101906103b091906121f6565b610943565b005b6103d160048036038101906103cc91906121cd565b6109f4565b005b6103ed60048036038101906103e89190612007565b610a93565b6040516103fa919061288f565b60405180910390f35b61040b610adc565b60405161041891906126d7565b60405180910390f35b610429610aeb565b60405161043691906126d7565b60405180910390f35b61045960048036038101906104549190612120565b610b14565b005b610463610e21565b604051610470919061270d565b60405180910390f35b610493600480360381019061048e91906121cd565b610eb3565b6040516104a0919061288f565b60405180910390f35b6104c360048036038101906104be91906120e4565b610ecb565b6040516104d091906126f2565b60405180910390f35b6104f360048036038101906104ee9190612161565b610f98565b005b61050f600480360381019061050a91906120e4565b61112d565b60405161051c91906126f2565b60405180910390f35b61052d61114b565b60405161053a919061270d565b60405180910390f35b61055d600480360381019061055891906121cd565b6111d9565b60405161056a919061288f565b60405180910390f35b61057b6111f1565b604051610588919061270d565b60405180910390f35b6105ab60048036038101906105a69190612059565b61127f565b6040516105b8919061288f565b60405180910390f35b6105db60048036038101906105d69190612007565b611306565b005b6060600c80546105ec90612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461061890612c88565b80156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b5050505050905090565b600061068361067c6113a7565b84846113af565b6001905092915050565b60016020528060005260406000206000915090505481565b6000600954905090565b600060046000838152602001908152602001600020549050919050565b60006106d984848461157a565b61079a846106e56113a7565b61079585604051806060016040528060288152602001612e5460289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061074b6113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b6113af565b600190509392505050565b60075481565b6000600a60009054906101000a900460ff16905090565b600a60009054906101000a900460ff1681565b600061087e6107e26113a7565b8461087985600360006107f36113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b6113af565b6001905092915050565b600061089b6108956113a7565b836118ca565b60019050919050565b6108ac6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906127cf565b60405180910390fd5b8060078190555050565b61094b6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf906127cf565b60405180910390fd5b8060046000848152602001908152602001600020819055505050565b6109fc6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a80906127cf565b60405180910390fd5b8060088190555050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610ae6610aeb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060075442610b2591906129d0565b905060005b8351811015610dce573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110610bc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610be5919061288f565b60206040518083038186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c359190612030565b73ffffffffffffffffffffffffffffffffffffffff161415610dbb576000610ce6858381518110610c8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015184610ce1888681518110610cd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611a6e565b611aad565b90506000811115610db9578084600954610d00919061297a565b610d0a919061297a565b6008541015610d52577f67cd89226dfede6d6ea7e276338f64ef08fa324a8ec00c212a37b319f1c05cab8482604051610d449291906128aa565b60405180910390a150610dce565b8084610d5e919061297a565b93508260016000878581518110610d9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055505b505b8080610dc690612cba565b915050610b2a565b5060008211610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e099061284f565b60405180910390fd5b610e1c3383611c31565b505050565b6060600b8054610e3090612c88565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c90612c88565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b60046020528060005260406000206000915090505481565b6000610f8e610ed86113a7565b84610f8985604051806060016040528060258152602001612e7c6025913960036000610f026113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b6113af565b6001905092915050565b610fa06113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611024906127cf565b60405180910390fd5b8051825114611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906127af565b60405180910390fd5b60005b8251811015611128578181815181106110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600560008584815181106110fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550808061112090612cba565b915050611074565b505050565b600061114161113a6113a7565b848461157a565b6001905092915050565b600b805461115890612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461118490612c88565b80156111d15780601f106111a6576101008083540402835291602001916111d1565b820191906000526020600020905b8154815290600101906020018083116111b457829003601f168201915b505050505081565b60056020528060005260406000206000915090505481565b600c80546111fe90612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90612c88565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b505050505081565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61130e6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611392906127cf565b60405180910390fd5b6113a481611dbb565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114169061274f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611486906127ef565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161156d919061288f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e19061282f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116519061272f565b60405180910390fd5b6116c681604051806060016040528060268152602001612e2e60269139600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061175b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117fb919061288f565b60405180910390a3505050565b6000838311158290611850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611847919061270d565b60405180910390fd5b506000838561185f9190612bcc565b9050809150509392505050565b600080828461187b919061297a565b9050838110156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b79061278f565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119319061280f565b60405180910390fd5b6119a681604051806060016040528060228152602001612e0c60229139600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119fe81600954611ee890919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a62919061288f565b60405180910390a35050565b600060018210158015611a835750610dac8211155b15611a915760019050611aa8565b600560008381526020019081526020016000205490505b919050565b600080600060016000878152602001908152602001600020541415611b8b576001831415611b485760046000848152602001908152602001600020549050600060065442611afb9190612bcc565b905060075481611b0b91906129d0565b9050600a60009054906101000a900460ff16600a611b299190612a54565b8282611b359190612b72565b611b3f9190612b72565b92505050611c2a565b6002831415611b8157600a60009054906101000a900460ff16600a611b6d9190612a54565b6019611b799190612b72565b915050611c2a565b6000915050611c2a565b60018060008781526020019081526020016000205485611bab9190612bcc565b10611c24576000600160008781526020019081526020016000205485611bd19190612bcc565b905060046000858152602001908152602001600020549150600a60009054906101000a900460ff16600a611c059190612a54565b82611c109190612b72565b81611c1b9190612b72565b92505050611c2a565b60009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c989061286f565b60405180910390fd5b611cb68160095461186c90919063ffffffff16565b600981905550611d0e81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611daf919061288f565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e229061276f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611f2a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611808565b905092915050565b6000611f45611f4084612932565b612901565b90508083825260208201905082856020860282011115611f6457600080fd5b60005b85811015611f945781611f7a8882611ff2565b845260208401935060208301925050600181019050611f67565b5050509392505050565b600081359050611fad81612ddd565b92915050565b600081519050611fc281612ddd565b92915050565b600082601f830112611fd957600080fd5b8135611fe9848260208601611f32565b91505092915050565b60008135905061200181612df4565b92915050565b60006020828403121561201957600080fd5b600061202784828501611f9e565b91505092915050565b60006020828403121561204257600080fd5b600061205084828501611fb3565b91505092915050565b6000806040838503121561206c57600080fd5b600061207a85828601611f9e565b925050602061208b85828601611f9e565b9150509250929050565b6000806000606084860312156120aa57600080fd5b60006120b886828701611f9e565b93505060206120c986828701611f9e565b92505060406120da86828701611ff2565b9150509250925092565b600080604083850312156120f757600080fd5b600061210585828601611f9e565b925050602061211685828601611ff2565b9150509250929050565b60006020828403121561213257600080fd5b600082013567ffffffffffffffff81111561214c57600080fd5b61215884828501611fc8565b91505092915050565b6000806040838503121561217457600080fd5b600083013567ffffffffffffffff81111561218e57600080fd5b61219a85828601611fc8565b925050602083013567ffffffffffffffff8111156121b757600080fd5b6121c385828601611fc8565b9150509250929050565b6000602082840312156121df57600080fd5b60006121ed84828501611ff2565b91505092915050565b6000806040838503121561220957600080fd5b600061221785828601611ff2565b925050602061222885828601611ff2565b9150509250929050565b61223b81612c00565b82525050565b61224a81612c12565b82525050565b600061225b8261295e565b6122658185612969565b9350612275818560208601612c55565b61227e81612dbf565b840191505092915050565b6000612296602383612969565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122fc602583612969565b91507f45524332303a20617070726f76652066726f6d6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612362602683612969565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123c8601b83612969565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612408603d83612969565b91507f496e707574732070726f7669646564207769746820646966666572656e74206e60008301527f6f206f662076616c7565732c2073686f756c6420626520455155414c2e0000006020830152604082019050919050565b600061246e602083612969565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006124ae602383612969565b91507f45524332303a20617070726f76656520746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612514602183612969565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061257a601583612969565b91507f4d696e74696e67204c696d6974205265616368656400000000000000000000006000830152602082019050919050565b60006125ba602583612969565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612620603a83612969565b91507f4e4f20706f736974697665206e756d626572206f66202442524541544820746f60008301527f6b656e732061726520617661696c61626c6520746f206d696e740000000000006020830152604082019050919050565b6000612686601f83612969565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6126c281612c3e565b82525050565b6126d181612c48565b82525050565b60006020820190506126ec6000830184612232565b92915050565b60006020820190506127076000830184612241565b92915050565b600060208201905081810360008301526127278184612250565b905092915050565b6000602082019050818103600083015261274881612289565b9050919050565b60006020820190508181036000830152612768816122ef565b9050919050565b6000602082019050818103600083015261278881612355565b9050919050565b600060208201905081810360008301526127a8816123bb565b9050919050565b600060208201905081810360008301526127c8816123fb565b9050919050565b600060208201905081810360008301526127e881612461565b9050919050565b60006020820190508181036000830152612808816124a1565b9050919050565b6000602082019050818103600083015261282881612507565b9050919050565b60006020820190508181036000830152612848816125ad565b9050919050565b6000602082019050818103600083015261286881612613565b9050919050565b6000602082019050818103600083015261288881612679565b9050919050565b60006020820190506128a460008301846126b9565b92915050565b60006060820190506128bf60008301856126b9565b6128cc60208301846126b9565b81810360408301526128dd8161256d565b90509392505050565b60006020820190506128fb60008301846126c8565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561292857612927612d90565b5b8060405250919050565b600067ffffffffffffffff82111561294d5761294c612d90565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061298582612c3e565b915061299083612c3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c4612d03565b5b828201905092915050565b60006129db82612c3e565b91506129e683612c3e565b9250826129f6576129f5612d32565b5b828204905092915050565b6000808291508390505b6001851115612a4b57808604811115612a2757612a26612d03565b5b6001851615612a365780820291505b8081029050612a4485612dd0565b9450612a0b565b94509492505050565b6000612a5f82612c3e565b9150612a6a83612c48565b9250612a977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612a9f565b905092915050565b600082612aaf5760019050612b6b565b81612abd5760009050612b6b565b8160018114612ad35760028114612add57612b0c565b6001915050612b6b565b60ff841115612aef57612aee612d03565b5b8360020a915084821115612b0657612b05612d03565b5b50612b6b565b5060208310610133831016604e8410600b8410161715612b415782820a905083811115612b3c57612b3b612d03565b5b612b6b565b612b4e8484846001612a01565b92509050818404811115612b6557612b64612d03565b5b81810290505b9392505050565b6000612b7d82612c3e565b9150612b8883612c3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bc157612bc0612d03565b5b828202905092915050565b6000612bd782612c3e565b9150612be283612c3e565b925082821015612bf557612bf4612d03565b5b828203905092915050565b6000612c0b82612c1e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612c73578082015181840152602081019050612c58565b83811115612c82576000848401525b50505050565b60006002820490506001821680612ca057607f821691505b60208210811415612cb457612cb3612d61565b5b50919050565b6000612cc582612c3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612cf857612cf7612d03565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b612de681612c00565b8114612df157600080fd5b50565b612dfd81612c3e565b8114612e0857600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122060560079eb6ce8b502855f9d1f742bc5e31589cda97b29c8ceeb8d5f1fff8fa964736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a5d598f711610097578063b9a7e7a411610071578063b9a7e7a414610543578063d28d885214610573578063dd62ed3e14610591578063f2fde38b146105c1576101c4565b8063a5d598f7146104d9578063a9059cbb146104f5578063b09f126614610525576101c4565b806392fbe481116100d357806392fbe4811461043f57806395d89b411461045b5780639b95c3ca14610479578063a457c2d7146104a9576101c4565b806370a08231146103d3578063893d20e8146104035780638da5cb5b14610421576101c4565b8063313ce5671161016657806342966c681161014057806342966c681461034f57806351617c001461037f5780636c7451c51461039b5780636f8b44b0146103b7576101c4565b8063313ce567146102e357806332424aa314610301578063395093511461031f576101c4565b806318160ddd116101a257806318160ddd146102475780631c0686361461026557806323b872dd146102955780632f0e92d0146102c5576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630bc5dec414610217575b600080fd5b6101d16105dd565b6040516101de919061270d565b60405180910390f35b61020160048036038101906101fc91906120e4565b61066f565b60405161020e91906126f2565b60405180910390f35b610231600480360381019061022c91906121cd565b61068d565b60405161023e919061288f565b60405180910390f35b61024f6106a5565b60405161025c919061288f565b60405180910390f35b61027f600480360381019061027a91906121cd565b6106af565b60405161028c919061288f565b60405180910390f35b6102af60048036038101906102aa9190612095565b6106cc565b6040516102bc91906126f2565b60405180910390f35b6102cd6107a5565b6040516102da919061288f565b60405180910390f35b6102eb6107ab565b6040516102f891906128e6565b60405180910390f35b6103096107c2565b60405161031691906128e6565b60405180910390f35b610339600480360381019061033491906120e4565b6107d5565b60405161034691906126f2565b60405180910390f35b610369600480360381019061036491906121cd565b610888565b60405161037691906126f2565b60405180910390f35b610399600480360381019061039491906121cd565b6108a4565b005b6103b560048036038101906103b091906121f6565b610943565b005b6103d160048036038101906103cc91906121cd565b6109f4565b005b6103ed60048036038101906103e89190612007565b610a93565b6040516103fa919061288f565b60405180910390f35b61040b610adc565b60405161041891906126d7565b60405180910390f35b610429610aeb565b60405161043691906126d7565b60405180910390f35b61045960048036038101906104549190612120565b610b14565b005b610463610e21565b604051610470919061270d565b60405180910390f35b610493600480360381019061048e91906121cd565b610eb3565b6040516104a0919061288f565b60405180910390f35b6104c360048036038101906104be91906120e4565b610ecb565b6040516104d091906126f2565b60405180910390f35b6104f360048036038101906104ee9190612161565b610f98565b005b61050f600480360381019061050a91906120e4565b61112d565b60405161051c91906126f2565b60405180910390f35b61052d61114b565b60405161053a919061270d565b60405180910390f35b61055d600480360381019061055891906121cd565b6111d9565b60405161056a919061288f565b60405180910390f35b61057b6111f1565b604051610588919061270d565b60405180910390f35b6105ab60048036038101906105a69190612059565b61127f565b6040516105b8919061288f565b60405180910390f35b6105db60048036038101906105d69190612007565b611306565b005b6060600c80546105ec90612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461061890612c88565b80156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b5050505050905090565b600061068361067c6113a7565b84846113af565b6001905092915050565b60016020528060005260406000206000915090505481565b6000600954905090565b600060046000838152602001908152602001600020549050919050565b60006106d984848461157a565b61079a846106e56113a7565b61079585604051806060016040528060288152602001612e5460289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061074b6113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b6113af565b600190509392505050565b60075481565b6000600a60009054906101000a900460ff16905090565b600a60009054906101000a900460ff1681565b600061087e6107e26113a7565b8461087985600360006107f36113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b6113af565b6001905092915050565b600061089b6108956113a7565b836118ca565b60019050919050565b6108ac6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610930906127cf565b60405180910390fd5b8060078190555050565b61094b6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf906127cf565b60405180910390fd5b8060046000848152602001908152602001600020819055505050565b6109fc6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a80906127cf565b60405180910390fd5b8060088190555050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610ae6610aeb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060075442610b2591906129d0565b905060005b8351811015610dce573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110610bc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610be5919061288f565b60206040518083038186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c359190612030565b73ffffffffffffffffffffffffffffffffffffffff161415610dbb576000610ce6858381518110610c8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015184610ce1888681518110610cd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611a6e565b611aad565b90506000811115610db9578084600954610d00919061297a565b610d0a919061297a565b6008541015610d52577f67cd89226dfede6d6ea7e276338f64ef08fa324a8ec00c212a37b319f1c05cab8482604051610d449291906128aa565b60405180910390a150610dce565b8084610d5e919061297a565b93508260016000878581518110610d9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055505b505b8080610dc690612cba565b915050610b2a565b5060008211610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e099061284f565b60405180910390fd5b610e1c3383611c31565b505050565b6060600b8054610e3090612c88565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c90612c88565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b5050505050905090565b60046020528060005260406000206000915090505481565b6000610f8e610ed86113a7565b84610f8985604051806060016040528060258152602001612e7c6025913960036000610f026113a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b6113af565b6001905092915050565b610fa06113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611024906127cf565b60405180910390fd5b8051825114611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906127af565b60405180910390fd5b60005b8251811015611128578181815181106110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600560008584815181106110fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550808061112090612cba565b915050611074565b505050565b600061114161113a6113a7565b848461157a565b6001905092915050565b600b805461115890612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461118490612c88565b80156111d15780601f106111a6576101008083540402835291602001916111d1565b820191906000526020600020905b8154815290600101906020018083116111b457829003601f168201915b505050505081565b60056020528060005260406000206000915090505481565b600c80546111fe90612c88565b80601f016020809104026020016040519081016040528092919081815260200182805461122a90612c88565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b505050505081565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61130e6113a7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611392906127cf565b60405180910390fd5b6113a481611dbb565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114169061274f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611486906127ef565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161156d919061288f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e19061282f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116519061272f565b60405180910390fd5b6116c681604051806060016040528060268152602001612e2e60269139600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061175b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117fb919061288f565b60405180910390a3505050565b6000838311158290611850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611847919061270d565b60405180910390fd5b506000838561185f9190612bcc565b9050809150509392505050565b600080828461187b919061297a565b9050838110156118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b79061278f565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119319061280f565b60405180910390fd5b6119a681604051806060016040528060228152602001612e0c60229139600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118089092919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119fe81600954611ee890919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a62919061288f565b60405180910390a35050565b600060018210158015611a835750610dac8211155b15611a915760019050611aa8565b600560008381526020019081526020016000205490505b919050565b600080600060016000878152602001908152602001600020541415611b8b576001831415611b485760046000848152602001908152602001600020549050600060065442611afb9190612bcc565b905060075481611b0b91906129d0565b9050600a60009054906101000a900460ff16600a611b299190612a54565b8282611b359190612b72565b611b3f9190612b72565b92505050611c2a565b6002831415611b8157600a60009054906101000a900460ff16600a611b6d9190612a54565b6019611b799190612b72565b915050611c2a565b6000915050611c2a565b60018060008781526020019081526020016000205485611bab9190612bcc565b10611c24576000600160008781526020019081526020016000205485611bd19190612bcc565b905060046000858152602001908152602001600020549150600a60009054906101000a900460ff16600a611c059190612a54565b82611c109190612b72565b81611c1b9190612b72565b92505050611c2a565b60009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c989061286f565b60405180910390fd5b611cb68160095461186c90919063ffffffff16565b600981905550611d0e81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461186c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611daf919061288f565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e229061276f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611f2a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611808565b905092915050565b6000611f45611f4084612932565b612901565b90508083825260208201905082856020860282011115611f6457600080fd5b60005b85811015611f945781611f7a8882611ff2565b845260208401935060208301925050600181019050611f67565b5050509392505050565b600081359050611fad81612ddd565b92915050565b600081519050611fc281612ddd565b92915050565b600082601f830112611fd957600080fd5b8135611fe9848260208601611f32565b91505092915050565b60008135905061200181612df4565b92915050565b60006020828403121561201957600080fd5b600061202784828501611f9e565b91505092915050565b60006020828403121561204257600080fd5b600061205084828501611fb3565b91505092915050565b6000806040838503121561206c57600080fd5b600061207a85828601611f9e565b925050602061208b85828601611f9e565b9150509250929050565b6000806000606084860312156120aa57600080fd5b60006120b886828701611f9e565b93505060206120c986828701611f9e565b92505060406120da86828701611ff2565b9150509250925092565b600080604083850312156120f757600080fd5b600061210585828601611f9e565b925050602061211685828601611ff2565b9150509250929050565b60006020828403121561213257600080fd5b600082013567ffffffffffffffff81111561214c57600080fd5b61215884828501611fc8565b91505092915050565b6000806040838503121561217457600080fd5b600083013567ffffffffffffffff81111561218e57600080fd5b61219a85828601611fc8565b925050602083013567ffffffffffffffff8111156121b757600080fd5b6121c385828601611fc8565b9150509250929050565b6000602082840312156121df57600080fd5b60006121ed84828501611ff2565b91505092915050565b6000806040838503121561220957600080fd5b600061221785828601611ff2565b925050602061222885828601611ff2565b9150509250929050565b61223b81612c00565b82525050565b61224a81612c12565b82525050565b600061225b8261295e565b6122658185612969565b9350612275818560208601612c55565b61227e81612dbf565b840191505092915050565b6000612296602383612969565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122fc602583612969565b91507f45524332303a20617070726f76652066726f6d6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612362602683612969565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123c8601b83612969565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612408603d83612969565b91507f496e707574732070726f7669646564207769746820646966666572656e74206e60008301527f6f206f662076616c7565732c2073686f756c6420626520455155414c2e0000006020830152604082019050919050565b600061246e602083612969565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006124ae602383612969565b91507f45524332303a20617070726f76656520746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612514602183612969565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061257a601583612969565b91507f4d696e74696e67204c696d6974205265616368656400000000000000000000006000830152602082019050919050565b60006125ba602583612969565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612620603a83612969565b91507f4e4f20706f736974697665206e756d626572206f66202442524541544820746f60008301527f6b656e732061726520617661696c61626c6520746f206d696e740000000000006020830152604082019050919050565b6000612686601f83612969565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6126c281612c3e565b82525050565b6126d181612c48565b82525050565b60006020820190506126ec6000830184612232565b92915050565b60006020820190506127076000830184612241565b92915050565b600060208201905081810360008301526127278184612250565b905092915050565b6000602082019050818103600083015261274881612289565b9050919050565b60006020820190508181036000830152612768816122ef565b9050919050565b6000602082019050818103600083015261278881612355565b9050919050565b600060208201905081810360008301526127a8816123bb565b9050919050565b600060208201905081810360008301526127c8816123fb565b9050919050565b600060208201905081810360008301526127e881612461565b9050919050565b60006020820190508181036000830152612808816124a1565b9050919050565b6000602082019050818103600083015261282881612507565b9050919050565b60006020820190508181036000830152612848816125ad565b9050919050565b6000602082019050818103600083015261286881612613565b9050919050565b6000602082019050818103600083015261288881612679565b9050919050565b60006020820190506128a460008301846126b9565b92915050565b60006060820190506128bf60008301856126b9565b6128cc60208301846126b9565b81810360408301526128dd8161256d565b90509392505050565b60006020820190506128fb60008301846126c8565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561292857612927612d90565b5b8060405250919050565b600067ffffffffffffffff82111561294d5761294c612d90565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061298582612c3e565b915061299083612c3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c4612d03565b5b828201905092915050565b60006129db82612c3e565b91506129e683612c3e565b9250826129f6576129f5612d32565b5b828204905092915050565b6000808291508390505b6001851115612a4b57808604811115612a2757612a26612d03565b5b6001851615612a365780820291505b8081029050612a4485612dd0565b9450612a0b565b94509492505050565b6000612a5f82612c3e565b9150612a6a83612c48565b9250612a977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612a9f565b905092915050565b600082612aaf5760019050612b6b565b81612abd5760009050612b6b565b8160018114612ad35760028114612add57612b0c565b6001915050612b6b565b60ff841115612aef57612aee612d03565b5b8360020a915084821115612b0657612b05612d03565b5b50612b6b565b5060208310610133831016604e8410600b8410161715612b415782820a905083811115612b3c57612b3b612d03565b5b612b6b565b612b4e8484846001612a01565b92509050818404811115612b6557612b64612d03565b5b81810290505b9392505050565b6000612b7d82612c3e565b9150612b8883612c3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bc157612bc0612d03565b5b828202905092915050565b6000612bd782612c3e565b9150612be283612c3e565b925082821015612bf557612bf4612d03565b5b828203905092915050565b6000612c0b82612c1e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612c73578082015181840152602081019050612c58565b83811115612c82576000848401525b50505050565b60006002820490506001821680612ca057607f821691505b60208210811415612cb457612cb3612d61565b5b50919050565b6000612cc582612c3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612cf857612cf7612d03565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b612de681612c00565b8114612df157600080fd5b50565b612dfd81612c3e565b8114612e0857600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122060560079eb6ce8b502855f9d1f742bc5e31589cda97b29c8ceeb8d5f1fff8fa964736f6c63430008000033

Deployed Bytecode Sourcemap

22872:12515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25003:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27050:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22997:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25159:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26184:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27664:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23370:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24689:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23654:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28367:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29407:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32873:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25470:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26042:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25319:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24530:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10407:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33239:942;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24846:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23169:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29055:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25661:373;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26540:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23683:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23231:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23711:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26769:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10847:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25003:94;25051:13;25084:5;25077:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25003:94;:::o;27050:163::-;27127:4;27144:39;27153:12;:10;:12::i;:::-;27167:7;27176:6;27144:8;:39::i;:::-;27201:4;27194:11;;27050:163;;;;:::o;22997:39::-;;;;;;;;;;;;;;;;;:::o;25159:100::-;25212:7;25239:12;;25232:19;;25159:100;:::o;26184:156::-;26266:4;26290:26;:42;26317:14;26290:42;;;;;;;;;;;;26283:49;;26184:156;;;:::o;27664:315::-;27764:4;27781:36;27791:6;27799:9;27810:6;27781:9;:36::i;:::-;27828:121;27837:6;27845:12;:10;:12::i;:::-;27859:89;27897:6;27859:89;;;;;;;;;;;;;;;;;:11;:19;27871:6;27859:19;;;;;;;;;;;;;;;:33;27879:12;:10;:12::i;:::-;27859:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;27828:8;:121::i;:::-;27967:4;27960:11;;27664:315;;;;;:::o;23370:39::-;;;;:::o;24689:94::-;24741:5;24766:9;;;;;;;;;;;24759:16;;24689:94;:::o;23654:22::-;;;;;;;;;;;;;:::o;28367:210::-;28447:4;28464:83;28473:12;:10;:12::i;:::-;28487:7;28496:50;28535:10;28496:11;:25;28508:12;:10;:12::i;:::-;28496:25;;;;;;;;;;;;;;;:34;28522:7;28496:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;28464:8;:83::i;:::-;28565:4;28558:11;;28367:210;;;;:::o;29407:120::-;29453:4;29470:27;29476:12;:10;:12::i;:::-;29490:6;29470:5;:27::i;:::-;29515:4;29508:11;;29407:120;;;:::o;32873:109::-;10627:12;:10;:12::i;:::-;10617:22;;:6;;;;;;;;;;:22;;;10609:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32964:10:::1;32945:16;:29;;;;32873:109:::0;:::o;25470:163::-;10627:12;:10;:12::i;:::-;10617:22;;:6;;;;;;;;;;:22;;;10609:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25618:7:::1;25573:26;:42;25600:14;25573:42;;;;;;;;;;;:52;;;;25470:163:::0;;:::o;26042:102::-;10627:12;:10;:12::i;:::-;10617:22;;:6;;;;;;;;;;:22;;;10609:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26124:12:::1;26112:9;:24;;;;26042:102:::0;:::o;25319:121::-;25387:7;25414:9;:18;25424:7;25414:18;;;;;;;;;;;;;;;;25407:25;;25319:121;;;:::o;24530:94::-;24582:7;24609;:5;:7::i;:::-;24602:14;;24530:94;:::o;10407:79::-;10445:7;10472:6;;;;;;;;;;;10465:13;;10407:79;:::o;33239:942::-;33303:11;33329:16;33366;;33348:15;:34;;;;:::i;:::-;33329:53;;33398:6;33393:653;33414:8;:15;33410:1;:19;33393:653;;;33483:10;33455:38;;:3;;;;;;;;;;;:11;;;33467:8;33476:1;33467:11;;;;;;;;;;;;;;;;;;;;;;33455:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;33451:584;;;33514:22;33539:71;33556:8;33565:1;33556:11;;;;;;;;;;;;;;;;;;;;;;33569;33582:27;33597:8;33606:1;33597:11;;;;;;;;;;;;;;;;;;;;;;33582:14;:27::i;:::-;33539:16;:71::i;:::-;33514:96;;33653:1;33633:17;:21;33629:391;;;33719:17;33710:6;33695:12;;:21;;;;:::i;:::-;:41;;;;:::i;:::-;33683:9;;:53;33679:212;;;33770:65;33784:6;33792:17;33770:65;;;;;;;:::i;:::-;;;;;;;;33862:5;;;33679:212;33923:17;33913:27;;;;;:::i;:::-;;;33989:11;33963:10;:23;33974:8;33983:1;33974:11;;;;;;;;;;;;;;;;;;;;;;33963:23;;;;;;;;;;;:37;;;;33629:391;33451:584;;33431:3;;;;;:::i;:::-;;;;33393:653;;;;34074:1;34065:6;:10;34056:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34148:25;34154:10;34166:6;34148:5;:25::i;:::-;33239:942;;;:::o;24846:98::-;24896:13;24929:7;24922:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24846:98;:::o;23169:55::-;;;;;;;;;;;;;;;;;:::o;29055:261::-;29140:4;29157:129;29166:12;:10;:12::i;:::-;29180:7;29189:96;29228:15;29189:96;;;;;;;;;;;;;;;;;:11;:25;29201:12;:10;:12::i;:::-;29189:25;;;;;;;;;;;;;;;:34;29215:7;29189:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;29157:8;:129::i;:::-;29304:4;29297:11;;29055:261;;;;:::o;25661:373::-;10627:12;:10;:12::i;:::-;10617:22;;:6;;;;;;;;;;:22;;;10609:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25801:15:::1;:22;25782:8;:15;:41;25774:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;25905:6;25900:127;25921:8;:15;25917:1;:19;25900:127;;;25997:15;26013:1;25997:18;;;;;;;;;;;;;;;;;;;;;;25958:23;:36;25982:8;25991:1;25982:11;;;;;;;;;;;;;;;;;;;;;;25958:36;;;;;;;;;;;:57;;;;25938:3;;;;;:::i;:::-;;;;25900:127;;;;25661:373:::0;;:::o;26540:169::-;26620:4;26637:42;26647:12;:10;:12::i;:::-;26661:9;26672:6;26637:9;:42::i;:::-;26697:4;26690:11;;26540:169;;;;:::o;23683:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23231:52::-;;;;;;;;;;;;;;;;;:::o;23711:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26769:145::-;26852:7;26879:11;:18;26891:5;26879:18;;;;;;;;;;;;;;;:27;26898:7;26879:27;;;;;;;;;;;;;;;;26872:34;;26769:145;;;;:::o;10847:109::-;10627:12;:10;:12::i;:::-;10617:22;;:6;;;;;;;;;;:22;;;10609:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;10920:28:::1;10939:8;10920:18;:28::i;:::-;10847:109:::0;:::o;3879:108::-;3924:15;3968:10;3952:27;;3879:108;:::o;32115:340::-;32226:1;32209:19;;:5;:19;;;;32201:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;32308:1;32289:21;;:7;:21;;;;32281:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;32393:6;32363:11;:18;32375:5;32363:18;;;;;;;;;;;;;;;:27;32382:7;32363:27;;;;;;;;;;;;;;;:36;;;;32431:7;32415:32;;32424:5;32415:32;;;32440:6;32415:32;;;;;;:::i;:::-;;;;;;;;32115:340;;;:::o;29993:471::-;30109:1;30091:20;;:6;:20;;;;30083:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30193:1;30172:23;;:9;:23;;;;30164:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30268;30290:6;30268:71;;;;;;;;;;;;;;;;;:9;:17;30278:6;30268:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;30248:9;:17;30258:6;30248:17;;;;;;;;;;;;;;;:91;;;;30373:32;30398:6;30373:9;:20;30383:9;30373:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;30350:9;:20;30360:9;30350:20;;;;;;;;;;;;;;;:55;;;;30438:9;30421:35;;30430:6;30421:35;;;30449:6;30421:35;;;;;;:::i;:::-;;;;;;;;29993:471;;;:::o;5913:192::-;5999:7;6032:1;6027;:6;;6035:12;6019:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6059:9;6075:1;6071;:5;;;;:::i;:::-;6059:17;;6096:1;6089:8;;;5913:192;;;;;:::o;5054:181::-;5112:7;5132:9;5148:1;5144;:5;;;;:::i;:::-;5132:17;;5173:1;5168;:6;;5160:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5226:1;5219:8;;;5054:181;;;;:::o;31351:348::-;31446:1;31427:21;;:7;:21;;;;31419:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31520:68;31543:6;31520:68;;;;;;;;;;;;;;;;;:9;:18;31530:7;31520:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;31499:9;:18;31509:7;31499:18;;;;;;;;;;;;;;;:89;;;;31614:24;31631:6;31614:12;;:16;;:24;;;;:::i;:::-;31599:12;:39;;;;31680:1;31654:37;;31663:7;31654:37;;;31684:6;31654:37;;;;;;:::i;:::-;;;;;;;;31351:348;;:::o;32990:241::-;33050:4;33082:1;33071:7;:12;;:31;;;;;33098:4;33087:7;:15;;33071:31;33067:157;;;33126:1;33119:8;;;;33067:157;33176:23;:32;33200:7;33176:32;;;;;;;;;;;;33169:39;;32990:241;;;;:::o;34189:1195::-;34291:4;34307:25;34370:1;34347:10;:19;34358:7;34347:19;;;;;;;;;;;;:24;34343:1034;;;34410:1;34392:14;:19;34388:572;;;34473:26;:42;34500:14;34473:42;;;;;;;;;;;;34450:65;;34534:29;34584:12;;34566:15;:30;;;;:::i;:::-;34534:62;;34670:16;;34643:24;:43;;;;:::i;:::-;34615:72;;34771:9;;;;;;;;;;;34765:2;:15;;;;:::i;:::-;34741:20;34714:24;:47;;;;:::i;:::-;:67;;;;:::i;:::-;34706:76;;;;;;34388:572;34825:1;34807:14;:19;34804:156;;;34887:9;;;;;;;;;;;34881:2;:15;;;;:::i;:::-;34875:2;:22;;;;:::i;:::-;34868:29;;;;;34804:156;34943:1;34936:8;;;;;34343:1034;35032:1;35009:10;:19;35020:7;35009:19;;;;;;;;;;;;34996:10;:32;;;;:::i;:::-;:37;34992:374;;35054:31;35101:10;:19;35112:7;35101:19;;;;;;;;;;;;35088:10;:32;;;;:::i;:::-;35054:66;;35162:26;:42;35189:14;35162:42;;;;;;;;;;;;35139:65;;35290:9;;;;;;;;;;;35284:2;:15;;;;:::i;:::-;35260:20;:40;;;;:::i;:::-;35230:26;:71;;;;:::i;:::-;35223:78;;;;;;34992:374;35349:1;35342:8;;;34189:1195;;;;;;:::o;30729:308::-;30824:1;30805:21;;:7;:21;;;;30797:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30890:24;30907:6;30890:12;;:16;;:24;;;;:::i;:::-;30875:12;:39;;;;30946:30;30969:6;30946:9;:18;30956:7;30946:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;30925:9;:18;30935:7;30925:18;;;;;;;;;;;;;;;:51;;;;31013:7;30992:37;;31009:1;30992:37;;;31022:6;30992:37;;;;;;:::i;:::-;;;;;;;;30729:308;;:::o;11060:229::-;11154:1;11134:22;;:8;:22;;;;11126:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11244:8;11215:38;;11236:6;;;;;;;;;;11215:38;;;;;;;;;;;;11273:8;11264:6;;:17;;;;;;;;;;;;;;;;;;11060:229;:::o;5496:136::-;5554:7;5581:43;5585:1;5588;5581:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5574:50;;5496:136;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:139::-;;736:6;723:20;714:29;;752:33;779:5;752:33;:::i;:::-;704:87;;;;:::o;797:143::-;;885:6;879:13;870:22;;901:33;928:5;901:33;:::i;:::-;860:80;;;;:::o;963:303::-;;1083:3;1076:4;1068:6;1064:17;1060:27;1050:2;;1101:1;1098;1091:12;1050:2;1141:6;1128:20;1166:94;1256:3;1248:6;1241:4;1233:6;1229:17;1166:94;:::i;:::-;1157:103;;1040:226;;;;;:::o;1272:139::-;;1356:6;1343:20;1334:29;;1372:33;1399:5;1372:33;:::i;:::-;1324:87;;;;:::o;1417:262::-;;1525:2;1513:9;1504:7;1500:23;1496:32;1493:2;;;1541:1;1538;1531:12;1493:2;1584:1;1609:53;1654:7;1645:6;1634:9;1630:22;1609:53;:::i;:::-;1599:63;;1555:117;1483:196;;;;:::o;1685:284::-;;1804:2;1792:9;1783:7;1779:23;1775:32;1772:2;;;1820:1;1817;1810:12;1772:2;1863:1;1888:64;1944:7;1935:6;1924:9;1920:22;1888:64;:::i;:::-;1878:74;;1834:128;1762:207;;;;:::o;1975:407::-;;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2159:1;2184:53;2229:7;2220:6;2209:9;2205:22;2184:53;:::i;:::-;2174:63;;2130:117;2286:2;2312:53;2357:7;2348:6;2337:9;2333:22;2312:53;:::i;:::-;2302:63;;2257:118;2058:324;;;;;:::o;2388:552::-;;;;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;2546:1;2543;2536:12;2498:2;2589:1;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2560:117;2716:2;2742:53;2787:7;2778:6;2767:9;2763:22;2742:53;:::i;:::-;2732:63;;2687:118;2844:2;2870:53;2915:7;2906:6;2895:9;2891:22;2870:53;:::i;:::-;2860:63;;2815:118;2488:452;;;;;:::o;2946:407::-;;;3071:2;3059:9;3050:7;3046:23;3042:32;3039:2;;;3087:1;3084;3077:12;3039:2;3130:1;3155:53;3200:7;3191:6;3180:9;3176:22;3155:53;:::i;:::-;3145:63;;3101:117;3257:2;3283:53;3328:7;3319:6;3308:9;3304:22;3283:53;:::i;:::-;3273:63;;3228:118;3029:324;;;;;:::o;3359:405::-;;3492:2;3480:9;3471:7;3467:23;3463:32;3460:2;;;3508:1;3505;3498:12;3460:2;3579:1;3568:9;3564:17;3551:31;3609:18;3601:6;3598:30;3595:2;;;3641:1;3638;3631:12;3595:2;3669:78;3739:7;3730:6;3719:9;3715:22;3669:78;:::i;:::-;3659:88;;3522:235;3450:314;;;;:::o;3770:693::-;;;3945:2;3933:9;3924:7;3920:23;3916:32;3913:2;;;3961:1;3958;3951:12;3913:2;4032:1;4021:9;4017:17;4004:31;4062:18;4054:6;4051:30;4048:2;;;4094:1;4091;4084:12;4048:2;4122:78;4192:7;4183:6;4172:9;4168:22;4122:78;:::i;:::-;4112:88;;3975:235;4277:2;4266:9;4262:18;4249:32;4308:18;4300:6;4297:30;4294:2;;;4340:1;4337;4330:12;4294:2;4368:78;4438:7;4429:6;4418:9;4414:22;4368:78;:::i;:::-;4358:88;;4220:236;3903:560;;;;;:::o;4469:262::-;;4577:2;4565:9;4556:7;4552:23;4548:32;4545:2;;;4593:1;4590;4583:12;4545:2;4636:1;4661:53;4706:7;4697:6;4686:9;4682:22;4661:53;:::i;:::-;4651:63;;4607:117;4535:196;;;;:::o;4737:407::-;;;4862:2;4850:9;4841:7;4837:23;4833:32;4830:2;;;4878:1;4875;4868:12;4830:2;4921:1;4946:53;4991:7;4982:6;4971:9;4967:22;4946:53;:::i;:::-;4936:63;;4892:117;5048:2;5074:53;5119:7;5110:6;5099:9;5095:22;5074:53;:::i;:::-;5064:63;;5019:118;4820:324;;;;;:::o;5150:118::-;5237:24;5255:5;5237:24;:::i;:::-;5232:3;5225:37;5215:53;;:::o;5274:109::-;5355:21;5370:5;5355:21;:::i;:::-;5350:3;5343:34;5333:50;;:::o;5389:364::-;;5505:39;5538:5;5505:39;:::i;:::-;5560:71;5624:6;5619:3;5560:71;:::i;:::-;5553:78;;5640:52;5685:6;5680:3;5673:4;5666:5;5662:16;5640:52;:::i;:::-;5717:29;5739:6;5717:29;:::i;:::-;5712:3;5708:39;5701:46;;5481:272;;;;;:::o;5759:367::-;;5922:67;5986:2;5981:3;5922:67;:::i;:::-;5915:74;;6019:34;6015:1;6010:3;6006:11;5999:55;6085:5;6080:2;6075:3;6071:12;6064:27;6117:2;6112:3;6108:12;6101:19;;5905:221;;;:::o;6132:369::-;;6295:67;6359:2;6354:3;6295:67;:::i;:::-;6288:74;;6392:34;6388:1;6383:3;6379:11;6372:55;6458:7;6453:2;6448:3;6444:12;6437:29;6492:2;6487:3;6483:12;6476:19;;6278:223;;;:::o;6507:370::-;;6670:67;6734:2;6729:3;6670:67;:::i;:::-;6663:74;;6767:34;6763:1;6758:3;6754:11;6747:55;6833:8;6828:2;6823:3;6819:12;6812:30;6868:2;6863:3;6859:12;6852:19;;6653:224;;;:::o;6883:325::-;;7046:67;7110:2;7105:3;7046:67;:::i;:::-;7039:74;;7143:29;7139:1;7134:3;7130:11;7123:50;7199:2;7194:3;7190:12;7183:19;;7029:179;;;:::o;7214:393::-;;7377:67;7441:2;7436:3;7377:67;:::i;:::-;7370:74;;7474:34;7470:1;7465:3;7461:11;7454:55;7540:31;7535:2;7530:3;7526:12;7519:53;7598:2;7593:3;7589:12;7582:19;;7360:247;;;:::o;7613:330::-;;7776:67;7840:2;7835:3;7776:67;:::i;:::-;7769:74;;7873:34;7869:1;7864:3;7860:11;7853:55;7934:2;7929:3;7925:12;7918:19;;7759:184;;;:::o;7949:367::-;;8112:67;8176:2;8171:3;8112:67;:::i;:::-;8105:74;;8209:34;8205:1;8200:3;8196:11;8189:55;8275:5;8270:2;8265:3;8261:12;8254:27;8307:2;8302:3;8298:12;8291:19;;8095:221;;;:::o;8322:365::-;;8485:67;8549:2;8544:3;8485:67;:::i;:::-;8478:74;;8582:34;8578:1;8573:3;8569:11;8562:55;8648:3;8643:2;8638:3;8634:12;8627:25;8678:2;8673:3;8669:12;8662:19;;8468:219;;;:::o;8693:319::-;;8856:67;8920:2;8915:3;8856:67;:::i;:::-;8849:74;;8953:23;8949:1;8944:3;8940:11;8933:44;9003:2;8998:3;8994:12;8987:19;;8839:173;;;:::o;9018:369::-;;9181:67;9245:2;9240:3;9181:67;:::i;:::-;9174:74;;9278:34;9274:1;9269:3;9265:11;9258:55;9344:7;9339:2;9334:3;9330:12;9323:29;9378:2;9373:3;9369:12;9362:19;;9164:223;;;:::o;9393:390::-;;9556:67;9620:2;9615:3;9556:67;:::i;:::-;9549:74;;9653:34;9649:1;9644:3;9640:11;9633:55;9719:28;9714:2;9709:3;9705:12;9698:50;9774:2;9769:3;9765:12;9758:19;;9539:244;;;:::o;9789:329::-;;9952:67;10016:2;10011:3;9952:67;:::i;:::-;9945:74;;10049:33;10045:1;10040:3;10036:11;10029:54;10109:2;10104:3;10100:12;10093:19;;9935:183;;;:::o;10124:118::-;10211:24;10229:5;10211:24;:::i;:::-;10206:3;10199:37;10189:53;;:::o;10248:112::-;10331:22;10347:5;10331:22;:::i;:::-;10326:3;10319:35;10309:51;;:::o;10366:222::-;;10497:2;10486:9;10482:18;10474:26;;10510:71;10578:1;10567:9;10563:17;10554:6;10510:71;:::i;:::-;10464:124;;;;:::o;10594:210::-;;10719:2;10708:9;10704:18;10696:26;;10732:65;10794:1;10783:9;10779:17;10770:6;10732:65;:::i;:::-;10686:118;;;;:::o;10810:313::-;;10961:2;10950:9;10946:18;10938:26;;11010:9;11004:4;11000:20;10996:1;10985:9;10981:17;10974:47;11038:78;11111:4;11102:6;11038:78;:::i;:::-;11030:86;;10928:195;;;;:::o;11129:419::-;;11333:2;11322:9;11318:18;11310:26;;11382:9;11376:4;11372:20;11368:1;11357:9;11353:17;11346:47;11410:131;11536:4;11410:131;:::i;:::-;11402:139;;11300:248;;;:::o;11554:419::-;;11758:2;11747:9;11743:18;11735:26;;11807:9;11801:4;11797:20;11793:1;11782:9;11778:17;11771:47;11835:131;11961:4;11835:131;:::i;:::-;11827:139;;11725:248;;;:::o;11979:419::-;;12183:2;12172:9;12168:18;12160:26;;12232:9;12226:4;12222:20;12218:1;12207:9;12203:17;12196:47;12260:131;12386:4;12260:131;:::i;:::-;12252:139;;12150:248;;;:::o;12404:419::-;;12608:2;12597:9;12593:18;12585:26;;12657:9;12651:4;12647:20;12643:1;12632:9;12628:17;12621:47;12685:131;12811:4;12685:131;:::i;:::-;12677:139;;12575:248;;;:::o;12829:419::-;;13033:2;13022:9;13018:18;13010:26;;13082:9;13076:4;13072:20;13068:1;13057:9;13053:17;13046:47;13110:131;13236:4;13110:131;:::i;:::-;13102:139;;13000:248;;;:::o;13254:419::-;;13458:2;13447:9;13443:18;13435:26;;13507:9;13501:4;13497:20;13493:1;13482:9;13478:17;13471:47;13535:131;13661:4;13535:131;:::i;:::-;13527:139;;13425:248;;;:::o;13679:419::-;;13883:2;13872:9;13868:18;13860:26;;13932:9;13926:4;13922:20;13918:1;13907:9;13903:17;13896:47;13960:131;14086:4;13960:131;:::i;:::-;13952:139;;13850:248;;;:::o;14104:419::-;;14308:2;14297:9;14293:18;14285:26;;14357:9;14351:4;14347:20;14343:1;14332:9;14328:17;14321:47;14385:131;14511:4;14385:131;:::i;:::-;14377:139;;14275:248;;;:::o;14529:419::-;;14733:2;14722:9;14718:18;14710:26;;14782:9;14776:4;14772:20;14768:1;14757:9;14753:17;14746:47;14810:131;14936:4;14810:131;:::i;:::-;14802:139;;14700:248;;;:::o;14954:419::-;;15158:2;15147:9;15143:18;15135:26;;15207:9;15201:4;15197:20;15193:1;15182:9;15178:17;15171:47;15235:131;15361:4;15235:131;:::i;:::-;15227:139;;15125:248;;;:::o;15379:419::-;;15583:2;15572:9;15568:18;15560:26;;15632:9;15626:4;15622:20;15618:1;15607:9;15603:17;15596:47;15660:131;15786:4;15660:131;:::i;:::-;15652:139;;15550:248;;;:::o;15804:222::-;;15935:2;15924:9;15920:18;15912:26;;15948:71;16016:1;16005:9;16001:17;15992:6;15948:71;:::i;:::-;15902:124;;;;:::o;16032:639::-;;16292:2;16281:9;16277:18;16269:26;;16305:71;16373:1;16362:9;16358:17;16349:6;16305:71;:::i;:::-;16386:72;16454:2;16443:9;16439:18;16430:6;16386:72;:::i;:::-;16505:9;16499:4;16495:20;16490:2;16479:9;16475:18;16468:48;16533:131;16659:4;16533:131;:::i;:::-;16525:139;;16259:412;;;;;:::o;16677:214::-;;16804:2;16793:9;16789:18;16781:26;;16817:67;16881:1;16870:9;16866:17;16857:6;16817:67;:::i;:::-;16771:120;;;;:::o;16897:283::-;;16963:2;16957:9;16947:19;;17005:4;16997:6;16993:17;17112:6;17100:10;17097:22;17076:18;17064:10;17061:34;17058:62;17055:2;;;17123:18;;:::i;:::-;17055:2;17163:10;17159:2;17152:22;16937:243;;;;:::o;17186:311::-;;17353:18;17345:6;17342:30;17339:2;;;17375:18;;:::i;:::-;17339:2;17425:4;17417:6;17413:17;17405:25;;17485:4;17479;17475:15;17467:23;;17268:229;;;:::o;17503:99::-;;17589:5;17583:12;17573:22;;17562:40;;;:::o;17608:169::-;;17726:6;17721:3;17714:19;17766:4;17761:3;17757:14;17742:29;;17704:73;;;;:::o;17783:305::-;;17842:20;17860:1;17842:20;:::i;:::-;17837:25;;17876:20;17894:1;17876:20;:::i;:::-;17871:25;;18030:1;17962:66;17958:74;17955:1;17952:81;17949:2;;;18036:18;;:::i;:::-;17949:2;18080:1;18077;18073:9;18066:16;;17827:261;;;;:::o;18094:185::-;;18151:20;18169:1;18151:20;:::i;:::-;18146:25;;18185:20;18203:1;18185:20;:::i;:::-;18180:25;;18224:1;18214:2;;18229:18;;:::i;:::-;18214:2;18271:1;18268;18264:9;18259:14;;18136:143;;;;:::o;18285:848::-;;;18377:6;18368:15;;18401:5;18392:14;;18415:712;18436:1;18426:8;18423:15;18415:712;;;18531:4;18526:3;18522:14;18516:4;18513:24;18510:2;;;18540:18;;:::i;:::-;18510:2;18590:1;18580:8;18576:16;18573:2;;;19005:4;18998:5;18994:16;18985:25;;18573:2;19055:4;19049;19045:15;19037:23;;19085:32;19108:8;19085:32;:::i;:::-;19073:44;;18415:712;;;18358:775;;;;;;;:::o;19139:281::-;;19221:23;19239:4;19221:23;:::i;:::-;19213:31;;19265:25;19281:8;19265:25;:::i;:::-;19253:37;;19309:104;19346:66;19336:8;19330:4;19309:104;:::i;:::-;19300:113;;19203:217;;;;:::o;19426:1073::-;;19671:8;19661:2;;19692:1;19683:10;;19694:5;;19661:2;19720:4;19710:2;;19737:1;19728:10;;19739:5;;19710:2;19806:4;19854:1;19849:27;;;;19890:1;19885:191;;;;19799:277;;19849:27;19867:1;19858:10;;19869:5;;;19885:191;19930:3;19920:8;19917:17;19914:2;;;19937:18;;:::i;:::-;19914:2;19986:8;19983:1;19979:16;19970:25;;20021:3;20014:5;20011:14;20008:2;;;20028:18;;:::i;:::-;20008:2;20061:5;;;19799:277;;20185:2;20175:8;20172:16;20166:3;20160:4;20157:13;20153:36;20135:2;20125:8;20122:16;20117:2;20111:4;20108:12;20104:35;20088:111;20085:2;;;20241:8;20235:4;20231:19;20222:28;;20276:3;20269:5;20266:14;20263:2;;;20283:18;;:::i;:::-;20263:2;20316:5;;20085:2;20356:42;20394:3;20384:8;20378:4;20375:1;20356:42;:::i;:::-;20341:57;;;;20430:4;20425:3;20421:14;20414:5;20411:25;20408:2;;;20439:18;;:::i;:::-;20408:2;20488:4;20481:5;20477:16;20468:25;;19486:1013;;;;;;:::o;20505:348::-;;20568:20;20586:1;20568:20;:::i;:::-;20563:25;;20602:20;20620:1;20602:20;:::i;:::-;20597:25;;20790:1;20722:66;20718:74;20715:1;20712:81;20707:1;20700:9;20693:17;20689:105;20686:2;;;20797:18;;:::i;:::-;20686:2;20845:1;20842;20838:9;20827:20;;20553:300;;;;:::o;20859:191::-;;20919:20;20937:1;20919:20;:::i;:::-;20914:25;;20953:20;20971:1;20953:20;:::i;:::-;20948:25;;20992:1;20989;20986:8;20983:2;;;20997:18;;:::i;:::-;20983:2;21042:1;21039;21035:9;21027:17;;20904:146;;;;:::o;21056:96::-;;21122:24;21140:5;21122:24;:::i;:::-;21111:35;;21101:51;;;:::o;21158:90::-;;21235:5;21228:13;21221:21;21210:32;;21200:48;;;:::o;21254:126::-;;21331:42;21324:5;21320:54;21309:65;;21299:81;;;:::o;21386:77::-;;21452:5;21441:16;;21431:32;;;:::o;21469:86::-;;21544:4;21537:5;21533:16;21522:27;;21512:43;;;:::o;21561:307::-;21629:1;21639:113;21653:6;21650:1;21647:13;21639:113;;;21738:1;21733:3;21729:11;21723:18;21719:1;21714:3;21710:11;21703:39;21675:2;21672:1;21668:10;21663:15;;21639:113;;;21770:6;21767:1;21764:13;21761:2;;;21850:1;21841:6;21836:3;21832:16;21825:27;21761:2;21610:258;;;;:::o;21874:320::-;;21955:1;21949:4;21945:12;21935:22;;22002:1;21996:4;21992:12;22023:18;22013:2;;22079:4;22071:6;22067:17;22057:27;;22013:2;22141;22133:6;22130:14;22110:18;22107:38;22104:2;;;22160:18;;:::i;:::-;22104:2;21925:269;;;;:::o;22200:233::-;;22262:24;22280:5;22262:24;:::i;:::-;22253:33;;22308:66;22301:5;22298:77;22295:2;;;22378:18;;:::i;:::-;22295:2;22425:1;22418:5;22414:13;22407:20;;22243:190;;;:::o;22439:180::-;22487:77;22484:1;22477:88;22584:4;22581:1;22574:15;22608:4;22605:1;22598:15;22625:180;22673:77;22670:1;22663:88;22770:4;22767:1;22760:15;22794:4;22791:1;22784:15;22811:180;22859:77;22856:1;22849:88;22956:4;22953:1;22946:15;22980:4;22977:1;22970:15;22997:180;23045:77;23042:1;23035:88;23142:4;23139:1;23132:15;23166:4;23163:1;23156:15;23183:102;;23275:2;23271:7;23266:2;23259:5;23255:14;23251:28;23241:38;;23231:54;;;:::o;23291:102::-;;23380:5;23377:1;23373:13;23352:34;;23342:51;;;:::o;23399:122::-;23472:24;23490:5;23472:24;:::i;:::-;23465:5;23462:35;23452:2;;23511:1;23508;23501:12;23452:2;23442:79;:::o;23527:122::-;23600:24;23618:5;23600:24;:::i;:::-;23593:5;23590:35;23580:2;;23639:1;23636;23629:12;23580:2;23570:79;:::o

Swarm Source

ipfs://60560079eb6ce8b502855f9d1f742bc5e31589cda97b29c8ceeb8d5f1fff8fa9
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.