ETH Price: $3,424.47 (+2.35%)

Woofpack NFT (WPN)
 

Overview

TokenID

478

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
WoofpackNFTToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-07
*/

// File: contracts/utils/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b > a) return (false, 0);
            return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b == 0) return (false, 0);
            return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            if (b == 0) return (false, 0);
            return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            return a - b;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b > 0, errorMessage);
            return a % b;
    }
}



abstract contract Royalties {

    using SafeMath for uint256;

    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    uint256 private royalty_amount;
    address private creator;

    /**
    @notice This event is emitted when royalties are transfered.

    @dev The marketplace would emit this event from their contracts. Or they would call royaltiesRecieved() function.

    @param creator The original creator of the NFT entitled to the royalties
    @param buyer The person buying the NFT on a secondary sale
    @param amount The amount being paid to the creator
  */

    event RecievedRoyalties(
        address indexed creator,
        address indexed buyer,
        uint256 indexed amount
    );

    constructor(uint256 _amount, address _creator) internal {
        royalty_amount = _amount;
        creator = _creator;
    }

    function hasRoyalties() public pure returns (bool) {
        return true;
    }

    function royaltyAmount() public view returns (uint256) {
        return royalty_amount;
    }

    function royaltyInfo(uint256 /* _tokenId */, uint256 _salePrice) external view returns (uint256, address) {
        uint256 deductRoyalty = _salePrice.mul(royalty_amount).div(100);
        return (deductRoyalty, creator);
    }

    function royaltiesRecieved(
        address _creator,
        address _buyer,
        uint256 _amount
    ) external {
        emit RecievedRoyalties(_creator, _buyer, _amount);
    }
}



/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

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




abstract contract MinterRole is Context {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    constructor () internal {
        _addMinter(_msgSender());
    }

    modifier onlyMinter() {
        require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(_msgSender());
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}


/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



/**
 * @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 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 ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}



/**
 * @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 Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}


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


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// import "@openzeppelin/contracts/utils/math/SafeMath.sol";



contract WoofpackNFTToken is ERC721Enumerable, Ownable, Royalties , MinterRole{
    using Strings for uint256;
    using SafeMath for uint256;
    uint256 public tokenCounter;

    string public baseExtension = ".json";
    string public baseURI = "https://reveal-1st.s3.us-east-2.amazonaws.com/";

    uint256 private range1Start = 1;
    uint256 private range1End = 49;

    struct RenderToken {
        uint256 id;
        string uri;
    }

    event Mint(address indexed to, uint256 indexed tokenId);

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _amount,
        address payable _creator
    ) ERC721(_name, _symbol) Royalties(_amount, _creator) {}

    function mint(
        address _to,
        uint256 _mintAmount
    ) public onlyMinter returns (bool) {
        require(_mintAmount > 0, "WoofpackNFTToken: mintAmount should be > 0");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            tokenCounter++;

                 // check ranges
            if (tokenCounter >= range1Start && tokenCounter <= range1End)
                tokenCounter = range1End + 1;
            _safeMint(_to, tokenCounter);
            emit Mint(_to, tokenCounter);

        }

        return true;
    }


function mintHoldToken(address _to, uint256 _tokenId)
        public
        onlyMinter
        returns (bool)
    {
        require(
            isHold(_tokenId),
            'WoofpackNFTToken: This token is not reserved'
        );

        _safeMint(_to, _tokenId);

        emit Mint(_to, _tokenId);
        return true;
    }

    function mintHoldTokens(address _to, uint256[] memory _tokenIds)
        public
        onlyMinter
        returns (bool)
    {
        require(_tokenIds.length > 0, 'MintHoldTokens: Please provide token id');

        for (uint256 x = 0; x < _tokenIds.length; x++) {
            require(
                isHold(_tokenIds[x]),
                'MintHoldTokens: Some tokens are not reserved'
            );
        }

        for (uint256 y = 0; y < _tokenIds.length; y++) {
            _safeMint(_to, _tokenIds[y]);
            emit Mint(_to, _tokenIds[y]);
        }

        return true;
    }

    function isHold(uint256 _tokenId) public view returns (bool) {

        if(_exists(_tokenId)) return false;

        return _tokenId >= range1Start && _tokenId <= range1End;
    }


    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "WoofpackNFTToken: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_creator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","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":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecievedRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasRoyalties","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isHold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintHoldToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintHoldTokens","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"royaltiesRecieved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f9080519060200190620000519291906200043a565b506040518060600160405280602e8152602001620054b5602e913960109080519060200190620000839291906200043a565b50600160115560316012553480156200009b57600080fd5b50604051620054e3380380620054e38339818101604052810190620000c1919062000596565b818185858160009080519060200190620000dd9291906200043a565b508060019080519060200190620000f69291906200043a565b505050620001196200010d6200018d60201b60201c565b6200019560201b60201c565b81600b8190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000183620001776200018d60201b60201c565b6200025b60201b60201c565b5050505062000957565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200027681600d620002bc60201b620019721790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b620002ce82826200036f60201b60201c565b1562000311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003089062000694565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003da90620006b6565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200044890620007bc565b90600052602060002090601f0160209004810192826200046c5760008555620004b8565b82601f106200048757805160ff1916838001178555620004b8565b82800160010185558215620004b8579182015b82811115620004b75782518255916020019190600101906200049a565b5b509050620004c79190620004cb565b5090565b5b80821115620004e6576000816000905550600101620004cc565b5090565b600062000501620004fb8462000701565b620006d8565b90508281526020810184848401111562000520576200051f6200088b565b5b6200052d84828562000786565b509392505050565b600081519050620005468162000923565b92915050565b600082601f83011262000564576200056362000886565b5b815162000576848260208601620004ea565b91505092915050565b60008151905062000590816200093d565b92915050565b60008060008060808587031215620005b357620005b262000895565b5b600085015167ffffffffffffffff811115620005d457620005d362000890565b5b620005e2878288016200054c565b945050602085015167ffffffffffffffff81111562000606576200060562000890565b5b62000614878288016200054c565b935050604062000627878288016200057f565b92505060606200063a8782880162000535565b91505092959194509250565b600062000655601f8362000737565b91506200066282620008ab565b602082019050919050565b60006200067c60228362000737565b91506200068982620008d4565b604082019050919050565b60006020820190508181036000830152620006af8162000646565b9050919050565b60006020820190508181036000830152620006d1816200066d565b9050919050565b6000620006e4620006f7565b9050620006f28282620007f2565b919050565b6000604051905090565b600067ffffffffffffffff8211156200071f576200071e62000857565b5b6200072a826200089a565b9050602081019050919050565b600082825260208201905092915050565b600062000755826200075c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620007a657808201518184015260208101905062000789565b83811115620007b6576000848401525b50505050565b60006002820490506001821680620007d557607f821691505b60208210811415620007ec57620007eb62000828565b5b50919050565b620007fd826200089a565b810181811067ffffffffffffffff821117156200081f576200081e62000857565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6200092e8162000748565b81146200093a57600080fd5b50565b62000948816200077c565b81146200095457600080fd5b50565b614b4e80620009676000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063715018a611610125578063aa271e1a116100ad578063c87b56dd1161007c578063c87b56dd14610676578063d082e381146106a6578063da3ef23f146106c4578063e985e9c5146106e0578063f2fde38b146107105761021c565b8063aa271e1a146105dc578063b88d4fde1461060c578063c668286214610628578063c726ad4b146106465761021c565b80638da5cb5b116100f45780638da5cb5b1461055e57806395d89b411461057c578063983b2d561461059a57806398650275146105b6578063a22cb465146105c05761021c565b8063715018a6146104ea5780637c6e551d146104f457806384a09c27146105125780638a43eb441461052e5761021c565b806342842e0e116101a85780636352211e116101775780636352211e1461041e578063656605d61461044e5780636886b9961461046c5780636c0360eb1461049c57806370a08231146104ba5761021c565b806342842e0e14610386578063438b6300146103a25780634f6ccce7146103d257806355f804b3146104025761021c565b806318160ddd116101ef57806318160ddd146102bb57806323b872dd146102d95780632a55205a146102f55780632f745c591461032657806340c10f19146103565761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b60048036038101906102369190613357565b61072c565b6040516102489190613a83565b60405180910390f35b6102596107a6565b6040516102669190613a9e565b60405180910390f35b610289600480360381019061028491906133fa565b610838565b60405161029691906139fa565b60405180910390f35b6102b960048036038101906102b49190613317565b6108bd565b005b6102c36109d5565b6040516102d09190613e00565b60405180910390f35b6102f360048036038101906102ee91906131a5565b6109e2565b005b61030f600480360381019061030a9190613427565b610a42565b60405161031d929190613e1b565b60405180910390f35b610340600480360381019061033b9190613317565b610aa1565b60405161034d9190613e00565b60405180910390f35b610370600480360381019061036b9190613317565b610b46565b60405161037d9190613a83565b60405180910390f35b6103a0600480360381019061039b91906131a5565b610ca3565b005b6103bc60048036038101906103b79190613138565b610cc3565b6040516103c99190613a61565b60405180910390f35b6103ec60048036038101906103e791906133fa565b610d71565b6040516103f99190613e00565b60405180910390f35b61041c600480360381019061041791906133b1565b610de2565b005b610438600480360381019061043391906133fa565b610e78565b60405161044591906139fa565b60405180910390f35b610456610f2a565b6040516104639190613a83565b60405180910390f35b61048660048036038101906104819190613317565b610f33565b6040516104939190613a83565b60405180910390f35b6104a4611024565b6040516104b19190613a9e565b60405180910390f35b6104d460048036038101906104cf9190613138565b6110b2565b6040516104e19190613e00565b60405180910390f35b6104f261116a565b005b6104fc6111f2565b6040516105099190613e00565b60405180910390f35b61052c600480360381019061052791906131a5565b6111fc565b005b610548600480360381019061054391906133fa565b61125c565b6040516105559190613a83565b60405180910390f35b610566611291565b60405161057391906139fa565b60405180910390f35b6105846112bb565b6040516105919190613a9e565b60405180910390f35b6105b460048036038101906105af9190613138565b61134d565b005b6105be6113a8565b005b6105da60048036038101906105d591906132d7565b6113ba565b005b6105f660048036038101906105f19190613138565b6113d0565b6040516106039190613a83565b60405180910390f35b610626600480360381019061062191906131f8565b6113ed565b005b61063061144f565b60405161063d9190613a9e565b60405180910390f35b610660600480360381019061065b919061327b565b6114dd565b60405161066d9190613a83565b60405180910390f35b610690600480360381019061068b91906133fa565b6116a0565b60405161069d9190613a9e565b60405180910390f35b6106ae61174a565b6040516106bb9190613e00565b60405180910390f35b6106de60048036038101906106d991906133b1565b611750565b005b6106fa60048036038101906106f59190613165565b6117e6565b6040516107079190613a83565b60405180910390f35b61072a60048036038101906107259190613138565b61187a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079f575061079e82611a1a565b5b9050919050565b6060600080546107b590614153565b80601f01602080910402602001604051908101604052809291908181526020018280546107e190614153565b801561082e5780601f106108035761010080835404028352916020019161082e565b820191906000526020600020905b81548152906001019060200180831161081157829003601f168201915b5050505050905090565b600061084382611afc565b610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613d00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c882610e78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613da0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610958611b68565b73ffffffffffffffffffffffffffffffffffffffff161480610987575061098681610981611b68565b6117e6565b5b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613c20565b60405180910390fd5b6109d08383611b70565b505050565b6000600880549050905090565b6109f36109ed611b68565b82611c29565b610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990613dc0565b60405180910390fd5b610a3d838383611d07565b505050565b6000806000610a6f6064610a61600b5487611f6390919063ffffffff16565b611f7990919063ffffffff16565b905080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692509250509250929050565b6000610aac836110b2565b8210610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490613b20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b58610b53611b68565b6113d0565b610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90613c80565b60405180910390fd5b60008211610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190613b60565b60405180910390fd5b6000600190505b828111610c9857600e6000815480929190610bfb906141b6565b9190505550601154600e5410158015610c185750601254600e5411155b15610c33576001601254610c2c9190613f88565b600e819055505b610c3f84600e54611f8f565b600e548473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a38080610c90906141b6565b915050610be1565b506001905092915050565b610cbe838383604051806020016040528060008152506113ed565b505050565b60606000610cd0836110b2565b905060008167ffffffffffffffff811115610cee57610ced61431b565b5b604051908082528060200260200182016040528015610d1c5781602001602082028036833780820191505090505b50905060005b82811015610d6657610d348582610aa1565b828281518110610d4757610d466142ec565b5b6020026020010181815250508080610d5e906141b6565b915050610d22565b508092505050919050565b6000610d7b6109d5565b8210610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390613de0565b60405180910390fd5b60088281548110610dd057610dcf6142ec565b5b90600052602060002001549050919050565b610dea611b68565b73ffffffffffffffffffffffffffffffffffffffff16610e08611291565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5590613d40565b60405180910390fd5b8060109080519060200190610e74929190612eae565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613c60565b60405180910390fd5b80915050919050565b60006001905090565b6000610f45610f40611b68565b6113d0565b610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613c80565b60405180910390fd5b610f8d8261125c565b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613d20565b60405180910390fd5b610fd68383611f8f565b818373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001905092915050565b6010805461103190614153565b80601f016020809104026020016040519081016040528092919081815260200182805461105d90614153565b80156110aa5780601f1061107f576101008083540402835291602001916110aa565b820191906000526020600020905b81548152906001019060200180831161108d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613c40565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611172611b68565b73ffffffffffffffffffffffffffffffffffffffff16611190611291565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613d40565b60405180910390fd5b6111f06000611fad565b565b6000600b54905090565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f06cb0b9d04d0ac2a93b9b9a93ee6c2511e069efb107c06eee43c85021fbc04ed60405160405180910390a4505050565b600061126782611afc565b15611275576000905061128c565b601154821015801561128957506012548211155b90505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112ca90614153565b80601f01602080910402602001604051908101604052809291908181526020018280546112f690614153565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b5050505050905090565b61135d611358611b68565b6113d0565b61139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390613c80565b60405180910390fd5b6113a581612073565b50565b6113b86113b3611b68565b6120cd565b565b6113cc6113c5611b68565b8383612127565b5050565b60006113e682600d61229490919063ffffffff16565b9050919050565b6113fe6113f8611b68565b83611c29565b61143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490613dc0565b60405180910390fd5b6114498484848461235c565b50505050565b600f805461145c90614153565b80601f016020809104026020016040519081016040528092919081815260200182805461148890614153565b80156114d55780601f106114aa576101008083540402835291602001916114d5565b820191906000526020600020905b8154815290600101906020018083116114b857829003601f168201915b505050505081565b60006114ef6114ea611b68565b6113d0565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613c80565b60405180910390fd5b6000825111611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156990613ac0565b60405180910390fd5b60005b82518110156115f3576115a1838281518110611594576115936142ec565b5b602002602001015161125c565b6115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613b00565b60405180910390fd5b80806115eb906141b6565b915050611575565b5060005b82518110156116955761162484848381518110611617576116166142ec565b5b6020026020010151611f8f565b828181518110611637576116366142ec565b5b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3808061168d906141b6565b9150506115f7565b506001905092915050565b60606116ab82611afc565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613ce0565b60405180910390fd5b60006116f46123b8565b905060008151116117145760405180602001604052806000815250611742565b8061171e8461244a565b600f604051602001611732939291906139c9565b6040516020818303038152906040525b915050919050565b600e5481565b611758611b68565b73ffffffffffffffffffffffffffffffffffffffff16611776611291565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390613d40565b60405180910390fd5b80600f90805190602001906117e2929190612eae565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611882611b68565b73ffffffffffffffffffffffffffffffffffffffff166118a0611291565b73ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613d40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90613b80565b60405180910390fd5b61196f81611fad565b50565b61197c8282612294565b156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae0565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ae557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611af55750611af4826125ab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be383610e78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3482611afc565b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90613c00565b60405180910390fd5b6000611c7e83610e78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ced57508373ffffffffffffffffffffffffffffffffffffffff16611cd584610838565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cfe5750611cfd81856117e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2782610e78565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613d80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490613bc0565b60405180910390fd5b611df8838383612615565b611e03600082611b70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190614069565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eaa9190613f88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611f71919061400f565b905092915050565b60008183611f879190613fde565b905092915050565b611fa9828260405180602001604052806000815250612729565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61208781600d61197290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6120e181600d61278490919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90613be0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122879190613a83565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90613d60565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612367848484611d07565b6123738484848461282b565b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990613b40565b60405180910390fd5b50505050565b6060601080546123c790614153565b80601f01602080910402602001604051908101604052809291908181526020018280546123f390614153565b80156124405780601f1061241557610100808354040283529160200191612440565b820191906000526020600020905b81548152906001019060200180831161242357829003601f168201915b5050505050905090565b60606000821415612492576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125a6565b600082905060005b600082146124c45780806124ad906141b6565b915050600a826124bd9190613fde565b915061249a565b60008167ffffffffffffffff8111156124e0576124df61431b565b5b6040519080825280601f01601f1916602001820160405280156125125781602001600182028036833780820191505090505b5090505b6000851461259f5760018261252b9190614069565b9150600a8561253a91906141ff565b60306125469190613f88565b60f81b81838151811061255c5761255b6142ec565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125989190613fde565b9450612516565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126208383836129c2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126635761265e816129c7565b6126a2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a1576126a08382612a10565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e5576126e081612b7d565b612724565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612723576127228282612c4e565b5b5b505050565b6127338383612ccd565b612740600084848461282b565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277690613b40565b60405180910390fd5b505050565b61278e8282612294565b6127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490613ca0565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061284c8473ffffffffffffffffffffffffffffffffffffffff16612e9b565b156129b5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612875611b68565b8786866040518563ffffffff1660e01b81526004016128979493929190613a15565b602060405180830381600087803b1580156128b157600080fd5b505af19250505080156128e257506040513d601f19601f820116820180604052508101906128df9190613384565b60015b612965573d8060008114612912576040519150601f19603f3d011682016040523d82523d6000602084013e612917565b606091505b5060008151141561295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613b40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ba565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1d846110b2565b612a279190614069565b9050600060076000848152602001908152602001600020549050818114612b0c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b919190614069565b9050600060096000848152602001908152602001600020549050600060088381548110612bc157612bc06142ec565b5b906000526020600020015490508060088381548110612be357612be26142ec565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3257612c316142bd565b5b6001900381819060005260206000200160009055905550505050565b6000612c59836110b2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3490613cc0565b60405180910390fd5b612d4681611afc565b15612d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7d90613ba0565b60405180910390fd5b612d9260008383612615565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de29190613f88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612eba90614153565b90600052602060002090601f016020900481019282612edc5760008555612f23565b82601f10612ef557805160ff1916838001178555612f23565b82800160010185558215612f23579182015b82811115612f22578251825591602001919060010190612f07565b5b509050612f309190612f34565b5090565b5b80821115612f4d576000816000905550600101612f35565b5090565b6000612f64612f5f84613e69565b613e44565b90508083825260208201905082856020860282011115612f8757612f8661434f565b5b60005b85811015612fb75781612f9d8882613123565b845260208401935060208301925050600181019050612f8a565b5050509392505050565b6000612fd4612fcf84613e95565b613e44565b905082815260208101848484011115612ff057612fef614354565b5b612ffb848285614111565b509392505050565b600061301661301184613ec6565b613e44565b90508281526020810184848401111561303257613031614354565b5b61303d848285614111565b509392505050565b60008135905061305481614abc565b92915050565b600082601f83011261306f5761306e61434a565b5b813561307f848260208601612f51565b91505092915050565b60008135905061309781614ad3565b92915050565b6000813590506130ac81614aea565b92915050565b6000815190506130c181614aea565b92915050565b600082601f8301126130dc576130db61434a565b5b81356130ec848260208601612fc1565b91505092915050565b600082601f83011261310a5761310961434a565b5b813561311a848260208601613003565b91505092915050565b60008135905061313281614b01565b92915050565b60006020828403121561314e5761314d61435e565b5b600061315c84828501613045565b91505092915050565b6000806040838503121561317c5761317b61435e565b5b600061318a85828601613045565b925050602061319b85828601613045565b9150509250929050565b6000806000606084860312156131be576131bd61435e565b5b60006131cc86828701613045565b93505060206131dd86828701613045565b92505060406131ee86828701613123565b9150509250925092565b600080600080608085870312156132125761321161435e565b5b600061322087828801613045565b945050602061323187828801613045565b935050604061324287828801613123565b925050606085013567ffffffffffffffff81111561326357613262614359565b5b61326f878288016130c7565b91505092959194509250565b600080604083850312156132925761329161435e565b5b60006132a085828601613045565b925050602083013567ffffffffffffffff8111156132c1576132c0614359565b5b6132cd8582860161305a565b9150509250929050565b600080604083850312156132ee576132ed61435e565b5b60006132fc85828601613045565b925050602061330d85828601613088565b9150509250929050565b6000806040838503121561332e5761332d61435e565b5b600061333c85828601613045565b925050602061334d85828601613123565b9150509250929050565b60006020828403121561336d5761336c61435e565b5b600061337b8482850161309d565b91505092915050565b60006020828403121561339a5761339961435e565b5b60006133a8848285016130b2565b91505092915050565b6000602082840312156133c7576133c661435e565b5b600082013567ffffffffffffffff8111156133e5576133e4614359565b5b6133f1848285016130f5565b91505092915050565b6000602082840312156134105761340f61435e565b5b600061341e84828501613123565b91505092915050565b6000806040838503121561343e5761343d61435e565b5b600061344c85828601613123565b925050602061345d85828601613123565b9150509250929050565b600061347383836139ab565b60208301905092915050565b6134888161409d565b82525050565b600061349982613f1c565b6134a38185613f4a565b93506134ae83613ef7565b8060005b838110156134df5781516134c68882613467565b97506134d183613f3d565b9250506001810190506134b2565b5085935050505092915050565b6134f5816140af565b82525050565b600061350682613f27565b6135108185613f5b565b9350613520818560208601614120565b61352981614363565b840191505092915050565b600061353f82613f32565b6135498185613f6c565b9350613559818560208601614120565b61356281614363565b840191505092915050565b600061357882613f32565b6135828185613f7d565b9350613592818560208601614120565b80840191505092915050565b600081546135ab81614153565b6135b58186613f7d565b945060018216600081146135d057600181146135e157613614565b60ff19831686528186019350613614565b6135ea85613f07565b60005b8381101561360c578154818901526001820191506020810190506135ed565b838801955050505b50505092915050565b600061362a602783613f6c565b915061363582614374565b604082019050919050565b600061364d601f83613f6c565b9150613658826143c3565b602082019050919050565b6000613670602c83613f6c565b915061367b826143ec565b604082019050919050565b6000613693602b83613f6c565b915061369e8261443b565b604082019050919050565b60006136b6603283613f6c565b91506136c18261448a565b604082019050919050565b60006136d9602a83613f6c565b91506136e4826144d9565b604082019050919050565b60006136fc602683613f6c565b915061370782614528565b604082019050919050565b600061371f601c83613f6c565b915061372a82614577565b602082019050919050565b6000613742602483613f6c565b915061374d826145a0565b604082019050919050565b6000613765601983613f6c565b9150613770826145ef565b602082019050919050565b6000613788602c83613f6c565b915061379382614618565b604082019050919050565b60006137ab603883613f6c565b91506137b682614667565b604082019050919050565b60006137ce602a83613f6c565b91506137d9826146b6565b604082019050919050565b60006137f1602983613f6c565b91506137fc82614705565b604082019050919050565b6000613814603083613f6c565b915061381f82614754565b604082019050919050565b6000613837602183613f6c565b9150613842826147a3565b604082019050919050565b600061385a602083613f6c565b9150613865826147f2565b602082019050919050565b600061387d603183613f6c565b91506138888261481b565b604082019050919050565b60006138a0602c83613f6c565b91506138ab8261486a565b604082019050919050565b60006138c3602c83613f6c565b91506138ce826148b9565b604082019050919050565b60006138e6602083613f6c565b91506138f182614908565b602082019050919050565b6000613909602283613f6c565b915061391482614931565b604082019050919050565b600061392c602983613f6c565b915061393782614980565b604082019050919050565b600061394f602183613f6c565b915061395a826149cf565b604082019050919050565b6000613972603183613f6c565b915061397d82614a1e565b604082019050919050565b6000613995602c83613f6c565b91506139a082614a6d565b604082019050919050565b6139b481614107565b82525050565b6139c381614107565b82525050565b60006139d5828661356d565b91506139e1828561356d565b91506139ed828461359e565b9150819050949350505050565b6000602082019050613a0f600083018461347f565b92915050565b6000608082019050613a2a600083018761347f565b613a37602083018661347f565b613a4460408301856139ba565b8181036060830152613a5681846134fb565b905095945050505050565b60006020820190508181036000830152613a7b818461348e565b905092915050565b6000602082019050613a9860008301846134ec565b92915050565b60006020820190508181036000830152613ab88184613534565b905092915050565b60006020820190508181036000830152613ad98161361d565b9050919050565b60006020820190508181036000830152613af981613640565b9050919050565b60006020820190508181036000830152613b1981613663565b9050919050565b60006020820190508181036000830152613b3981613686565b9050919050565b60006020820190508181036000830152613b59816136a9565b9050919050565b60006020820190508181036000830152613b79816136cc565b9050919050565b60006020820190508181036000830152613b99816136ef565b9050919050565b60006020820190508181036000830152613bb981613712565b9050919050565b60006020820190508181036000830152613bd981613735565b9050919050565b60006020820190508181036000830152613bf981613758565b9050919050565b60006020820190508181036000830152613c198161377b565b9050919050565b60006020820190508181036000830152613c398161379e565b9050919050565b60006020820190508181036000830152613c59816137c1565b9050919050565b60006020820190508181036000830152613c79816137e4565b9050919050565b60006020820190508181036000830152613c9981613807565b9050919050565b60006020820190508181036000830152613cb98161382a565b9050919050565b60006020820190508181036000830152613cd98161384d565b9050919050565b60006020820190508181036000830152613cf981613870565b9050919050565b60006020820190508181036000830152613d1981613893565b9050919050565b60006020820190508181036000830152613d39816138b6565b9050919050565b60006020820190508181036000830152613d59816138d9565b9050919050565b60006020820190508181036000830152613d79816138fc565b9050919050565b60006020820190508181036000830152613d998161391f565b9050919050565b60006020820190508181036000830152613db981613942565b9050919050565b60006020820190508181036000830152613dd981613965565b9050919050565b60006020820190508181036000830152613df981613988565b9050919050565b6000602082019050613e1560008301846139ba565b92915050565b6000604082019050613e3060008301856139ba565b613e3d602083018461347f565b9392505050565b6000613e4e613e5f565b9050613e5a8282614185565b919050565b6000604051905090565b600067ffffffffffffffff821115613e8457613e8361431b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613eb057613eaf61431b565b5b613eb982614363565b9050602081019050919050565b600067ffffffffffffffff821115613ee157613ee061431b565b5b613eea82614363565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f9382614107565b9150613f9e83614107565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fd357613fd2614230565b5b828201905092915050565b6000613fe982614107565b9150613ff483614107565b9250826140045761400361425f565b5b828204905092915050565b600061401a82614107565b915061402583614107565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405e5761405d614230565b5b828202905092915050565b600061407482614107565b915061407f83614107565b92508282101561409257614091614230565b5b828203905092915050565b60006140a8826140e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561413e578082015181840152602081019050614123565b8381111561414d576000848401525b50505050565b6000600282049050600182168061416b57607f821691505b6020821081141561417f5761417e61428e565b5b50919050565b61418e82614363565b810181811067ffffffffffffffff821117156141ad576141ac61431b565b5b80604052505050565b60006141c182614107565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141f4576141f3614230565b5b600182019050919050565b600061420a82614107565b915061421583614107565b9250826142255761422461425f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74486f6c64546f6b656e733a20506c656173652070726f76696465207460008201527f6f6b656e20696400000000000000000000000000000000000000000000000000602082015250565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b7f4d696e74486f6c64546f6b656e733a20536f6d6520746f6b656e73206172652060008201527f6e6f742072657365727665640000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f576f6f667061636b4e4654546f6b656e3a206d696e74416d6f756e742073686f60008201527f756c64206265203e203000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766560008201527f20746865204d696e74657220726f6c6500000000000000000000000000000000602082015250565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f576f6f667061636b4e4654546f6b656e3a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f576f6f667061636b4e4654546f6b656e3a205468697320746f6b656e2069732060008201527f6e6f742072657365727665640000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614ac58161409d565b8114614ad057600080fd5b50565b614adc816140af565b8114614ae757600080fd5b50565b614af3816140bb565b8114614afe57600080fd5b50565b614b0a81614107565b8114614b1557600080fd5b5056fea26469706673582212207650e3e0685d1da6e28b9254d11c8157a32e4af081e842727f6450b8fcf1431164736f6c6343000807003368747470733a2f2f72657665616c2d3173742e73332e75732d656173742d322e616d617a6f6e6177732e636f6d2f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000ead48c7797ccfd37176241767485922ee69a6c19000000000000000000000000000000000000000000000000000000000000000c576f6f667061636b204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357504e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063715018a611610125578063aa271e1a116100ad578063c87b56dd1161007c578063c87b56dd14610676578063d082e381146106a6578063da3ef23f146106c4578063e985e9c5146106e0578063f2fde38b146107105761021c565b8063aa271e1a146105dc578063b88d4fde1461060c578063c668286214610628578063c726ad4b146106465761021c565b80638da5cb5b116100f45780638da5cb5b1461055e57806395d89b411461057c578063983b2d561461059a57806398650275146105b6578063a22cb465146105c05761021c565b8063715018a6146104ea5780637c6e551d146104f457806384a09c27146105125780638a43eb441461052e5761021c565b806342842e0e116101a85780636352211e116101775780636352211e1461041e578063656605d61461044e5780636886b9961461046c5780636c0360eb1461049c57806370a08231146104ba5761021c565b806342842e0e14610386578063438b6300146103a25780634f6ccce7146103d257806355f804b3146104025761021c565b806318160ddd116101ef57806318160ddd146102bb57806323b872dd146102d95780632a55205a146102f55780632f745c591461032657806340c10f19146103565761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b60048036038101906102369190613357565b61072c565b6040516102489190613a83565b60405180910390f35b6102596107a6565b6040516102669190613a9e565b60405180910390f35b610289600480360381019061028491906133fa565b610838565b60405161029691906139fa565b60405180910390f35b6102b960048036038101906102b49190613317565b6108bd565b005b6102c36109d5565b6040516102d09190613e00565b60405180910390f35b6102f360048036038101906102ee91906131a5565b6109e2565b005b61030f600480360381019061030a9190613427565b610a42565b60405161031d929190613e1b565b60405180910390f35b610340600480360381019061033b9190613317565b610aa1565b60405161034d9190613e00565b60405180910390f35b610370600480360381019061036b9190613317565b610b46565b60405161037d9190613a83565b60405180910390f35b6103a0600480360381019061039b91906131a5565b610ca3565b005b6103bc60048036038101906103b79190613138565b610cc3565b6040516103c99190613a61565b60405180910390f35b6103ec60048036038101906103e791906133fa565b610d71565b6040516103f99190613e00565b60405180910390f35b61041c600480360381019061041791906133b1565b610de2565b005b610438600480360381019061043391906133fa565b610e78565b60405161044591906139fa565b60405180910390f35b610456610f2a565b6040516104639190613a83565b60405180910390f35b61048660048036038101906104819190613317565b610f33565b6040516104939190613a83565b60405180910390f35b6104a4611024565b6040516104b19190613a9e565b60405180910390f35b6104d460048036038101906104cf9190613138565b6110b2565b6040516104e19190613e00565b60405180910390f35b6104f261116a565b005b6104fc6111f2565b6040516105099190613e00565b60405180910390f35b61052c600480360381019061052791906131a5565b6111fc565b005b610548600480360381019061054391906133fa565b61125c565b6040516105559190613a83565b60405180910390f35b610566611291565b60405161057391906139fa565b60405180910390f35b6105846112bb565b6040516105919190613a9e565b60405180910390f35b6105b460048036038101906105af9190613138565b61134d565b005b6105be6113a8565b005b6105da60048036038101906105d591906132d7565b6113ba565b005b6105f660048036038101906105f19190613138565b6113d0565b6040516106039190613a83565b60405180910390f35b610626600480360381019061062191906131f8565b6113ed565b005b61063061144f565b60405161063d9190613a9e565b60405180910390f35b610660600480360381019061065b919061327b565b6114dd565b60405161066d9190613a83565b60405180910390f35b610690600480360381019061068b91906133fa565b6116a0565b60405161069d9190613a9e565b60405180910390f35b6106ae61174a565b6040516106bb9190613e00565b60405180910390f35b6106de60048036038101906106d991906133b1565b611750565b005b6106fa60048036038101906106f59190613165565b6117e6565b6040516107079190613a83565b60405180910390f35b61072a60048036038101906107259190613138565b61187a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079f575061079e82611a1a565b5b9050919050565b6060600080546107b590614153565b80601f01602080910402602001604051908101604052809291908181526020018280546107e190614153565b801561082e5780601f106108035761010080835404028352916020019161082e565b820191906000526020600020905b81548152906001019060200180831161081157829003601f168201915b5050505050905090565b600061084382611afc565b610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613d00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c882610e78565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613da0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610958611b68565b73ffffffffffffffffffffffffffffffffffffffff161480610987575061098681610981611b68565b6117e6565b5b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613c20565b60405180910390fd5b6109d08383611b70565b505050565b6000600880549050905090565b6109f36109ed611b68565b82611c29565b610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990613dc0565b60405180910390fd5b610a3d838383611d07565b505050565b6000806000610a6f6064610a61600b5487611f6390919063ffffffff16565b611f7990919063ffffffff16565b905080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692509250509250929050565b6000610aac836110b2565b8210610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490613b20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610b58610b53611b68565b6113d0565b610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90613c80565b60405180910390fd5b60008211610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190613b60565b60405180910390fd5b6000600190505b828111610c9857600e6000815480929190610bfb906141b6565b9190505550601154600e5410158015610c185750601254600e5411155b15610c33576001601254610c2c9190613f88565b600e819055505b610c3f84600e54611f8f565b600e548473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a38080610c90906141b6565b915050610be1565b506001905092915050565b610cbe838383604051806020016040528060008152506113ed565b505050565b60606000610cd0836110b2565b905060008167ffffffffffffffff811115610cee57610ced61431b565b5b604051908082528060200260200182016040528015610d1c5781602001602082028036833780820191505090505b50905060005b82811015610d6657610d348582610aa1565b828281518110610d4757610d466142ec565b5b6020026020010181815250508080610d5e906141b6565b915050610d22565b508092505050919050565b6000610d7b6109d5565b8210610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390613de0565b60405180910390fd5b60088281548110610dd057610dcf6142ec565b5b90600052602060002001549050919050565b610dea611b68565b73ffffffffffffffffffffffffffffffffffffffff16610e08611291565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5590613d40565b60405180910390fd5b8060109080519060200190610e74929190612eae565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613c60565b60405180910390fd5b80915050919050565b60006001905090565b6000610f45610f40611b68565b6113d0565b610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613c80565b60405180910390fd5b610f8d8261125c565b610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613d20565b60405180910390fd5b610fd68383611f8f565b818373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001905092915050565b6010805461103190614153565b80601f016020809104026020016040519081016040528092919081815260200182805461105d90614153565b80156110aa5780601f1061107f576101008083540402835291602001916110aa565b820191906000526020600020905b81548152906001019060200180831161108d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613c40565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611172611b68565b73ffffffffffffffffffffffffffffffffffffffff16611190611291565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613d40565b60405180910390fd5b6111f06000611fad565b565b6000600b54905090565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f06cb0b9d04d0ac2a93b9b9a93ee6c2511e069efb107c06eee43c85021fbc04ed60405160405180910390a4505050565b600061126782611afc565b15611275576000905061128c565b601154821015801561128957506012548211155b90505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112ca90614153565b80601f01602080910402602001604051908101604052809291908181526020018280546112f690614153565b80156113435780601f1061131857610100808354040283529160200191611343565b820191906000526020600020905b81548152906001019060200180831161132657829003601f168201915b5050505050905090565b61135d611358611b68565b6113d0565b61139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390613c80565b60405180910390fd5b6113a581612073565b50565b6113b86113b3611b68565b6120cd565b565b6113cc6113c5611b68565b8383612127565b5050565b60006113e682600d61229490919063ffffffff16565b9050919050565b6113fe6113f8611b68565b83611c29565b61143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490613dc0565b60405180910390fd5b6114498484848461235c565b50505050565b600f805461145c90614153565b80601f016020809104026020016040519081016040528092919081815260200182805461148890614153565b80156114d55780601f106114aa576101008083540402835291602001916114d5565b820191906000526020600020905b8154815290600101906020018083116114b857829003601f168201915b505050505081565b60006114ef6114ea611b68565b6113d0565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613c80565b60405180910390fd5b6000825111611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156990613ac0565b60405180910390fd5b60005b82518110156115f3576115a1838281518110611594576115936142ec565b5b602002602001015161125c565b6115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613b00565b60405180910390fd5b80806115eb906141b6565b915050611575565b5060005b82518110156116955761162484848381518110611617576116166142ec565b5b6020026020010151611f8f565b828181518110611637576116366142ec565b5b60200260200101518473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a3808061168d906141b6565b9150506115f7565b506001905092915050565b60606116ab82611afc565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613ce0565b60405180910390fd5b60006116f46123b8565b905060008151116117145760405180602001604052806000815250611742565b8061171e8461244a565b600f604051602001611732939291906139c9565b6040516020818303038152906040525b915050919050565b600e5481565b611758611b68565b73ffffffffffffffffffffffffffffffffffffffff16611776611291565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390613d40565b60405180910390fd5b80600f90805190602001906117e2929190612eae565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611882611b68565b73ffffffffffffffffffffffffffffffffffffffff166118a0611291565b73ffffffffffffffffffffffffffffffffffffffff16146118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613d40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90613b80565b60405180910390fd5b61196f81611fad565b50565b61197c8282612294565b156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613ae0565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ae557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611af55750611af4826125ab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be383610e78565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3482611afc565b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90613c00565b60405180910390fd5b6000611c7e83610e78565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ced57508373ffffffffffffffffffffffffffffffffffffffff16611cd584610838565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cfe5750611cfd81856117e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2782610e78565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613d80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490613bc0565b60405180910390fd5b611df8838383612615565b611e03600082611b70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190614069565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eaa9190613f88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611f71919061400f565b905092915050565b60008183611f879190613fde565b905092915050565b611fa9828260405180602001604052806000815250612729565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61208781600d61197290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6120e181600d61278490919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90613be0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122879190613a83565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90613d60565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612367848484611d07565b6123738484848461282b565b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990613b40565b60405180910390fd5b50505050565b6060601080546123c790614153565b80601f01602080910402602001604051908101604052809291908181526020018280546123f390614153565b80156124405780601f1061241557610100808354040283529160200191612440565b820191906000526020600020905b81548152906001019060200180831161242357829003601f168201915b5050505050905090565b60606000821415612492576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125a6565b600082905060005b600082146124c45780806124ad906141b6565b915050600a826124bd9190613fde565b915061249a565b60008167ffffffffffffffff8111156124e0576124df61431b565b5b6040519080825280601f01601f1916602001820160405280156125125781602001600182028036833780820191505090505b5090505b6000851461259f5760018261252b9190614069565b9150600a8561253a91906141ff565b60306125469190613f88565b60f81b81838151811061255c5761255b6142ec565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125989190613fde565b9450612516565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126208383836129c2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126635761265e816129c7565b6126a2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a1576126a08382612a10565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e5576126e081612b7d565b612724565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612723576127228282612c4e565b5b5b505050565b6127338383612ccd565b612740600084848461282b565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277690613b40565b60405180910390fd5b505050565b61278e8282612294565b6127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490613ca0565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061284c8473ffffffffffffffffffffffffffffffffffffffff16612e9b565b156129b5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612875611b68565b8786866040518563ffffffff1660e01b81526004016128979493929190613a15565b602060405180830381600087803b1580156128b157600080fd5b505af19250505080156128e257506040513d601f19601f820116820180604052508101906128df9190613384565b60015b612965573d8060008114612912576040519150601f19603f3d011682016040523d82523d6000602084013e612917565b606091505b5060008151141561295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613b40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129ba565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1d846110b2565b612a279190614069565b9050600060076000848152602001908152602001600020549050818114612b0c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b919190614069565b9050600060096000848152602001908152602001600020549050600060088381548110612bc157612bc06142ec565b5b906000526020600020015490508060088381548110612be357612be26142ec565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3257612c316142bd565b5b6001900381819060005260206000200160009055905550505050565b6000612c59836110b2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3490613cc0565b60405180910390fd5b612d4681611afc565b15612d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7d90613ba0565b60405180910390fd5b612d9260008383612615565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de29190613f88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612eba90614153565b90600052602060002090601f016020900481019282612edc5760008555612f23565b82601f10612ef557805160ff1916838001178555612f23565b82800160010185558215612f23579182015b82811115612f22578251825591602001919060010190612f07565b5b509050612f309190612f34565b5090565b5b80821115612f4d576000816000905550600101612f35565b5090565b6000612f64612f5f84613e69565b613e44565b90508083825260208201905082856020860282011115612f8757612f8661434f565b5b60005b85811015612fb75781612f9d8882613123565b845260208401935060208301925050600181019050612f8a565b5050509392505050565b6000612fd4612fcf84613e95565b613e44565b905082815260208101848484011115612ff057612fef614354565b5b612ffb848285614111565b509392505050565b600061301661301184613ec6565b613e44565b90508281526020810184848401111561303257613031614354565b5b61303d848285614111565b509392505050565b60008135905061305481614abc565b92915050565b600082601f83011261306f5761306e61434a565b5b813561307f848260208601612f51565b91505092915050565b60008135905061309781614ad3565b92915050565b6000813590506130ac81614aea565b92915050565b6000815190506130c181614aea565b92915050565b600082601f8301126130dc576130db61434a565b5b81356130ec848260208601612fc1565b91505092915050565b600082601f83011261310a5761310961434a565b5b813561311a848260208601613003565b91505092915050565b60008135905061313281614b01565b92915050565b60006020828403121561314e5761314d61435e565b5b600061315c84828501613045565b91505092915050565b6000806040838503121561317c5761317b61435e565b5b600061318a85828601613045565b925050602061319b85828601613045565b9150509250929050565b6000806000606084860312156131be576131bd61435e565b5b60006131cc86828701613045565b93505060206131dd86828701613045565b92505060406131ee86828701613123565b9150509250925092565b600080600080608085870312156132125761321161435e565b5b600061322087828801613045565b945050602061323187828801613045565b935050604061324287828801613123565b925050606085013567ffffffffffffffff81111561326357613262614359565b5b61326f878288016130c7565b91505092959194509250565b600080604083850312156132925761329161435e565b5b60006132a085828601613045565b925050602083013567ffffffffffffffff8111156132c1576132c0614359565b5b6132cd8582860161305a565b9150509250929050565b600080604083850312156132ee576132ed61435e565b5b60006132fc85828601613045565b925050602061330d85828601613088565b9150509250929050565b6000806040838503121561332e5761332d61435e565b5b600061333c85828601613045565b925050602061334d85828601613123565b9150509250929050565b60006020828403121561336d5761336c61435e565b5b600061337b8482850161309d565b91505092915050565b60006020828403121561339a5761339961435e565b5b60006133a8848285016130b2565b91505092915050565b6000602082840312156133c7576133c661435e565b5b600082013567ffffffffffffffff8111156133e5576133e4614359565b5b6133f1848285016130f5565b91505092915050565b6000602082840312156134105761340f61435e565b5b600061341e84828501613123565b91505092915050565b6000806040838503121561343e5761343d61435e565b5b600061344c85828601613123565b925050602061345d85828601613123565b9150509250929050565b600061347383836139ab565b60208301905092915050565b6134888161409d565b82525050565b600061349982613f1c565b6134a38185613f4a565b93506134ae83613ef7565b8060005b838110156134df5781516134c68882613467565b97506134d183613f3d565b9250506001810190506134b2565b5085935050505092915050565b6134f5816140af565b82525050565b600061350682613f27565b6135108185613f5b565b9350613520818560208601614120565b61352981614363565b840191505092915050565b600061353f82613f32565b6135498185613f6c565b9350613559818560208601614120565b61356281614363565b840191505092915050565b600061357882613f32565b6135828185613f7d565b9350613592818560208601614120565b80840191505092915050565b600081546135ab81614153565b6135b58186613f7d565b945060018216600081146135d057600181146135e157613614565b60ff19831686528186019350613614565b6135ea85613f07565b60005b8381101561360c578154818901526001820191506020810190506135ed565b838801955050505b50505092915050565b600061362a602783613f6c565b915061363582614374565b604082019050919050565b600061364d601f83613f6c565b9150613658826143c3565b602082019050919050565b6000613670602c83613f6c565b915061367b826143ec565b604082019050919050565b6000613693602b83613f6c565b915061369e8261443b565b604082019050919050565b60006136b6603283613f6c565b91506136c18261448a565b604082019050919050565b60006136d9602a83613f6c565b91506136e4826144d9565b604082019050919050565b60006136fc602683613f6c565b915061370782614528565b604082019050919050565b600061371f601c83613f6c565b915061372a82614577565b602082019050919050565b6000613742602483613f6c565b915061374d826145a0565b604082019050919050565b6000613765601983613f6c565b9150613770826145ef565b602082019050919050565b6000613788602c83613f6c565b915061379382614618565b604082019050919050565b60006137ab603883613f6c565b91506137b682614667565b604082019050919050565b60006137ce602a83613f6c565b91506137d9826146b6565b604082019050919050565b60006137f1602983613f6c565b91506137fc82614705565b604082019050919050565b6000613814603083613f6c565b915061381f82614754565b604082019050919050565b6000613837602183613f6c565b9150613842826147a3565b604082019050919050565b600061385a602083613f6c565b9150613865826147f2565b602082019050919050565b600061387d603183613f6c565b91506138888261481b565b604082019050919050565b60006138a0602c83613f6c565b91506138ab8261486a565b604082019050919050565b60006138c3602c83613f6c565b91506138ce826148b9565b604082019050919050565b60006138e6602083613f6c565b91506138f182614908565b602082019050919050565b6000613909602283613f6c565b915061391482614931565b604082019050919050565b600061392c602983613f6c565b915061393782614980565b604082019050919050565b600061394f602183613f6c565b915061395a826149cf565b604082019050919050565b6000613972603183613f6c565b915061397d82614a1e565b604082019050919050565b6000613995602c83613f6c565b91506139a082614a6d565b604082019050919050565b6139b481614107565b82525050565b6139c381614107565b82525050565b60006139d5828661356d565b91506139e1828561356d565b91506139ed828461359e565b9150819050949350505050565b6000602082019050613a0f600083018461347f565b92915050565b6000608082019050613a2a600083018761347f565b613a37602083018661347f565b613a4460408301856139ba565b8181036060830152613a5681846134fb565b905095945050505050565b60006020820190508181036000830152613a7b818461348e565b905092915050565b6000602082019050613a9860008301846134ec565b92915050565b60006020820190508181036000830152613ab88184613534565b905092915050565b60006020820190508181036000830152613ad98161361d565b9050919050565b60006020820190508181036000830152613af981613640565b9050919050565b60006020820190508181036000830152613b1981613663565b9050919050565b60006020820190508181036000830152613b3981613686565b9050919050565b60006020820190508181036000830152613b59816136a9565b9050919050565b60006020820190508181036000830152613b79816136cc565b9050919050565b60006020820190508181036000830152613b99816136ef565b9050919050565b60006020820190508181036000830152613bb981613712565b9050919050565b60006020820190508181036000830152613bd981613735565b9050919050565b60006020820190508181036000830152613bf981613758565b9050919050565b60006020820190508181036000830152613c198161377b565b9050919050565b60006020820190508181036000830152613c398161379e565b9050919050565b60006020820190508181036000830152613c59816137c1565b9050919050565b60006020820190508181036000830152613c79816137e4565b9050919050565b60006020820190508181036000830152613c9981613807565b9050919050565b60006020820190508181036000830152613cb98161382a565b9050919050565b60006020820190508181036000830152613cd98161384d565b9050919050565b60006020820190508181036000830152613cf981613870565b9050919050565b60006020820190508181036000830152613d1981613893565b9050919050565b60006020820190508181036000830152613d39816138b6565b9050919050565b60006020820190508181036000830152613d59816138d9565b9050919050565b60006020820190508181036000830152613d79816138fc565b9050919050565b60006020820190508181036000830152613d998161391f565b9050919050565b60006020820190508181036000830152613db981613942565b9050919050565b60006020820190508181036000830152613dd981613965565b9050919050565b60006020820190508181036000830152613df981613988565b9050919050565b6000602082019050613e1560008301846139ba565b92915050565b6000604082019050613e3060008301856139ba565b613e3d602083018461347f565b9392505050565b6000613e4e613e5f565b9050613e5a8282614185565b919050565b6000604051905090565b600067ffffffffffffffff821115613e8457613e8361431b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613eb057613eaf61431b565b5b613eb982614363565b9050602081019050919050565b600067ffffffffffffffff821115613ee157613ee061431b565b5b613eea82614363565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f9382614107565b9150613f9e83614107565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fd357613fd2614230565b5b828201905092915050565b6000613fe982614107565b9150613ff483614107565b9250826140045761400361425f565b5b828204905092915050565b600061401a82614107565b915061402583614107565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405e5761405d614230565b5b828202905092915050565b600061407482614107565b915061407f83614107565b92508282101561409257614091614230565b5b828203905092915050565b60006140a8826140e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561413e578082015181840152602081019050614123565b8381111561414d576000848401525b50505050565b6000600282049050600182168061416b57607f821691505b6020821081141561417f5761417e61428e565b5b50919050565b61418e82614363565b810181811067ffffffffffffffff821117156141ad576141ac61431b565b5b80604052505050565b60006141c182614107565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141f4576141f3614230565b5b600182019050919050565b600061420a82614107565b915061421583614107565b9250826142255761422461425f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74486f6c64546f6b656e733a20506c656173652070726f76696465207460008201527f6f6b656e20696400000000000000000000000000000000000000000000000000602082015250565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b7f4d696e74486f6c64546f6b656e733a20536f6d6520746f6b656e73206172652060008201527f6e6f742072657365727665640000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f576f6f667061636b4e4654546f6b656e3a206d696e74416d6f756e742073686f60008201527f756c64206265203e203000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766560008201527f20746865204d696e74657220726f6c6500000000000000000000000000000000602082015250565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f576f6f667061636b4e4654546f6b656e3a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f576f6f667061636b4e4654546f6b656e3a205468697320746f6b656e2069732060008201527f6e6f742072657365727665640000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614ac58161409d565b8114614ad057600080fd5b50565b614adc816140af565b8114614ae757600080fd5b50565b614af3816140bb565b8114614afe57600080fd5b50565b614b0a81614107565b8114614b1557600080fd5b5056fea26469706673582212207650e3e0685d1da6e28b9254d11c8157a32e4af081e842727f6450b8fcf1431164736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000ead48c7797ccfd37176241767485922ee69a6c19000000000000000000000000000000000000000000000000000000000000000c576f6f667061636b204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357504e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Woofpack NFT
Arg [1] : _symbol (string): WPN
Arg [2] : _amount (uint256): 10
Arg [3] : _creator (address): 0xEad48c7797CCFd37176241767485922EE69A6c19

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 000000000000000000000000ead48c7797ccfd37176241767485922ee69a6c19
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 576f6f667061636b204e46540000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 57504e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52928:3917:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46710:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33521:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35080:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34603:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47350:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35830:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7939:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47018:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53661:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36240:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55396:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47540:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56446:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33215:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54228:344;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53158:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32945:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12712:103;;;:::i;:::-;;7836:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8177:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55202:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12061:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33690:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10686:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10786:79;;;:::i;:::-;;35373:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10569:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36496:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53114:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54580:614;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55794:644;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53078:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56558:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35599:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12970:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46710:224;46812:4;46851:35;46836:50;;;:11;:50;;;;:90;;;;46890:36;46914:11;46890:23;:36::i;:::-;46836:90;46829:97;;46710:224;;;:::o;33521:100::-;33575:13;33608:5;33601:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33521:100;:::o;35080:221::-;35156:7;35184:16;35192:7;35184;:16::i;:::-;35176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35269:15;:24;35285:7;35269:24;;;;;;;;;;;;;;;;;;;;;35262:31;;35080:221;;;:::o;34603:411::-;34684:13;34700:23;34715:7;34700:14;:23::i;:::-;34684:39;;34748:5;34742:11;;:2;:11;;;;34734:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34842:5;34826:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34851:37;34868:5;34875:12;:10;:12::i;:::-;34851:16;:37::i;:::-;34826:62;34804:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34985:21;34994:2;34998:7;34985:8;:21::i;:::-;34673:341;34603:411;;:::o;47350:113::-;47411:7;47438:10;:17;;;;47431:24;;47350:113;:::o;35830:339::-;36025:41;36044:12;:10;:12::i;:::-;36058:7;36025:18;:41::i;:::-;36017:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36133:28;36143:4;36149:2;36153:7;36133:9;:28::i;:::-;35830:339;;;:::o;7939:230::-;8027:7;8036;8056:21;8080:39;8115:3;8080:30;8095:14;;8080:10;:14;;:30;;;;:::i;:::-;:34;;:39;;;;:::i;:::-;8056:63;;8138:13;8153:7;;;;;;;;;;;8130:31;;;;;7939:230;;;;;:::o;47018:256::-;47115:7;47151:23;47168:5;47151:16;:23::i;:::-;47143:5;:31;47135:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47240:12;:19;47253:5;47240:19;;;;;;;;;;;;;;;:26;47260:5;47240:26;;;;;;;;;;;;47233:33;;47018:256;;;;:::o;53661:561::-;53761:4;10466:22;10475:12;:10;:12::i;:::-;10466:8;:22::i;:::-;10458:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53800:1:::1;53786:11;:15;53778:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53866:9;53878:1;53866:13;;53861:330;53886:11;53881:1;:16;53861:330;;53919:12;;:14;;;;;;;;;:::i;:::-;;;;;;54004:11;;53988:12;;:27;;:56;;;;;54035:9;;54019:12;;:25;;53988:56;53984:107;;;54090:1;54078:9;;:13;;;;:::i;:::-;54063:12;:28;;;;53984:107;54106:28;54116:3;54121:12;;54106:9;:28::i;:::-;54164:12;;54159:3;54154:23;;;;;;;;;;;;53899:3;;;;;:::i;:::-;;;;53861:330;;;;54210:4;54203:11;;53661:561:::0;;;;:::o;36240:185::-;36378:39;36395:4;36401:2;36405:7;36378:39;;;;;;;;;;;;:16;:39::i;:::-;36240:185;;;:::o;55396:390::-;55483:16;55517:23;55543:17;55553:6;55543:9;:17::i;:::-;55517:43;;55571:25;55613:15;55599:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55571:58;;55645:9;55640:113;55660:15;55656:1;:19;55640:113;;;55711:30;55731:6;55739:1;55711:19;:30::i;:::-;55697:8;55706:1;55697:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;55677:3;;;;;:::i;:::-;;;;55640:113;;;;55770:8;55763:15;;;;55396:390;;;:::o;47540:233::-;47615:7;47651:30;:28;:30::i;:::-;47643:5;:38;47635:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47748:10;47759:5;47748:17;;;;;;;;:::i;:::-;;;;;;;;;;47741:24;;47540:233;;;:::o;56446:104::-;12292:12;:10;:12::i;:::-;12281:23;;:7;:5;:7::i;:::-;:23;;;12273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56531:11:::1;56521:7;:21;;;;;;;;;;;;:::i;:::-;;56446:104:::0;:::o;33215:239::-;33287:7;33307:13;33323:7;:16;33331:7;33323:16;;;;;;;;;;;;;;;;;;;;;33307:32;;33375:1;33358:19;;:5;:19;;;;33350:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33441:5;33434:12;;;33215:239;;;:::o;7747:81::-;7792:4;7816;7809:11;;7747:81;:::o;54228:344::-;54336:4;10466:22;10475:12;:10;:12::i;:::-;10466:8;:22::i;:::-;10458:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54380:16:::1;54387:8;54380:6;:16::i;:::-;54358:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54481:24;54491:3;54496:8;54481:9;:24::i;:::-;54533:8;54528:3;54523:19;;;;;;;;;;;;54560:4;54553:11;;54228:344:::0;;;;:::o;53158:72::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32945:208::-;33017:7;33062:1;33045:19;;:5;:19;;;;33037:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33129:9;:16;33139:5;33129:16;;;;;;;;;;;;;;;;33122:23;;32945:208;;;:::o;12712:103::-;12292:12;:10;:12::i;:::-;12281:23;;:7;:5;:7::i;:::-;:23;;;12273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12777:30:::1;12804:1;12777:18;:30::i;:::-;12712:103::o:0;7836:95::-;7882:7;7909:14;;7902:21;;7836:95;:::o;8177:189::-;8350:7;8342:6;8314:44;;8332:8;8314:44;;;;;;;;;;;;8177:189;;;:::o;55202:184::-;55257:4;55279:17;55287:8;55279:7;:17::i;:::-;55276:34;;;55305:5;55298:12;;;;55276:34;55342:11;;55330:8;:23;;:48;;;;;55369:9;;55357:8;:21;;55330:48;55323:55;;55202:184;;;;:::o;12061:87::-;12107:7;12134:6;;;;;;;;;;;12127:13;;12061:87;:::o;33690:104::-;33746:13;33779:7;33772:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33690:104;:::o;10686:92::-;10466:22;10475:12;:10;:12::i;:::-;10466:8;:22::i;:::-;10458:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;10751:19:::1;10762:7;10751:10;:19::i;:::-;10686:92:::0;:::o;10786:79::-;10830:27;10844:12;:10;:12::i;:::-;10830:13;:27::i;:::-;10786:79::o;35373:155::-;35468:52;35487:12;:10;:12::i;:::-;35501:8;35511;35468:18;:52::i;:::-;35373:155;;:::o;10569:109::-;10625:4;10649:21;10662:7;10649:8;:12;;:21;;;;:::i;:::-;10642:28;;10569:109;;;:::o;36496:328::-;36671:41;36690:12;:10;:12::i;:::-;36704:7;36671:18;:41::i;:::-;36663:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36777:39;36791:4;36797:2;36801:7;36810:5;36777:13;:39::i;:::-;36496:328;;;;:::o;53114:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54580:614::-;54699:4;10466:22;10475:12;:10;:12::i;:::-;10466:8;:22::i;:::-;10458:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54748:1:::1;54729:9;:16;:20;54721:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;54811:9;54806:200;54830:9;:16;54826:1;:20;54806:200;;;54894:20;54901:9;54911:1;54901:12;;;;;;;;:::i;:::-;;;;;;;;54894:6;:20::i;:::-;54868:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;54848:3;;;;;:::i;:::-;;;;54806:200;;;;55023:9;55018:145;55042:9;:16;55038:1;:20;55018:145;;;55080:28;55090:3;55095:9;55105:1;55095:12;;;;;;;;:::i;:::-;;;;;;;;55080:9;:28::i;:::-;55138:9;55148:1;55138:12;;;;;;;;:::i;:::-;;;;;;;;55133:3;55128:23;;;;;;;;;;;;55060:3;;;;;:::i;:::-;;;;55018:145;;;;55182:4;55175:11;;54580:614:::0;;;;:::o;55794:644::-;55912:13;55965:16;55973:7;55965;:16::i;:::-;55943:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;56071:28;56102:10;:8;:10::i;:::-;56071:41;;56174:1;56149:14;56143:28;:32;:287;;;;;;;;;;;;;;;;;56267:14;56308:18;:7;:16;:18::i;:::-;56353:13;56224:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56143:287;56123:307;;;55794:644;;;:::o;53078:27::-;;;;:::o;56558:151::-;12292:12;:10;:12::i;:::-;12281:23;;:7;:5;:7::i;:::-;:23;;;12273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56684:17:::1;56668:13;:33;;;;;;;;;;;;:::i;:::-;;56558:151:::0;:::o;35599:164::-;35696:4;35720:18;:25;35739:5;35720:25;;;;;;;;;;;;;;;:35;35746:8;35720:35;;;;;;;;;;;;;;;;;;;;;;;;;35713:42;;35599:164;;;;:::o;12970:201::-;12292:12;:10;:12::i;:::-;12281:23;;:7;:5;:7::i;:::-;:23;;;12273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13079:1:::1;13059:22;;:8;:22;;;;13051:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13135:28;13154:8;13135:18;:28::i;:::-;12970:201:::0;:::o;8624:178::-;8702:18;8706:4;8712:7;8702:3;:18::i;:::-;8701:19;8693:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8790:4;8767;:11;;:20;8779:7;8767:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;8624:178;;:::o;32576:305::-;32678:4;32730:25;32715:40;;;:11;:40;;;;:105;;;;32787:33;32772:48;;;:11;:48;;;;32715:105;:158;;;;32837:36;32861:11;32837:23;:36::i;:::-;32715:158;32695:178;;32576:305;;;:::o;38334:127::-;38399:4;38451:1;38423:30;;:7;:16;38431:7;38423:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38416:37;;38334:127;;;:::o;9910:98::-;9963:7;9990:10;9983:17;;9910:98;:::o;42316:174::-;42418:2;42391:15;:24;42407:7;42391:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42474:7;42470:2;42436:46;;42445:23;42460:7;42445:14;:23::i;:::-;42436:46;;;;;;;;;;;;42316:174;;:::o;38628:348::-;38721:4;38746:16;38754:7;38746;:16::i;:::-;38738:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38822:13;38838:23;38853:7;38838:14;:23::i;:::-;38822:39;;38891:5;38880:16;;:7;:16;;;:51;;;;38924:7;38900:31;;:20;38912:7;38900:11;:20::i;:::-;:31;;;38880:51;:87;;;;38935:32;38952:5;38959:7;38935:16;:32::i;:::-;38880:87;38872:96;;;38628:348;;;;:::o;41620:578::-;41779:4;41752:31;;:23;41767:7;41752:14;:23::i;:::-;:31;;;41744:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41862:1;41848:16;;:2;:16;;;;41840:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41918:39;41939:4;41945:2;41949:7;41918:20;:39::i;:::-;42022:29;42039:1;42043:7;42022:8;:29::i;:::-;42083:1;42064:9;:15;42074:4;42064:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42112:1;42095:9;:13;42105:2;42095:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42143:2;42124:7;:16;42132:7;42124:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42182:7;42178:2;42163:27;;42172:4;42163:27;;;;;;;;;;;;41620:578;;;:::o;3382:98::-;3440:7;3471:1;3467;:5;;;;:::i;:::-;3460:12;;3382:98;;;;:::o;3781:::-;3839:7;3870:1;3866;:5;;;;:::i;:::-;3859:12;;3781:98;;;;:::o;39318:110::-;39394:26;39404:2;39408:7;39394:26;;;;;;;;;;;;:9;:26::i;:::-;39318:110;;:::o;13331:191::-;13405:16;13424:6;;;;;;;;;;;13405:25;;13450:8;13441:6;;:17;;;;;;;;;;;;;;;;;;13505:8;13474:40;;13495:8;13474:40;;;;;;;;;;;;13394:128;13331:191;:::o;10873:122::-;10930:21;10943:7;10930:8;:12;;:21;;;;:::i;:::-;10979:7;10967:20;;;;;;;;;;;;10873:122;:::o;11003:130::-;11063:24;11079:7;11063:8;:15;;:24;;;;:::i;:::-;11117:7;11103:22;;;;;;;;;;;;11003:130;:::o;42632:315::-;42787:8;42778:17;;:5;:17;;;;42770:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42874:8;42836:18;:25;42855:5;42836:25;;;;;;;;;;;;;;;:35;42862:8;42836:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42920:8;42898:41;;42913:5;42898:41;;;42930:8;42898:41;;;;;;:::i;:::-;;;;;;;;42632:315;;;:::o;9160:203::-;9232:4;9276:1;9257:21;;:7;:21;;;;9249:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9335:4;:11;;:20;9347:7;9335:20;;;;;;;;;;;;;;;;;;;;;;;;;9328:27;;9160:203;;;;:::o;37706:315::-;37863:28;37873:4;37879:2;37883:7;37863:9;:28::i;:::-;37910:48;37933:4;37939:2;37943:7;37952:5;37910:22;:48::i;:::-;37902:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37706:315;;;;:::o;56734:108::-;56794:13;56827:7;56820:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56734:108;:::o;28720:723::-;28776:13;29006:1;28997:5;:10;28993:53;;;29024:10;;;;;;;;;;;;;;;;;;;;;28993:53;29056:12;29071:5;29056:20;;29087:14;29112:78;29127:1;29119:4;:9;29112:78;;29145:8;;;;;:::i;:::-;;;;29176:2;29168:10;;;;;:::i;:::-;;;29112:78;;;29200:19;29232:6;29222:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29200:39;;29250:154;29266:1;29257:5;:10;29250:154;;29294:1;29284:11;;;;;:::i;:::-;;;29361:2;29353:5;:10;;;;:::i;:::-;29340:2;:24;;;;:::i;:::-;29327:39;;29310:6;29317;29310:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;29390:2;29381:11;;;;;:::i;:::-;;;29250:154;;;29428:6;29414:21;;;;;28720:723;;;;:::o;31181:157::-;31266:4;31305:25;31290:40;;;:11;:40;;;;31283:47;;31181:157;;;:::o;48386:589::-;48530:45;48557:4;48563:2;48567:7;48530:26;:45::i;:::-;48608:1;48592:18;;:4;:18;;;48588:187;;;48627:40;48659:7;48627:31;:40::i;:::-;48588:187;;;48697:2;48689:10;;:4;:10;;;48685:90;;48716:47;48749:4;48755:7;48716:32;:47::i;:::-;48685:90;48588:187;48803:1;48789:16;;:2;:16;;;48785:183;;;48822:45;48859:7;48822:36;:45::i;:::-;48785:183;;;48895:4;48889:10;;:2;:10;;;48885:83;;48916:40;48944:2;48948:7;48916:27;:40::i;:::-;48885:83;48785:183;48386:589;;;:::o;39655:321::-;39785:18;39791:2;39795:7;39785:5;:18::i;:::-;39836:54;39867:1;39871:2;39875:7;39884:5;39836:22;:54::i;:::-;39814:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39655:321;;;:::o;8882:183::-;8962:18;8966:4;8972:7;8962:3;:18::i;:::-;8954:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9052:5;9029:4;:11;;:20;9041:7;9029:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;8882:183;;:::o;43512:799::-;43667:4;43688:15;:2;:13;;;:15::i;:::-;43684:620;;;43740:2;43724:36;;;43761:12;:10;:12::i;:::-;43775:4;43781:7;43790:5;43724:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43720:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43983:1;43966:6;:13;:18;43962:272;;;44009:60;;;;;;;;;;:::i;:::-;;;;;;;;43962:272;44184:6;44178:13;44169:6;44165:2;44161:15;44154:38;43720:529;43857:41;;;43847:51;;;:6;:51;;;;43840:58;;;;;43684:620;44288:4;44281:11;;43512:799;;;;;;;:::o;44883:126::-;;;;:::o;49698:164::-;49802:10;:17;;;;49775:15;:24;49791:7;49775:24;;;;;;;;;;;:44;;;;49830:10;49846:7;49830:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49698:164;:::o;50489:988::-;50755:22;50805:1;50780:22;50797:4;50780:16;:22::i;:::-;:26;;;;:::i;:::-;50755:51;;50817:18;50838:17;:26;50856:7;50838:26;;;;;;;;;;;;50817:47;;50985:14;50971:10;:28;50967:328;;51016:19;51038:12;:18;51051:4;51038:18;;;;;;;;;;;;;;;:34;51057:14;51038:34;;;;;;;;;;;;51016:56;;51122:11;51089:12;:18;51102:4;51089:18;;;;;;;;;;;;;;;:30;51108:10;51089:30;;;;;;;;;;;:44;;;;51239:10;51206:17;:30;51224:11;51206:30;;;;;;;;;;;:43;;;;51001:294;50967:328;51391:17;:26;51409:7;51391:26;;;;;;;;;;;51384:33;;;51435:12;:18;51448:4;51435:18;;;;;;;;;;;;;;;:34;51454:14;51435:34;;;;;;;;;;;51428:41;;;50570:907;;50489:988;;:::o;51772:1079::-;52025:22;52070:1;52050:10;:17;;;;:21;;;;:::i;:::-;52025:46;;52082:18;52103:15;:24;52119:7;52103:24;;;;;;;;;;;;52082:45;;52454:19;52476:10;52487:14;52476:26;;;;;;;;:::i;:::-;;;;;;;;;;52454:48;;52540:11;52515:10;52526;52515:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;52651:10;52620:15;:28;52636:11;52620:28;;;;;;;;;;;:41;;;;52792:15;:24;52808:7;52792:24;;;;;;;;;;;52785:31;;;52827:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51843:1008;;;51772:1079;:::o;49276:221::-;49361:14;49378:20;49395:2;49378:16;:20::i;:::-;49361:37;;49436:7;49409:12;:16;49422:2;49409:16;;;;;;;;;;;;;;;:24;49426:6;49409:24;;;;;;;;;;;:34;;;;49483:6;49454:17;:26;49472:7;49454:26;;;;;;;;;;;:35;;;;49350:147;49276:221;;:::o;40312:382::-;40406:1;40392:16;;:2;:16;;;;40384:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40465:16;40473:7;40465;:16::i;:::-;40464:17;40456:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40527:45;40556:1;40560:2;40564:7;40527:20;:45::i;:::-;40602:1;40585:9;:13;40595:2;40585:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40633:2;40614:7;:16;40622:7;40614:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40678:7;40674:2;40653:33;;40670:1;40653:33;;;;;;;;;;;;40312:382;;:::o;21163:387::-;21223:4;21431:12;21498:7;21486:20;21478:28;;21541:1;21534:4;:8;21527:15;;;21163:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:684::-;5897:6;5905;5954:2;5942:9;5933:7;5929:23;5925:32;5922:119;;;5960:79;;:::i;:::-;5922:119;6080:1;6105:53;6150:7;6141:6;6130:9;6126:22;6105:53;:::i;:::-;6095:63;;6051:117;6235:2;6224:9;6220:18;6207:32;6266:18;6258:6;6255:30;6252:117;;;6288:79;;:::i;:::-;6252:117;6393:78;6463:7;6454:6;6443:9;6439:22;6393:78;:::i;:::-;6383:88;;6178:303;5804:684;;;;;:::o;6494:468::-;6559:6;6567;6616:2;6604:9;6595:7;6591:23;6587:32;6584:119;;;6622:79;;:::i;:::-;6584:119;6742:1;6767:53;6812:7;6803:6;6792:9;6788:22;6767:53;:::i;:::-;6757:63;;6713:117;6869:2;6895:50;6937:7;6928:6;6917:9;6913:22;6895:50;:::i;:::-;6885:60;;6840:115;6494:468;;;;;:::o;6968:474::-;7036:6;7044;7093:2;7081:9;7072:7;7068:23;7064:32;7061:119;;;7099:79;;:::i;:::-;7061:119;7219:1;7244:53;7289:7;7280:6;7269:9;7265:22;7244:53;:::i;:::-;7234:63;;7190:117;7346:2;7372:53;7417:7;7408:6;7397:9;7393:22;7372:53;:::i;:::-;7362:63;;7317:118;6968:474;;;;;:::o;7448:327::-;7506:6;7555:2;7543:9;7534:7;7530:23;7526:32;7523:119;;;7561:79;;:::i;:::-;7523:119;7681:1;7706:52;7750:7;7741:6;7730:9;7726:22;7706:52;:::i;:::-;7696:62;;7652:116;7448:327;;;;:::o;7781:349::-;7850:6;7899:2;7887:9;7878:7;7874:23;7870:32;7867:119;;;7905:79;;:::i;:::-;7867:119;8025:1;8050:63;8105:7;8096:6;8085:9;8081:22;8050:63;:::i;:::-;8040:73;;7996:127;7781:349;;;;:::o;8136:509::-;8205:6;8254:2;8242:9;8233:7;8229:23;8225:32;8222:119;;;8260:79;;:::i;:::-;8222:119;8408:1;8397:9;8393:17;8380:31;8438:18;8430:6;8427:30;8424:117;;;8460:79;;:::i;:::-;8424:117;8565:63;8620:7;8611:6;8600:9;8596:22;8565:63;:::i;:::-;8555:73;;8351:287;8136:509;;;;:::o;8651:329::-;8710:6;8759:2;8747:9;8738:7;8734:23;8730:32;8727:119;;;8765:79;;:::i;:::-;8727:119;8885:1;8910:53;8955:7;8946:6;8935:9;8931:22;8910:53;:::i;:::-;8900:63;;8856:117;8651:329;;;;:::o;8986:474::-;9054:6;9062;9111:2;9099:9;9090:7;9086:23;9082:32;9079:119;;;9117:79;;:::i;:::-;9079:119;9237:1;9262:53;9307:7;9298:6;9287:9;9283:22;9262:53;:::i;:::-;9252:63;;9208:117;9364:2;9390:53;9435:7;9426:6;9415:9;9411:22;9390:53;:::i;:::-;9380:63;;9335:118;8986:474;;;;;:::o;9466:179::-;9535:10;9556:46;9598:3;9590:6;9556:46;:::i;:::-;9634:4;9629:3;9625:14;9611:28;;9466:179;;;;:::o;9651:118::-;9738:24;9756:5;9738:24;:::i;:::-;9733:3;9726:37;9651:118;;:::o;9805:732::-;9924:3;9953:54;10001:5;9953:54;:::i;:::-;10023:86;10102:6;10097:3;10023:86;:::i;:::-;10016:93;;10133:56;10183:5;10133:56;:::i;:::-;10212:7;10243:1;10228:284;10253:6;10250:1;10247:13;10228:284;;;10329:6;10323:13;10356:63;10415:3;10400:13;10356:63;:::i;:::-;10349:70;;10442:60;10495:6;10442:60;:::i;:::-;10432:70;;10288:224;10275:1;10272;10268:9;10263:14;;10228:284;;;10232:14;10528:3;10521:10;;9929:608;;;9805:732;;;;:::o;10543:109::-;10624:21;10639:5;10624:21;:::i;:::-;10619:3;10612:34;10543:109;;:::o;10658:360::-;10744:3;10772:38;10804:5;10772:38;:::i;:::-;10826:70;10889:6;10884:3;10826:70;:::i;:::-;10819:77;;10905:52;10950:6;10945:3;10938:4;10931:5;10927:16;10905:52;:::i;:::-;10982:29;11004:6;10982:29;:::i;:::-;10977:3;10973:39;10966:46;;10748:270;10658:360;;;;:::o;11024:364::-;11112:3;11140:39;11173:5;11140:39;:::i;:::-;11195:71;11259:6;11254:3;11195:71;:::i;:::-;11188:78;;11275:52;11320:6;11315:3;11308:4;11301:5;11297:16;11275:52;:::i;:::-;11352:29;11374:6;11352:29;:::i;:::-;11347:3;11343:39;11336:46;;11116:272;11024:364;;;;:::o;11394:377::-;11500:3;11528:39;11561:5;11528:39;:::i;:::-;11583:89;11665:6;11660:3;11583:89;:::i;:::-;11576:96;;11681:52;11726:6;11721:3;11714:4;11707:5;11703:16;11681:52;:::i;:::-;11758:6;11753:3;11749:16;11742:23;;11504:267;11394:377;;;;:::o;11801:845::-;11904:3;11941:5;11935:12;11970:36;11996:9;11970:36;:::i;:::-;12022:89;12104:6;12099:3;12022:89;:::i;:::-;12015:96;;12142:1;12131:9;12127:17;12158:1;12153:137;;;;12304:1;12299:341;;;;12120:520;;12153:137;12237:4;12233:9;12222;12218:25;12213:3;12206:38;12273:6;12268:3;12264:16;12257:23;;12153:137;;12299:341;12366:38;12398:5;12366:38;:::i;:::-;12426:1;12440:154;12454:6;12451:1;12448:13;12440:154;;;12528:7;12522:14;12518:1;12513:3;12509:11;12502:35;12578:1;12569:7;12565:15;12554:26;;12476:4;12473:1;12469:12;12464:17;;12440:154;;;12623:6;12618:3;12614:16;12607:23;;12306:334;;12120:520;;11908:738;;11801:845;;;;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12652:366;;;:::o;13024:::-;13166:3;13187:67;13251:2;13246:3;13187:67;:::i;:::-;13180:74;;13263:93;13352:3;13263:93;:::i;:::-;13381:2;13376:3;13372:12;13365:19;;13024:366;;;:::o;13396:::-;13538:3;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13635:93;13724:3;13635:93;:::i;:::-;13753:2;13748:3;13744:12;13737:19;;13396:366;;;:::o;13768:::-;13910:3;13931:67;13995:2;13990:3;13931:67;:::i;:::-;13924:74;;14007:93;14096:3;14007:93;:::i;:::-;14125:2;14120:3;14116:12;14109:19;;13768:366;;;:::o;14140:::-;14282:3;14303:67;14367:2;14362:3;14303:67;:::i;:::-;14296:74;;14379:93;14468:3;14379:93;:::i;:::-;14497:2;14492:3;14488:12;14481:19;;14140:366;;;:::o;14512:::-;14654:3;14675:67;14739:2;14734:3;14675:67;:::i;:::-;14668:74;;14751:93;14840:3;14751:93;:::i;:::-;14869:2;14864:3;14860:12;14853:19;;14512:366;;;:::o;14884:::-;15026:3;15047:67;15111:2;15106:3;15047:67;:::i;:::-;15040:74;;15123:93;15212:3;15123:93;:::i;:::-;15241:2;15236:3;15232:12;15225:19;;14884:366;;;:::o;15256:::-;15398:3;15419:67;15483:2;15478:3;15419:67;:::i;:::-;15412:74;;15495:93;15584:3;15495:93;:::i;:::-;15613:2;15608:3;15604:12;15597:19;;15256:366;;;:::o;15628:::-;15770:3;15791:67;15855:2;15850:3;15791:67;:::i;:::-;15784:74;;15867:93;15956:3;15867:93;:::i;:::-;15985:2;15980:3;15976:12;15969:19;;15628:366;;;:::o;16000:::-;16142:3;16163:67;16227:2;16222:3;16163:67;:::i;:::-;16156:74;;16239:93;16328:3;16239:93;:::i;:::-;16357:2;16352:3;16348:12;16341:19;;16000:366;;;:::o;16372:::-;16514:3;16535:67;16599:2;16594:3;16535:67;:::i;:::-;16528:74;;16611:93;16700:3;16611:93;:::i;:::-;16729:2;16724:3;16720:12;16713:19;;16372:366;;;:::o;16744:::-;16886:3;16907:67;16971:2;16966:3;16907:67;:::i;:::-;16900:74;;16983:93;17072:3;16983:93;:::i;:::-;17101:2;17096:3;17092:12;17085:19;;16744:366;;;:::o;17116:::-;17258:3;17279:67;17343:2;17338:3;17279:67;:::i;:::-;17272:74;;17355:93;17444:3;17355:93;:::i;:::-;17473:2;17468:3;17464:12;17457:19;;17116:366;;;:::o;17488:::-;17630:3;17651:67;17715:2;17710:3;17651:67;:::i;:::-;17644:74;;17727:93;17816:3;17727:93;:::i;:::-;17845:2;17840:3;17836:12;17829:19;;17488:366;;;:::o;17860:::-;18002:3;18023:67;18087:2;18082:3;18023:67;:::i;:::-;18016:74;;18099:93;18188:3;18099:93;:::i;:::-;18217:2;18212:3;18208:12;18201:19;;17860:366;;;:::o;18232:::-;18374:3;18395:67;18459:2;18454:3;18395:67;:::i;:::-;18388:74;;18471:93;18560:3;18471:93;:::i;:::-;18589:2;18584:3;18580:12;18573:19;;18232:366;;;:::o;18604:::-;18746:3;18767:67;18831:2;18826:3;18767:67;:::i;:::-;18760:74;;18843:93;18932:3;18843:93;:::i;:::-;18961:2;18956:3;18952:12;18945:19;;18604:366;;;:::o;18976:::-;19118:3;19139:67;19203:2;19198:3;19139:67;:::i;:::-;19132:74;;19215:93;19304:3;19215:93;:::i;:::-;19333:2;19328:3;19324:12;19317:19;;18976:366;;;:::o;19348:::-;19490:3;19511:67;19575:2;19570:3;19511:67;:::i;:::-;19504:74;;19587:93;19676:3;19587:93;:::i;:::-;19705:2;19700:3;19696:12;19689:19;;19348:366;;;:::o;19720:::-;19862:3;19883:67;19947:2;19942:3;19883:67;:::i;:::-;19876:74;;19959:93;20048:3;19959:93;:::i;:::-;20077:2;20072:3;20068:12;20061:19;;19720:366;;;:::o;20092:::-;20234:3;20255:67;20319:2;20314:3;20255:67;:::i;:::-;20248:74;;20331:93;20420:3;20331:93;:::i;:::-;20449:2;20444:3;20440:12;20433:19;;20092:366;;;:::o;20464:::-;20606:3;20627:67;20691:2;20686:3;20627:67;:::i;:::-;20620:74;;20703:93;20792:3;20703:93;:::i;:::-;20821:2;20816:3;20812:12;20805:19;;20464:366;;;:::o;20836:::-;20978:3;20999:67;21063:2;21058:3;20999:67;:::i;:::-;20992:74;;21075:93;21164:3;21075:93;:::i;:::-;21193:2;21188:3;21184:12;21177:19;;20836:366;;;:::o;21208:::-;21350:3;21371:67;21435:2;21430:3;21371:67;:::i;:::-;21364:74;;21447:93;21536:3;21447:93;:::i;:::-;21565:2;21560:3;21556:12;21549:19;;21208:366;;;:::o;21580:::-;21722:3;21743:67;21807:2;21802:3;21743:67;:::i;:::-;21736:74;;21819:93;21908:3;21819:93;:::i;:::-;21937:2;21932:3;21928:12;21921:19;;21580:366;;;:::o;21952:::-;22094:3;22115:67;22179:2;22174:3;22115:67;:::i;:::-;22108:74;;22191:93;22280:3;22191:93;:::i;:::-;22309:2;22304:3;22300:12;22293:19;;21952:366;;;:::o;22324:108::-;22401:24;22419:5;22401:24;:::i;:::-;22396:3;22389:37;22324:108;;:::o;22438:118::-;22525:24;22543:5;22525:24;:::i;:::-;22520:3;22513:37;22438:118;;:::o;22562:589::-;22787:3;22809:95;22900:3;22891:6;22809:95;:::i;:::-;22802:102;;22921:95;23012:3;23003:6;22921:95;:::i;:::-;22914:102;;23033:92;23121:3;23112:6;23033:92;:::i;:::-;23026:99;;23142:3;23135:10;;22562:589;;;;;;:::o;23157:222::-;23250:4;23288:2;23277:9;23273:18;23265:26;;23301:71;23369:1;23358:9;23354:17;23345:6;23301:71;:::i;:::-;23157:222;;;;:::o;23385:640::-;23580:4;23618:3;23607:9;23603:19;23595:27;;23632:71;23700:1;23689:9;23685:17;23676:6;23632:71;:::i;:::-;23713:72;23781:2;23770:9;23766:18;23757:6;23713:72;:::i;:::-;23795;23863:2;23852:9;23848:18;23839:6;23795:72;:::i;:::-;23914:9;23908:4;23904:20;23899:2;23888:9;23884:18;23877:48;23942:76;24013:4;24004:6;23942:76;:::i;:::-;23934:84;;23385:640;;;;;;;:::o;24031:373::-;24174:4;24212:2;24201:9;24197:18;24189:26;;24261:9;24255:4;24251:20;24247:1;24236:9;24232:17;24225:47;24289:108;24392:4;24383:6;24289:108;:::i;:::-;24281:116;;24031:373;;;;:::o;24410:210::-;24497:4;24535:2;24524:9;24520:18;24512:26;;24548:65;24610:1;24599:9;24595:17;24586:6;24548:65;:::i;:::-;24410:210;;;;:::o;24626:313::-;24739:4;24777:2;24766:9;24762:18;24754:26;;24826:9;24820:4;24816:20;24812:1;24801:9;24797:17;24790:47;24854:78;24927:4;24918:6;24854:78;:::i;:::-;24846:86;;24626:313;;;;:::o;24945:419::-;25111:4;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;24945:419;;;:::o;25370:::-;25536:4;25574:2;25563:9;25559:18;25551:26;;25623:9;25617:4;25613:20;25609:1;25598:9;25594:17;25587:47;25651:131;25777:4;25651:131;:::i;:::-;25643:139;;25370:419;;;:::o;25795:::-;25961:4;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:131;26202:4;26076:131;:::i;:::-;26068:139;;25795:419;;;:::o;26220:::-;26386:4;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26220:419;;;:::o;26645:::-;26811:4;26849:2;26838:9;26834:18;26826:26;;26898:9;26892:4;26888:20;26884:1;26873:9;26869:17;26862:47;26926:131;27052:4;26926:131;:::i;:::-;26918:139;;26645:419;;;:::o;27070:::-;27236:4;27274:2;27263:9;27259:18;27251:26;;27323:9;27317:4;27313:20;27309:1;27298:9;27294:17;27287:47;27351:131;27477:4;27351:131;:::i;:::-;27343:139;;27070:419;;;:::o;27495:::-;27661:4;27699:2;27688:9;27684:18;27676:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27776:131;27902:4;27776:131;:::i;:::-;27768:139;;27495:419;;;:::o;27920:::-;28086:4;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:131;28327:4;28201:131;:::i;:::-;28193:139;;27920:419;;;:::o;28345:::-;28511:4;28549:2;28538:9;28534:18;28526:26;;28598:9;28592:4;28588:20;28584:1;28573:9;28569:17;28562:47;28626:131;28752:4;28626:131;:::i;:::-;28618:139;;28345:419;;;:::o;28770:::-;28936:4;28974:2;28963:9;28959:18;28951:26;;29023:9;29017:4;29013:20;29009:1;28998:9;28994:17;28987:47;29051:131;29177:4;29051:131;:::i;:::-;29043:139;;28770:419;;;:::o;29195:::-;29361:4;29399:2;29388:9;29384:18;29376:26;;29448:9;29442:4;29438:20;29434:1;29423:9;29419:17;29412:47;29476:131;29602:4;29476:131;:::i;:::-;29468:139;;29195:419;;;:::o;29620:::-;29786:4;29824:2;29813:9;29809:18;29801:26;;29873:9;29867:4;29863:20;29859:1;29848:9;29844:17;29837:47;29901:131;30027:4;29901:131;:::i;:::-;29893:139;;29620:419;;;:::o;30045:::-;30211:4;30249:2;30238:9;30234:18;30226:26;;30298:9;30292:4;30288:20;30284:1;30273:9;30269:17;30262:47;30326:131;30452:4;30326:131;:::i;:::-;30318:139;;30045:419;;;:::o;30470:::-;30636:4;30674:2;30663:9;30659:18;30651:26;;30723:9;30717:4;30713:20;30709:1;30698:9;30694:17;30687:47;30751:131;30877:4;30751:131;:::i;:::-;30743:139;;30470:419;;;:::o;30895:::-;31061:4;31099:2;31088:9;31084:18;31076:26;;31148:9;31142:4;31138:20;31134:1;31123:9;31119:17;31112:47;31176:131;31302:4;31176:131;:::i;:::-;31168:139;;30895:419;;;:::o;31320:::-;31486:4;31524:2;31513:9;31509:18;31501:26;;31573:9;31567:4;31563:20;31559:1;31548:9;31544:17;31537:47;31601:131;31727:4;31601:131;:::i;:::-;31593:139;;31320:419;;;:::o;31745:::-;31911:4;31949:2;31938:9;31934:18;31926:26;;31998:9;31992:4;31988:20;31984:1;31973:9;31969:17;31962:47;32026:131;32152:4;32026:131;:::i;:::-;32018:139;;31745:419;;;:::o;32170:::-;32336:4;32374:2;32363:9;32359:18;32351:26;;32423:9;32417:4;32413:20;32409:1;32398:9;32394:17;32387:47;32451:131;32577:4;32451:131;:::i;:::-;32443:139;;32170:419;;;:::o;32595:::-;32761:4;32799:2;32788:9;32784:18;32776:26;;32848:9;32842:4;32838:20;32834:1;32823:9;32819:17;32812:47;32876:131;33002:4;32876:131;:::i;:::-;32868:139;;32595:419;;;:::o;33020:::-;33186:4;33224:2;33213:9;33209:18;33201:26;;33273:9;33267:4;33263:20;33259:1;33248:9;33244:17;33237:47;33301:131;33427:4;33301:131;:::i;:::-;33293:139;;33020:419;;;:::o;33445:::-;33611:4;33649:2;33638:9;33634:18;33626:26;;33698:9;33692:4;33688:20;33684:1;33673:9;33669:17;33662:47;33726:131;33852:4;33726:131;:::i;:::-;33718:139;;33445:419;;;:::o;33870:::-;34036:4;34074:2;34063:9;34059:18;34051:26;;34123:9;34117:4;34113:20;34109:1;34098:9;34094:17;34087:47;34151:131;34277:4;34151:131;:::i;:::-;34143:139;;33870:419;;;:::o;34295:::-;34461:4;34499:2;34488:9;34484:18;34476:26;;34548:9;34542:4;34538:20;34534:1;34523:9;34519:17;34512:47;34576:131;34702:4;34576:131;:::i;:::-;34568:139;;34295:419;;;:::o;34720:::-;34886:4;34924:2;34913:9;34909:18;34901:26;;34973:9;34967:4;34963:20;34959:1;34948:9;34944:17;34937:47;35001:131;35127:4;35001:131;:::i;:::-;34993:139;;34720:419;;;:::o;35145:::-;35311:4;35349:2;35338:9;35334:18;35326:26;;35398:9;35392:4;35388:20;35384:1;35373:9;35369:17;35362:47;35426:131;35552:4;35426:131;:::i;:::-;35418:139;;35145:419;;;:::o;35570:::-;35736:4;35774:2;35763:9;35759:18;35751:26;;35823:9;35817:4;35813:20;35809:1;35798:9;35794:17;35787:47;35851:131;35977:4;35851:131;:::i;:::-;35843:139;;35570:419;;;:::o;35995:222::-;36088:4;36126:2;36115:9;36111:18;36103:26;;36139:71;36207:1;36196:9;36192:17;36183:6;36139:71;:::i;:::-;35995:222;;;;:::o;36223:332::-;36344:4;36382:2;36371:9;36367:18;36359:26;;36395:71;36463:1;36452:9;36448:17;36439:6;36395:71;:::i;:::-;36476:72;36544:2;36533:9;36529:18;36520:6;36476:72;:::i;:::-;36223:332;;;;;:::o;36561:129::-;36595:6;36622:20;;:::i;:::-;36612:30;;36651:33;36679:4;36671:6;36651:33;:::i;:::-;36561:129;;;:::o;36696:75::-;36729:6;36762:2;36756:9;36746:19;;36696:75;:::o;36777:311::-;36854:4;36944:18;36936:6;36933:30;36930:56;;;36966:18;;:::i;:::-;36930:56;37016:4;37008:6;37004:17;36996:25;;37076:4;37070;37066:15;37058:23;;36777:311;;;:::o;37094:307::-;37155:4;37245:18;37237:6;37234:30;37231:56;;;37267:18;;:::i;:::-;37231:56;37305:29;37327:6;37305:29;:::i;:::-;37297:37;;37389:4;37383;37379:15;37371:23;;37094:307;;;:::o;37407:308::-;37469:4;37559:18;37551:6;37548:30;37545:56;;;37581:18;;:::i;:::-;37545:56;37619:29;37641:6;37619:29;:::i;:::-;37611:37;;37703:4;37697;37693:15;37685:23;;37407:308;;;:::o;37721:132::-;37788:4;37811:3;37803:11;;37841:4;37836:3;37832:14;37824:22;;37721:132;;;:::o;37859:141::-;37908:4;37931:3;37923:11;;37954:3;37951:1;37944:14;37988:4;37985:1;37975:18;37967:26;;37859:141;;;:::o;38006:114::-;38073:6;38107:5;38101:12;38091:22;;38006:114;;;:::o;38126:98::-;38177:6;38211:5;38205:12;38195:22;;38126:98;;;:::o;38230:99::-;38282:6;38316:5;38310:12;38300:22;;38230:99;;;:::o;38335:113::-;38405:4;38437;38432:3;38428:14;38420:22;;38335:113;;;:::o;38454:184::-;38553:11;38587:6;38582:3;38575:19;38627:4;38622:3;38618:14;38603:29;;38454:184;;;;:::o;38644:168::-;38727:11;38761:6;38756:3;38749:19;38801:4;38796:3;38792:14;38777:29;;38644:168;;;;:::o;38818:169::-;38902:11;38936:6;38931:3;38924:19;38976:4;38971:3;38967:14;38952:29;;38818:169;;;;:::o;38993:148::-;39095:11;39132:3;39117:18;;38993:148;;;;:::o;39147:305::-;39187:3;39206:20;39224:1;39206:20;:::i;:::-;39201:25;;39240:20;39258:1;39240:20;:::i;:::-;39235:25;;39394:1;39326:66;39322:74;39319:1;39316:81;39313:107;;;39400:18;;:::i;:::-;39313:107;39444:1;39441;39437:9;39430:16;;39147:305;;;;:::o;39458:185::-;39498:1;39515:20;39533:1;39515:20;:::i;:::-;39510:25;;39549:20;39567:1;39549:20;:::i;:::-;39544:25;;39588:1;39578:35;;39593:18;;:::i;:::-;39578:35;39635:1;39632;39628:9;39623:14;;39458:185;;;;:::o;39649:348::-;39689:7;39712:20;39730:1;39712:20;:::i;:::-;39707:25;;39746:20;39764:1;39746:20;:::i;:::-;39741:25;;39934:1;39866:66;39862:74;39859:1;39856:81;39851:1;39844:9;39837:17;39833:105;39830:131;;;39941:18;;:::i;:::-;39830:131;39989:1;39986;39982:9;39971:20;;39649:348;;;;:::o;40003:191::-;40043:4;40063:20;40081:1;40063:20;:::i;:::-;40058:25;;40097:20;40115:1;40097:20;:::i;:::-;40092:25;;40136:1;40133;40130:8;40127:34;;;40141:18;;:::i;:::-;40127:34;40186:1;40183;40179:9;40171:17;;40003:191;;;;:::o;40200:96::-;40237:7;40266:24;40284:5;40266:24;:::i;:::-;40255:35;;40200:96;;;:::o;40302:90::-;40336:7;40379:5;40372:13;40365:21;40354:32;;40302:90;;;:::o;40398:149::-;40434:7;40474:66;40467:5;40463:78;40452:89;;40398:149;;;:::o;40553:126::-;40590:7;40630:42;40623:5;40619:54;40608:65;;40553:126;;;:::o;40685:77::-;40722:7;40751:5;40740:16;;40685:77;;;:::o;40768:154::-;40852:6;40847:3;40842;40829:30;40914:1;40905:6;40900:3;40896:16;40889:27;40768:154;;;:::o;40928:307::-;40996:1;41006:113;41020:6;41017:1;41014:13;41006:113;;;41105:1;41100:3;41096:11;41090:18;41086:1;41081:3;41077:11;41070:39;41042:2;41039:1;41035:10;41030:15;;41006:113;;;41137:6;41134:1;41131:13;41128:101;;;41217:1;41208:6;41203:3;41199:16;41192:27;41128:101;40977:258;40928:307;;;:::o;41241:320::-;41285:6;41322:1;41316:4;41312:12;41302:22;;41369:1;41363:4;41359:12;41390:18;41380:81;;41446:4;41438:6;41434:17;41424:27;;41380:81;41508:2;41500:6;41497:14;41477:18;41474:38;41471:84;;;41527:18;;:::i;:::-;41471:84;41292:269;41241:320;;;:::o;41567:281::-;41650:27;41672:4;41650:27;:::i;:::-;41642:6;41638:40;41780:6;41768:10;41765:22;41744:18;41732:10;41729:34;41726:62;41723:88;;;41791:18;;:::i;:::-;41723:88;41831:10;41827:2;41820:22;41610:238;41567:281;;:::o;41854:233::-;41893:3;41916:24;41934:5;41916:24;:::i;:::-;41907:33;;41962:66;41955:5;41952:77;41949:103;;;42032:18;;:::i;:::-;41949:103;42079:1;42072:5;42068:13;42061:20;;41854:233;;;:::o;42093:176::-;42125:1;42142:20;42160:1;42142:20;:::i;:::-;42137:25;;42176:20;42194:1;42176:20;:::i;:::-;42171:25;;42215:1;42205:35;;42220:18;;:::i;:::-;42205:35;42261:1;42258;42254:9;42249:14;;42093:176;;;;:::o;42275:180::-;42323:77;42320:1;42313:88;42420:4;42417:1;42410:15;42444:4;42441:1;42434:15;42461:180;42509:77;42506:1;42499:88;42606:4;42603:1;42596:15;42630:4;42627:1;42620:15;42647:180;42695:77;42692:1;42685:88;42792:4;42789:1;42782:15;42816:4;42813:1;42806:15;42833:180;42881:77;42878:1;42871:88;42978:4;42975:1;42968:15;43002:4;42999:1;42992:15;43019:180;43067:77;43064:1;43057:88;43164:4;43161:1;43154:15;43188:4;43185:1;43178:15;43205:180;43253:77;43250:1;43243:88;43350:4;43347:1;43340:15;43374:4;43371:1;43364:15;43391:117;43500:1;43497;43490:12;43514:117;43623:1;43620;43613:12;43637:117;43746:1;43743;43736:12;43760:117;43869:1;43866;43859:12;43883:117;43992:1;43989;43982:12;44006:102;44047:6;44098:2;44094:7;44089:2;44082:5;44078:14;44074:28;44064:38;;44006:102;;;:::o;44114:226::-;44254:34;44250:1;44242:6;44238:14;44231:58;44323:9;44318:2;44310:6;44306:15;44299:34;44114:226;:::o;44346:181::-;44486:33;44482:1;44474:6;44470:14;44463:57;44346:181;:::o;44533:231::-;44673:34;44669:1;44661:6;44657:14;44650:58;44742:14;44737:2;44729:6;44725:15;44718:39;44533:231;:::o;44770:230::-;44910:34;44906:1;44898:6;44894:14;44887:58;44979:13;44974:2;44966:6;44962:15;44955:38;44770:230;:::o;45006:237::-;45146:34;45142:1;45134:6;45130:14;45123:58;45215:20;45210:2;45202:6;45198:15;45191:45;45006:237;:::o;45249:229::-;45389:34;45385:1;45377:6;45373:14;45366:58;45458:12;45453:2;45445:6;45441:15;45434:37;45249:229;:::o;45484:225::-;45624:34;45620:1;45612:6;45608:14;45601:58;45693:8;45688:2;45680:6;45676:15;45669:33;45484:225;:::o;45715:178::-;45855:30;45851:1;45843:6;45839:14;45832:54;45715:178;:::o;45899:223::-;46039:34;46035:1;46027:6;46023:14;46016:58;46108:6;46103:2;46095:6;46091:15;46084:31;45899:223;:::o;46128:175::-;46268:27;46264:1;46256:6;46252:14;46245:51;46128:175;:::o;46309:231::-;46449:34;46445:1;46437:6;46433:14;46426:58;46518:14;46513:2;46505:6;46501:15;46494:39;46309:231;:::o;46546:243::-;46686:34;46682:1;46674:6;46670:14;46663:58;46755:26;46750:2;46742:6;46738:15;46731:51;46546:243;:::o;46795:229::-;46935:34;46931:1;46923:6;46919:14;46912:58;47004:12;46999:2;46991:6;46987:15;46980:37;46795:229;:::o;47030:228::-;47170:34;47166:1;47158:6;47154:14;47147:58;47239:11;47234:2;47226:6;47222:15;47215:36;47030:228;:::o;47264:235::-;47404:34;47400:1;47392:6;47388:14;47381:58;47473:18;47468:2;47460:6;47456:15;47449:43;47264:235;:::o;47505:220::-;47645:34;47641:1;47633:6;47629:14;47622:58;47714:3;47709:2;47701:6;47697:15;47690:28;47505:220;:::o;47731:182::-;47871:34;47867:1;47859:6;47855:14;47848:58;47731:182;:::o;47919:236::-;48059:34;48055:1;48047:6;48043:14;48036:58;48128:19;48123:2;48115:6;48111:15;48104:44;47919:236;:::o;48161:231::-;48301:34;48297:1;48289:6;48285:14;48278:58;48370:14;48365:2;48357:6;48353:15;48346:39;48161:231;:::o;48398:::-;48538:34;48534:1;48526:6;48522:14;48515:58;48607:14;48602:2;48594:6;48590:15;48583:39;48398:231;:::o;48635:182::-;48775:34;48771:1;48763:6;48759:14;48752:58;48635:182;:::o;48823:221::-;48963:34;48959:1;48951:6;48947:14;48940:58;49032:4;49027:2;49019:6;49015:15;49008:29;48823:221;:::o;49050:228::-;49190:34;49186:1;49178:6;49174:14;49167:58;49259:11;49254:2;49246:6;49242:15;49235:36;49050:228;:::o;49284:220::-;49424:34;49420:1;49412:6;49408:14;49401:58;49493:3;49488:2;49480:6;49476:15;49469:28;49284:220;:::o;49510:236::-;49650:34;49646:1;49638:6;49634:14;49627:58;49719:19;49714:2;49706:6;49702:15;49695:44;49510:236;:::o;49752:231::-;49892:34;49888:1;49880:6;49876:14;49869:58;49961:14;49956:2;49948:6;49944:15;49937:39;49752:231;:::o;49989:122::-;50062:24;50080:5;50062:24;:::i;:::-;50055:5;50052:35;50042:63;;50101:1;50098;50091:12;50042:63;49989:122;:::o;50117:116::-;50187:21;50202:5;50187:21;:::i;:::-;50180:5;50177:32;50167:60;;50223:1;50220;50213:12;50167:60;50117:116;:::o;50239:120::-;50311:23;50328:5;50311:23;:::i;:::-;50304:5;50301:34;50291:62;;50349:1;50346;50339:12;50291:62;50239:120;:::o;50365:122::-;50438:24;50456:5;50438:24;:::i;:::-;50431:5;50428:35;50418:63;;50477:1;50474;50467:12;50418:63;50365:122;:::o

Swarm Source

ipfs://7650e3e0685d1da6e28b9254d11c8157a32e4af081e842727f6450b8fcf14311
Loading...
Loading
Loading...
Loading
[ 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.