ETH Price: $3,273.02 (+0.73%)
Gas: 1 Gwei

Token

Adventurer Gold (GOLD)
 

Overview

Max Total Supply

6,811,000 GOLD

Holders

141

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
raulonastool.eth
Balance
1,000 GOLD

Value
$0.00
0x2531B2FF6a7f08c6Ab12c29D1b394788F819DeB1
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:
AdventurerGold

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-06
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
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;
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/// @title Adventurer Gold for ADV holders!
/// https://t.me/adv3nturers
/// @notice This contract mints Adventurer Gold for ADV holders and provides
/// administrative functions to the ADV DAO. It allows:
/// * ADV holders to claim Adventurer Gold
/// * A DAO to set seasons for new opportunities to claim Adventurer Gold
/// * A DAO to mint Adventurer Gold for use within the ADV ecosystem
/// This contract has not been audited. Use at your own risk.
contract AdventurerGold is Context, Ownable, ERC20 {
    // ADV contract is available at https://etherscan.io/address/0x4b8f5913f1dd81ae68ac8d332635cbb4c7436f2a
    address public advContractAddress =
        0x4b8F5913F1dD81AE68AC8D332635Cbb4C7436f2a;
    IERC721Enumerable public advContract;

    // Give out 1,000 Adventurer Gold for every ADV Bag that a user holds
    uint256 public adventurerGoldPerTokenId = 1000 * (10**decimals());

    // tokenIdStart of 1 is based on the following lines in the ADV contract:
    /** 
    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 1001, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    */
    uint256 public tokenIdStart = 1;

    // tokenIdEnd of 1111 is based on the following lines in the ADV contract:
    /**
        function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 1000 && tokenId < 1112, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    */
    uint256 public tokenIdEnd = 1111;

    // Seasons are used to allow users to claim tokens regularly. Seasons are
    // decided by the DAO.
    uint256 public season = 0;

    // Track claimed tokens within a season
    // IMPORTANT: The format of the mapping is:
    // claimedForSeason[season][tokenId][claimed]
    mapping(uint256 => mapping(uint256 => bool)) public seasonClaimedByTokenId;

    constructor() Ownable() ERC20("Adventurer Gold", "GOLD") {
        // Transfer ownership to the ADV DAO
        // Ownable by OpenZeppelin automatically sets owner to msg.sender, but
        // we're going to be using a separate wallet for deployment
        transferOwnership(0x887a5c67d4dD51965845C1b668c1faa183739aD0);
        advContract = IERC721Enumerable(advContractAddress);
    }

    /// @notice Claim Adventurer Gold for a given ADV ID
    /// @param tokenId The tokenId of the ADV NFT
    function claimById(uint256 tokenId) external {
        // Follow the Checks-Effects-Interactions pattern to prevent reentrancy
        // attacks

        // Checks

        // Check that the msgSender owns the token that is being claimed
        require(
            _msgSender() == advContract.ownerOf(tokenId),
            "MUST_OWN_TOKEN_ID"
        );

        // Further Checks, Effects, and Interactions are contained within the
        // _claim() function
        _claim(tokenId, _msgSender());
    }

    /// @notice Claim Adventurer Gold for all tokens owned by the sender
    /// @notice This function will run out of gas if you have too much adv! If
    /// this is a concern, you should use claimRangeForOwner and claim Adventurer
    /// Gold in batches.
    function claimAllForOwner() external {
        uint256 tokenBalanceOwner = advContract.balanceOf(_msgSender());

        // Checks
        require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");

        // i < tokenBalanceOwner because tokenBalanceOwner is 1-indexed
        for (uint256 i = 0; i < tokenBalanceOwner; i++) {
            // Further Checks, Effects, and Interactions are contained within
            // the _claim() function
            _claim(
                advContract.tokenOfOwnerByIndex(_msgSender(), i),
                _msgSender()
            );
        }
    }

    /// @notice Claim Adventurer Gold for all tokens owned by the sender within a
    /// given range
    /// @notice This function is useful if you own too much ADV to claim all at
    /// once or if you want to leave some ADV unclaimed. If you leave ADV
    /// unclaimed, however, you cannot claim it once the next season starts.
    function claimRangeForOwner(uint256 ownerIndexStart, uint256 ownerIndexEnd)
        external
    {
        uint256 tokenBalanceOwner = advContract.balanceOf(_msgSender());

        // Checks
        require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");

        // We use < for ownerIndexEnd and tokenBalanceOwner because
        // tokenOfOwnerByIndex is 0-indexed while the token balance is 1-indexed
        require(
            ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
            "INDEX_OUT_OF_RANGE"
        );

        // i <= ownerIndexEnd because ownerIndexEnd is 0-indexed
        for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
            // Further Checks, Effects, and Interactions are contained within
            // the _claim() function
            _claim(
                advContract.tokenOfOwnerByIndex(_msgSender(), i),
                _msgSender()
            );
        }
    }

    /// @dev Internal function to mint ADV upon claiming
    function _claim(uint256 tokenId, address tokenOwner) internal {
        // Checks
        // Check that the token ID is in range
        // We use >= and <= to here because all of the token IDs are 0-indexed
        require(
            tokenId >= tokenIdStart && tokenId <= tokenIdEnd,
            "TOKEN_ID_OUT_OF_RANGE"
        );

        // Check that Adventurer Gold have not already been claimed this season
        // for a given tokenId
        require(
            !seasonClaimedByTokenId[season][tokenId],
            "GOLD_CLAIMED_FOR_TOKEN_ID"
        );

        // Effects

        // Mark that Adventurer Gold has been claimed for this season for the
        // given tokenId
        seasonClaimedByTokenId[season][tokenId] = true;

        // Interactions

        // Send Adventurer Gold to the owner of the token ID
        _mint(tokenOwner, adventurerGoldPerTokenId);
    }

    /// @notice Allows the DAO to mint new tokens for use within the ADV
    /// Ecosystem
    /// @param amountDisplayValue The amount of ADV to mint. This should be
    /// input as the display value, not in raw decimals. If you want to mint
    /// 100 ADV, you should enter "100" rather than the value of 100 * 10^18.
    function daoMint(uint256 amountDisplayValue) external onlyOwner {
        _mint(owner(), amountDisplayValue * (10**decimals()));
    }

    /// @notice Allows the DAO to set a new contract address for ADV. This is
    /// relevant in the event that ADV migrates to a new contract.
    /// @param advContractAddress_ The new contract address for ADV
    function daoSetADVContractAddress(address advContractAddress_)
        external
        onlyOwner
    {
        advContractAddress = advContractAddress_;
        advContract = IERC721Enumerable(advContractAddress);
    }

    /// @notice Allows the DAO to set the token IDs that are eligible to claim
    /// ADV
    /// @param tokenIdStart_ The start of the eligible token range
    /// @param tokenIdEnd_ The end of the eligible token range
    /// @dev This is relevant in case a future ADV contract has a different
    /// total supply of ADV
    function daoSetTokenIdRange(uint256 tokenIdStart_, uint256 tokenIdEnd_)
        external
        onlyOwner
    {
        tokenIdStart = tokenIdStart_;
        tokenIdEnd = tokenIdEnd_;
    }

    /// @notice Allows the DAO to set a season for new Adventurer Gold claims
    /// @param season_ The season to use for claiming ADV
    function daoSetSeason(uint256 season_) public onlyOwner {
        season = season_;
    }

    /// @notice Allows the DAO to set the amount of Adventurer Gold that is
    /// claimed per token ID
    /// @param adventurerGoldDisplayValue The amount of ADV a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 ADV, you should enter "100" rather than the value of
    /// 100 * 10^18.
    function daoSetAdventurerGoldPerTokenId(uint256 adventurerGoldDisplayValue)
        public
        onlyOwner
    {
        adventurerGoldPerTokenId = adventurerGoldDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the season and Adventurer Gold per token ID
    /// in one transaction. This ensures that there is not a gap where a user
    /// can claim more Adventurer Gold than others
    /// @param season_ The season to use for claiming adv
    /// @param adventurerGoldDisplayValue The amount of ADV a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 ADV, you should enter "100" rather than the value of
    /// 100 * 10^18.
    /// @dev We would save a tiny amount of gas by modifying the season and
    /// adventurerGold variables directly. It is better practice for security,
    /// however, to avoid repeating code. This function is so rarely used that
    /// it's not worth moving these values into their own internal function to
    /// skip the gas used on the modifier check.
    function daoSetSeasonAndAdventurerGoldPerTokenID(
        uint256 season_,
        uint256 adventurerGoldDisplayValue
    ) external onlyOwner {
        daoSetSeason(season_);
        daoSetAdventurerGoldPerTokenId(adventurerGoldDisplayValue);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"advContract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adventurerGoldPerTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerIndexStart","type":"uint256"},{"internalType":"uint256","name":"ownerIndexEnd","type":"uint256"}],"name":"claimRangeForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDisplayValue","type":"uint256"}],"name":"daoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"advContractAddress_","type":"address"}],"name":"daoSetADVContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adventurerGoldDisplayValue","type":"uint256"}],"name":"daoSetAdventurerGoldPerTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"}],"name":"daoSetSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"},{"internalType":"uint256","name":"adventurerGoldDisplayValue","type":"uint256"}],"name":"daoSetSeasonAndAdventurerGoldPerTokenID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdStart_","type":"uint256"},{"internalType":"uint256","name":"tokenIdEnd_","type":"uint256"}],"name":"daoSetTokenIdRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"season","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonClaimedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdStart","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"}]

6080604052734b8f5913f1dd81ae68ac8d332635cbb4c7436f2a600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000069620001f560201b60201c565b600a62000077919062000613565b6103e862000086919062000750565b6008556001600955610457600a556000600b55348015620000a657600080fd5b506040518060400160405280600f81526020017f416476656e747572657220476f6c6400000000000000000000000000000000008152506040518060400160405280600481526020017f474f4c44000000000000000000000000000000000000000000000000000000008152506200013362000127620001fe60201b60201c565b6200020660201b60201c565b81600490805190602001906200014b92919062000409565b5080600590805190602001906200016492919062000409565b5050506200018c73887a5c67d4dd51965845c1b668c1faa183739ad0620002ca60201b60201c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000869565b60006012905090565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002da620001fe60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000300620003e060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003509062000585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620003cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c39062000563565b60405180910390fd5b620003dd816200020660201b60201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200041790620007c8565b90600052602060002090601f0160209004810192826200043b576000855562000487565b82601f106200045657805160ff191683800117855562000487565b8280016001018555821562000487579182015b828111156200048657825182559160200191906001019062000469565b5b5090506200049691906200049a565b5090565b5b80821115620004b55760008160009055506001016200049b565b5090565b6000620004c8602683620005a7565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000530602083620005a7565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200057e81620004b9565b9050919050565b60006020820190508181036000830152620005a08162000521565b9050919050565b600082825260208201905092915050565b6000808291508390505b60018511156200060a57808604811115620005e257620005e1620007fe565b5b6001851615620005f25780820291505b808102905062000602856200085c565b9450620005c2565b94509492505050565b60006200062082620007b1565b91506200062d83620007bb565b92506200065c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000664565b905092915050565b60008262000676576001905062000749565b8162000686576000905062000749565b81600181146200069f5760028114620006aa57620006e0565b600191505062000749565b60ff841115620006bf57620006be620007fe565b5b8360020a915084821115620006d957620006d8620007fe565b5b5062000749565b5060208310610133831016604e8410600b84101617156200071a5782820a905083811115620007145762000713620007fe565b5b62000749565b620007298484846001620005b8565b92509050818404811115620007435762000742620007fe565b5b81810290505b9392505050565b60006200075d82620007b1565b91506200076a83620007b1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a657620007a5620007fe565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620007e157607f821691505b60208210811415620007f857620007f76200082d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b612c2780620008796000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637030309411610104578063a9059cbb116100a2578063d9bd40d911610071578063d9bd40d914610521578063dd62ed3e1461053d578063e5e808cb1461056d578063f2fde38b1461059d576101da565b8063a9059cbb146104ad578063becf7741146104dd578063c50b0fb0146104f9578063cbf0b27614610517576101da565b8063878e7ea5116100de578063878e7ea5146104255780638da5cb5b1461044157806395d89b411461045f578063a457c2d71461047d576101da565b806370303094146103cd57806370a08231146103eb578063715018a61461041b576101da565b80632ac910a61161017c57806343f428021161014b57806343f42802146103595780634da7808a1461037757806362759f6c146103935780636bd64e9a146103af576101da565b80632ac910a6146102d3578063313ce567146102ef578063395093511461030d57806342e473151461033d576101da565b806318160ddd116101b857806318160ddd1461024b57806323b872dd1461026957806328324b70146102995780632a389062146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd57806314722fb71461022d575b600080fd5b6101e76105b9565b6040516101f491906125ab565b60405180910390f35b61021760048036038101906102129190611ef3565b61064b565b6040516102249190612575565b60405180910390f35b610235610669565b6040516102429190612531565b60405180910390f35b61025361068f565b60405161026091906127ad565b60405180910390f35b610283600480360381019061027e9190611ea4565b610699565b6040516102909190612575565b60405180910390f35b6102b360048036038101906102ae9190611f2f565b610791565b005b6102bd610835565b6040516102ca91906127ad565b60405180910390f35b6102ed60048036038101906102e89190611e16565b61083b565b005b6102f761095e565b60405161030491906127c8565b60405180910390f35b61032760048036038101906103229190611ef3565b610967565b6040516103349190612575565b60405180910390f35b61035760048036038101906103529190611f2f565b610a13565b005b610361610a99565b60405161036e91906127ad565b60405180910390f35b610391600480360381019061038c9190611f81565b610a9f565b005b6103ad60048036038101906103a89190611f2f565b610b2d565b005b6103b7610bdb565b6040516103c49190612590565b60405180910390f35b6103d5610c01565b6040516103e291906127ad565b60405180910390f35b61040560048036038101906104009190611e16565b610c07565b60405161041291906127ad565b60405180910390f35b610423610c50565b005b61043f600480360381019061043a9190611f81565b610cd8565b005b610449610f0a565b6040516104569190612531565b60405180910390f35b610467610f33565b60405161047491906125ab565b60405180910390f35b61049760048036038101906104929190611ef3565b610fc5565b6040516104a49190612575565b60405180910390f35b6104c760048036038101906104c29190611ef3565b6110b0565b6040516104d49190612575565b60405180910390f35b6104f760048036038101906104f29190611f2f565b6110ce565b005b610501611201565b60405161050e91906127ad565b60405180910390f35b61051f611207565b005b61053b60048036038101906105369190611f81565b6113e6565b005b61055760048036038101906105529190611e68565b611478565b60405161056491906127ad565b60405180910390f35b61058760048036038101906105829190611f81565b6114ff565b6040516105949190612575565b60405180910390f35b6105b760048036038101906105b29190611e16565b61152e565b005b6060600480546105c890612acc565b80601f01602080910402602001604051908101604052809291908181526020018280546105f490612acc565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b5050505050905090565b600061065f610658611626565b848461162e565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b60006106a68484846117f9565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106f1611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610771576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107689061268d565b60405180910390fd5b6107858561077d611626565b85840361162e565b60019150509392505050565b610799611626565b73ffffffffffffffffffffffffffffffffffffffff166107b7610f0a565b73ffffffffffffffffffffffffffffffffffffffff161461080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906126ad565b60405180910390fd5b61081561095e565b600a61082191906128a8565b8161082c91906129c6565b60088190555050565b60095481565b610843611626565b73ffffffffffffffffffffffffffffffffffffffff16610861610f0a565b73ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906126ad565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006012905090565b6000610a09610974611626565b848460026000610982611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a0491906127ff565b61162e565b6001905092915050565b610a1b611626565b73ffffffffffffffffffffffffffffffffffffffff16610a39610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a86906126ad565b60405180910390fd5b80600b8190555050565b600a5481565b610aa7611626565b73ffffffffffffffffffffffffffffffffffffffff16610ac5610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b12906126ad565b60405180910390fd5b8160098190555080600a819055505050565b610b35611626565b73ffffffffffffffffffffffffffffffffffffffff16610b53610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906126ad565b60405180910390fd5b610bd8610bb4610f0a565b610bbc61095e565b600a610bc891906128a8565b83610bd391906129c6565b611a7d565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c58611626565b73ffffffffffffffffffffffffffffffffffffffff16610c76610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906126ad565b60405180910390fd5b610cd66000611bde565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610d20611626565b6040518263ffffffff1660e01b8152600401610d3c9190612531565b60206040518083038186803b158015610d5457600080fd5b505afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c9190611f58565b905060008111610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc89061274d565b60405180910390fd5b60008310158015610de157508082105b610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906125ed565b60405180910390fd5b60008390505b828111610f0457610ef1600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610e76611626565b846040518363ffffffff1660e01b8152600401610e9492919061254c565b60206040518083038186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190611f58565b610eec611626565b611ca2565b8080610efc90612afe565b915050610e26565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610f4290612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e90612acc565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b5050505050905090565b60008060026000610fd4611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110889061276d565b60405180910390fd5b6110a561109c611626565b8585840361162e565b600191505092915050565b60006110c46110bd611626565b84846117f9565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161112991906127ad565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190611e3f565b73ffffffffffffffffffffffffffffffffffffffff16611197611626565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061266d565b60405180910390fd5b6111fe816111f9611626565b611ca2565b50565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161124f611626565b6040518263ffffffff1660e01b815260040161126b9190612531565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190611f58565b905060008111611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061274d565b60405180910390fd5b60005b818110156113e2576113cf600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611354611626565b846040518363ffffffff1660e01b815260040161137292919061254c565b60206040518083038186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c29190611f58565b6113ca611626565b611ca2565b80806113da90612afe565b915050611303565b5050565b6113ee611626565b73ffffffffffffffffffffffffffffffffffffffff1661140c610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906126ad565b60405180910390fd5b61146b82610a13565b61147481610791565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611536611626565b73ffffffffffffffffffffffffffffffffffffffff16611554610f0a565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a1906126ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116119061260d565b60405180910390fd5b61162381611bde565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561169e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959061270d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117059061262d565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117ec91906127ad565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611869576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611860906126cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906125cd565b60405180910390fd5b6118e4838383611db8565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061264d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0091906127ff565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6491906127ad565b60405180910390a3611a77848484611dbd565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae49061278d565b60405180910390fd5b611af960008383611db8565b8060036000828254611b0b91906127ff565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6191906127ff565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bc691906127ad565b60405180910390a3611bda60008383611dbd565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6009548210158015611cb65750600a548211155b611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061272d565b60405180910390fd5b600c6000600b548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d60906126ed565b60405180910390fd5b6001600c6000600b548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550611db481600854611a7d565b5050565b505050565b505050565b600081359050611dd181612bc3565b92915050565b600081519050611de681612bc3565b92915050565b600081359050611dfb81612bda565b92915050565b600081519050611e1081612bda565b92915050565b600060208284031215611e2857600080fd5b6000611e3684828501611dc2565b91505092915050565b600060208284031215611e5157600080fd5b6000611e5f84828501611dd7565b91505092915050565b60008060408385031215611e7b57600080fd5b6000611e8985828601611dc2565b9250506020611e9a85828601611dc2565b9150509250929050565b600080600060608486031215611eb957600080fd5b6000611ec786828701611dc2565b9350506020611ed886828701611dc2565b9250506040611ee986828701611dec565b9150509250925092565b60008060408385031215611f0657600080fd5b6000611f1485828601611dc2565b9250506020611f2585828601611dec565b9150509250929050565b600060208284031215611f4157600080fd5b6000611f4f84828501611dec565b91505092915050565b600060208284031215611f6a57600080fd5b6000611f7884828501611e01565b91505092915050565b60008060408385031215611f9457600080fd5b6000611fa285828601611dec565b9250506020611fb385828601611dec565b9150509250929050565b611fc681612a20565b82525050565b611fd581612a32565b82525050565b611fe481612a75565b82525050565b6000611ff5826127e3565b611fff81856127ee565b935061200f818560208601612a99565b61201881612ba5565b840191505092915050565b60006120306023836127ee565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120966012836127ee565b91507f494e4445585f4f55545f4f465f52414e474500000000000000000000000000006000830152602082019050919050565b60006120d66026836127ee565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061213c6022836127ee565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121a26026836127ee565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122086011836127ee565b91507f4d5553545f4f574e5f544f4b454e5f49440000000000000000000000000000006000830152602082019050919050565b60006122486028836127ee565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122ae6020836127ee565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006122ee6025836127ee565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123546019836127ee565b91507f474f4c445f434c41494d45445f464f525f544f4b454e5f4944000000000000006000830152602082019050919050565b60006123946024836127ee565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123fa6015836127ee565b91507f544f4b454e5f49445f4f55545f4f465f52414e474500000000000000000000006000830152602082019050919050565b600061243a600f836127ee565b91507f4e4f5f544f4b454e535f4f574e454400000000000000000000000000000000006000830152602082019050919050565b600061247a6025836127ee565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124e0601f836127ee565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b61251c81612a5e565b82525050565b61252b81612a68565b82525050565b60006020820190506125466000830184611fbd565b92915050565b60006040820190506125616000830185611fbd565b61256e6020830184612513565b9392505050565b600060208201905061258a6000830184611fcc565b92915050565b60006020820190506125a56000830184611fdb565b92915050565b600060208201905081810360008301526125c58184611fea565b905092915050565b600060208201905081810360008301526125e681612023565b9050919050565b6000602082019050818103600083015261260681612089565b9050919050565b60006020820190508181036000830152612626816120c9565b9050919050565b600060208201905081810360008301526126468161212f565b9050919050565b6000602082019050818103600083015261266681612195565b9050919050565b60006020820190508181036000830152612686816121fb565b9050919050565b600060208201905081810360008301526126a68161223b565b9050919050565b600060208201905081810360008301526126c6816122a1565b9050919050565b600060208201905081810360008301526126e6816122e1565b9050919050565b6000602082019050818103600083015261270681612347565b9050919050565b6000602082019050818103600083015261272681612387565b9050919050565b60006020820190508181036000830152612746816123ed565b9050919050565b600060208201905081810360008301526127668161242d565b9050919050565b600060208201905081810360008301526127868161246d565b9050919050565b600060208201905081810360008301526127a6816124d3565b9050919050565b60006020820190506127c26000830184612513565b92915050565b60006020820190506127dd6000830184612522565b92915050565b600081519050919050565b600082825260208201905092915050565b600061280a82612a5e565b915061281583612a5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284a57612849612b47565b5b828201905092915050565b6000808291508390505b600185111561289f5780860481111561287b5761287a612b47565b5b600185161561288a5780820291505b808102905061289885612bb6565b945061285f565b94509492505050565b60006128b382612a5e565b91506128be83612a68565b92506128eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846128f3565b905092915050565b60008261290357600190506129bf565b8161291157600090506129bf565b8160018114612927576002811461293157612960565b60019150506129bf565b60ff84111561294357612942612b47565b5b8360020a91508482111561295a57612959612b47565b5b506129bf565b5060208310610133831016604e8410600b84101617156129955782820a9050838111156129905761298f612b47565b5b6129bf565b6129a28484846001612855565b925090508184048111156129b9576129b8612b47565b5b81810290505b9392505050565b60006129d182612a5e565b91506129dc83612a5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1557612a14612b47565b5b828202905092915050565b6000612a2b82612a3e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612a8082612a87565b9050919050565b6000612a9282612a3e565b9050919050565b60005b83811015612ab7578082015181840152602081019050612a9c565b83811115612ac6576000848401525b50505050565b60006002820490506001821680612ae457607f821691505b60208210811415612af857612af7612b76565b5b50919050565b6000612b0982612a5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b3c57612b3b612b47565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b612bcc81612a20565b8114612bd757600080fd5b50565b612be381612a5e565b8114612bee57600080fd5b5056fea26469706673582212203812afe84e858dbf9a558c3c798217f309182776c0f1d1d7ad814657d982345564736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637030309411610104578063a9059cbb116100a2578063d9bd40d911610071578063d9bd40d914610521578063dd62ed3e1461053d578063e5e808cb1461056d578063f2fde38b1461059d576101da565b8063a9059cbb146104ad578063becf7741146104dd578063c50b0fb0146104f9578063cbf0b27614610517576101da565b8063878e7ea5116100de578063878e7ea5146104255780638da5cb5b1461044157806395d89b411461045f578063a457c2d71461047d576101da565b806370303094146103cd57806370a08231146103eb578063715018a61461041b576101da565b80632ac910a61161017c57806343f428021161014b57806343f42802146103595780634da7808a1461037757806362759f6c146103935780636bd64e9a146103af576101da565b80632ac910a6146102d3578063313ce567146102ef578063395093511461030d57806342e473151461033d576101da565b806318160ddd116101b857806318160ddd1461024b57806323b872dd1461026957806328324b70146102995780632a389062146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd57806314722fb71461022d575b600080fd5b6101e76105b9565b6040516101f491906125ab565b60405180910390f35b61021760048036038101906102129190611ef3565b61064b565b6040516102249190612575565b60405180910390f35b610235610669565b6040516102429190612531565b60405180910390f35b61025361068f565b60405161026091906127ad565b60405180910390f35b610283600480360381019061027e9190611ea4565b610699565b6040516102909190612575565b60405180910390f35b6102b360048036038101906102ae9190611f2f565b610791565b005b6102bd610835565b6040516102ca91906127ad565b60405180910390f35b6102ed60048036038101906102e89190611e16565b61083b565b005b6102f761095e565b60405161030491906127c8565b60405180910390f35b61032760048036038101906103229190611ef3565b610967565b6040516103349190612575565b60405180910390f35b61035760048036038101906103529190611f2f565b610a13565b005b610361610a99565b60405161036e91906127ad565b60405180910390f35b610391600480360381019061038c9190611f81565b610a9f565b005b6103ad60048036038101906103a89190611f2f565b610b2d565b005b6103b7610bdb565b6040516103c49190612590565b60405180910390f35b6103d5610c01565b6040516103e291906127ad565b60405180910390f35b61040560048036038101906104009190611e16565b610c07565b60405161041291906127ad565b60405180910390f35b610423610c50565b005b61043f600480360381019061043a9190611f81565b610cd8565b005b610449610f0a565b6040516104569190612531565b60405180910390f35b610467610f33565b60405161047491906125ab565b60405180910390f35b61049760048036038101906104929190611ef3565b610fc5565b6040516104a49190612575565b60405180910390f35b6104c760048036038101906104c29190611ef3565b6110b0565b6040516104d49190612575565b60405180910390f35b6104f760048036038101906104f29190611f2f565b6110ce565b005b610501611201565b60405161050e91906127ad565b60405180910390f35b61051f611207565b005b61053b60048036038101906105369190611f81565b6113e6565b005b61055760048036038101906105529190611e68565b611478565b60405161056491906127ad565b60405180910390f35b61058760048036038101906105829190611f81565b6114ff565b6040516105949190612575565b60405180910390f35b6105b760048036038101906105b29190611e16565b61152e565b005b6060600480546105c890612acc565b80601f01602080910402602001604051908101604052809291908181526020018280546105f490612acc565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b5050505050905090565b600061065f610658611626565b848461162e565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b60006106a68484846117f9565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106f1611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610771576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107689061268d565b60405180910390fd5b6107858561077d611626565b85840361162e565b60019150509392505050565b610799611626565b73ffffffffffffffffffffffffffffffffffffffff166107b7610f0a565b73ffffffffffffffffffffffffffffffffffffffff161461080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906126ad565b60405180910390fd5b61081561095e565b600a61082191906128a8565b8161082c91906129c6565b60088190555050565b60095481565b610843611626565b73ffffffffffffffffffffffffffffffffffffffff16610861610f0a565b73ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906126ad565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006012905090565b6000610a09610974611626565b848460026000610982611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a0491906127ff565b61162e565b6001905092915050565b610a1b611626565b73ffffffffffffffffffffffffffffffffffffffff16610a39610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a86906126ad565b60405180910390fd5b80600b8190555050565b600a5481565b610aa7611626565b73ffffffffffffffffffffffffffffffffffffffff16610ac5610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b12906126ad565b60405180910390fd5b8160098190555080600a819055505050565b610b35611626565b73ffffffffffffffffffffffffffffffffffffffff16610b53610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906126ad565b60405180910390fd5b610bd8610bb4610f0a565b610bbc61095e565b600a610bc891906128a8565b83610bd391906129c6565b611a7d565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c58611626565b73ffffffffffffffffffffffffffffffffffffffff16610c76610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906126ad565b60405180910390fd5b610cd66000611bde565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610d20611626565b6040518263ffffffff1660e01b8152600401610d3c9190612531565b60206040518083038186803b158015610d5457600080fd5b505afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c9190611f58565b905060008111610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc89061274d565b60405180910390fd5b60008310158015610de157508082105b610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906125ed565b60405180910390fd5b60008390505b828111610f0457610ef1600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610e76611626565b846040518363ffffffff1660e01b8152600401610e9492919061254c565b60206040518083038186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190611f58565b610eec611626565b611ca2565b8080610efc90612afe565b915050610e26565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610f4290612acc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e90612acc565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b5050505050905090565b60008060026000610fd4611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110889061276d565b60405180910390fd5b6110a561109c611626565b8585840361162e565b600191505092915050565b60006110c46110bd611626565b84846117f9565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161112991906127ad565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190611e3f565b73ffffffffffffffffffffffffffffffffffffffff16611197611626565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061266d565b60405180910390fd5b6111fe816111f9611626565b611ca2565b50565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161124f611626565b6040518263ffffffff1660e01b815260040161126b9190612531565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190611f58565b905060008111611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061274d565b60405180910390fd5b60005b818110156113e2576113cf600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611354611626565b846040518363ffffffff1660e01b815260040161137292919061254c565b60206040518083038186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c29190611f58565b6113ca611626565b611ca2565b80806113da90612afe565b915050611303565b5050565b6113ee611626565b73ffffffffffffffffffffffffffffffffffffffff1661140c610f0a565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906126ad565b60405180910390fd5b61146b82610a13565b61147481610791565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b611536611626565b73ffffffffffffffffffffffffffffffffffffffff16611554610f0a565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a1906126ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116119061260d565b60405180910390fd5b61162381611bde565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561169e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959061270d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117059061262d565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117ec91906127ad565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611869576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611860906126cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906125cd565b60405180910390fd5b6118e4838383611db8565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061264d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0091906127ff565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6491906127ad565b60405180910390a3611a77848484611dbd565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae49061278d565b60405180910390fd5b611af960008383611db8565b8060036000828254611b0b91906127ff565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6191906127ff565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bc691906127ad565b60405180910390a3611bda60008383611dbd565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6009548210158015611cb65750600a548211155b611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061272d565b60405180910390fd5b600c6000600b548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d60906126ed565b60405180910390fd5b6001600c6000600b548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550611db481600854611a7d565b5050565b505050565b505050565b600081359050611dd181612bc3565b92915050565b600081519050611de681612bc3565b92915050565b600081359050611dfb81612bda565b92915050565b600081519050611e1081612bda565b92915050565b600060208284031215611e2857600080fd5b6000611e3684828501611dc2565b91505092915050565b600060208284031215611e5157600080fd5b6000611e5f84828501611dd7565b91505092915050565b60008060408385031215611e7b57600080fd5b6000611e8985828601611dc2565b9250506020611e9a85828601611dc2565b9150509250929050565b600080600060608486031215611eb957600080fd5b6000611ec786828701611dc2565b9350506020611ed886828701611dc2565b9250506040611ee986828701611dec565b9150509250925092565b60008060408385031215611f0657600080fd5b6000611f1485828601611dc2565b9250506020611f2585828601611dec565b9150509250929050565b600060208284031215611f4157600080fd5b6000611f4f84828501611dec565b91505092915050565b600060208284031215611f6a57600080fd5b6000611f7884828501611e01565b91505092915050565b60008060408385031215611f9457600080fd5b6000611fa285828601611dec565b9250506020611fb385828601611dec565b9150509250929050565b611fc681612a20565b82525050565b611fd581612a32565b82525050565b611fe481612a75565b82525050565b6000611ff5826127e3565b611fff81856127ee565b935061200f818560208601612a99565b61201881612ba5565b840191505092915050565b60006120306023836127ee565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120966012836127ee565b91507f494e4445585f4f55545f4f465f52414e474500000000000000000000000000006000830152602082019050919050565b60006120d66026836127ee565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061213c6022836127ee565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121a26026836127ee565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122086011836127ee565b91507f4d5553545f4f574e5f544f4b454e5f49440000000000000000000000000000006000830152602082019050919050565b60006122486028836127ee565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122ae6020836127ee565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006122ee6025836127ee565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123546019836127ee565b91507f474f4c445f434c41494d45445f464f525f544f4b454e5f4944000000000000006000830152602082019050919050565b60006123946024836127ee565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123fa6015836127ee565b91507f544f4b454e5f49445f4f55545f4f465f52414e474500000000000000000000006000830152602082019050919050565b600061243a600f836127ee565b91507f4e4f5f544f4b454e535f4f574e454400000000000000000000000000000000006000830152602082019050919050565b600061247a6025836127ee565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124e0601f836127ee565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b61251c81612a5e565b82525050565b61252b81612a68565b82525050565b60006020820190506125466000830184611fbd565b92915050565b60006040820190506125616000830185611fbd565b61256e6020830184612513565b9392505050565b600060208201905061258a6000830184611fcc565b92915050565b60006020820190506125a56000830184611fdb565b92915050565b600060208201905081810360008301526125c58184611fea565b905092915050565b600060208201905081810360008301526125e681612023565b9050919050565b6000602082019050818103600083015261260681612089565b9050919050565b60006020820190508181036000830152612626816120c9565b9050919050565b600060208201905081810360008301526126468161212f565b9050919050565b6000602082019050818103600083015261266681612195565b9050919050565b60006020820190508181036000830152612686816121fb565b9050919050565b600060208201905081810360008301526126a68161223b565b9050919050565b600060208201905081810360008301526126c6816122a1565b9050919050565b600060208201905081810360008301526126e6816122e1565b9050919050565b6000602082019050818103600083015261270681612347565b9050919050565b6000602082019050818103600083015261272681612387565b9050919050565b60006020820190508181036000830152612746816123ed565b9050919050565b600060208201905081810360008301526127668161242d565b9050919050565b600060208201905081810360008301526127868161246d565b9050919050565b600060208201905081810360008301526127a6816124d3565b9050919050565b60006020820190506127c26000830184612513565b92915050565b60006020820190506127dd6000830184612522565b92915050565b600081519050919050565b600082825260208201905092915050565b600061280a82612a5e565b915061281583612a5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284a57612849612b47565b5b828201905092915050565b6000808291508390505b600185111561289f5780860481111561287b5761287a612b47565b5b600185161561288a5780820291505b808102905061289885612bb6565b945061285f565b94509492505050565b60006128b382612a5e565b91506128be83612a68565b92506128eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846128f3565b905092915050565b60008261290357600190506129bf565b8161291157600090506129bf565b8160018114612927576002811461293157612960565b60019150506129bf565b60ff84111561294357612942612b47565b5b8360020a91508482111561295a57612959612b47565b5b506129bf565b5060208310610133831016604e8410600b84101617156129955782820a9050838111156129905761298f612b47565b5b6129bf565b6129a28484846001612855565b925090508184048111156129b9576129b8612b47565b5b81810290505b9392505050565b60006129d182612a5e565b91506129dc83612a5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1557612a14612b47565b5b828202905092915050565b6000612a2b82612a3e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612a8082612a87565b9050919050565b6000612a9282612a3e565b9050919050565b60005b83811015612ab7578082015181840152602081019050612a9c565b83811115612ac6576000848401525b50505050565b60006002820490506001821680612ae457607f821691505b60208210811415612af857612af7612b76565b5b50919050565b6000612b0982612a5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b3c57612b3b612b47565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b612bcc81612a20565b8114612bd757600080fd5b50565b612be381612a5e565b8114612bee57600080fd5b5056fea26469706673582212203812afe84e858dbf9a558c3c798217f309182776c0f1d1d7ad814657d982345564736f6c63430008000033

Deployed Bytecode Sourcemap

26506:9097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8425:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10733:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26673:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9545:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11425:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34230:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27236:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32857:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9387:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12363:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33764:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27568:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33422:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32497:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26767:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26887:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9716:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2409:94;;;:::i;:::-;;30226:951;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1758:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8644:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13163:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10106:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28489:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27716:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29284:596;;;:::i;:::-;;35345:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10385:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27895:74;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2658:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8425:100;8479:13;8512:5;8505:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8425:100;:::o;10733:210::-;10852:4;10874:39;10883:12;:10;:12::i;:::-;10897:7;10906:6;10874:8;:39::i;:::-;10931:4;10924:11;;10733:210;;;;:::o;26673:87::-;;;;;;;;;;;;;:::o;9545:108::-;9606:7;9633:12;;9626:19;;9545:108;:::o;11425:529::-;11565:4;11582:36;11592:6;11600:9;11611:6;11582:9;:36::i;:::-;11631:24;11658:11;:19;11670:6;11658:19;;;;;;;;;;;;;;;:33;11678:12;:10;:12::i;:::-;11658:33;;;;;;;;;;;;;;;;11631:60;;11744:6;11724:16;:26;;11702:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;11854:57;11863:6;11871:12;:10;:12::i;:::-;11904:6;11885:16;:25;11854:8;:57::i;:::-;11942:4;11935:11;;;11425:529;;;;;:::o;34230:207::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34418:10:::1;:8;:10::i;:::-;34414:2;:14;;;;:::i;:::-;34384:26;:45;;;;:::i;:::-;34357:24;:72;;;;34230:207:::0;:::o;27236:31::-;;;;:::o;32857:226::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32994:19:::1;32973:18;;:40;;;;;;;;;;;;;;;;;;33056:18;;;;;;;;;;;33024:11;;:51;;;;;;;;;;;;;;;;;;32857:226:::0;:::o;9387:93::-;9445:5;9470:2;9463:9;;9387:93;:::o;12363:297::-;12478:4;12500:130;12523:12;:10;:12::i;:::-;12550:7;12609:10;12572:11;:25;12584:12;:10;:12::i;:::-;12572:25;;;;;;;;;;;;;;;:34;12598:7;12572:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12500:8;:130::i;:::-;12648:4;12641:11;;12363:297;;;;:::o;33764:91::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33840:7:::1;33831:6;:16;;;;33764:91:::0;:::o;27568:32::-;;;;:::o;33422:196::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33562:13:::1;33547:12;:28;;;;33599:11;33586:10;:24;;;;33422:196:::0;;:::o;32497:136::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32572:53:::1;32578:7;:5;:7::i;:::-;32613:10;:8;:10::i;:::-;32609:2;:14;;;;:::i;:::-;32587:18;:37;;;;:::i;:::-;32572:5;:53::i;:::-;32497:136:::0;:::o;26767:36::-;;;;;;;;;;;;;:::o;26887:65::-;;;;:::o;9716:177::-;9835:7;9867:9;:18;9877:7;9867:18;;;;;;;;;;;;;;;;9860:25;;9716:177;;;:::o;2409:94::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2474:21:::1;2492:1;2474:9;:21::i;:::-;2409:94::o:0;30226:951::-;30336:25;30364:11;;;;;;;;;;;:21;;;30386:12;:10;:12::i;:::-;30364:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30336:63;;30459:1;30439:17;:21;30431:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;30685:1;30666:15;:20;;:57;;;;;30706:17;30690:13;:33;30666:57;30644:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;30853:9;30865:15;30853:27;;30848:322;30887:13;30882:1;:18;30848:322;;31039:119;31064:11;;;;;;;;;;;:31;;;31096:12;:10;:12::i;:::-;31110:1;31064:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31131:12;:10;:12::i;:::-;31039:6;:119::i;:::-;30902:3;;;;;:::i;:::-;;;;30848:322;;;;30226:951;;;:::o;1758:87::-;1804:7;1831:6;;;;;;;;;;;1824:13;;1758:87;:::o;8644:104::-;8700:13;8733:7;8726:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8644:104;:::o;13163:482::-;13283:4;13305:24;13332:11;:25;13344:12;:10;:12::i;:::-;13332:25;;;;;;;;;;;;;;;:34;13358:7;13332:34;;;;;;;;;;;;;;;;13305:61;;13419:15;13399:16;:35;;13377:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;13535:67;13544:12;:10;:12::i;:::-;13558:7;13586:15;13567:16;:34;13535:8;:67::i;:::-;13633:4;13626:11;;;13163:482;;;;:::o;10106:216::-;10228:4;10250:42;10260:12;:10;:12::i;:::-;10274:9;10285:6;10250:9;:42::i;:::-;10310:4;10303:11;;10106:216;;;;:::o;28489:524::-;28781:11;;;;;;;;;;;:19;;;28801:7;28781:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28765:44;;:12;:10;:12::i;:::-;:44;;;28743:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28976:29;28983:7;28992:12;:10;:12::i;:::-;28976:6;:29::i;:::-;28489:524;:::o;27716:25::-;;;;:::o;29284:596::-;29332:25;29360:11;;;;;;;;;;;:21;;;29382:12;:10;:12::i;:::-;29360:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29332:63;;29455:1;29435:17;:21;29427:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;29567:9;29562:311;29586:17;29582:1;:21;29562:311;;;29742:119;29767:11;;;;;;;;;;;:31;;;29799:12;:10;:12::i;:::-;29813:1;29767:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29834:12;:10;:12::i;:::-;29742:6;:119::i;:::-;29605:3;;;;;:::i;:::-;;;;29562:311;;;;29284:596;:::o;35345:255::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35502:21:::1;35515:7;35502:12;:21::i;:::-;35534:58;35565:26;35534:30;:58::i;:::-;35345:255:::0;;:::o;10385:201::-;10519:7;10551:11;:18;10563:5;10551:18;;;;;;;;;;;;;;;:27;10570:7;10551:27;;;;;;;;;;;;;;;;10544:34;;10385:201;;;;:::o;27895:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2658:229::-;1989:12;:10;:12::i;:::-;1978:23;;:7;:5;:7::i;:::-;:23;;;1970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2781:1:::1;2761:22;;:8;:22;;;;2739:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2860:19;2870:8;2860:9;:19::i;:::-;2658:229:::0;:::o;609:98::-;662:7;689:10;682:17;;609:98;:::o;16953:380::-;17106:1;17089:19;;:5;:19;;;;17081:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17187:1;17168:21;;:7;:21;;;;17160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17271:6;17241:11;:18;17253:5;17241:18;;;;;;;;;;;;;;;:27;17260:7;17241:27;;;;;;;;;;;;;;;:36;;;;17309:7;17293:32;;17302:5;17293:32;;;17318:6;17293:32;;;;;;:::i;:::-;;;;;;;;16953:380;;;:::o;14135:770::-;14293:1;14275:20;;:6;:20;;;;14267:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14377:1;14356:23;;:9;:23;;;;14348:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14432:47;14453:6;14461:9;14472:6;14432:20;:47::i;:::-;14492:21;14516:9;:17;14526:6;14516:17;;;;;;;;;;;;;;;;14492:41;;14583:6;14566:13;:23;;14544:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;14727:6;14711:13;:22;14691:9;:17;14701:6;14691:17;;;;;;;;;;;;;;;:42;;;;14779:6;14755:9;:20;14765:9;14755:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;14820:9;14803:35;;14812:6;14803:35;;;14831:6;14803:35;;;;;;:::i;:::-;;;;;;;;14851:46;14871:6;14879:9;14890:6;14851:19;:46::i;:::-;14135:770;;;;:::o;15192:399::-;15295:1;15276:21;;:7;:21;;;;15268:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15346:49;15375:1;15379:7;15388:6;15346:20;:49::i;:::-;15424:6;15408:12;;:22;;;;;;;:::i;:::-;;;;;;;;15463:6;15441:9;:18;15451:7;15441:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15506:7;15485:37;;15502:1;15485:37;;;15515:6;15485:37;;;;;;:::i;:::-;;;;;;;;15535:48;15563:1;15567:7;15576:6;15535:19;:48::i;:::-;15192:399;;:::o;2895:173::-;2951:16;2970:6;;;;;;;;;;;2951:25;;2996:8;2987:6;;:17;;;;;;;;;;;;;;;;;;3051:8;3020:40;;3041:8;3020:40;;;;;;;;;;;;2895:173;;:::o;31243:919::-;31496:12;;31485:7;:23;;:48;;;;;31523:10;;31512:7;:21;;31485:48;31463:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;31731:22;:30;31754:6;;31731:30;;;;;;;;;;;:39;31762:7;31731:39;;;;;;;;;;;;;;;;;;;;;31730:40;31708:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;32005:4;31963:22;:30;31986:6;;31963:30;;;;;;;;;;;:39;31994:7;31963:39;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32111:43;32117:10;32129:24;;32111:5;:43::i;:::-;31243:919;;:::o;17933:125::-;;;;:::o;18662:124::-;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:139::-;;385:6;372:20;363:29;;401:33;428:5;401:33;:::i;:::-;353:87;;;;:::o;446:143::-;;534:6;528:13;519:22;;550:33;577:5;550:33;:::i;:::-;509:80;;;;:::o;595:262::-;;703:2;691:9;682:7;678:23;674:32;671:2;;;719:1;716;709:12;671:2;762:1;787:53;832:7;823:6;812:9;808:22;787:53;:::i;:::-;777:63;;733:117;661:196;;;;:::o;863:284::-;;982:2;970:9;961:7;957:23;953:32;950:2;;;998:1;995;988:12;950:2;1041:1;1066:64;1122:7;1113:6;1102:9;1098:22;1066:64;:::i;:::-;1056:74;;1012:128;940:207;;;;:::o;1153:407::-;;;1278:2;1266:9;1257:7;1253:23;1249:32;1246:2;;;1294:1;1291;1284:12;1246:2;1337:1;1362:53;1407:7;1398:6;1387:9;1383:22;1362:53;:::i;:::-;1352:63;;1308:117;1464:2;1490:53;1535:7;1526:6;1515:9;1511:22;1490:53;:::i;:::-;1480:63;;1435:118;1236:324;;;;;:::o;1566:552::-;;;;1708:2;1696:9;1687:7;1683:23;1679:32;1676:2;;;1724:1;1721;1714:12;1676:2;1767:1;1792:53;1837:7;1828:6;1817:9;1813:22;1792:53;:::i;:::-;1782:63;;1738:117;1894:2;1920:53;1965:7;1956:6;1945:9;1941:22;1920:53;:::i;:::-;1910:63;;1865:118;2022:2;2048:53;2093:7;2084:6;2073:9;2069:22;2048:53;:::i;:::-;2038:63;;1993:118;1666:452;;;;;:::o;2124:407::-;;;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2265:1;2262;2255:12;2217:2;2308:1;2333:53;2378:7;2369:6;2358:9;2354:22;2333:53;:::i;:::-;2323:63;;2279:117;2435:2;2461:53;2506:7;2497:6;2486:9;2482:22;2461:53;:::i;:::-;2451:63;;2406:118;2207:324;;;;;:::o;2537:262::-;;2645:2;2633:9;2624:7;2620:23;2616:32;2613:2;;;2661:1;2658;2651:12;2613:2;2704:1;2729:53;2774:7;2765:6;2754:9;2750:22;2729:53;:::i;:::-;2719:63;;2675:117;2603:196;;;;:::o;2805:284::-;;2924:2;2912:9;2903:7;2899:23;2895:32;2892:2;;;2940:1;2937;2930:12;2892:2;2983:1;3008:64;3064:7;3055:6;3044:9;3040:22;3008:64;:::i;:::-;2998:74;;2954:128;2882:207;;;;:::o;3095:407::-;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3178:324;;;;;:::o;3508:118::-;3595:24;3613:5;3595:24;:::i;:::-;3590:3;3583:37;3573:53;;:::o;3632:109::-;3713:21;3728:5;3713:21;:::i;:::-;3708:3;3701:34;3691:50;;:::o;3747:181::-;3859:62;3915:5;3859:62;:::i;:::-;3854:3;3847:75;3837:91;;:::o;3934:364::-;;4050:39;4083:5;4050:39;:::i;:::-;4105:71;4169:6;4164:3;4105:71;:::i;:::-;4098:78;;4185:52;4230:6;4225:3;4218:4;4211:5;4207:16;4185:52;:::i;:::-;4262:29;4284:6;4262:29;:::i;:::-;4257:3;4253:39;4246:46;;4026:272;;;;;:::o;4304:367::-;;4467:67;4531:2;4526:3;4467:67;:::i;:::-;4460:74;;4564:34;4560:1;4555:3;4551:11;4544:55;4630:5;4625:2;4620:3;4616:12;4609:27;4662:2;4657:3;4653:12;4646:19;;4450:221;;;:::o;4677:316::-;;4840:67;4904:2;4899:3;4840:67;:::i;:::-;4833:74;;4937:20;4933:1;4928:3;4924:11;4917:41;4984:2;4979:3;4975:12;4968:19;;4823:170;;;:::o;4999:370::-;;5162:67;5226:2;5221:3;5162:67;:::i;:::-;5155:74;;5259:34;5255:1;5250:3;5246:11;5239:55;5325:8;5320:2;5315:3;5311:12;5304:30;5360:2;5355:3;5351:12;5344:19;;5145:224;;;:::o;5375:366::-;;5538:67;5602:2;5597:3;5538:67;:::i;:::-;5531:74;;5635:34;5631:1;5626:3;5622:11;5615:55;5701:4;5696:2;5691:3;5687:12;5680:26;5732:2;5727:3;5723:12;5716:19;;5521:220;;;:::o;5747:370::-;;5910:67;5974:2;5969:3;5910:67;:::i;:::-;5903:74;;6007:34;6003:1;5998:3;5994:11;5987:55;6073:8;6068:2;6063:3;6059:12;6052:30;6108:2;6103:3;6099:12;6092:19;;5893:224;;;:::o;6123:315::-;;6286:67;6350:2;6345:3;6286:67;:::i;:::-;6279:74;;6383:19;6379:1;6374:3;6370:11;6363:40;6429:2;6424:3;6420:12;6413:19;;6269:169;;;:::o;6444:372::-;;6607:67;6671:2;6666:3;6607:67;:::i;:::-;6600:74;;6704:34;6700:1;6695:3;6691:11;6684:55;6770:10;6765:2;6760:3;6756:12;6749:32;6807:2;6802:3;6798:12;6791:19;;6590:226;;;:::o;6822:330::-;;6985:67;7049:2;7044:3;6985:67;:::i;:::-;6978:74;;7082:34;7078:1;7073:3;7069:11;7062:55;7143:2;7138:3;7134:12;7127:19;;6968:184;;;:::o;7158:369::-;;7321:67;7385:2;7380:3;7321:67;:::i;:::-;7314:74;;7418:34;7414:1;7409:3;7405:11;7398:55;7484:7;7479:2;7474:3;7470:12;7463:29;7518:2;7513:3;7509:12;7502:19;;7304:223;;;:::o;7533:323::-;;7696:67;7760:2;7755:3;7696:67;:::i;:::-;7689:74;;7793:27;7789:1;7784:3;7780:11;7773:48;7847:2;7842:3;7838:12;7831:19;;7679:177;;;:::o;7862:368::-;;8025:67;8089:2;8084:3;8025:67;:::i;:::-;8018:74;;8122:34;8118:1;8113:3;8109:11;8102:55;8188:6;8183:2;8178:3;8174:12;8167:28;8221:2;8216:3;8212:12;8205:19;;8008:222;;;:::o;8236:319::-;;8399:67;8463:2;8458:3;8399:67;:::i;:::-;8392:74;;8496:23;8492:1;8487:3;8483:11;8476:44;8546:2;8541:3;8537:12;8530:19;;8382:173;;;:::o;8561:313::-;;8724:67;8788:2;8783:3;8724:67;:::i;:::-;8717:74;;8821:17;8817:1;8812:3;8808:11;8801:38;8865:2;8860:3;8856:12;8849:19;;8707:167;;;:::o;8880:369::-;;9043:67;9107:2;9102:3;9043:67;:::i;:::-;9036:74;;9140:34;9136:1;9131:3;9127:11;9120:55;9206:7;9201:2;9196:3;9192:12;9185:29;9240:2;9235:3;9231:12;9224:19;;9026:223;;;:::o;9255:329::-;;9418:67;9482:2;9477:3;9418:67;:::i;:::-;9411:74;;9515:33;9511:1;9506:3;9502:11;9495:54;9575:2;9570:3;9566:12;9559:19;;9401:183;;;:::o;9590:118::-;9677:24;9695:5;9677:24;:::i;:::-;9672:3;9665:37;9655:53;;:::o;9714:112::-;9797:22;9813:5;9797:22;:::i;:::-;9792:3;9785:35;9775:51;;:::o;9832:222::-;;9963:2;9952:9;9948:18;9940:26;;9976:71;10044:1;10033:9;10029:17;10020:6;9976:71;:::i;:::-;9930:124;;;;:::o;10060:332::-;;10219:2;10208:9;10204:18;10196:26;;10232:71;10300:1;10289:9;10285:17;10276:6;10232:71;:::i;:::-;10313:72;10381:2;10370:9;10366:18;10357:6;10313:72;:::i;:::-;10186:206;;;;;:::o;10398:210::-;;10523:2;10512:9;10508:18;10500:26;;10536:65;10598:1;10587:9;10583:17;10574:6;10536:65;:::i;:::-;10490:118;;;;:::o;10614:272::-;;10770:2;10759:9;10755:18;10747:26;;10783:96;10876:1;10865:9;10861:17;10852:6;10783:96;:::i;:::-;10737:149;;;;:::o;10892:313::-;;11043:2;11032:9;11028:18;11020:26;;11092:9;11086:4;11082:20;11078:1;11067:9;11063:17;11056:47;11120:78;11193:4;11184:6;11120:78;:::i;:::-;11112:86;;11010:195;;;;:::o;11211:419::-;;11415:2;11404:9;11400:18;11392:26;;11464:9;11458:4;11454:20;11450:1;11439:9;11435:17;11428:47;11492:131;11618:4;11492:131;:::i;:::-;11484:139;;11382:248;;;:::o;11636:419::-;;11840:2;11829:9;11825:18;11817:26;;11889:9;11883:4;11879:20;11875:1;11864:9;11860:17;11853:47;11917:131;12043:4;11917:131;:::i;:::-;11909:139;;11807:248;;;:::o;12061:419::-;;12265:2;12254:9;12250:18;12242:26;;12314:9;12308:4;12304:20;12300:1;12289:9;12285:17;12278:47;12342:131;12468:4;12342:131;:::i;:::-;12334:139;;12232:248;;;:::o;12486:419::-;;12690:2;12679:9;12675:18;12667:26;;12739:9;12733:4;12729:20;12725:1;12714:9;12710:17;12703:47;12767:131;12893:4;12767:131;:::i;:::-;12759:139;;12657:248;;;:::o;12911:419::-;;13115:2;13104:9;13100:18;13092:26;;13164:9;13158:4;13154:20;13150:1;13139:9;13135:17;13128:47;13192:131;13318:4;13192:131;:::i;:::-;13184:139;;13082:248;;;:::o;13336:419::-;;13540:2;13529:9;13525:18;13517:26;;13589:9;13583:4;13579:20;13575:1;13564:9;13560:17;13553:47;13617:131;13743:4;13617:131;:::i;:::-;13609:139;;13507:248;;;:::o;13761:419::-;;13965:2;13954:9;13950:18;13942:26;;14014:9;14008:4;14004:20;14000:1;13989:9;13985:17;13978:47;14042:131;14168:4;14042:131;:::i;:::-;14034:139;;13932:248;;;:::o;14186:419::-;;14390:2;14379:9;14375:18;14367:26;;14439:9;14433:4;14429:20;14425:1;14414:9;14410:17;14403:47;14467:131;14593:4;14467:131;:::i;:::-;14459:139;;14357:248;;;:::o;14611:419::-;;14815:2;14804:9;14800:18;14792:26;;14864:9;14858:4;14854:20;14850:1;14839:9;14835:17;14828:47;14892:131;15018:4;14892:131;:::i;:::-;14884:139;;14782:248;;;:::o;15036:419::-;;15240:2;15229:9;15225:18;15217:26;;15289:9;15283:4;15279:20;15275:1;15264:9;15260:17;15253:47;15317:131;15443:4;15317:131;:::i;:::-;15309:139;;15207:248;;;:::o;15461:419::-;;15665:2;15654:9;15650:18;15642:26;;15714:9;15708:4;15704:20;15700:1;15689:9;15685:17;15678:47;15742:131;15868:4;15742:131;:::i;:::-;15734:139;;15632:248;;;:::o;15886:419::-;;16090:2;16079:9;16075:18;16067:26;;16139:9;16133:4;16129:20;16125:1;16114:9;16110:17;16103:47;16167:131;16293:4;16167:131;:::i;:::-;16159:139;;16057:248;;;:::o;16311:419::-;;16515:2;16504:9;16500:18;16492:26;;16564:9;16558:4;16554:20;16550:1;16539:9;16535:17;16528:47;16592:131;16718:4;16592:131;:::i;:::-;16584:139;;16482:248;;;:::o;16736:419::-;;16940:2;16929:9;16925:18;16917:26;;16989:9;16983:4;16979:20;16975:1;16964:9;16960:17;16953:47;17017:131;17143:4;17017:131;:::i;:::-;17009:139;;16907:248;;;:::o;17161:419::-;;17365:2;17354:9;17350:18;17342:26;;17414:9;17408:4;17404:20;17400:1;17389:9;17385:17;17378:47;17442:131;17568:4;17442:131;:::i;:::-;17434:139;;17332:248;;;:::o;17586:222::-;;17717:2;17706:9;17702:18;17694:26;;17730:71;17798:1;17787:9;17783:17;17774:6;17730:71;:::i;:::-;17684:124;;;;:::o;17814:214::-;;17941:2;17930:9;17926:18;17918:26;;17954:67;18018:1;18007:9;18003:17;17994:6;17954:67;:::i;:::-;17908:120;;;;:::o;18034:99::-;;18120:5;18114:12;18104:22;;18093:40;;;:::o;18139:169::-;;18257:6;18252:3;18245:19;18297:4;18292:3;18288:14;18273:29;;18235:73;;;;:::o;18314:305::-;;18373:20;18391:1;18373:20;:::i;:::-;18368:25;;18407:20;18425:1;18407:20;:::i;:::-;18402:25;;18561:1;18493:66;18489:74;18486:1;18483:81;18480:2;;;18567:18;;:::i;:::-;18480:2;18611:1;18608;18604:9;18597:16;;18358:261;;;;:::o;18625:848::-;;;18717:6;18708:15;;18741:5;18732:14;;18755:712;18776:1;18766:8;18763:15;18755:712;;;18871:4;18866:3;18862:14;18856:4;18853:24;18850:2;;;18880:18;;:::i;:::-;18850:2;18930:1;18920:8;18916:16;18913:2;;;19345:4;19338:5;19334:16;19325:25;;18913:2;19395:4;19389;19385:15;19377:23;;19425:32;19448:8;19425:32;:::i;:::-;19413:44;;18755:712;;;18698:775;;;;;;;:::o;19479:281::-;;19561:23;19579:4;19561:23;:::i;:::-;19553:31;;19605:25;19621:8;19605:25;:::i;:::-;19593:37;;19649:104;19686:66;19676:8;19670:4;19649:104;:::i;:::-;19640:113;;19543:217;;;;:::o;19766:1073::-;;20011:8;20001:2;;20032:1;20023:10;;20034:5;;20001:2;20060:4;20050:2;;20077:1;20068:10;;20079:5;;20050:2;20146:4;20194:1;20189:27;;;;20230:1;20225:191;;;;20139:277;;20189:27;20207:1;20198:10;;20209:5;;;20225:191;20270:3;20260:8;20257:17;20254:2;;;20277:18;;:::i;:::-;20254:2;20326:8;20323:1;20319:16;20310:25;;20361:3;20354:5;20351:14;20348:2;;;20368:18;;:::i;:::-;20348:2;20401:5;;;20139:277;;20525:2;20515:8;20512:16;20506:3;20500:4;20497:13;20493:36;20475:2;20465:8;20462:16;20457:2;20451:4;20448:12;20444:35;20428:111;20425:2;;;20581:8;20575:4;20571:19;20562:28;;20616:3;20609:5;20606:14;20603:2;;;20623:18;;:::i;:::-;20603:2;20656:5;;20425:2;20696:42;20734:3;20724:8;20718:4;20715:1;20696:42;:::i;:::-;20681:57;;;;20770:4;20765:3;20761:14;20754:5;20751:25;20748:2;;;20779:18;;:::i;:::-;20748:2;20828:4;20821:5;20817:16;20808:25;;19826:1013;;;;;;:::o;20845:348::-;;20908:20;20926:1;20908:20;:::i;:::-;20903:25;;20942:20;20960:1;20942:20;:::i;:::-;20937:25;;21130:1;21062:66;21058:74;21055:1;21052:81;21047:1;21040:9;21033:17;21029:105;21026:2;;;21137:18;;:::i;:::-;21026:2;21185:1;21182;21178:9;21167:20;;20893:300;;;;:::o;21199:96::-;;21265:24;21283:5;21265:24;:::i;:::-;21254:35;;21244:51;;;:::o;21301:90::-;;21378:5;21371:13;21364:21;21353:32;;21343:48;;;:::o;21397:126::-;;21474:42;21467:5;21463:54;21452:65;;21442:81;;;:::o;21529:77::-;;21595:5;21584:16;;21574:32;;;:::o;21612:86::-;;21687:4;21680:5;21676:16;21665:27;;21655:43;;;:::o;21704:176::-;;21812:62;21868:5;21812:62;:::i;:::-;21799:75;;21789:91;;;:::o;21886:138::-;;21994:24;22012:5;21994:24;:::i;:::-;21981:37;;21971:53;;;:::o;22030:307::-;22098:1;22108:113;22122:6;22119:1;22116:13;22108:113;;;22207:1;22202:3;22198:11;22192:18;22188:1;22183:3;22179:11;22172:39;22144:2;22141:1;22137:10;22132:15;;22108:113;;;22239:6;22236:1;22233:13;22230:2;;;22319:1;22310:6;22305:3;22301:16;22294:27;22230:2;22079:258;;;;:::o;22343:320::-;;22424:1;22418:4;22414:12;22404:22;;22471:1;22465:4;22461:12;22492:18;22482:2;;22548:4;22540:6;22536:17;22526:27;;22482:2;22610;22602:6;22599:14;22579:18;22576:38;22573:2;;;22629:18;;:::i;:::-;22573:2;22394:269;;;;:::o;22669:233::-;;22731:24;22749:5;22731:24;:::i;:::-;22722:33;;22777:66;22770:5;22767:77;22764:2;;;22847:18;;:::i;:::-;22764:2;22894:1;22887:5;22883:13;22876:20;;22712:190;;;:::o;22908:180::-;22956:77;22953:1;22946:88;23053:4;23050:1;23043:15;23077:4;23074:1;23067:15;23094:180;23142:77;23139:1;23132:88;23239:4;23236:1;23229:15;23263:4;23260:1;23253:15;23280:102;;23372:2;23368:7;23363:2;23356:5;23352:14;23348:28;23338:38;;23328:54;;;:::o;23388:102::-;;23477:5;23474:1;23470:13;23449:34;;23439:51;;;:::o;23496:122::-;23569:24;23587:5;23569:24;:::i;:::-;23562:5;23559:35;23549:2;;23608:1;23605;23598:12;23549:2;23539:79;:::o;23624:122::-;23697:24;23715:5;23697:24;:::i;:::-;23690:5;23687:35;23677:2;;23736:1;23733;23726:12;23677:2;23667:79;:::o

Swarm Source

ipfs://3812afe84e858dbf9a558c3c798217f309182776c0f1d1d7ad814657d9823455
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.