ETH Price: $2,930.87 (-7.17%)
Gas: 7 Gwei

Token

SparklesDogs (SPD)
 

Overview

Max Total Supply

897 SPD

Holders

246

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
sanyigg520.eth
Balance
2 SPD
0x316fa1d608beb5e5e59e478eb4120a678d484e77
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:
SparklesDogs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-20
*/

// SPDX-License-Identifier: MIT


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @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;
}


// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
 * @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);
}


// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;
/**
 * @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;
    }
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

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

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


// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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 {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



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


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

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

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

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

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

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

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

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

pragma solidity >=0.7.0 <0.9.0;

//**********************************************************
//**********************************************************
//**********************************************************
//***************&G5Y5G&************************************
//**************B?!~~~!JG***********************************
//*************B7!^::^!!?5**********************************
//************#?!~::::~!J?B*********************************
//************P7!^^~~~!75JJ*********************************
//***********&Y77!77777JPY!#**********************&#BBB#&***
//***********BJ777?JJ?J5PJ75*******************#GY?7!~~!J#**
//**********BY????5PP5PPY77J&&&**************BYJ7!!~^::^!P**
//*********BJ????YPP55YJ7777777?JYPB&*****&GJ?5J!!~::^:^!G**
//*********PYJJJYP5J??7777?7777777!77J5G&P?7JPY777!~::^~J&**
//*********G5GPGPY77???JYJ777777???77777777?5PJ??77!:^~?B***
//**********BPBP?JYYYYYYJ?7!7!!!!!77?777777YPP5P5?77!!JB****
//***********&5?P5Y5~!G55??7?JJ?7!!!777?J?7?YPPP5??77Y#*****
//***********P7P5?YB##&&5?JJJYYJJ?7777?JJJ?77YP5J????G******
//**********&?75GGJPGB##57?YYY5YY?7?JY5YYYJ?7YP5JJ??JB******
//*********&?77~JBBGGGP5Y5555YJJ?7JP#&G!^YG?7JBP5YY5G&******
//*********B7??77J5GGGGGB&&BGGBP??P#&&#BPJYP7?BBGGG#********
//*********&JYPGGGGGGPPPP#&&&&##G5GGPPPYJYP5!5###&**********
//**********B5BGGGGGPPPPGB##GPPGGGGGGBBGG5577#**************
//***********#BBBBBBBBGPPPGBBGP5PGGP5J??777Y#***************
//**********#YJ55PGBGBJ7??J5BBBBPGGGGY!!77J&****************
//*********#7777??J55PP5JY5GB#B#BGGGGY??J5#*****************
//*********YY?77777J5Y?JJGPY5PGGBBGP555G#*******************
//********&Y777!??77JY~^^!!^?YJJJYYYYYJY********************
//********GJ?!!JJ?777~:::^^^^7?77777??Y?B*******************
//*******B7JJ7?77J?7^.       .~?7777!!JJ5*******************
//******&Y?YJ?77PJ77?7.     .~7?YJ77!7?YJ*******************
//*****#BYJ?77!5P?7?!:        ~7JP777!?YY*******************
//****P?5??777!GPY?^          ^JYP?7?7775*******************
//*****B5????7!B#5~^:::.....:^YY5B?7777?P*******************
//****#5J??JJ?7#*&B5J7!~~^~~~?GB&*J7?JJYJY#*****************
//****BYJJ?7??J&******&#BBB#&****#?777?7??Y&****************
//******&#####&*******************#G55PPG##*****************
//**********************************************************
//**********************************************************
//**********************************************************

contract SparklesDogs is ERC721Enumerable, Ownable {
  using Strings for uint256;

  uint256 public cost = 0.02 ether;
  uint256 public maxSupply = 1000;
  uint256 public maxMintAmount = 5;
  uint256 public tokenAddress;

  bool public paused;

  using Strings for uint256;
        
// Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

  constructor(
    string memory _name,
    string memory _symbol,
    uint256 _tokenAddress

  ) 
  ERC721(_name, _symbol) {
    setTokenAddress(_tokenAddress);
    }

 
  
   function mintOneGift(address to, uint256 tokenId,  string memory _nftUri  ) public onlyOwner {

    require (tokenId > 881);
    require (tokenId < 1000);
      
    _safeMint(to, tokenId );
    _setTokenURI(tokenId,  _nftUri);
   }
  
  
  function mintFive(uint256 _mintAmount1, uint256 _mintAmount2, uint256 _mintAmount3, uint256 _mintAmount4, uint256 _mintAmount5
  , string[] memory _nftUri ) public payable {
    
    require(!paused);
    uint256 mintAmount1 = (_mintAmount1 - tokenAddress) / 1000000;
    uint256 _breeds1 = (_mintAmount1 - tokenAddress) % 1000;
    require (_breeds1 + mintAmount1 <= 882); 

    if(_breeds1 % 21 != 0)
    {
        require(_exists(_breeds1 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount1 + _breeds1 <= (((_mintAmount1 - tokenAddress) % 100000) / 1000*21)));

    uint256 mintAmount2 = _mintAmount2 / 1000000;
    uint256 _breeds2 = _mintAmount2 % 1000;
    require (_breeds2 + mintAmount2 <= 882);

    if(_breeds2 % 21 != 0)
    {
        require(_exists(_breeds2 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount2 + _breeds2 <= ((_mintAmount2 % 100000) / 1000*21)));

    uint256 mintAmount3 = _mintAmount3 / 1000000;
    uint256 _breeds3 = _mintAmount3 % 1000;
    require (_breeds3 + mintAmount3 <= 882);

    if(_breeds3 % 21 != 0)
    {
        require(_exists(_breeds3 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount3 + _breeds3 <= ((_mintAmount3 % 100000) / 1000*21)));

    uint256 mintAmount4 = _mintAmount4 / 1000000;
    uint256 _breeds4 = _mintAmount4 % 1000;
    require (_breeds4 + mintAmount4 <= 882);

    if(_breeds4 % 21 != 0)
    {
        require(_exists(_breeds4 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount4 + _breeds4 <= ((_mintAmount4 % 100000) / 1000*21)));

    uint256 mintAmount5 = _mintAmount5 / 1000000;
    uint256 _breeds5 = _mintAmount5 % 1000;
    require (_breeds5  + mintAmount5 <= 882);

    if(_breeds5 % 21 != 0)
    {
        require(_exists(_breeds5 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount5 + _breeds5 <= ((_mintAmount5 % 100000) / 1000*21)));
 
    require(mintAmount1 == 1);    
    require(mintAmount2 == 1);
    require(mintAmount3 == 1);
    require(mintAmount4 == 1);
    require(mintAmount5 == 1);
   
    if (msg.sender != owner()) {
      require(msg.value >= cost * mintAmount1*5 );
    }

    for (uint256 i = _breeds1; i < mintAmount1 + _breeds1; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[0]);
        
    }

    for (uint256 i = _breeds2; i < mintAmount2 + _breeds2; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[1]);
        
    }

    for (uint256 i = _breeds3; i < mintAmount3 + _breeds3; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[2]);
        
    }

    for (uint256 i = _breeds4; i < mintAmount4 + _breeds4; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[3]);
        
    }

    for (uint256 i = _breeds5; i < mintAmount5 + _breeds5; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[4]);
    }
    
  }

  function mintFour(uint256 _mintAmount1, uint256 _mintAmount2, uint256 _mintAmount3, uint256 _mintAmount4
  , string[] memory _nftUri ) public payable {

    require(!paused);
    uint8 j = 0;
    uint256 mintAmount1 = (_mintAmount1 - tokenAddress) / 1000000;
    uint256 _breeds1 = (_mintAmount1 - tokenAddress) % 1000;
    require (_breeds1 + mintAmount1 <= 882); 

    if(_breeds1 % 21 != 0)
    {
        require(_exists(_breeds1 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount1 + _breeds1 <= (((_mintAmount1 - tokenAddress) % 100000) / 1000*21)));

    uint256 mintAmount2 = _mintAmount2 / 1000000;
    uint256 _breeds2 = _mintAmount2 % 1000;
    require (_breeds2 + mintAmount2 <= 882);

    if(_breeds2 % 21 != 0)
    {
        require(_exists(_breeds2 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount2 + _breeds2 <= ((_mintAmount2 % 100000) / 1000*21)));

    uint256 mintAmount3 = _mintAmount3 / 1000000;
    uint256 _breeds3 = _mintAmount3 % 1000;
    require (_breeds3 + mintAmount3 <= 882);

    if(_breeds3 % 21 != 0)
    {
        require(_exists(_breeds3 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount3 + _breeds3 <= ((_mintAmount3 % 100000) / 1000*21)));

    uint256 mintAmount4 = _mintAmount4 / 1000000;
    uint256 _breeds4 = _mintAmount4 % 1000;
    require (_breeds4 + mintAmount4 <= 882);

    if(_breeds4 % 21 != 0)
    {
        require(_exists(_breeds4 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount4 + _breeds4 <= ((_mintAmount4 % 100000) / 1000*21)));

    require(mintAmount1 > 0); 
    require(mintAmount2 > 0); 
    require(mintAmount3 > 0); 
    require(mintAmount4 > 0);    
      
    require(mintAmount1+mintAmount2+mintAmount3+mintAmount4  <= maxMintAmount);

    if (msg.sender != owner()) {
      require(msg.value >= cost * (mintAmount1+mintAmount2+mintAmount3+mintAmount4 ));
    }
       
    for (uint256 i = _breeds1; i < mintAmount1 + _breeds1; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

    for (uint256 i = _breeds2; i < mintAmount2 + _breeds2; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

    for (uint256 i = _breeds3; i < mintAmount3 + _breeds3; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }
    for (uint256 i = _breeds4; i < mintAmount4 + _breeds4; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

  }

   function mintThree(uint256 _mintAmount1, uint256 _mintAmount2, uint256 _mintAmount3,  string[] memory _nftUri) public payable {
    
    require(!paused);
    uint8 j = 0;
    uint256 mintAmount1 = (_mintAmount1 - tokenAddress) / 1000000;
    uint256 _breeds1 = (_mintAmount1 - tokenAddress) % 1000;
    require (_breeds1 + mintAmount1 <= 882); 

        if(_breeds1 % 21 != 0)
    {
        require(_exists(_breeds1 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount1 + _breeds1 <= (((_mintAmount1 - tokenAddress) % 100000) / 1000*21)));

    uint256 mintAmount2 = _mintAmount2 / 1000000;
    uint256 _breeds2 = _mintAmount2 % 1000;
    require (_breeds2 + mintAmount2 <= 882);

        if(_breeds2 % 21 != 0)
    {
        require(_exists(_breeds2 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount2 + _breeds2 <= ((_mintAmount2 % 100000) / 1000*21)));

    uint256 mintAmount3 = _mintAmount3 / 1000000;
    uint256 _breeds3 = _mintAmount3 % 1000;
    require (_breeds3 + mintAmount3 <= 882);

        if(_breeds3 % 21 != 0)
    {
        require(_exists(_breeds3 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount3 + _breeds3 <= ((_mintAmount3 % 100000) / 1000*21)));

    require(mintAmount1 > 0); 
    require(mintAmount2 > 0); 
    require(mintAmount3 > 0); 
       
    require(mintAmount1+mintAmount2+mintAmount3  <= maxMintAmount);

    if (msg.sender != owner()) {
      require(msg.value >= cost * (mintAmount1+mintAmount2+mintAmount3 ));
    }
       
    for (uint256 i = _breeds1; i < mintAmount1 + _breeds1; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

    for (uint256 i = _breeds2; i < mintAmount2 + _breeds2; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

    for (uint256 i = _breeds3; i < mintAmount3 + _breeds3; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }
     
  }

  function mintTwo(uint256 _mintAmount1, uint256 _mintAmount2, string[] memory _nftUri) public payable {
    
    require(!paused);
    uint8 j = 0;
    uint256 mintAmount1 = (_mintAmount1 - tokenAddress) / 1000000;
    uint256 _breeds1 = (_mintAmount1 - tokenAddress) % 1000;
    require (_breeds1 + mintAmount1 <= 882);

    if(_breeds1 % 21 != 0)
    {
        require(_exists(_breeds1 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount1 + _breeds1 <= (((_mintAmount1 - tokenAddress) % 100000) / 1000*21)));

    uint256 mintAmount2 = _mintAmount2 / 1000000;
    uint256 _breeds2 = _mintAmount2 % 1000;
    require (_breeds2 + mintAmount2 <= 882);

    if(_breeds2 % 21 != 0)
    {
        require(_exists(_breeds2 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount2 + _breeds2 <= ((_mintAmount2 % 100000) / 1000*21)));
    
    require(mintAmount1 > 0); 
    require(mintAmount2 > 0); 
    
    require(mintAmount1 + mintAmount2  <= maxMintAmount);

    if (msg.sender != owner()) {
       require(msg.value >= cost * (mintAmount1 + mintAmount2 ));
    }
             
    for (uint256 i = _breeds1; i < mintAmount1 + _breeds1; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }

    for (uint256 i = _breeds2; i < mintAmount2 + _breeds2; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }
  }

   function mintOne(uint256 _mintAmount1,string[] memory _nftUri) public payable {
    
    require(!paused);
    uint8 j = 0;
    uint256 mintAmount1 = (_mintAmount1 - tokenAddress) / 1000000 ;
    uint256 _breeds1 = (_mintAmount1 - tokenAddress) % 1000;
    require (_breeds1 + mintAmount1 <= 882); 

    if(_breeds1 % 21 != 0)
    {
        require(_exists(_breeds1 - 1), "ERC721Metadata: URI set of nonexistent token");
    }
    require((mintAmount1 + _breeds1 <= (((_mintAmount1 - tokenAddress) % 100000) / 1000*21)));

    require(mintAmount1 > 0);    
    require(mintAmount1  <= maxMintAmount);


    if (msg.sender != owner()) {
       require(msg.value >= cost * (mintAmount1 ));
    }
    for (uint256 i = _breeds1; i < mintAmount1 + _breeds1; i++) {
        _safeMint(msg.sender,i);
        _setTokenURI(i,  _nftUri[j]);
        j++;
    }
   }

  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 _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
        

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

        string memory _tokenURI = _tokenURIs[tokenId];
        return _tokenURI;
           
    }


  function setTokenURI(          
            uint256 _tokenId,
            string memory tokenURI_
        ) external onlyOwner() {
           
            _setTokenURI(_tokenId, tokenURI_);
        }     


  function setCost(uint256 _newCost) public onlyOwner() {
    cost = _newCost;
  }

   function setTokenAddress(uint256 _newAddress) public onlyOwner() {
    tokenAddress = _newAddress;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() {
    maxMintAmount = _newmaxMintAmount;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function withdraw() public payable onlyOwner {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success);
  }

    
  function tokenByIndexBreed(uint256 _startID)  public
    view
    returns (uint256)
  {
    uint256 j;
    uint256 totalSup = totalSupply();
    for (uint256 i = 0; i < totalSup; i++) {
        uint256 tokenbyind = tokenByIndex(i);
        if(  tokenbyind >= _startID && tokenbyind < (_startID + 21)    ){
        j++;  
      }         
  }
    return j;   
  }

   function allTokens()  public
    view
    returns (uint256[] memory)
  {
    uint256 j;
    uint256[] memory tokenIds = new uint256[](totalSupply());

    for (uint256 i = 0; i < totalSupply(); i++) {
     
      if(tokenByIndex(i) >= 0 && tokenByIndex(i) < maxSupply ){
        j++;  
         tokenIds[i] = tokenByIndex(i);
      }         
  }
    return tokenIds;   
  }

     function allTokensInt(uint256 _start, uint256 _end)  public
    view
    returns (uint256[] memory)
  {
    uint256 j;
    uint256 end;
    if(_end >= totalSupply()) {end = totalSupply() - 1;}
    else {end = _end;}
    
    uint256[] memory tokenIds = new uint256[](end - _start + 1);

    for (uint256 i = 0; i <= end - _start ; i++) {
     
      if(tokenByIndex(_start + i) >= 0 && tokenByIndex(_start + i) < maxSupply ){
        j++;  
        tokenIds[i] = tokenByIndex(_start + i);
      }         
  }
    return tokenIds;   
  }
   
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_tokenAddress","type":"uint256"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"allTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"allTokensInt","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount1","type":"uint256"},{"internalType":"uint256","name":"_mintAmount2","type":"uint256"},{"internalType":"uint256","name":"_mintAmount3","type":"uint256"},{"internalType":"uint256","name":"_mintAmount4","type":"uint256"},{"internalType":"uint256","name":"_mintAmount5","type":"uint256"},{"internalType":"string[]","name":"_nftUri","type":"string[]"}],"name":"mintFive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount1","type":"uint256"},{"internalType":"uint256","name":"_mintAmount2","type":"uint256"},{"internalType":"uint256","name":"_mintAmount3","type":"uint256"},{"internalType":"uint256","name":"_mintAmount4","type":"uint256"},{"internalType":"string[]","name":"_nftUri","type":"string[]"}],"name":"mintFour","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount1","type":"uint256"},{"internalType":"string[]","name":"_nftUri","type":"string[]"}],"name":"mintOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_nftUri","type":"string"}],"name":"mintOneGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount1","type":"uint256"},{"internalType":"uint256","name":"_mintAmount2","type":"uint256"},{"internalType":"uint256","name":"_mintAmount3","type":"uint256"},{"internalType":"string[]","name":"_nftUri","type":"string[]"}],"name":"mintThree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount1","type":"uint256"},{"internalType":"uint256","name":"_mintAmount2","type":"uint256"},{"internalType":"string[]","name":"_nftUri","type":"string[]"}],"name":"mintTwo","outputs":[],"stateMutability":"payable","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAddress","type":"uint256"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[],"name":"tokenAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startID","type":"uint256"}],"name":"tokenByIndexBreed","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266470de4df820000600b556103e8600c556005600d553480156200002757600080fd5b5060405162003d0a38038062003d0a8339810160408190526200004a91620002c1565b8251839083906200006390600090602085019062000164565b5080516200007990600190602084019062000164565b5050506200009662000090620000aa60201b60201c565b620000ae565b620000a18162000100565b50505062000387565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200015f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600e55565b828054620001729062000334565b90600052602060002090601f016020900481019282620001965760008555620001e1565b82601f10620001b157805160ff1916838001178555620001e1565b82800160010185558215620001e1579182015b82811115620001e1578251825591602001919060010190620001c4565b50620001ef929150620001f3565b5090565b5b80821115620001ef5760008155600101620001f4565b600082601f8301126200021c57600080fd5b81516001600160401b038082111562000239576200023962000371565b604051601f8301601f19908116603f0116810190828211818310171562000264576200026462000371565b816040528381526020925086838588010111156200028157600080fd5b600091505b83821015620002a5578582018301518183018401529082019062000286565b83821115620002b75760008385830101525b9695505050505050565b600080600060608486031215620002d757600080fd5b83516001600160401b0380821115620002ef57600080fd5b620002fd878388016200020a565b945060208601519150808211156200031457600080fd5b5062000323868287016200020a565b925050604084015190509250925092565b600181811c908216806200034957607f821691505b602082108114156200036b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61397380620003976000396000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063a794be86116100ab578063d5abeb011161006f578063d5abeb011461064e578063e1fb4eae14610664578063e985e9c514610677578063ee2820cf146106c0578063f2fde38b146106e057600080fd5b8063a794be86146105c8578063af29651e146105db578063b88d4fde146105fb578063c175007e1461061b578063c87b56dd1461062e57600080fd5b80637f00c7a6116100f25780637f00c7a61461053f5780638da5cb5b1461055f57806395d89b411461057d5780639d76ea5814610592578063a22cb465146105a857600080fd5b80636352211e146104b55780636ff97f1d146104d557806370a08231146104ea578063715018a61461050a578063741016441461051f57600080fd5b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461040e578063438b63001461042e57806344a0d68a1461045b5780634f6ccce71461047b5780635c975abb1461049b57600080fd5b806323b872dd146103a05780632509d40c146103c05780632f745c59146103d35780633322d790146103f35780633ccfd60b1461040657600080fd5b80630d3a5369116102035780630d3a53691461031157806313faede61461033f578063162094c41461035557806318160ddd14610375578063239c70ae1461038a57600080fd5b806301ffc9a71461024057806302329a291461027557806306fdde0314610297578063081812fc146102b9578063095ea7b3146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004613341565b610700565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004613326565b61072b565b005b3480156102a357600080fd5b506102ac610771565b60405161026c9190613666565b3480156102c557600080fd5b506102d96102d436600461337b565b610803565b6040516001600160a01b03909116815260200161026c565b3480156102fd57600080fd5b5061029561030c3660046132a6565b61088b565b34801561031d57600080fd5b5061033161032c36600461337b565b6109a1565b60405190815260200161026c565b34801561034b57600080fd5b50610331600b5481565b34801561036157600080fd5b506102956103703660046133da565b610a11565b34801561038157600080fd5b50600854610331565b34801561039657600080fd5b50610331600d5481565b3480156103ac57600080fd5b506102956103bb3660046131c5565b610a49565b6102956103ce366004613394565b610a7a565b3480156103df57600080fd5b506103316103ee3660046132a6565b610c1d565b61029561040136600461352d565b610cb3565b61029561123e565b34801561041a57600080fd5b506102956104293660046131c5565b6112c0565b34801561043a57600080fd5b5061044e610449366004613177565b6112db565b60405161026c9190613622565b34801561046757600080fd5b5061029561047636600461337b565b61137c565b34801561048757600080fd5b5061033161049636600461337b565b6113ab565b3480156104a757600080fd5b50600f546102609060ff1681565b3480156104c157600080fd5b506102d96104d036600461337b565b61143e565b3480156104e157600080fd5b5061044e6114b5565b3480156104f657600080fd5b50610331610505366004613177565b611588565b34801561051657600080fd5b5061029561160f565b34801561052b57600080fd5b5061029561053a36600461337b565b611645565b34801561054b57600080fd5b5061029561055a36600461337b565b611674565b34801561056b57600080fd5b50600a546001600160a01b03166102d9565b34801561058957600080fd5b506102ac6116a3565b34801561059e57600080fd5b50610331600e5481565b3480156105b457600080fd5b506102956105c336600461327c565b6116b2565b6102956105d636600461347d565b611777565b3480156105e757600080fd5b5061044e6105f6366004613416565b611b58565b34801561060757600080fd5b50610295610616366004613201565b611c7d565b6102956106293660046134ca565b611cb5565b34801561063a57600080fd5b506102ac61064936600461337b565b6121c0565b34801561065a57600080fd5b50610331600c5481565b610295610672366004613438565b6122ce565b34801561068357600080fd5b50610260610692366004613192565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102956106db3660046132d0565b612585565b3480156106ec57600080fd5b506102956106fb366004613177565b6125df565b60006001600160e01b0319821663780e9d6360e01b1480610725575061072582612677565b92915050565b600a546001600160a01b0316331461075e5760405162461bcd60e51b815260040161075590613717565b60405180910390fd5b600f805460ff1916911515919091179055565b6060600080546107809061382f565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac9061382f565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b600061080e826126c7565b61086f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b506000908152600460205260409020546001600160a01b031690565b60006108968261143e565b9050806001600160a01b0316836001600160a01b031614156109045760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610755565b336001600160a01b038216148061092057506109208133610692565b6109925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610755565b61099c83836126e4565b505050565b60008060006109af60085490565b905060005b81811015610a085760006109c7826113ab565b90508581101580156109e257506109df8660156137cd565b81105b156109f557836109f18161386a565b9450505b5080610a008161386a565b9150506109b4565b50909392505050565b600a546001600160a01b03163314610a3b5760405162461bcd60e51b815260040161075590613717565b610a458282612752565b5050565b610a533382612796565b610a6f5760405162461bcd60e51b81526004016107559061374c565b61099c838383612880565b600f5460ff1615610a8a57600080fd5b600080620f4240600e5485610a9f9190613818565b610aa991906137e5565b905060006103e8600e5486610abe9190613818565b610ac891906138a5565b9050610372610ad783836137cd565b1115610ae257600080fd5b610aed6015826138a5565b15610b2157610b05610b00600183613818565b6126c7565b610b215760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e5487610b369190613818565b610b4091906138a5565b610b4a91906137e5565b610b559060156137f9565b610b5f82846137cd565b1115610b6a57600080fd5b60008211610b7757600080fd5b600d54821115610b8657600080fd5b600a546001600160a01b03163314610bb25781600b54610ba691906137f9565b341015610bb257600080fd5b805b610bbe82846137cd565b811015610c1557610bcf3382612a2b565b610bf581868660ff1681518110610be857610be86138fb565b6020026020010151612752565b83610bff81613885565b9450508080610c0d9061386a565b915050610bb4565b505050505050565b6000610c2883611588565b8210610c8a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610755565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600f5460ff1615610cc357600080fd5b6000620f4240600e5488610cd79190613818565b610ce191906137e5565b905060006103e8600e5489610cf69190613818565b610d0091906138a5565b9050610372610d0f83836137cd565b1115610d1a57600080fd5b610d256015826138a5565b15610d5457610d38610b00600183613818565b610d545760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548a610d699190613818565b610d7391906138a5565b610d7d91906137e5565b610d889060156137f9565b610d9282846137cd565b1115610d9d57600080fd5b6000610dac620f4240896137e5565b90506000610dbc6103e88a6138a5565b9050610372610dcb83836137cd565b1115610dd657600080fd5b610de16015826138a5565b15610e1057610df4610b00600183613818565b610e105760405162461bcd60e51b8152600401610755906136cb565b6103e8610e20620186a08b6138a5565b610e2a91906137e5565b610e359060156137f9565b610e3f82846137cd565b1115610e4a57600080fd5b6000610e59620f42408a6137e5565b90506000610e696103e88b6138a5565b9050610372610e7883836137cd565b1115610e8357600080fd5b610e8e6015826138a5565b15610ebd57610ea1610b00600183613818565b610ebd5760405162461bcd60e51b8152600401610755906136cb565b6103e8610ecd620186a08c6138a5565b610ed791906137e5565b610ee29060156137f9565b610eec82846137cd565b1115610ef757600080fd5b6000610f06620f42408b6137e5565b90506000610f166103e88c6138a5565b9050610372610f2583836137cd565b1115610f3057600080fd5b610f3b6015826138a5565b15610f6a57610f4e610b00600183613818565b610f6a5760405162461bcd60e51b8152600401610755906136cb565b6103e8610f7a620186a08d6138a5565b610f8491906137e5565b610f8f9060156137f9565b610f9982846137cd565b1115610fa457600080fd5b6000610fb3620f42408c6137e5565b90506000610fc36103e88d6138a5565b9050610372610fd283836137cd565b1115610fdd57600080fd5b610fe86015826138a5565b1561101757610ffb610b00600183613818565b6110175760405162461bcd60e51b8152600401610755906136cb565b6103e8611027620186a08e6138a5565b61103191906137e5565b61103c9060156137f9565b61104682846137cd565b111561105157600080fd5b8960011461105e57600080fd5b8760011461106b57600080fd5b8560011461107857600080fd5b8360011461108557600080fd5b8160011461109257600080fd5b600a546001600160a01b031633146110c95789600b546110b291906137f9565b6110bd9060056137f9565b3410156110c957600080fd5b885b6110d58a8c6137cd565b81101561110f576110e63382612a2b565b6110fd818d600081518110610be857610be86138fb565b806111078161386a565b9150506110cb565b50865b61111c888a6137cd565b8110156111565761112d3382612a2b565b611144818d600181518110610be857610be86138fb565b8061114e8161386a565b915050611112565b50845b61116386886137cd565b81101561119d576111743382612a2b565b61118b818d600281518110610be857610be86138fb565b806111958161386a565b915050611159565b50825b6111aa84866137cd565b8110156111e4576111bb3382612a2b565b6111d2818d600381518110610be857610be86138fb565b806111dc8161386a565b9150506111a0565b50805b6111f182846137cd565b81101561122b576112023382612a2b565b611219818d600481518110610be857610be86138fb565b806112238161386a565b9150506111e7565b5050505050505050505050505050505050565b600a546001600160a01b031633146112685760405162461bcd60e51b815260040161075590613717565b604051600090339047908381818185875af1925050503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b50509050806112bd57600080fd5b50565b61099c83838360405180602001604052806000815250611c7d565b606060006112e883611588565b90506000816001600160401b0381111561130457611304613911565b60405190808252806020026020018201604052801561132d578160200160208202803683370190505b50905060005b82811015611374576113458582610c1d565b828281518110611357576113576138fb565b60209081029190910101528061136c8161386a565b915050611333565b509392505050565b600a546001600160a01b031633146113a65760405162461bcd60e51b815260040161075590613717565b600b55565b60006113b660085490565b82106114195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610755565b6008828154811061142c5761142c6138fb565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610755565b60606000806114c360085490565b6001600160401b038111156114da576114da613911565b604051908082528060200260200182016040528015611503578160200160208202803683370190505b50905060005b60085481101561158157600061151e826113ab565b101580156115355750600c54611533826113ab565b105b1561156f57826115448161386a565b935050611550816113ab565b828281518110611562576115626138fb565b6020026020010181815250505b806115798161386a565b915050611509565b5092915050565b60006001600160a01b0382166115f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610755565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116395760405162461bcd60e51b815260040161075590613717565b6116436000612a45565b565b600a546001600160a01b0316331461166f5760405162461bcd60e51b815260040161075590613717565b600e55565b600a546001600160a01b0316331461169e5760405162461bcd60e51b815260040161075590613717565b600d55565b6060600180546107809061382f565b6001600160a01b03821633141561170b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610755565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f5460ff161561178757600080fd5b600080620f4240600e548761179c9190613818565b6117a691906137e5565b905060006103e8600e54886117bb9190613818565b6117c591906138a5565b90506103726117d483836137cd565b11156117df57600080fd5b6117ea6015826138a5565b15611819576117fd610b00600183613818565b6118195760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548961182e9190613818565b61183891906138a5565b61184291906137e5565b61184d9060156137f9565b61185782846137cd565b111561186257600080fd5b6000611871620f4240886137e5565b905060006118816103e8896138a5565b905061037261189083836137cd565b111561189b57600080fd5b6118a66015826138a5565b156118d5576118b9610b00600183613818565b6118d55760405162461bcd60e51b8152600401610755906136cb565b6103e86118e5620186a08a6138a5565b6118ef91906137e5565b6118fa9060156137f9565b61190482846137cd565b111561190f57600080fd5b600061191e620f4240896137e5565b9050600061192e6103e88a6138a5565b905061037261193d83836137cd565b111561194857600080fd5b6119536015826138a5565b1561198257611966610b00600183613818565b6119825760405162461bcd60e51b8152600401610755906136cb565b6103e8611992620186a08b6138a5565b61199c91906137e5565b6119a79060156137f9565b6119b182846137cd565b11156119bc57600080fd5b600086116119c957600080fd5b600084116119d657600080fd5b600082116119e357600080fd5b600d54826119f186896137cd565b6119fb91906137cd565b1115611a0657600080fd5b600a546001600160a01b03163314611a465781611a2385886137cd565b611a2d91906137cd565b600b54611a3a91906137f9565b341015611a4657600080fd5b845b611a5286886137cd565b811015611a9c57611a633382612a2b565b611a7c818a8a60ff1681518110610be857610be86138fb565b87611a8681613885565b9850508080611a949061386a565b915050611a48565b50825b611aa984866137cd565b811015611af357611aba3382612a2b565b611ad3818a8a60ff1681518110610be857610be86138fb565b87611add81613885565b9850508080611aeb9061386a565b915050611a9f565b50805b611b0082846137cd565b811015611b4a57611b113382612a2b565b611b2a818a8a60ff1681518110610be857610be86138fb565b87611b3481613885565b9850508080611b429061386a565b915050611af6565b505050505050505050505050565b6060600080611b6660085490565b8410611b88576001611b7760085490565b611b819190613818565b9050611b8b565b50825b6000611b978683613818565b611ba29060016137cd565b6001600160401b03811115611bb957611bb9613911565b604051908082528060200260200182016040528015611be2578160200160208202803683370190505b50905060005b611bf28784613818565b8111611c73576000611c07610496838a6137cd565b10158015611c225750600c54611c20610496838a6137cd565b105b15611c615783611c318161386a565b9450611c42905061049682896137cd565b828281518110611c5457611c546138fb565b6020026020010181815250505b80611c6b8161386a565b915050611be8565b5095945050505050565b611c873383612796565b611ca35760405162461bcd60e51b81526004016107559061374c565b611caf84848484612a97565b50505050565b600f5460ff1615611cc557600080fd5b600080620f4240600e5488611cda9190613818565b611ce491906137e5565b905060006103e8600e5489611cf99190613818565b611d0391906138a5565b9050610372611d1283836137cd565b1115611d1d57600080fd5b611d286015826138a5565b15611d5757611d3b610b00600183613818565b611d575760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548a611d6c9190613818565b611d7691906138a5565b611d8091906137e5565b611d8b9060156137f9565b611d9582846137cd565b1115611da057600080fd5b6000611daf620f4240896137e5565b90506000611dbf6103e88a6138a5565b9050610372611dce83836137cd565b1115611dd957600080fd5b611de46015826138a5565b15611e1357611df7610b00600183613818565b611e135760405162461bcd60e51b8152600401610755906136cb565b6103e8611e23620186a08b6138a5565b611e2d91906137e5565b611e389060156137f9565b611e4282846137cd565b1115611e4d57600080fd5b6000611e5c620f42408a6137e5565b90506000611e6c6103e88b6138a5565b9050610372611e7b83836137cd565b1115611e8657600080fd5b611e916015826138a5565b15611ec057611ea4610b00600183613818565b611ec05760405162461bcd60e51b8152600401610755906136cb565b6103e8611ed0620186a08c6138a5565b611eda91906137e5565b611ee59060156137f9565b611eef82846137cd565b1115611efa57600080fd5b6000611f09620f42408b6137e5565b90506000611f196103e88c6138a5565b9050610372611f2883836137cd565b1115611f3357600080fd5b611f3e6015826138a5565b15611f6d57611f51610b00600183613818565b611f6d5760405162461bcd60e51b8152600401610755906136cb565b6103e8611f7d620186a08d6138a5565b611f8791906137e5565b611f929060156137f9565b611f9c82846137cd565b1115611fa757600080fd5b60008811611fb457600080fd5b60008611611fc157600080fd5b60008411611fce57600080fd5b60008211611fdb57600080fd5b600d548285611fea898c6137cd565b611ff491906137cd565b611ffe91906137cd565b111561200957600080fd5b600a546001600160a01b03163314612054578184612027888b6137cd565b61203191906137cd565b61203b91906137cd565b600b5461204891906137f9565b34101561205457600080fd5b865b612060888a6137cd565b8110156120aa576120713382612a2b565b61208a818c8c60ff1681518110610be857610be86138fb565b8961209481613885565b9a505080806120a29061386a565b915050612056565b50845b6120b786886137cd565b811015612101576120c83382612a2b565b6120e1818c8c60ff1681518110610be857610be86138fb565b896120eb81613885565b9a505080806120f99061386a565b9150506120ad565b50825b61210e84866137cd565b8110156121585761211f3382612a2b565b612138818c8c60ff1681518110610be857610be86138fb565b8961214281613885565b9a505080806121509061386a565b915050612104565b50805b61216582846137cd565b8110156121af576121763382612a2b565b61218f818c8c60ff1681518110610be857610be86138fb565b8961219981613885565b9a505080806121a79061386a565b91505061215b565b505050505050505050505050505050565b60606121cb826126c7565b61222f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610755565b600082815260106020526040812080546122489061382f565b80601f01602080910402602001604051908101604052809291908181526020018280546122749061382f565b80156122c15780601f10612296576101008083540402835291602001916122c1565b820191906000526020600020905b8154815290600101906020018083116122a457829003601f168201915b5093979650505050505050565b600f5460ff16156122de57600080fd5b600080620f4240600e54866122f39190613818565b6122fd91906137e5565b905060006103e8600e54876123129190613818565b61231c91906138a5565b905061037261232b83836137cd565b111561233657600080fd5b6123416015826138a5565b1561237057612354610b00600183613818565b6123705760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e54886123859190613818565b61238f91906138a5565b61239991906137e5565b6123a49060156137f9565b6123ae82846137cd565b11156123b957600080fd5b60006123c8620f4240876137e5565b905060006123d86103e8886138a5565b90506103726123e783836137cd565b11156123f257600080fd5b6123fd6015826138a5565b1561242c57612410610b00600183613818565b61242c5760405162461bcd60e51b8152600401610755906136cb565b6103e861243c620186a0896138a5565b61244691906137e5565b6124519060156137f9565b61245b82846137cd565b111561246657600080fd5b6000841161247357600080fd5b6000821161248057600080fd5b600d5461248d83866137cd565b111561249857600080fd5b600a546001600160a01b031633146124cd576124b482856137cd565b600b546124c191906137f9565b3410156124cd57600080fd5b825b6124d984866137cd565b811015612523576124ea3382612a2b565b61250381888860ff1681518110610be857610be86138fb565b8561250d81613885565b965050808061251b9061386a565b9150506124cf565b50805b61253082846137cd565b81101561257a576125413382612a2b565b61255a81888860ff1681518110610be857610be86138fb565b8561256481613885565b96505080806125729061386a565b915050612526565b505050505050505050565b600a546001600160a01b031633146125af5760405162461bcd60e51b815260040161075590613717565b61037182116125bd57600080fd5b6103e882106125cb57600080fd5b6125d58383612a2b565b61099c8282612752565b600a546001600160a01b031633146126095760405162461bcd60e51b815260040161075590613717565b6001600160a01b03811661266e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610755565b6112bd81612a45565b60006001600160e01b031982166380ac58cd60e01b14806126a857506001600160e01b03198216635b5e139f60e01b145b8061072557506301ffc9a760e01b6001600160e01b0319831614610725565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127198261143e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61275b826126c7565b6127775760405162461bcd60e51b8152600401610755906136cb565b6000828152601060209081526040909120825161099c92840190612f91565b60006127a1826126c7565b6128025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b600061280d8361143e565b9050806001600160a01b0316846001600160a01b031614806128485750836001600160a01b031661283d84610803565b6001600160a01b0316145b8061287857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166128938261143e565b6001600160a01b0316146128fb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610755565b6001600160a01b03821661295d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610755565b612968838383612aca565b6129736000826126e4565b6001600160a01b038316600090815260036020526040812080546001929061299c908490613818565b90915550506001600160a01b03821660009081526003602052604081208054600192906129ca9084906137cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a45828260405180602001604052806000815250612b82565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612aa2848484612880565b612aae84848484612bb5565b611caf5760405162461bcd60e51b815260040161075590613679565b6001600160a01b038316612b2557612b2081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b48565b816001600160a01b0316836001600160a01b031614612b4857612b488382612cc2565b6001600160a01b038216612b5f5761099c81612d5f565b826001600160a01b0316826001600160a01b03161461099c5761099c8282612e0e565b612b8c8383612e52565b612b996000848484612bb5565b61099c5760405162461bcd60e51b815260040161075590613679565b60006001600160a01b0384163b15612cb757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bf99033908990889088906004016135e5565b602060405180830381600087803b158015612c1357600080fd5b505af1925050508015612c43575060408051601f3d908101601f19168201909252612c409181019061335e565b60015b612c9d573d808015612c71576040519150601f19603f3d011682016040523d82523d6000602084013e612c76565b606091505b508051612c955760405162461bcd60e51b815260040161075590613679565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612878565b506001949350505050565b60006001612ccf84611588565b612cd99190613818565b600083815260076020526040902054909150808214612d2c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d7190600190613818565b60008381526009602052604081205460088054939450909284908110612d9957612d996138fb565b906000526020600020015490508060088381548110612dba57612dba6138fb565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612df257612df26138e5565b6001900381819060005260206000200160009055905550505050565b6000612e1983611588565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612ea85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610755565b612eb1816126c7565b15612efe5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610755565b612f0a60008383612aca565b6001600160a01b0382166000908152600360205260408120805460019290612f339084906137cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f9d9061382f565b90600052602060002090601f016020900481019282612fbf5760008555613005565b82601f10612fd857805160ff1916838001178555613005565b82800160010185558215613005579182015b82811115613005578251825591602001919060010190612fea565b50613011929150613015565b5090565b5b808211156130115760008155600101613016565b60006001600160401b0383111561304357613043613911565b613056601f8401601f191660200161379d565b905082815283838301111561306a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461309857600080fd5b919050565b600082601f8301126130ae57600080fd5b813560206001600160401b03808311156130ca576130ca613911565b8260051b6130d983820161379d565b8481528381019087850183890186018a10156130f457600080fd5b60009350835b8781101561313157813586811115613110578586fd5b61311e8c89838e0101613150565b85525092860192908601906001016130fa565b50909998505050505050505050565b8035801515811461309857600080fd5b600082601f83011261316157600080fd5b6131708383356020850161302a565b9392505050565b60006020828403121561318957600080fd5b61317082613081565b600080604083850312156131a557600080fd5b6131ae83613081565b91506131bc60208401613081565b90509250929050565b6000806000606084860312156131da57600080fd5b6131e384613081565b92506131f160208501613081565b9150604084013590509250925092565b6000806000806080858703121561321757600080fd5b61322085613081565b935061322e60208601613081565b92506040850135915060608501356001600160401b0381111561325057600080fd5b8501601f8101871361326157600080fd5b6132708782356020840161302a565b91505092959194509250565b6000806040838503121561328f57600080fd5b61329883613081565b91506131bc60208401613140565b600080604083850312156132b957600080fd5b6132c283613081565b946020939093013593505050565b6000806000606084860312156132e557600080fd5b6132ee84613081565b92506020840135915060408401356001600160401b0381111561331057600080fd5b61331c86828701613150565b9150509250925092565b60006020828403121561333857600080fd5b61317082613140565b60006020828403121561335357600080fd5b813561317081613927565b60006020828403121561337057600080fd5b815161317081613927565b60006020828403121561338d57600080fd5b5035919050565b600080604083850312156133a757600080fd5b8235915060208301356001600160401b038111156133c457600080fd5b6133d08582860161309d565b9150509250929050565b600080604083850312156133ed57600080fd5b8235915060208301356001600160401b0381111561340a57600080fd5b6133d085828601613150565b6000806040838503121561342957600080fd5b50508035926020909101359150565b60008060006060848603121561344d57600080fd5b833592506020840135915060408401356001600160401b0381111561347157600080fd5b61331c8682870161309d565b6000806000806080858703121561349357600080fd5b84359350602085013592506040850135915060608501356001600160401b038111156134be57600080fd5b6132708782880161309d565b600080600080600060a086880312156134e257600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561351457600080fd5b6135208882890161309d565b9150509295509295909350565b60008060008060008060c0878903121561354657600080fd5b863595506020870135945060408701359350606087013592506080870135915060a08701356001600160401b0381111561357f57600080fd5b61358b89828a0161309d565b9150509295509295509295565b6000815180845260005b818110156135be576020818501810151868301820152016135a2565b818111156135d0576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361890830184613598565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561365a5783518352928401929184019160010161363e565b50909695505050505050565b6020815260006131706020830184613598565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b03811182821017156137c5576137c5613911565b604052919050565b600082198211156137e0576137e06138b9565b500190565b6000826137f4576137f46138cf565b500490565b6000816000190483118215151615613813576138136138b9565b500290565b60008282101561382a5761382a6138b9565b500390565b600181811c9082168061384357607f821691505b6020821081141561386457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561387e5761387e6138b9565b5060010190565b600060ff821660ff81141561389c5761389c6138b9565b60010192915050565b6000826138b4576138b46138cf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112bd57600080fdfea2646970667358221220487948d4f22a8153c2785ae6f5d4cc972685dd3e1074689e4f989b30ac9f99af64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000030d48d009a4e000000000000000000000000000000000000000000000000000000000000000c537061726b6c6573446f6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035350440000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636352211e1161012e578063a794be86116100ab578063d5abeb011161006f578063d5abeb011461064e578063e1fb4eae14610664578063e985e9c514610677578063ee2820cf146106c0578063f2fde38b146106e057600080fd5b8063a794be86146105c8578063af29651e146105db578063b88d4fde146105fb578063c175007e1461061b578063c87b56dd1461062e57600080fd5b80637f00c7a6116100f25780637f00c7a61461053f5780638da5cb5b1461055f57806395d89b411461057d5780639d76ea5814610592578063a22cb465146105a857600080fd5b80636352211e146104b55780636ff97f1d146104d557806370a08231146104ea578063715018a61461050a578063741016441461051f57600080fd5b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461040e578063438b63001461042e57806344a0d68a1461045b5780634f6ccce71461047b5780635c975abb1461049b57600080fd5b806323b872dd146103a05780632509d40c146103c05780632f745c59146103d35780633322d790146103f35780633ccfd60b1461040657600080fd5b80630d3a5369116102035780630d3a53691461031157806313faede61461033f578063162094c41461035557806318160ddd14610375578063239c70ae1461038a57600080fd5b806301ffc9a71461024057806302329a291461027557806306fdde0314610297578063081812fc146102b9578063095ea7b3146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004613341565b610700565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004613326565b61072b565b005b3480156102a357600080fd5b506102ac610771565b60405161026c9190613666565b3480156102c557600080fd5b506102d96102d436600461337b565b610803565b6040516001600160a01b03909116815260200161026c565b3480156102fd57600080fd5b5061029561030c3660046132a6565b61088b565b34801561031d57600080fd5b5061033161032c36600461337b565b6109a1565b60405190815260200161026c565b34801561034b57600080fd5b50610331600b5481565b34801561036157600080fd5b506102956103703660046133da565b610a11565b34801561038157600080fd5b50600854610331565b34801561039657600080fd5b50610331600d5481565b3480156103ac57600080fd5b506102956103bb3660046131c5565b610a49565b6102956103ce366004613394565b610a7a565b3480156103df57600080fd5b506103316103ee3660046132a6565b610c1d565b61029561040136600461352d565b610cb3565b61029561123e565b34801561041a57600080fd5b506102956104293660046131c5565b6112c0565b34801561043a57600080fd5b5061044e610449366004613177565b6112db565b60405161026c9190613622565b34801561046757600080fd5b5061029561047636600461337b565b61137c565b34801561048757600080fd5b5061033161049636600461337b565b6113ab565b3480156104a757600080fd5b50600f546102609060ff1681565b3480156104c157600080fd5b506102d96104d036600461337b565b61143e565b3480156104e157600080fd5b5061044e6114b5565b3480156104f657600080fd5b50610331610505366004613177565b611588565b34801561051657600080fd5b5061029561160f565b34801561052b57600080fd5b5061029561053a36600461337b565b611645565b34801561054b57600080fd5b5061029561055a36600461337b565b611674565b34801561056b57600080fd5b50600a546001600160a01b03166102d9565b34801561058957600080fd5b506102ac6116a3565b34801561059e57600080fd5b50610331600e5481565b3480156105b457600080fd5b506102956105c336600461327c565b6116b2565b6102956105d636600461347d565b611777565b3480156105e757600080fd5b5061044e6105f6366004613416565b611b58565b34801561060757600080fd5b50610295610616366004613201565b611c7d565b6102956106293660046134ca565b611cb5565b34801561063a57600080fd5b506102ac61064936600461337b565b6121c0565b34801561065a57600080fd5b50610331600c5481565b610295610672366004613438565b6122ce565b34801561068357600080fd5b50610260610692366004613192565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cc57600080fd5b506102956106db3660046132d0565b612585565b3480156106ec57600080fd5b506102956106fb366004613177565b6125df565b60006001600160e01b0319821663780e9d6360e01b1480610725575061072582612677565b92915050565b600a546001600160a01b0316331461075e5760405162461bcd60e51b815260040161075590613717565b60405180910390fd5b600f805460ff1916911515919091179055565b6060600080546107809061382f565b80601f01602080910402602001604051908101604052809291908181526020018280546107ac9061382f565b80156107f95780601f106107ce576101008083540402835291602001916107f9565b820191906000526020600020905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b600061080e826126c7565b61086f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b506000908152600460205260409020546001600160a01b031690565b60006108968261143e565b9050806001600160a01b0316836001600160a01b031614156109045760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610755565b336001600160a01b038216148061092057506109208133610692565b6109925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610755565b61099c83836126e4565b505050565b60008060006109af60085490565b905060005b81811015610a085760006109c7826113ab565b90508581101580156109e257506109df8660156137cd565b81105b156109f557836109f18161386a565b9450505b5080610a008161386a565b9150506109b4565b50909392505050565b600a546001600160a01b03163314610a3b5760405162461bcd60e51b815260040161075590613717565b610a458282612752565b5050565b610a533382612796565b610a6f5760405162461bcd60e51b81526004016107559061374c565b61099c838383612880565b600f5460ff1615610a8a57600080fd5b600080620f4240600e5485610a9f9190613818565b610aa991906137e5565b905060006103e8600e5486610abe9190613818565b610ac891906138a5565b9050610372610ad783836137cd565b1115610ae257600080fd5b610aed6015826138a5565b15610b2157610b05610b00600183613818565b6126c7565b610b215760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e5487610b369190613818565b610b4091906138a5565b610b4a91906137e5565b610b559060156137f9565b610b5f82846137cd565b1115610b6a57600080fd5b60008211610b7757600080fd5b600d54821115610b8657600080fd5b600a546001600160a01b03163314610bb25781600b54610ba691906137f9565b341015610bb257600080fd5b805b610bbe82846137cd565b811015610c1557610bcf3382612a2b565b610bf581868660ff1681518110610be857610be86138fb565b6020026020010151612752565b83610bff81613885565b9450508080610c0d9061386a565b915050610bb4565b505050505050565b6000610c2883611588565b8210610c8a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610755565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600f5460ff1615610cc357600080fd5b6000620f4240600e5488610cd79190613818565b610ce191906137e5565b905060006103e8600e5489610cf69190613818565b610d0091906138a5565b9050610372610d0f83836137cd565b1115610d1a57600080fd5b610d256015826138a5565b15610d5457610d38610b00600183613818565b610d545760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548a610d699190613818565b610d7391906138a5565b610d7d91906137e5565b610d889060156137f9565b610d9282846137cd565b1115610d9d57600080fd5b6000610dac620f4240896137e5565b90506000610dbc6103e88a6138a5565b9050610372610dcb83836137cd565b1115610dd657600080fd5b610de16015826138a5565b15610e1057610df4610b00600183613818565b610e105760405162461bcd60e51b8152600401610755906136cb565b6103e8610e20620186a08b6138a5565b610e2a91906137e5565b610e359060156137f9565b610e3f82846137cd565b1115610e4a57600080fd5b6000610e59620f42408a6137e5565b90506000610e696103e88b6138a5565b9050610372610e7883836137cd565b1115610e8357600080fd5b610e8e6015826138a5565b15610ebd57610ea1610b00600183613818565b610ebd5760405162461bcd60e51b8152600401610755906136cb565b6103e8610ecd620186a08c6138a5565b610ed791906137e5565b610ee29060156137f9565b610eec82846137cd565b1115610ef757600080fd5b6000610f06620f42408b6137e5565b90506000610f166103e88c6138a5565b9050610372610f2583836137cd565b1115610f3057600080fd5b610f3b6015826138a5565b15610f6a57610f4e610b00600183613818565b610f6a5760405162461bcd60e51b8152600401610755906136cb565b6103e8610f7a620186a08d6138a5565b610f8491906137e5565b610f8f9060156137f9565b610f9982846137cd565b1115610fa457600080fd5b6000610fb3620f42408c6137e5565b90506000610fc36103e88d6138a5565b9050610372610fd283836137cd565b1115610fdd57600080fd5b610fe86015826138a5565b1561101757610ffb610b00600183613818565b6110175760405162461bcd60e51b8152600401610755906136cb565b6103e8611027620186a08e6138a5565b61103191906137e5565b61103c9060156137f9565b61104682846137cd565b111561105157600080fd5b8960011461105e57600080fd5b8760011461106b57600080fd5b8560011461107857600080fd5b8360011461108557600080fd5b8160011461109257600080fd5b600a546001600160a01b031633146110c95789600b546110b291906137f9565b6110bd9060056137f9565b3410156110c957600080fd5b885b6110d58a8c6137cd565b81101561110f576110e63382612a2b565b6110fd818d600081518110610be857610be86138fb565b806111078161386a565b9150506110cb565b50865b61111c888a6137cd565b8110156111565761112d3382612a2b565b611144818d600181518110610be857610be86138fb565b8061114e8161386a565b915050611112565b50845b61116386886137cd565b81101561119d576111743382612a2b565b61118b818d600281518110610be857610be86138fb565b806111958161386a565b915050611159565b50825b6111aa84866137cd565b8110156111e4576111bb3382612a2b565b6111d2818d600381518110610be857610be86138fb565b806111dc8161386a565b9150506111a0565b50805b6111f182846137cd565b81101561122b576112023382612a2b565b611219818d600481518110610be857610be86138fb565b806112238161386a565b9150506111e7565b5050505050505050505050505050505050565b600a546001600160a01b031633146112685760405162461bcd60e51b815260040161075590613717565b604051600090339047908381818185875af1925050503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b50509050806112bd57600080fd5b50565b61099c83838360405180602001604052806000815250611c7d565b606060006112e883611588565b90506000816001600160401b0381111561130457611304613911565b60405190808252806020026020018201604052801561132d578160200160208202803683370190505b50905060005b82811015611374576113458582610c1d565b828281518110611357576113576138fb565b60209081029190910101528061136c8161386a565b915050611333565b509392505050565b600a546001600160a01b031633146113a65760405162461bcd60e51b815260040161075590613717565b600b55565b60006113b660085490565b82106114195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610755565b6008828154811061142c5761142c6138fb565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610755565b60606000806114c360085490565b6001600160401b038111156114da576114da613911565b604051908082528060200260200182016040528015611503578160200160208202803683370190505b50905060005b60085481101561158157600061151e826113ab565b101580156115355750600c54611533826113ab565b105b1561156f57826115448161386a565b935050611550816113ab565b828281518110611562576115626138fb565b6020026020010181815250505b806115798161386a565b915050611509565b5092915050565b60006001600160a01b0382166115f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610755565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146116395760405162461bcd60e51b815260040161075590613717565b6116436000612a45565b565b600a546001600160a01b0316331461166f5760405162461bcd60e51b815260040161075590613717565b600e55565b600a546001600160a01b0316331461169e5760405162461bcd60e51b815260040161075590613717565b600d55565b6060600180546107809061382f565b6001600160a01b03821633141561170b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610755565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f5460ff161561178757600080fd5b600080620f4240600e548761179c9190613818565b6117a691906137e5565b905060006103e8600e54886117bb9190613818565b6117c591906138a5565b90506103726117d483836137cd565b11156117df57600080fd5b6117ea6015826138a5565b15611819576117fd610b00600183613818565b6118195760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548961182e9190613818565b61183891906138a5565b61184291906137e5565b61184d9060156137f9565b61185782846137cd565b111561186257600080fd5b6000611871620f4240886137e5565b905060006118816103e8896138a5565b905061037261189083836137cd565b111561189b57600080fd5b6118a66015826138a5565b156118d5576118b9610b00600183613818565b6118d55760405162461bcd60e51b8152600401610755906136cb565b6103e86118e5620186a08a6138a5565b6118ef91906137e5565b6118fa9060156137f9565b61190482846137cd565b111561190f57600080fd5b600061191e620f4240896137e5565b9050600061192e6103e88a6138a5565b905061037261193d83836137cd565b111561194857600080fd5b6119536015826138a5565b1561198257611966610b00600183613818565b6119825760405162461bcd60e51b8152600401610755906136cb565b6103e8611992620186a08b6138a5565b61199c91906137e5565b6119a79060156137f9565b6119b182846137cd565b11156119bc57600080fd5b600086116119c957600080fd5b600084116119d657600080fd5b600082116119e357600080fd5b600d54826119f186896137cd565b6119fb91906137cd565b1115611a0657600080fd5b600a546001600160a01b03163314611a465781611a2385886137cd565b611a2d91906137cd565b600b54611a3a91906137f9565b341015611a4657600080fd5b845b611a5286886137cd565b811015611a9c57611a633382612a2b565b611a7c818a8a60ff1681518110610be857610be86138fb565b87611a8681613885565b9850508080611a949061386a565b915050611a48565b50825b611aa984866137cd565b811015611af357611aba3382612a2b565b611ad3818a8a60ff1681518110610be857610be86138fb565b87611add81613885565b9850508080611aeb9061386a565b915050611a9f565b50805b611b0082846137cd565b811015611b4a57611b113382612a2b565b611b2a818a8a60ff1681518110610be857610be86138fb565b87611b3481613885565b9850508080611b429061386a565b915050611af6565b505050505050505050505050565b6060600080611b6660085490565b8410611b88576001611b7760085490565b611b819190613818565b9050611b8b565b50825b6000611b978683613818565b611ba29060016137cd565b6001600160401b03811115611bb957611bb9613911565b604051908082528060200260200182016040528015611be2578160200160208202803683370190505b50905060005b611bf28784613818565b8111611c73576000611c07610496838a6137cd565b10158015611c225750600c54611c20610496838a6137cd565b105b15611c615783611c318161386a565b9450611c42905061049682896137cd565b828281518110611c5457611c546138fb565b6020026020010181815250505b80611c6b8161386a565b915050611be8565b5095945050505050565b611c873383612796565b611ca35760405162461bcd60e51b81526004016107559061374c565b611caf84848484612a97565b50505050565b600f5460ff1615611cc557600080fd5b600080620f4240600e5488611cda9190613818565b611ce491906137e5565b905060006103e8600e5489611cf99190613818565b611d0391906138a5565b9050610372611d1283836137cd565b1115611d1d57600080fd5b611d286015826138a5565b15611d5757611d3b610b00600183613818565b611d575760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e548a611d6c9190613818565b611d7691906138a5565b611d8091906137e5565b611d8b9060156137f9565b611d9582846137cd565b1115611da057600080fd5b6000611daf620f4240896137e5565b90506000611dbf6103e88a6138a5565b9050610372611dce83836137cd565b1115611dd957600080fd5b611de46015826138a5565b15611e1357611df7610b00600183613818565b611e135760405162461bcd60e51b8152600401610755906136cb565b6103e8611e23620186a08b6138a5565b611e2d91906137e5565b611e389060156137f9565b611e4282846137cd565b1115611e4d57600080fd5b6000611e5c620f42408a6137e5565b90506000611e6c6103e88b6138a5565b9050610372611e7b83836137cd565b1115611e8657600080fd5b611e916015826138a5565b15611ec057611ea4610b00600183613818565b611ec05760405162461bcd60e51b8152600401610755906136cb565b6103e8611ed0620186a08c6138a5565b611eda91906137e5565b611ee59060156137f9565b611eef82846137cd565b1115611efa57600080fd5b6000611f09620f42408b6137e5565b90506000611f196103e88c6138a5565b9050610372611f2883836137cd565b1115611f3357600080fd5b611f3e6015826138a5565b15611f6d57611f51610b00600183613818565b611f6d5760405162461bcd60e51b8152600401610755906136cb565b6103e8611f7d620186a08d6138a5565b611f8791906137e5565b611f929060156137f9565b611f9c82846137cd565b1115611fa757600080fd5b60008811611fb457600080fd5b60008611611fc157600080fd5b60008411611fce57600080fd5b60008211611fdb57600080fd5b600d548285611fea898c6137cd565b611ff491906137cd565b611ffe91906137cd565b111561200957600080fd5b600a546001600160a01b03163314612054578184612027888b6137cd565b61203191906137cd565b61203b91906137cd565b600b5461204891906137f9565b34101561205457600080fd5b865b612060888a6137cd565b8110156120aa576120713382612a2b565b61208a818c8c60ff1681518110610be857610be86138fb565b8961209481613885565b9a505080806120a29061386a565b915050612056565b50845b6120b786886137cd565b811015612101576120c83382612a2b565b6120e1818c8c60ff1681518110610be857610be86138fb565b896120eb81613885565b9a505080806120f99061386a565b9150506120ad565b50825b61210e84866137cd565b8110156121585761211f3382612a2b565b612138818c8c60ff1681518110610be857610be86138fb565b8961214281613885565b9a505080806121509061386a565b915050612104565b50805b61216582846137cd565b8110156121af576121763382612a2b565b61218f818c8c60ff1681518110610be857610be86138fb565b8961219981613885565b9a505080806121a79061386a565b91505061215b565b505050505050505050505050505050565b60606121cb826126c7565b61222f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610755565b600082815260106020526040812080546122489061382f565b80601f01602080910402602001604051908101604052809291908181526020018280546122749061382f565b80156122c15780601f10612296576101008083540402835291602001916122c1565b820191906000526020600020905b8154815290600101906020018083116122a457829003601f168201915b5093979650505050505050565b600f5460ff16156122de57600080fd5b600080620f4240600e54866122f39190613818565b6122fd91906137e5565b905060006103e8600e54876123129190613818565b61231c91906138a5565b905061037261232b83836137cd565b111561233657600080fd5b6123416015826138a5565b1561237057612354610b00600183613818565b6123705760405162461bcd60e51b8152600401610755906136cb565b6103e8620186a0600e54886123859190613818565b61238f91906138a5565b61239991906137e5565b6123a49060156137f9565b6123ae82846137cd565b11156123b957600080fd5b60006123c8620f4240876137e5565b905060006123d86103e8886138a5565b90506103726123e783836137cd565b11156123f257600080fd5b6123fd6015826138a5565b1561242c57612410610b00600183613818565b61242c5760405162461bcd60e51b8152600401610755906136cb565b6103e861243c620186a0896138a5565b61244691906137e5565b6124519060156137f9565b61245b82846137cd565b111561246657600080fd5b6000841161247357600080fd5b6000821161248057600080fd5b600d5461248d83866137cd565b111561249857600080fd5b600a546001600160a01b031633146124cd576124b482856137cd565b600b546124c191906137f9565b3410156124cd57600080fd5b825b6124d984866137cd565b811015612523576124ea3382612a2b565b61250381888860ff1681518110610be857610be86138fb565b8561250d81613885565b965050808061251b9061386a565b9150506124cf565b50805b61253082846137cd565b81101561257a576125413382612a2b565b61255a81888860ff1681518110610be857610be86138fb565b8561256481613885565b96505080806125729061386a565b915050612526565b505050505050505050565b600a546001600160a01b031633146125af5760405162461bcd60e51b815260040161075590613717565b61037182116125bd57600080fd5b6103e882106125cb57600080fd5b6125d58383612a2b565b61099c8282612752565b600a546001600160a01b031633146126095760405162461bcd60e51b815260040161075590613717565b6001600160a01b03811661266e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610755565b6112bd81612a45565b60006001600160e01b031982166380ac58cd60e01b14806126a857506001600160e01b03198216635b5e139f60e01b145b8061072557506301ffc9a760e01b6001600160e01b0319831614610725565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127198261143e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61275b826126c7565b6127775760405162461bcd60e51b8152600401610755906136cb565b6000828152601060209081526040909120825161099c92840190612f91565b60006127a1826126c7565b6128025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b600061280d8361143e565b9050806001600160a01b0316846001600160a01b031614806128485750836001600160a01b031661283d84610803565b6001600160a01b0316145b8061287857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166128938261143e565b6001600160a01b0316146128fb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610755565b6001600160a01b03821661295d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610755565b612968838383612aca565b6129736000826126e4565b6001600160a01b038316600090815260036020526040812080546001929061299c908490613818565b90915550506001600160a01b03821660009081526003602052604081208054600192906129ca9084906137cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a45828260405180602001604052806000815250612b82565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612aa2848484612880565b612aae84848484612bb5565b611caf5760405162461bcd60e51b815260040161075590613679565b6001600160a01b038316612b2557612b2081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b48565b816001600160a01b0316836001600160a01b031614612b4857612b488382612cc2565b6001600160a01b038216612b5f5761099c81612d5f565b826001600160a01b0316826001600160a01b03161461099c5761099c8282612e0e565b612b8c8383612e52565b612b996000848484612bb5565b61099c5760405162461bcd60e51b815260040161075590613679565b60006001600160a01b0384163b15612cb757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bf99033908990889088906004016135e5565b602060405180830381600087803b158015612c1357600080fd5b505af1925050508015612c43575060408051601f3d908101601f19168201909252612c409181019061335e565b60015b612c9d573d808015612c71576040519150601f19603f3d011682016040523d82523d6000602084013e612c76565b606091505b508051612c955760405162461bcd60e51b815260040161075590613679565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612878565b506001949350505050565b60006001612ccf84611588565b612cd99190613818565b600083815260076020526040902054909150808214612d2c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d7190600190613818565b60008381526009602052604081205460088054939450909284908110612d9957612d996138fb565b906000526020600020015490508060088381548110612dba57612dba6138fb565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612df257612df26138e5565b6001900381819060005260206000200160009055905550505050565b6000612e1983611588565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612ea85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610755565b612eb1816126c7565b15612efe5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610755565b612f0a60008383612aca565b6001600160a01b0382166000908152600360205260408120805460019290612f339084906137cd565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f9d9061382f565b90600052602060002090601f016020900481019282612fbf5760008555613005565b82601f10612fd857805160ff1916838001178555613005565b82800160010185558215613005579182015b82811115613005578251825591602001919060010190612fea565b50613011929150613015565b5090565b5b808211156130115760008155600101613016565b60006001600160401b0383111561304357613043613911565b613056601f8401601f191660200161379d565b905082815283838301111561306a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461309857600080fd5b919050565b600082601f8301126130ae57600080fd5b813560206001600160401b03808311156130ca576130ca613911565b8260051b6130d983820161379d565b8481528381019087850183890186018a10156130f457600080fd5b60009350835b8781101561313157813586811115613110578586fd5b61311e8c89838e0101613150565b85525092860192908601906001016130fa565b50909998505050505050505050565b8035801515811461309857600080fd5b600082601f83011261316157600080fd5b6131708383356020850161302a565b9392505050565b60006020828403121561318957600080fd5b61317082613081565b600080604083850312156131a557600080fd5b6131ae83613081565b91506131bc60208401613081565b90509250929050565b6000806000606084860312156131da57600080fd5b6131e384613081565b92506131f160208501613081565b9150604084013590509250925092565b6000806000806080858703121561321757600080fd5b61322085613081565b935061322e60208601613081565b92506040850135915060608501356001600160401b0381111561325057600080fd5b8501601f8101871361326157600080fd5b6132708782356020840161302a565b91505092959194509250565b6000806040838503121561328f57600080fd5b61329883613081565b91506131bc60208401613140565b600080604083850312156132b957600080fd5b6132c283613081565b946020939093013593505050565b6000806000606084860312156132e557600080fd5b6132ee84613081565b92506020840135915060408401356001600160401b0381111561331057600080fd5b61331c86828701613150565b9150509250925092565b60006020828403121561333857600080fd5b61317082613140565b60006020828403121561335357600080fd5b813561317081613927565b60006020828403121561337057600080fd5b815161317081613927565b60006020828403121561338d57600080fd5b5035919050565b600080604083850312156133a757600080fd5b8235915060208301356001600160401b038111156133c457600080fd5b6133d08582860161309d565b9150509250929050565b600080604083850312156133ed57600080fd5b8235915060208301356001600160401b0381111561340a57600080fd5b6133d085828601613150565b6000806040838503121561342957600080fd5b50508035926020909101359150565b60008060006060848603121561344d57600080fd5b833592506020840135915060408401356001600160401b0381111561347157600080fd5b61331c8682870161309d565b6000806000806080858703121561349357600080fd5b84359350602085013592506040850135915060608501356001600160401b038111156134be57600080fd5b6132708782880161309d565b600080600080600060a086880312156134e257600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561351457600080fd5b6135208882890161309d565b9150509295509295909350565b60008060008060008060c0878903121561354657600080fd5b863595506020870135945060408701359350606087013592506080870135915060a08701356001600160401b0381111561357f57600080fd5b61358b89828a0161309d565b9150509295509295509295565b6000815180845260005b818110156135be576020818501810151868301820152016135a2565b818111156135d0576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361890830184613598565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561365a5783518352928401929184019160010161363e565b50909695505050505050565b6020815260006131706020830184613598565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b03811182821017156137c5576137c5613911565b604052919050565b600082198211156137e0576137e06138b9565b500190565b6000826137f4576137f46138cf565b500490565b6000816000190483118215151615613813576138136138b9565b500290565b60008282101561382a5761382a6138b9565b500390565b600181811c9082168061384357607f821691505b6020821081141561386457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561387e5761387e6138b9565b5060010190565b600060ff821660ff81141561389c5761389c6138b9565b60010192915050565b6000826138b4576138b46138cf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112bd57600080fdfea2646970667358221220487948d4f22a8153c2785ae6f5d4cc972685dd3e1074689e4f989b30ac9f99af64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000030d48d009a4e000000000000000000000000000000000000000000000000000000000000000c537061726b6c6573446f6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035350440000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): SparklesDogs
Arg [1] : _symbol (string): SPD
Arg [2] : _tokenAddress (uint256): 53689456826958

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000000000000000000000000000000030d48d009a4e
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 537061726b6c6573446f67730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5350440000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45542:14145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34663:224;;;;;;;;;;-1:-1:-1;34663:224:0;;;;;:::i;:::-;;:::i;:::-;;;10904:14:1;;10897:22;10879:41;;10867:2;10852:18;34663:224:0;;;;;;;;58092:73;;;;;;;;;;-1:-1:-1;58092:73:0;;;;;:::i;:::-;;:::i;:::-;;22556:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24114:221::-;;;;;;;;;;-1:-1:-1;24114:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9565:32:1;;;9547:51;;9535:2;9520:18;24114:221:0;9401:203:1;23637:411:0;;;;;;;;;;-1:-1:-1;23637:411:0;;;;;:::i;:::-;;:::i;58343:375::-;;;;;;;;;;-1:-1:-1;58343:375:0;;;;;:::i;:::-;;:::i;:::-;;;18921:25:1;;;18909:2;18894:18;58343:375:0;18775:177:1;45630:32:0;;;;;;;;;;;;;;;;57551:205;;;;;;;;;;-1:-1:-1;57551:205:0;;;;;:::i;:::-;;:::i;35303:113::-;;;;;;;;;;-1:-1:-1;35391:10:0;:17;35303:113;;45703:32;;;;;;;;;;;;;;;;25004:339;;;;;;;;;;-1:-1:-1;25004:339:0;;;;;:::i;:::-;;:::i;55781:880::-;;;;;;:::i;:::-;;:::i;34971:256::-;;;;;;;;;;-1:-1:-1;34971:256:0;;;;;:::i;:::-;;:::i;46368:3095::-;;;;;;:::i;:::-;;:::i;58173:158::-;;;:::i;25414:185::-;;;;;;;;;;-1:-1:-1;25414:185:0;;;;;:::i;:::-;;:::i;56667:348::-;;;;;;;;;;-1:-1:-1;56667:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57769:82::-;;;;;;;;;;-1:-1:-1;57769:82:0;;;;;:::i;:::-;;:::i;35499:233::-;;;;;;;;;;-1:-1:-1;35499:233:0;;;;;:::i;:::-;;:::i;45774:18::-;;;;;;;;;;-1:-1:-1;45774:18:0;;;;;;;;22250:239;;;;;;;;;;-1:-1:-1;22250:239:0;;;;;:::i;:::-;;:::i;58725:389::-;;;;;;;;;;;;;:::i;21980:208::-;;;;;;;;;;-1:-1:-1;21980:208:0;;;;;:::i;:::-;;:::i;42458:94::-;;;;;;;;;;;;;:::i;57858:104::-;;;;;;;;;;-1:-1:-1;57858:104:0;;;;;:::i;:::-;;:::i;57968:118::-;;;;;;;;;;-1:-1:-1;57968:118:0;;;;;:::i;:::-;;:::i;41807:87::-;;;;;;;;;;-1:-1:-1;41880:6:0;;-1:-1:-1;;;;;41880:6:0;41807:87;;22725:104;;;;;;;;;;;;;:::i;45740:27::-;;;;;;;;;;;;;;;;24407:295;;;;;;;;;;-1:-1:-1;24407:295:0;;;;;:::i;:::-;;:::i;52162:2107::-;;;;;;:::i;:::-;;:::i;59123:556::-;;;;;;;;;;-1:-1:-1;59123:556:0;;;;;:::i;:::-;;:::i;25670:328::-;;;;;;;;;;-1:-1:-1;25670:328:0;;;;;:::i;:::-;;:::i;49469:2686::-;;;;;;:::i;:::-;;:::i;57262:281::-;;;;;;;;;;-1:-1:-1;57262:281:0;;;;;:::i;:::-;;:::i;45667:31::-;;;;;;;;;;;;;;;;54275:1499;;;;;;:::i;:::-;;:::i;24773:164::-;;;;;;;;;;-1:-1:-1;24773:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24894:25:0;;;24870:4;24894:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24773:164;46117:239;;;;;;;;;;-1:-1:-1;46117:239:0;;;;;:::i;:::-;;:::i;42707:192::-;;;;;;;;;;-1:-1:-1;42707:192:0;;;;;:::i;:::-;;:::i;34663:224::-;34765:4;-1:-1:-1;;;;;;34789:50:0;;-1:-1:-1;;;34789:50:0;;:90;;;34843:36;34867:11;34843:23;:36::i;:::-;34782:97;34663:224;-1:-1:-1;;34663:224:0:o;58092:73::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;;;;;;;;;58144:6:::1;:15:::0;;-1:-1:-1;;58144:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58092:73::o;22556:100::-;22610:13;22643:5;22636:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22556:100;:::o;24114:221::-;24190:7;24218:16;24226:7;24218;:16::i;:::-;24210:73;;;;-1:-1:-1;;;24210:73:0;;15731:2:1;24210:73:0;;;15713:21:1;15770:2;15750:18;;;15743:30;15809:34;15789:18;;;15782:62;-1:-1:-1;;;15860:18:1;;;15853:42;15912:19;;24210:73:0;15529:408:1;24210:73:0;-1:-1:-1;24303:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24303:24:0;;24114:221::o;23637:411::-;23718:13;23734:23;23749:7;23734:14;:23::i;:::-;23718:39;;23782:5;-1:-1:-1;;;;;23776:11:0;:2;-1:-1:-1;;;;;23776:11:0;;;23768:57;;;;-1:-1:-1;;;23768:57:0;;17744:2:1;23768:57:0;;;17726:21:1;17783:2;17763:18;;;17756:30;17822:34;17802:18;;;17795:62;-1:-1:-1;;;17873:18:1;;;17866:31;17914:19;;23768:57:0;17542:397:1;23768:57:0;20165:10;-1:-1:-1;;;;;23860:21:0;;;;:62;;-1:-1:-1;23885:37:0;23902:5;20165:10;24773:164;:::i;23885:37::-;23838:168;;;;-1:-1:-1;;;23838:168:0;;14124:2:1;23838:168:0;;;14106:21:1;14163:2;14143:18;;;14136:30;14202:34;14182:18;;;14175:62;14273:26;14253:18;;;14246:54;14317:19;;23838:168:0;13922:420:1;23838:168:0;24019:21;24028:2;24032:7;24019:8;:21::i;:::-;23707:341;23637:411;;:::o;58343:375::-;58420:7;58439:9;58455:16;58474:13;35391:10;:17;;35303:113;58474:13;58455:32;;58499:9;58494:201;58518:8;58514:1;:12;58494:201;;;58544:18;58565:15;58578:1;58565:12;:15::i;:::-;58544:36;;58610:8;58596:10;:22;;:54;;;;-1:-1:-1;58636:13:0;:8;58647:2;58636:13;:::i;:::-;58622:10;:28;58596:54;58591:90;;;58666:3;;;;:::i;:::-;;;;58591:90;-1:-1:-1;58528:3:0;;;;:::i;:::-;;;;58494:201;;;-1:-1:-1;58708:1:0;;58343:375;-1:-1:-1;;;58343:375:0:o;57551:205::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;57711:33:::1;57724:8;57734:9;57711:12;:33::i;:::-;57551:205:::0;;:::o;25004:339::-;25199:41;20165:10;25232:7;25199:18;:41::i;:::-;25191:103;;;;-1:-1:-1;;;25191:103:0;;;;;;;:::i;:::-;25307:28;25317:4;25323:2;25327:7;25307:9;:28::i;55781:880::-;55881:6;;;;55880:7;55872:16;;;;;;55895:7;55913:19;55967:7;55951:12;;55936;:27;;;;:::i;:::-;55935:39;;;;:::i;:::-;55913:61;;55982:16;56033:4;56017:12;;56002;:27;;;;:::i;:::-;56001:36;;;;:::i;:::-;55982:55;-1:-1:-1;56079:3:0;56053:22;56064:11;55982:55;56053:22;:::i;:::-;:29;;56044:39;;;;;;56096:13;56107:2;56096:8;:13;:::i;:::-;:18;56093:125;;56140:21;56148:12;56159:1;56148:8;:12;:::i;:::-;56140:7;:21::i;:::-;56132:78;;;;-1:-1:-1;;;56132:78:0;;;;;;;:::i;:::-;56303:4;56293:6;56277:12;;56262;:27;;;;:::i;:::-;56261:38;;;;:::i;:::-;56260:47;;;;:::i;:::-;:50;;56308:2;56260:50;:::i;:::-;56233:22;56247:8;56233:11;:22;:::i;:::-;:78;;56224:89;;;;;;56344:1;56330:11;:15;56322:24;;;;;;56381:13;;56365:11;:29;;56357:38;;;;;;41880:6;;-1:-1:-1;;;;;41880:6:0;56410:10;:21;56406:88;;56472:11;56464:4;;:21;;;;:::i;:::-;56451:9;:34;;56443:43;;;;;;56517:8;56500:155;56531:22;56545:8;56531:11;:22;:::i;:::-;56527:1;:26;56500:155;;;56571:23;56581:10;56592:1;56571:9;:23::i;:::-;56605:28;56618:1;56622:7;56630:1;56622:10;;;;;;;;;;:::i;:::-;;;;;;;56605:12;:28::i;:::-;56644:3;;;;:::i;:::-;;;;56555;;;;;:::i;:::-;;;;56500:155;;;;55859:802;;;55781:880;;:::o;34971:256::-;35068:7;35104:23;35121:5;35104:16;:23::i;:::-;35096:5;:31;35088:87;;;;-1:-1:-1;;;35088:87:0;;11357:2:1;35088:87:0;;;11339:21:1;11396:2;11376:18;;;11369:30;11435:34;11415:18;;;11408:62;-1:-1:-1;;;11486:18:1;;;11479:41;11537:19;;35088:87:0;11155:407:1;35088:87:0;-1:-1:-1;;;;;;35193:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34971:256::o;46368:3095::-;46563:6;;;;46562:7;46554:16;;;;;;46577:19;46631:7;46615:12;;46600;:27;;;;:::i;:::-;46599:39;;;;:::i;:::-;46577:61;;46645:16;46696:4;46680:12;;46665;:27;;;;:::i;:::-;46664:36;;;;:::i;:::-;46645:55;-1:-1:-1;46742:3:0;46716:22;46727:11;46645:55;46716:22;:::i;:::-;:29;;46707:39;;;;;;46759:13;46770:2;46759:8;:13;:::i;:::-;:18;46756:125;;46803:21;46811:12;46822:1;46811:8;:12;:::i;46803:21::-;46795:78;;;;-1:-1:-1;;;46795:78:0;;;;;;;:::i;:::-;46966:4;46956:6;46940:12;;46925;:27;;;;:::i;:::-;46924:38;;;;:::i;:::-;46923:47;;;;:::i;:::-;:50;;46971:2;46923:50;:::i;:::-;46896:22;46910:8;46896:11;:22;:::i;:::-;:78;;46887:89;;;;;;46985:19;47007:22;47022:7;47007:12;:22;:::i;:::-;46985:44;-1:-1:-1;47036:16:0;47055:19;47070:4;47055:12;:19;:::i;:::-;47036:38;-1:-1:-1;47116:3:0;47090:22;47101:11;47036:38;47090:22;:::i;:::-;:29;;47081:39;;;;;;47132:13;47143:2;47132:8;:13;:::i;:::-;:18;47129:125;;47176:21;47184:12;47195:1;47184:8;:12;:::i;47176:21::-;47168:78;;;;-1:-1:-1;;;47168:78:0;;;;;;;:::i;:::-;47322:4;47297:21;47312:6;47297:12;:21;:::i;:::-;47296:30;;;;:::i;:::-;:33;;47327:2;47296:33;:::i;:::-;47269:22;47283:8;47269:11;:22;:::i;:::-;:61;;47260:72;;;;;;47341:19;47363:22;47378:7;47363:12;:22;:::i;:::-;47341:44;-1:-1:-1;47392:16:0;47411:19;47426:4;47411:12;:19;:::i;:::-;47392:38;-1:-1:-1;47472:3:0;47446:22;47457:11;47392:38;47446:22;:::i;:::-;:29;;47437:39;;;;;;47488:13;47499:2;47488:8;:13;:::i;:::-;:18;47485:125;;47532:21;47540:12;47551:1;47540:8;:12;:::i;47532:21::-;47524:78;;;;-1:-1:-1;;;47524:78:0;;;;;;;:::i;:::-;47678:4;47653:21;47668:6;47653:12;:21;:::i;:::-;47652:30;;;;:::i;:::-;:33;;47683:2;47652:33;:::i;:::-;47625:22;47639:8;47625:11;:22;:::i;:::-;:61;;47616:72;;;;;;47697:19;47719:22;47734:7;47719:12;:22;:::i;:::-;47697:44;-1:-1:-1;47748:16:0;47767:19;47782:4;47767:12;:19;:::i;:::-;47748:38;-1:-1:-1;47828:3:0;47802:22;47813:11;47748:38;47802:22;:::i;:::-;:29;;47793:39;;;;;;47844:13;47855:2;47844:8;:13;:::i;:::-;:18;47841:125;;47888:21;47896:12;47907:1;47896:8;:12;:::i;47888:21::-;47880:78;;;;-1:-1:-1;;;47880:78:0;;;;;;;:::i;:::-;48034:4;48009:21;48024:6;48009:12;:21;:::i;:::-;48008:30;;;;:::i;:::-;:33;;48039:2;48008:33;:::i;:::-;47981:22;47995:8;47981:11;:22;:::i;:::-;:61;;47972:72;;;;;;48053:19;48075:22;48090:7;48075:12;:22;:::i;:::-;48053:44;-1:-1:-1;48104:16:0;48123:19;48138:4;48123:12;:19;:::i;:::-;48104:38;-1:-1:-1;48185:3:0;48158:23;48170:11;48104:38;48158:23;:::i;:::-;:30;;48149:40;;;;;;48201:13;48212:2;48201:8;:13;:::i;:::-;:18;48198:125;;48245:21;48253:12;48264:1;48253:8;:12;:::i;48245:21::-;48237:78;;;;-1:-1:-1;;;48237:78:0;;;;;;;:::i;:::-;48391:4;48366:21;48381:6;48366:12;:21;:::i;:::-;48365:30;;;;:::i;:::-;:33;;48396:2;48365:33;:::i;:::-;48338:22;48352:8;48338:11;:22;:::i;:::-;:61;;48329:72;;;;;;48419:11;48434:1;48419:16;48411:25;;;;;;48455:11;48470:1;48455:16;48447:25;;;;;;48487:11;48502:1;48487:16;48479:25;;;;;;48519:11;48534:1;48519:16;48511:25;;;;;;48551:11;48566:1;48551:16;48543:25;;;;;;41880:6;;-1:-1:-1;;;;;41880:6:0;48584:10;:21;48580:87;;48644:11;48637:4;;:18;;;;:::i;:::-;:20;;48656:1;48637:20;:::i;:::-;48624:9;:33;;48616:43;;;;;;48692:8;48675:151;48706:22;48720:8;48706:11;:22;:::i;:::-;48702:1;:26;48675:151;;;48746:23;48756:10;48767:1;48746:9;:23::i;:::-;48780:28;48793:1;48797:7;48805:1;48797:10;;;;;;;;:::i;48780:28::-;48730:3;;;;:::i;:::-;;;;48675:151;;;-1:-1:-1;48851:8:0;48834:151;48865:22;48879:8;48865:11;:22;:::i;:::-;48861:1;:26;48834:151;;;48905:23;48915:10;48926:1;48905:9;:23::i;:::-;48939:28;48952:1;48956:7;48964:1;48956:10;;;;;;;;:::i;48939:28::-;48889:3;;;;:::i;:::-;;;;48834:151;;;-1:-1:-1;49010:8:0;48993:151;49024:22;49038:8;49024:11;:22;:::i;:::-;49020:1;:26;48993:151;;;49064:23;49074:10;49085:1;49064:9;:23::i;:::-;49098:28;49111:1;49115:7;49123:1;49115:10;;;;;;;;:::i;49098:28::-;49048:3;;;;:::i;:::-;;;;48993:151;;;-1:-1:-1;49169:8:0;49152:151;49183:22;49197:8;49183:11;:22;:::i;:::-;49179:1;:26;49152:151;;;49223:23;49233:10;49244:1;49223:9;:23::i;:::-;49257:28;49270:1;49274:7;49282:1;49274:10;;;;;;;;:::i;49257:28::-;49207:3;;;;:::i;:::-;;;;49152:151;;;-1:-1:-1;49328:8:0;49311:141;49342:22;49356:8;49342:11;:22;:::i;:::-;49338:1;:26;49311:141;;;49382:23;49392:10;49403:1;49382:9;:23::i;:::-;49416:28;49429:1;49433:7;49441:1;49433:10;;;;;;;;:::i;49416:28::-;49366:3;;;;:::i;:::-;;;;49311:141;;;;46541:2922;;;;;;;;;;46368:3095;;;;;;:::o;58173:158::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;58244:58:::1;::::0;58226:12:::1;::::0;58252:10:::1;::::0;58276:21:::1;::::0;58226:12;58244:58;58226:12;58244:58;58276:21;58252:10;58244:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58225:77;;;58317:7;58309:16;;;::::0;::::1;;58218:113;58173:158::o:0;25414:185::-;25552:39;25569:4;25575:2;25579:7;25552:39;;;;;;;;;;;;:16;:39::i;56667:348::-;56742:16;56770:23;56796:17;56806:6;56796:9;:17::i;:::-;56770:43;;56820:25;56862:15;-1:-1:-1;;;;;56848:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56848:30:0;;56820:58;;56890:9;56885:103;56905:15;56901:1;:19;56885:103;;;56950:30;56970:6;56978:1;56950:19;:30::i;:::-;56936:8;56945:1;56936:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;56922:3;;;;:::i;:::-;;;;56885:103;;;-1:-1:-1;57001:8:0;56667:348;-1:-1:-1;;;56667:348:0:o;57769:82::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;57830:4:::1;:15:::0;57769:82::o;35499:233::-;35574:7;35610:30;35391:10;:17;;35303:113;35610:30;35602:5;:38;35594:95;;;;-1:-1:-1;;;35594:95:0;;18564:2:1;35594:95:0;;;18546:21:1;18603:2;18583:18;;;18576:30;18642:34;18622:18;;;18615:62;-1:-1:-1;;;18693:18:1;;;18686:42;18745:19;;35594:95:0;18362:408:1;35594:95:0;35707:10;35718:5;35707:17;;;;;;;;:::i;:::-;;;;;;;;;35700:24;;35499:233;;;:::o;22250:239::-;22322:7;22358:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22358:16:0;22393:19;22385:73;;;;-1:-1:-1;;;22385:73:0;;14960:2:1;22385:73:0;;;14942:21:1;14999:2;14979:18;;;14972:30;15038:34;15018:18;;;15011:62;-1:-1:-1;;;15089:18:1;;;15082:39;15138:19;;22385:73:0;14758:405:1;58725:389:0;58778:16;58806:9;58822:25;58864:13;35391:10;:17;;35303:113;58864:13;-1:-1:-1;;;;;58850:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58850:28:0;;58822:56;;58892:9;58887:197;35391:10;:17;58907:1;:17;58887:197;;;58969:1;58950:15;58963:1;58950:12;:15::i;:::-;:20;;:51;;;;;58992:9;;58974:15;58987:1;58974:12;:15::i;:::-;:27;58950:51;58947:123;;;59014:3;;;;:::i;:::-;;;;59045:15;59058:1;59045:12;:15::i;:::-;59031:8;59040:1;59031:11;;;;;;;;:::i;:::-;;;;;;:29;;;;;58947:123;58926:3;;;;:::i;:::-;;;;58887:197;;;-1:-1:-1;59097:8:0;58725:389;-1:-1:-1;;58725:389:0:o;21980:208::-;22052:7;-1:-1:-1;;;;;22080:19:0;;22072:74;;;;-1:-1:-1;;;22072:74:0;;14549:2:1;22072:74:0;;;14531:21:1;14588:2;14568:18;;;14561:30;14627:34;14607:18;;;14600:62;-1:-1:-1;;;14678:18:1;;;14671:40;14728:19;;22072:74:0;14347:406:1;22072:74:0;-1:-1:-1;;;;;;22164:16:0;;;;;:9;:16;;;;;;;21980:208::o;42458:94::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;42523:21:::1;42541:1;42523:9;:21::i;:::-;42458:94::o:0;57858:104::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;57930:12:::1;:26:::0;57858:104::o;57968:118::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;58047:13:::1;:33:::0;57968:118::o;22725:104::-;22781:13;22814:7;22807:14;;;;;:::i;24407:295::-;-1:-1:-1;;;;;24510:24:0;;20165:10;24510:24;;24502:62;;;;-1:-1:-1;;;24502:62:0;;13357:2:1;24502:62:0;;;13339:21:1;13396:2;13376:18;;;13369:30;13435:27;13415:18;;;13408:55;13480:18;;24502:62:0;13155:349:1;24502:62:0;20165:10;24577:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24577:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24577:53:0;;;;;;;;;;24646:48;;10879:41:1;;;24577:42:0;;20165:10;24646:48;;10852:18:1;24646:48:0;;;;;;;24407:295;;:::o;52162:2107::-;52310:6;;;;52309:7;52301:16;;;;;;52324:7;52342:19;52396:7;52380:12;;52365;:27;;;;:::i;:::-;52364:39;;;;:::i;:::-;52342:61;;52410:16;52461:4;52445:12;;52430;:27;;;;:::i;:::-;52429:36;;;;:::i;:::-;52410:55;-1:-1:-1;52507:3:0;52481:22;52492:11;52410:55;52481:22;:::i;:::-;:29;;52472:39;;;;;;52528:13;52539:2;52528:8;:13;:::i;:::-;:18;52525:125;;52572:21;52580:12;52591:1;52580:8;:12;:::i;52572:21::-;52564:78;;;;-1:-1:-1;;;52564:78:0;;;;;;;:::i;:::-;52735:4;52725:6;52709:12;;52694;:27;;;;:::i;:::-;52693:38;;;;:::i;:::-;52692:47;;;;:::i;:::-;:50;;52740:2;52692:50;:::i;:::-;52665:22;52679:8;52665:11;:22;:::i;:::-;:78;;52656:89;;;;;;52754:19;52776:22;52791:7;52776:12;:22;:::i;:::-;52754:44;-1:-1:-1;52805:16:0;52824:19;52839:4;52824:12;:19;:::i;:::-;52805:38;-1:-1:-1;52885:3:0;52859:22;52870:11;52805:38;52859:22;:::i;:::-;:29;;52850:39;;;;;;52905:13;52916:2;52905:8;:13;:::i;:::-;:18;52902:125;;52949:21;52957:12;52968:1;52957:8;:12;:::i;52949:21::-;52941:78;;;;-1:-1:-1;;;52941:78:0;;;;;;;:::i;:::-;53095:4;53070:21;53085:6;53070:12;:21;:::i;:::-;53069:30;;;;:::i;:::-;:33;;53100:2;53069:33;:::i;:::-;53042:22;53056:8;53042:11;:22;:::i;:::-;:61;;53033:72;;;;;;53114:19;53136:22;53151:7;53136:12;:22;:::i;:::-;53114:44;-1:-1:-1;53165:16:0;53184:19;53199:4;53184:12;:19;:::i;:::-;53165:38;-1:-1:-1;53245:3:0;53219:22;53230:11;53165:38;53219:22;:::i;:::-;:29;;53210:39;;;;;;53265:13;53276:2;53265:8;:13;:::i;:::-;:18;53262:125;;53309:21;53317:12;53328:1;53317:8;:12;:::i;53309:21::-;53301:78;;;;-1:-1:-1;;;53301:78:0;;;;;;;:::i;:::-;53455:4;53430:21;53445:6;53430:12;:21;:::i;:::-;53429:30;;;;:::i;:::-;:33;;53460:2;53429:33;:::i;:::-;53402:22;53416:8;53402:11;:22;:::i;:::-;:61;;53393:72;;;;;;53496:1;53482:11;:15;53474:24;;;;;;53528:1;53514:11;:15;53506:24;;;;;;53560:1;53546:11;:15;53538:24;;;;;;53627:13;;53611:11;53587:23;53599:11;53587;:23;:::i;:::-;:35;;;;:::i;:::-;:53;;53579:62;;;;;;41880:6;;-1:-1:-1;;;;;41880:6:0;53654:10;:21;53650:111;;53739:11;53715:23;53727:11;53715;:23;:::i;:::-;:35;;;;:::i;:::-;53707:4;;:45;;;;:::i;:::-;53694:9;:58;;53686:67;;;;;;53793:8;53776:155;53807:22;53821:8;53807:11;:22;:::i;:::-;53803:1;:26;53776:155;;;53847:23;53857:10;53868:1;53847:9;:23::i;:::-;53881:28;53894:1;53898:7;53906:1;53898:10;;;;;;;;;;:::i;53881:28::-;53920:3;;;;:::i;:::-;;;;53831;;;;;:::i;:::-;;;;53776:155;;;-1:-1:-1;53956:8:0;53939:155;53970:22;53984:8;53970:11;:22;:::i;:::-;53966:1;:26;53939:155;;;54010:23;54020:10;54031:1;54010:9;:23::i;:::-;54044:28;54057:1;54061:7;54069:1;54061:10;;;;;;;;;;:::i;54044:28::-;54083:3;;;;:::i;:::-;;;;53994;;;;;:::i;:::-;;;;53939:155;;;-1:-1:-1;54119:8:0;54102:155;54133:22;54147:8;54133:11;:22;:::i;:::-;54129:1;:26;54102:155;;;54173:23;54183:10;54194:1;54173:9;:23::i;:::-;54207:28;54220:1;54224:7;54232:1;54224:10;;;;;;;;;;:::i;54207:28::-;54246:3;;;;:::i;:::-;;;;54157;;;;;:::i;:::-;;;;54102:155;;;;52288:1981;;;;;;;52162:2107;;;;:::o;59123:556::-;59207:16;59235:9;59251:11;59280:13;35391:10;:17;;35303:113;59280:13;59272:4;:21;59269:76;;59318:1;59302:13;35391:10;:17;;35303:113;59302:13;:17;;;;:::i;:::-;59296:23;;59269:76;;;-1:-1:-1;59339:4:0;59269:76;59357:25;59399:12;59405:6;59399:3;:12;:::i;:::-;:16;;59414:1;59399:16;:::i;:::-;-1:-1:-1;;;;;59385:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59385:31:0;;59357:59;;59430:9;59425:224;59450:12;59456:6;59450:3;:12;:::i;:::-;59445:1;:17;59425:224;;59517:1;59489:24;59502:10;59511:1;59502:6;:10;:::i;59489:24::-;:29;;:69;;;;-1:-1:-1;59549:9:0;;59522:24;59535:10;59544:1;59535:6;:10;:::i;59522:24::-;:36;59489:69;59486:149;;;59571:3;;;;:::i;:::-;;-1:-1:-1;59601:24:0;;-1:-1:-1;59614:10:0;59623:1;59614:6;:10;:::i;59601:24::-;59587:8;59596:1;59587:11;;;;;;;;:::i;:::-;;;;;;:38;;;;;59486:149;59465:3;;;;:::i;:::-;;;;59425:224;;;-1:-1:-1;59662:8:0;59123:556;-1:-1:-1;;;;;59123:556:0:o;25670:328::-;25845:41;20165:10;25878:7;25845:18;:41::i;:::-;25837:103;;;;-1:-1:-1;;;25837:103:0;;;;;;;:::i;:::-;25951:39;25965:4;25971:2;25975:7;25984:5;25951:13;:39::i;:::-;25670:328;;;;:::o;49469:2686::-;49638:6;;;;49637:7;49629:16;;;;;;49652:7;49670:19;49724:7;49708:12;;49693;:27;;;;:::i;:::-;49692:39;;;;:::i;:::-;49670:61;;49738:16;49789:4;49773:12;;49758;:27;;;;:::i;:::-;49757:36;;;;:::i;:::-;49738:55;-1:-1:-1;49835:3:0;49809:22;49820:11;49738:55;49809:22;:::i;:::-;:29;;49800:39;;;;;;49852:13;49863:2;49852:8;:13;:::i;:::-;:18;49849:125;;49896:21;49904:12;49915:1;49904:8;:12;:::i;49896:21::-;49888:78;;;;-1:-1:-1;;;49888:78:0;;;;;;;:::i;:::-;50059:4;50049:6;50033:12;;50018;:27;;;;:::i;:::-;50017:38;;;;:::i;:::-;50016:47;;;;:::i;:::-;:50;;50064:2;50016:50;:::i;:::-;49989:22;50003:8;49989:11;:22;:::i;:::-;:78;;49980:89;;;;;;50078:19;50100:22;50115:7;50100:12;:22;:::i;:::-;50078:44;-1:-1:-1;50129:16:0;50148:19;50163:4;50148:12;:19;:::i;:::-;50129:38;-1:-1:-1;50209:3:0;50183:22;50194:11;50129:38;50183:22;:::i;:::-;:29;;50174:39;;;;;;50225:13;50236:2;50225:8;:13;:::i;:::-;:18;50222:125;;50269:21;50277:12;50288:1;50277:8;:12;:::i;50269:21::-;50261:78;;;;-1:-1:-1;;;50261:78:0;;;;;;;:::i;:::-;50415:4;50390:21;50405:6;50390:12;:21;:::i;:::-;50389:30;;;;:::i;:::-;:33;;50420:2;50389:33;:::i;:::-;50362:22;50376:8;50362:11;:22;:::i;:::-;:61;;50353:72;;;;;;50434:19;50456:22;50471:7;50456:12;:22;:::i;:::-;50434:44;-1:-1:-1;50485:16:0;50504:19;50519:4;50504:12;:19;:::i;:::-;50485:38;-1:-1:-1;50565:3:0;50539:22;50550:11;50485:38;50539:22;:::i;:::-;:29;;50530:39;;;;;;50581:13;50592:2;50581:8;:13;:::i;:::-;:18;50578:125;;50625:21;50633:12;50644:1;50633:8;:12;:::i;50625:21::-;50617:78;;;;-1:-1:-1;;;50617:78:0;;;;;;;:::i;:::-;50771:4;50746:21;50761:6;50746:12;:21;:::i;:::-;50745:30;;;;:::i;:::-;:33;;50776:2;50745:33;:::i;:::-;50718:22;50732:8;50718:11;:22;:::i;:::-;:61;;50709:72;;;;;;50790:19;50812:22;50827:7;50812:12;:22;:::i;:::-;50790:44;-1:-1:-1;50841:16:0;50860:19;50875:4;50860:12;:19;:::i;:::-;50841:38;-1:-1:-1;50921:3:0;50895:22;50906:11;50841:38;50895:22;:::i;:::-;:29;;50886:39;;;;;;50937:13;50948:2;50937:8;:13;:::i;:::-;:18;50934:125;;50981:21;50989:12;51000:1;50989:8;:12;:::i;50981:21::-;50973:78;;;;-1:-1:-1;;;50973:78:0;;;;;;;:::i;:::-;51127:4;51102:21;51117:6;51102:12;:21;:::i;:::-;51101:30;;;;:::i;:::-;:33;;51132:2;51101:33;:::i;:::-;51074:22;51088:8;51074:11;:22;:::i;:::-;:61;;51065:72;;;;;;51168:1;51154:11;:15;51146:24;;;;;;51200:1;51186:11;:15;51178:24;;;;;;51232:1;51218:11;:15;51210:24;;;;;;51264:1;51250:11;:15;51242:24;;;;;;51345:13;;51329:11;51317;51293:23;51305:11;51293;:23;:::i;:::-;:35;;;;:::i;:::-;:47;;;;:::i;:::-;:65;;51285:74;;;;;;41880:6;;-1:-1:-1;;;;;41880:6:0;51372:10;:21;51368:123;;51469:11;51457;51433:23;51445:11;51433;:23;:::i;:::-;:35;;;;:::i;:::-;:47;;;;:::i;:::-;51425:4;;:57;;;;:::i;:::-;51412:9;:70;;51404:79;;;;;;51523:8;51506:155;51537:22;51551:8;51537:11;:22;:::i;:::-;51533:1;:26;51506:155;;;51577:23;51587:10;51598:1;51577:9;:23::i;:::-;51611:28;51624:1;51628:7;51636:1;51628:10;;;;;;;;;;:::i;51611:28::-;51650:3;;;;:::i;:::-;;;;51561;;;;;:::i;:::-;;;;51506:155;;;-1:-1:-1;51686:8:0;51669:155;51700:22;51714:8;51700:11;:22;:::i;:::-;51696:1;:26;51669:155;;;51740:23;51750:10;51761:1;51740:9;:23::i;:::-;51774:28;51787:1;51791:7;51799:1;51791:10;;;;;;;;;;:::i;51774:28::-;51813:3;;;;:::i;:::-;;;;51724;;;;;:::i;:::-;;;;51669:155;;;-1:-1:-1;51849:8:0;51832:155;51863:22;51877:8;51863:11;:22;:::i;:::-;51859:1;:26;51832:155;;;51903:23;51913:10;51924:1;51903:9;:23::i;:::-;51937:28;51950:1;51954:7;51962:1;51954:10;;;;;;;;;;:::i;51937:28::-;51976:3;;;;:::i;:::-;;;;51887;;;;;:::i;:::-;;;;51832:155;;;-1:-1:-1;52010:8:0;51993:155;52024:22;52038:8;52024:11;:22;:::i;:::-;52020:1;:26;51993:155;;;52064:23;52074:10;52085:1;52064:9;:23::i;:::-;52098:28;52111:1;52115:7;52123:1;52115:10;;;;;;;;;;:::i;52098:28::-;52137:3;;;;:::i;:::-;;;;52048;;;;;:::i;:::-;;;;51993:155;;;;49620:2535;;;;;;;;;49469:2686;;;;;:::o;57262:281::-;57335:13;57369:16;57377:7;57369;:16::i;:::-;57361:76;;;;-1:-1:-1;;;57361:76:0;;17328:2:1;57361:76:0;;;17310:21:1;17367:2;17347:18;;;17340:30;17406:34;17386:18;;;17379:62;-1:-1:-1;;;17457:18:1;;;17450:45;17512:19;;57361:76:0;17126:411:1;57361:76:0;57450:23;57476:19;;;:10;:19;;;;;57450:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57450:45:0;;57262:281;-1:-1:-1;;;;;;;57262:281:0:o;54275:1499::-;54398:6;;;;54397:7;54389:16;;;;;;54412:7;54430:19;54484:7;54468:12;;54453;:27;;;;:::i;:::-;54452:39;;;;:::i;:::-;54430:61;;54498:16;54549:4;54533:12;;54518;:27;;;;:::i;:::-;54517:36;;;;:::i;:::-;54498:55;-1:-1:-1;54595:3:0;54569:22;54580:11;54498:55;54569:22;:::i;:::-;:29;;54560:39;;;;;;54611:13;54622:2;54611:8;:13;:::i;:::-;:18;54608:125;;54655:21;54663:12;54674:1;54663:8;:12;:::i;54655:21::-;54647:78;;;;-1:-1:-1;;;54647:78:0;;;;;;;:::i;:::-;54818:4;54808:6;54792:12;;54777;:27;;;;:::i;:::-;54776:38;;;;:::i;:::-;54775:47;;;;:::i;:::-;:50;;54823:2;54775:50;:::i;:::-;54748:22;54762:8;54748:11;:22;:::i;:::-;:78;;54739:89;;;;;;54837:19;54859:22;54874:7;54859:12;:22;:::i;:::-;54837:44;-1:-1:-1;54888:16:0;54907:19;54922:4;54907:12;:19;:::i;:::-;54888:38;-1:-1:-1;54968:3:0;54942:22;54953:11;54888:38;54942:22;:::i;:::-;:29;;54933:39;;;;;;54984:13;54995:2;54984:8;:13;:::i;:::-;:18;54981:125;;55028:21;55036:12;55047:1;55036:8;:12;:::i;55028:21::-;55020:78;;;;-1:-1:-1;;;55020:78:0;;;;;;;:::i;:::-;55174:4;55149:21;55164:6;55149:12;:21;:::i;:::-;55148:30;;;;:::i;:::-;:33;;55179:2;55148:33;:::i;:::-;55121:22;55135:8;55121:11;:22;:::i;:::-;:61;;55112:72;;;;;;55219:1;55205:11;:15;55197:24;;;;;;55251:1;55237:11;:15;55229:24;;;;;;55305:13;;55275:25;55289:11;55275;:25;:::i;:::-;:43;;55267:52;;;;;;41880:6;;-1:-1:-1;;;;;41880:6:0;55332:10;:21;55328:102;;55394:25;55408:11;55394;:25;:::i;:::-;55386:4;;:35;;;;:::i;:::-;55373:9;:48;;55365:57;;;;;;55468:8;55451:155;55482:22;55496:8;55482:11;:22;:::i;:::-;55478:1;:26;55451:155;;;55522:23;55532:10;55543:1;55522:9;:23::i;:::-;55556:28;55569:1;55573:7;55581:1;55573:10;;;;;;;;;;:::i;55556:28::-;55595:3;;;;:::i;:::-;;;;55506;;;;;:::i;:::-;;;;55451:155;;;-1:-1:-1;55631:8:0;55614:155;55645:22;55659:8;55645:11;:22;:::i;:::-;55641:1;:26;55614:155;;;55685:23;55695:10;55706:1;55685:9;:23::i;:::-;55719:28;55732:1;55736:7;55744:1;55736:10;;;;;;;;;;:::i;55719:28::-;55758:3;;;;:::i;:::-;;;;55669;;;;;:::i;:::-;;;;55614:155;;;;54376:1398;;;;;54275:1499;;;:::o;46117:239::-;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;46238:3:::1;46228:7;:13;46219:23;;;::::0;::::1;;46268:4;46258:7;:14;46249:24;;;::::0;::::1;;46288:23;46298:2;46302:7;46288:9;:23::i;:::-;46318:31;46331:7;46341;46318:12;:31::i;42707:192::-:0;41880:6;;-1:-1:-1;;;;;41880:6:0;20165:10;42027:23;42019:68;;;;-1:-1:-1;;;42019:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42796:22:0;::::1;42788:73;;;::::0;-1:-1:-1;;;42788:73:0;;12188:2:1;42788:73:0::1;::::0;::::1;12170:21:1::0;12227:2;12207:18;;;12200:30;12266:34;12246:18;;;12239:62;-1:-1:-1;;;12317:18:1;;;12310:36;12363:19;;42788:73:0::1;11986:402:1::0;42788:73:0::1;42872:19;42882:8;42872:9;:19::i;21611:305::-:0;21713:4;-1:-1:-1;;;;;;21750:40:0;;-1:-1:-1;;;21750:40:0;;:105;;-1:-1:-1;;;;;;;21807:48:0;;-1:-1:-1;;;21807:48:0;21750:105;:158;;;-1:-1:-1;;;;;;;;;;7551:40:0;;;21872:36;7442:157;27508:127;27573:4;27597:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27597:16:0;:30;;;27508:127::o;31490:174::-;31565:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31565:29:0;-1:-1:-1;;;;;31565:29:0;;;;;;;;:24;;31619:23;31565:24;31619:14;:23::i;:::-;-1:-1:-1;;;;;31610:46:0;;;;;;;;;;;31490:174;;:::o;57029:215::-;57129:16;57137:7;57129;:16::i;:::-;57121:73;;;;-1:-1:-1;;;57121:73:0;;;;;;;:::i;:::-;57205:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;27802:348::-;27895:4;27920:16;27928:7;27920;:16::i;:::-;27912:73;;;;-1:-1:-1;;;27912:73:0;;13711:2:1;27912:73:0;;;13693:21:1;13750:2;13730:18;;;13723:30;13789:34;13769:18;;;13762:62;-1:-1:-1;;;13840:18:1;;;13833:42;13892:19;;27912:73:0;13509:408:1;27912:73:0;27996:13;28012:23;28027:7;28012:14;:23::i;:::-;27996:39;;28065:5;-1:-1:-1;;;;;28054:16:0;:7;-1:-1:-1;;;;;28054:16:0;;:51;;;;28098:7;-1:-1:-1;;;;;28074:31:0;:20;28086:7;28074:11;:20::i;:::-;-1:-1:-1;;;;;28074:31:0;;28054:51;:87;;;-1:-1:-1;;;;;;24894:25:0;;;24870:4;24894:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28109:32;28046:96;27802:348;-1:-1:-1;;;;27802:348:0:o;30794:578::-;30953:4;-1:-1:-1;;;;;30926:31:0;:23;30941:7;30926:14;:23::i;:::-;-1:-1:-1;;;;;30926:31:0;;30918:85;;;;-1:-1:-1;;;30918:85:0;;16918:2:1;30918:85:0;;;16900:21:1;16957:2;16937:18;;;16930:30;16996:34;16976:18;;;16969:62;-1:-1:-1;;;17047:18:1;;;17040:39;17096:19;;30918:85:0;16716:405:1;30918:85:0;-1:-1:-1;;;;;31022:16:0;;31014:65;;;;-1:-1:-1;;;31014:65:0;;12952:2:1;31014:65:0;;;12934:21:1;12991:2;12971:18;;;12964:30;13030:34;13010:18;;;13003:62;-1:-1:-1;;;13081:18:1;;;13074:34;13125:19;;31014:65:0;12750:400:1;31014:65:0;31092:39;31113:4;31119:2;31123:7;31092:20;:39::i;:::-;31196:29;31213:1;31217:7;31196:8;:29::i;:::-;-1:-1:-1;;;;;31238:15:0;;;;;;:9;:15;;;;;:20;;31257:1;;31238:15;:20;;31257:1;;31238:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31269:13:0;;;;;;:9;:13;;;;;:18;;31286:1;;31269:13;:18;;31286:1;;31269:18;:::i;:::-;;;;-1:-1:-1;;31298:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31298:21:0;-1:-1:-1;;;;;31298:21:0;;;;;;;;;31337:27;;31298:16;;31337:27;;;;;;;30794:578;;;:::o;28492:110::-;28568:26;28578:2;28582:7;28568:26;;;;;;;;;;;;:9;:26::i;42907:173::-;42982:6;;;-1:-1:-1;;;;;42999:17:0;;;-1:-1:-1;;;;;;42999:17:0;;;;;;;43032:40;;42982:6;;;42999:17;42982:6;;43032:40;;42963:16;;43032:40;42952:128;42907:173;:::o;26880:315::-;27037:28;27047:4;27053:2;27057:7;27037:9;:28::i;:::-;27084:48;27107:4;27113:2;27117:7;27126:5;27084:22;:48::i;:::-;27076:111;;;;-1:-1:-1;;;27076:111:0;;;;;;;:::i;36345:589::-;-1:-1:-1;;;;;36551:18:0;;36547:187;;36586:40;36618:7;37761:10;:17;;37734:24;;;;:15;:24;;;;;:44;;;37789:24;;;;;;;;;;;;37657:164;36586:40;36547:187;;;36656:2;-1:-1:-1;;;;;36648:10:0;:4;-1:-1:-1;;;;;36648:10:0;;36644:90;;36675:47;36708:4;36714:7;36675:32;:47::i;:::-;-1:-1:-1;;;;;36748:16:0;;36744:183;;36781:45;36818:7;36781:36;:45::i;36744:183::-;36854:4;-1:-1:-1;;;;;36848:10:0;:2;-1:-1:-1;;;;;36848:10:0;;36844:83;;36875:40;36903:2;36907:7;36875:27;:40::i;28829:321::-;28959:18;28965:2;28969:7;28959:5;:18::i;:::-;29010:54;29041:1;29045:2;29049:7;29058:5;29010:22;:54::i;:::-;28988:154;;;;-1:-1:-1;;;28988:154:0;;;;;;;:::i;32229:799::-;32384:4;-1:-1:-1;;;;;32405:13:0;;10765:20;10813:8;32401:620;;32441:72;;-1:-1:-1;;;32441:72:0;;-1:-1:-1;;;;;32441:36:0;;;;;:72;;20165:10;;32492:4;;32498:7;;32507:5;;32441:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32441:72:0;;;;;;;;-1:-1:-1;;32441:72:0;;;;;;;;;;;;:::i;:::-;;;32437:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32683:13:0;;32679:272;;32726:60;;-1:-1:-1;;;32726:60:0;;;;;;;:::i;32679:272::-;32901:6;32895:13;32886:6;32882:2;32878:15;32871:38;32437:529;-1:-1:-1;;;;;;32564:51:0;-1:-1:-1;;;32564:51:0;;-1:-1:-1;32557:58:0;;32401:620;-1:-1:-1;33005:4:0;32229:799;;;;;;:::o;38448:988::-;38714:22;38764:1;38739:22;38756:4;38739:16;:22::i;:::-;:26;;;;:::i;:::-;38776:18;38797:26;;;:17;:26;;;;;;38714:51;;-1:-1:-1;38930:28:0;;;38926:328;;-1:-1:-1;;;;;38997:18:0;;38975:19;38997:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39048:30;;;;;;:44;;;39165:30;;:17;:30;;;;;:43;;;38926:328;-1:-1:-1;39350:26:0;;;;:17;:26;;;;;;;;39343:33;;;-1:-1:-1;;;;;39394:18:0;;;;;:12;:18;;;;;:34;;;;;;;39387:41;38448:988::o;39731:1079::-;40009:10;:17;39984:22;;40009:21;;40029:1;;40009:21;:::i;:::-;40041:18;40062:24;;;:15;:24;;;;;;40435:10;:26;;39984:46;;-1:-1:-1;40062:24:0;;39984:46;;40435:26;;;;;;:::i;:::-;;;;;;;;;40413:48;;40499:11;40474:10;40485;40474:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40579:28;;;:15;:28;;;;;;;:41;;;40751:24;;;;;40744:31;40786:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39802:1008;;;39731:1079;:::o;37235:221::-;37320:14;37337:20;37354:2;37337:16;:20::i;:::-;-1:-1:-1;;;;;37368:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37413:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37235:221:0:o;29486:382::-;-1:-1:-1;;;;;29566:16:0;;29558:61;;;;-1:-1:-1;;;29558:61:0;;15370:2:1;29558:61:0;;;15352:21:1;;;15389:18;;;15382:30;15448:34;15428:18;;;15421:62;15500:18;;29558:61:0;15168:356:1;29558:61:0;29639:16;29647:7;29639;:16::i;:::-;29638:17;29630:58;;;;-1:-1:-1;;;29630:58:0;;12595:2:1;29630:58:0;;;12577:21:1;12634:2;12614:18;;;12607:30;12673;12653:18;;;12646:58;12721:18;;29630:58:0;12393:352:1;29630:58:0;29701:45;29730:1;29734:2;29738:7;29701:20;:45::i;:::-;-1:-1:-1;;;;;29759:13:0;;;;;;:9;:13;;;;;:18;;29776:1;;29759:13;:18;;29776:1;;29759:18;:::i;:::-;;;;-1:-1:-1;;29788:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29788:21:0;-1:-1:-1;;;;;29788:21:0;;;;;;;;29827:33;;29788:16;;;29827:33;;29788:16;;29827:33;29486:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:911::-;656:5;709:3;702:4;694:6;690:17;686:27;676:55;;727:1;724;717:12;676:55;763:6;750:20;789:4;-1:-1:-1;;;;;849:2:1;845;842:10;839:36;;;855:18;;:::i;:::-;901:2;898:1;894:10;924:28;948:2;944;940:11;924:28;:::i;:::-;986:15;;;1017:12;;;;1049:15;;;1083;;;1079:24;;1076:33;-1:-1:-1;1073:53:1;;;1122:1;1119;1112:12;1073:53;1144:1;1135:10;;1165:1;1175:310;1191:2;1186:3;1183:11;1175:310;;;1272:3;1259:17;1308:2;1295:11;1292:19;1289:39;;;1324:1;1321;1314:12;1289:39;1353:57;1406:3;1401:2;1387:11;1379:6;1375:24;1371:33;1353:57;:::i;:::-;1341:70;;-1:-1:-1;1431:12:1;;;;1463;;;;1213:1;1204:11;1175:310;;;-1:-1:-1;1503:5:1;;603:911;-1:-1:-1;;;;;;;;;603:911:1:o;1519:160::-;1584:20;;1640:13;;1633:21;1623:32;;1613:60;;1669:1;1666;1659:12;1684:221;1727:5;1780:3;1773:4;1765:6;1761:17;1757:27;1747:55;;1798:1;1795;1788:12;1747:55;1820:79;1895:3;1886:6;1873:20;1866:4;1858:6;1854:17;1820:79;:::i;:::-;1811:88;1684:221;-1:-1:-1;;;1684:221:1:o;1910:186::-;1969:6;2022:2;2010:9;2001:7;1997:23;1993:32;1990:52;;;2038:1;2035;2028:12;1990:52;2061:29;2080:9;2061:29;:::i;2101:260::-;2169:6;2177;2230:2;2218:9;2209:7;2205:23;2201:32;2198:52;;;2246:1;2243;2236:12;2198:52;2269:29;2288:9;2269:29;:::i;:::-;2259:39;;2317:38;2351:2;2340:9;2336:18;2317:38;:::i;:::-;2307:48;;2101:260;;;;;:::o;2366:328::-;2443:6;2451;2459;2512:2;2500:9;2491:7;2487:23;2483:32;2480:52;;;2528:1;2525;2518:12;2480:52;2551:29;2570:9;2551:29;:::i;:::-;2541:39;;2599:38;2633:2;2622:9;2618:18;2599:38;:::i;:::-;2589:48;;2684:2;2673:9;2669:18;2656:32;2646:42;;2366:328;;;;;:::o;2699:666::-;2794:6;2802;2810;2818;2871:3;2859:9;2850:7;2846:23;2842:33;2839:53;;;2888:1;2885;2878:12;2839:53;2911:29;2930:9;2911:29;:::i;:::-;2901:39;;2959:38;2993:2;2982:9;2978:18;2959:38;:::i;:::-;2949:48;;3044:2;3033:9;3029:18;3016:32;3006:42;;3099:2;3088:9;3084:18;3071:32;-1:-1:-1;;;;;3118:6:1;3115:30;3112:50;;;3158:1;3155;3148:12;3112:50;3181:22;;3234:4;3226:13;;3222:27;-1:-1:-1;3212:55:1;;3263:1;3260;3253:12;3212:55;3286:73;3351:7;3346:2;3333:16;3328:2;3324;3320:11;3286:73;:::i;:::-;3276:83;;;2699:666;;;;;;;:::o;3370:254::-;3435:6;3443;3496:2;3484:9;3475:7;3471:23;3467:32;3464:52;;;3512:1;3509;3502:12;3464:52;3535:29;3554:9;3535:29;:::i;:::-;3525:39;;3583:35;3614:2;3603:9;3599:18;3583:35;:::i;3629:254::-;3697:6;3705;3758:2;3746:9;3737:7;3733:23;3729:32;3726:52;;;3774:1;3771;3764:12;3726:52;3797:29;3816:9;3797:29;:::i;:::-;3787:39;3873:2;3858:18;;;;3845:32;;-1:-1:-1;;;3629:254:1:o;3888:464::-;3975:6;3983;3991;4044:2;4032:9;4023:7;4019:23;4015:32;4012:52;;;4060:1;4057;4050:12;4012:52;4083:29;4102:9;4083:29;:::i;:::-;4073:39;;4159:2;4148:9;4144:18;4131:32;4121:42;;4214:2;4203:9;4199:18;4186:32;-1:-1:-1;;;;;4233:6:1;4230:30;4227:50;;;4273:1;4270;4263:12;4227:50;4296;4338:7;4329:6;4318:9;4314:22;4296:50;:::i;:::-;4286:60;;;3888:464;;;;;:::o;4357:180::-;4413:6;4466:2;4454:9;4445:7;4441:23;4437:32;4434:52;;;4482:1;4479;4472:12;4434:52;4505:26;4521:9;4505:26;:::i;4542:245::-;4600:6;4653:2;4641:9;4632:7;4628:23;4624:32;4621:52;;;4669:1;4666;4659:12;4621:52;4708:9;4695:23;4727:30;4751:5;4727:30;:::i;4792:249::-;4861:6;4914:2;4902:9;4893:7;4889:23;4885:32;4882:52;;;4930:1;4927;4920:12;4882:52;4962:9;4956:16;4981:30;5005:5;4981:30;:::i;5046:180::-;5105:6;5158:2;5146:9;5137:7;5133:23;5129:32;5126:52;;;5174:1;5171;5164:12;5126:52;-1:-1:-1;5197:23:1;;5046:180;-1:-1:-1;5046:180:1:o;5231:425::-;5334:6;5342;5395:2;5383:9;5374:7;5370:23;5366:32;5363:52;;;5411:1;5408;5401:12;5363:52;5447:9;5434:23;5424:33;;5508:2;5497:9;5493:18;5480:32;-1:-1:-1;;;;;5527:6:1;5524:30;5521:50;;;5567:1;5564;5557:12;5521:50;5590:60;5642:7;5633:6;5622:9;5618:22;5590:60;:::i;:::-;5580:70;;;5231:425;;;;;:::o;5661:390::-;5739:6;5747;5800:2;5788:9;5779:7;5775:23;5771:32;5768:52;;;5816:1;5813;5806:12;5768:52;5852:9;5839:23;5829:33;;5913:2;5902:9;5898:18;5885:32;-1:-1:-1;;;;;5932:6:1;5929:30;5926:50;;;5972:1;5969;5962:12;5926:50;5995;6037:7;6028:6;6017:9;6013:22;5995:50;:::i;6056:248::-;6124:6;6132;6185:2;6173:9;6164:7;6160:23;6156:32;6153:52;;;6201:1;6198;6191:12;6153:52;-1:-1:-1;;6224:23:1;;;6294:2;6279:18;;;6266:32;;-1:-1:-1;6056:248:1:o;6309:493::-;6421:6;6429;6437;6490:2;6478:9;6469:7;6465:23;6461:32;6458:52;;;6506:1;6503;6496:12;6458:52;6542:9;6529:23;6519:33;;6599:2;6588:9;6584:18;6571:32;6561:42;;6654:2;6643:9;6639:18;6626:32;-1:-1:-1;;;;;6673:6:1;6670:30;6667:50;;;6713:1;6710;6703:12;6667:50;6736:60;6788:7;6779:6;6768:9;6764:22;6736:60;:::i;6807:562::-;6928:6;6936;6944;6952;7005:3;6993:9;6984:7;6980:23;6976:33;6973:53;;;7022:1;7019;7012:12;6973:53;7058:9;7045:23;7035:33;;7115:2;7104:9;7100:18;7087:32;7077:42;;7166:2;7155:9;7151:18;7138:32;7128:42;;7221:2;7210:9;7206:18;7193:32;-1:-1:-1;;;;;7240:6:1;7237:30;7234:50;;;7280:1;7277;7270:12;7234:50;7303:60;7355:7;7346:6;7335:9;7331:22;7303:60;:::i;7374:631::-;7504:6;7512;7520;7528;7536;7589:3;7577:9;7568:7;7564:23;7560:33;7557:53;;;7606:1;7603;7596:12;7557:53;7642:9;7629:23;7619:33;;7699:2;7688:9;7684:18;7671:32;7661:42;;7750:2;7739:9;7735:18;7722:32;7712:42;;7801:2;7790:9;7786:18;7773:32;7763:42;;7856:3;7845:9;7841:19;7828:33;-1:-1:-1;;;;;7876:6:1;7873:30;7870:50;;;7916:1;7913;7906:12;7870:50;7939:60;7991:7;7982:6;7971:9;7967:22;7939:60;:::i;:::-;7929:70;;;7374:631;;;;;;;;:::o;8010:700::-;8149:6;8157;8165;8173;8181;8189;8242:3;8230:9;8221:7;8217:23;8213:33;8210:53;;;8259:1;8256;8249:12;8210:53;8295:9;8282:23;8272:33;;8352:2;8341:9;8337:18;8324:32;8314:42;;8403:2;8392:9;8388:18;8375:32;8365:42;;8454:2;8443:9;8439:18;8426:32;8416:42;;8505:3;8494:9;8490:19;8477:33;8467:43;;8561:3;8550:9;8546:19;8533:33;-1:-1:-1;;;;;8581:6:1;8578:30;8575:50;;;8621:1;8618;8611:12;8575:50;8644:60;8696:7;8687:6;8676:9;8672:22;8644:60;:::i;:::-;8634:70;;;8010:700;;;;;;;;:::o;8715:471::-;8756:3;8794:5;8788:12;8821:6;8816:3;8809:19;8846:1;8856:162;8870:6;8867:1;8864:13;8856:162;;;8932:4;8988:13;;;8984:22;;8978:29;8960:11;;;8956:20;;8949:59;8885:12;8856:162;;;9036:6;9033:1;9030:13;9027:87;;;9102:1;9095:4;9086:6;9081:3;9077:16;9073:27;9066:38;9027:87;-1:-1:-1;9168:2:1;9147:15;-1:-1:-1;;9143:29:1;9134:39;;;;9175:4;9130:50;;8715:471;-1:-1:-1;;8715:471:1:o;9609:488::-;-1:-1:-1;;;;;9878:15:1;;;9860:34;;9930:15;;9925:2;9910:18;;9903:43;9977:2;9962:18;;9955:34;;;10025:3;10020:2;10005:18;;9998:31;;;9803:4;;10046:45;;10071:19;;10063:6;10046:45;:::i;:::-;10038:53;9609:488;-1:-1:-1;;;;;;9609:488:1:o;10102:632::-;10273:2;10325:21;;;10395:13;;10298:18;;;10417:22;;;10244:4;;10273:2;10496:15;;;;10470:2;10455:18;;;10244:4;10539:169;10553:6;10550:1;10547:13;10539:169;;;10614:13;;10602:26;;10683:15;;;;10648:12;;;;10575:1;10568:9;10539:169;;;-1:-1:-1;10725:3:1;;10102:632;-1:-1:-1;;;;;;10102:632:1:o;10931:219::-;11080:2;11069:9;11062:21;11043:4;11100:44;11140:2;11129:9;11125:18;11117:6;11100:44;:::i;11567:414::-;11769:2;11751:21;;;11808:2;11788:18;;;11781:30;11847:34;11842:2;11827:18;;11820:62;-1:-1:-1;;;11913:2:1;11898:18;;11891:48;11971:3;11956:19;;11567:414::o;15942:408::-;16144:2;16126:21;;;16183:2;16163:18;;;16156:30;16222:34;16217:2;16202:18;;16195:62;-1:-1:-1;;;16288:2:1;16273:18;;16266:42;16340:3;16325:19;;15942:408::o;16355:356::-;16557:2;16539:21;;;16576:18;;;16569:30;16635:34;16630:2;16615:18;;16608:62;16702:2;16687:18;;16355:356::o;17944:413::-;18146:2;18128:21;;;18185:2;18165:18;;;18158:30;18224:34;18219:2;18204:18;;18197:62;-1:-1:-1;;;18290:2:1;18275:18;;18268:47;18347:3;18332:19;;17944:413::o;18957:275::-;19028:2;19022:9;19093:2;19074:13;;-1:-1:-1;;19070:27:1;19058:40;;-1:-1:-1;;;;;19113:34:1;;19149:22;;;19110:62;19107:88;;;19175:18;;:::i;:::-;19211:2;19204:22;18957:275;;-1:-1:-1;18957:275:1:o;19237:128::-;19277:3;19308:1;19304:6;19301:1;19298:13;19295:39;;;19314:18;;:::i;:::-;-1:-1:-1;19350:9:1;;19237:128::o;19370:120::-;19410:1;19436;19426:35;;19441:18;;:::i;:::-;-1:-1:-1;19475:9:1;;19370:120::o;19495:168::-;19535:7;19601:1;19597;19593:6;19589:14;19586:1;19583:21;19578:1;19571:9;19564:17;19560:45;19557:71;;;19608:18;;:::i;:::-;-1:-1:-1;19648:9:1;;19495:168::o;19668:125::-;19708:4;19736:1;19733;19730:8;19727:34;;;19741:18;;:::i;:::-;-1:-1:-1;19778:9:1;;19668:125::o;19798:380::-;19877:1;19873:12;;;;19920;;;19941:61;;19995:4;19987:6;19983:17;19973:27;;19941:61;20048:2;20040:6;20037:14;20017:18;20014:38;20011:161;;;20094:10;20089:3;20085:20;20082:1;20075:31;20129:4;20126:1;20119:15;20157:4;20154:1;20147:15;20011:161;;19798:380;;;:::o;20183:135::-;20222:3;-1:-1:-1;;20243:17:1;;20240:43;;;20263:18;;:::i;:::-;-1:-1:-1;20310:1:1;20299:13;;20183:135::o;20323:175::-;20360:3;20404:4;20397:5;20393:16;20433:4;20424:7;20421:17;20418:43;;;20441:18;;:::i;:::-;20490:1;20477:15;;20323:175;-1:-1:-1;;20323:175:1:o;20503:112::-;20535:1;20561;20551:35;;20566:18;;:::i;:::-;-1:-1:-1;20600:9:1;;20503:112::o;20620:127::-;20681:10;20676:3;20672:20;20669:1;20662:31;20712:4;20709:1;20702:15;20736:4;20733:1;20726:15;20752:127;20813:10;20808:3;20804:20;20801:1;20794:31;20844:4;20841:1;20834:15;20868:4;20865:1;20858:15;20884:127;20945:10;20940:3;20936:20;20933:1;20926:31;20976:4;20973:1;20966:15;21000:4;20997:1;20990:15;21016:127;21077:10;21072:3;21068:20;21065:1;21058:31;21108:4;21105:1;21098:15;21132:4;21129:1;21122:15;21148:127;21209:10;21204:3;21200:20;21197:1;21190:31;21240:4;21237:1;21230:15;21264:4;21261:1;21254:15;21280:131;-1:-1:-1;;;;;;21354:32:1;;21344:43;;21334:71;;21401:1;21398;21391:12

Swarm Source

ipfs://487948d4f22a8153c2785ae6f5d4cc972685dd3e1074689e4f989b30ac9f99af
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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