ETH Price: $3,389.37 (-1.54%)
Gas: 2 Gwei

Token

Dicks (DICKS)
 

Overview

Max Total Supply

1,110 DICKS

Holders

218

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
cybernetwork.eth
Balance
10 DICKS
0x33bd8d5a4f40285df90694ccb29d6f5859c3977e
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:
Dicks

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-05
*/

// SPDX-License-Identifier: MIT

/*********************************
            _
   lol      /\) _
       _   / / (/\  lol
      /\) ( Y)  \ \
     / /   ""   (Y )
    ( Y)  _      ""
     ""  (/\ lol   _
   lol    \ \     /\)
          (Y )   / /
           ""   ( Y)
                 ""
 *********************************/

 // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// OpenZeppelin Contracts v4.4.1 (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);
}


// OpenZeppelin Contracts v4.4.1 (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;
    }
}
pragma solidity ^0.8.13;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// OpenZeppelin Contracts (last updated v4.8.0) (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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// OpenZeppelin Contracts v4.4.1 (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);
}
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

pragma solidity ^0.8.13;


abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;
    string private _symbol;

    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");

        uint256 count;
        for (uint256 i; i < _owners.length;) {
            if (owner == _owners[i]) {
                unchecked {
                    ++count;
                }
            }
            unchecked {
                ++i;
            }
        }
        return count;
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: invalid token ID");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC721: approve to caller");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    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");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(!_exists(tokenId), "ERC721: token already minted");

        _owners.push(to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        delete _tokenApprovals[tokenId];
        delete _owners[tokenId];

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

    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    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))
                    }
                }
            }
        }

        return true;
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts (last updated v4.5.0) (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);

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

pragma solidity ^0.8.7;

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function totalSupply() public view virtual override returns (uint256) {
        uint256 count;
        for (uint256 i; i < _owners.length;) {
            if (_owners[i] != address(0)) {
                unchecked {
                    ++count;
                }
            }

            unchecked {
                ++i;
            }
        }

        return count;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < _owners.length, "ERC721Enumerable: global index out of bounds");
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint256 count;
        for(uint256 i; i < _owners.length;){
            if(owner == _owners[i]) {
                if(count == index) return i;
                else {
                    unchecked {
                        ++count;
                    }
                }
            }

            unchecked {
                ++i;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

pragma solidity ^0.8.13;

interface IDickriptor {
    function tokenURI(uint256 tokenId, uint256 seed) external view returns (string memory);
}
pragma solidity ^0.8.13;

contract Dicks is ERC721Enumerable, Ownable {
    event SeedUpdated(uint256 indexed tokenId, uint256 seed);

    mapping(uint256 => uint256) internal seeds;
    IDickriptor public descriptor;
    uint256 public maxSupply = 10000;
    uint32 public maxFreeMintAmountPerWallet = 1;
    uint256 public cost = 0.001 ether;
    bool public minting = false;
    bool public canUpdateSeed = true;

    mapping (address => uint32) public NFTPerPublicAddress;

    constructor(IDickriptor newDescriptor) ERC721("Dicks", "DICKS") {
        descriptor = newDescriptor;
    }

    function mint(uint32 count) external payable {
        uint32 nft = NFTPerPublicAddress[msg.sender];
        require(minting, "Minting needs to be enabled to start minting");
        require(count < 101, "Exceeds max per transaction.");
        uint256 nextTokenId = _owners.length;
        unchecked {
            require(nextTokenId + count < maxSupply, "Exceeds max supply.");
        }
           if(nft >= maxFreeMintAmountPerWallet)
        {
            require(msg.value >= cost * count, "Insufficient funds!");
        }
        else {
            uint32 costAmount = count + nft;
            if(costAmount > maxFreeMintAmountPerWallet)
        {
            costAmount = costAmount - maxFreeMintAmountPerWallet;
            require(msg.value >= cost * costAmount, "Insufficient funds!");
        }
        }
        NFTPerPublicAddress[msg.sender] = count + nft;

        for (uint32 i; i < count;) {
            seeds[nextTokenId] = generateSeed(nextTokenId);
            _mint(_msgSender(), nextTokenId);
            unchecked { ++nextTokenId; ++i; }
        }
    }

    function setMaxSupply(uint16 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
        maxFreeMintAmountPerWallet = _limit;
        delete _limit;
    }

    function setMinting(bool value) external onlyOwner {
        minting = value;
    }

    function setDescriptor(IDickriptor newDescriptor) external onlyOwner {
        descriptor = newDescriptor;
    }

    function withdraw() external payable onlyOwner {
        (bool os,)= payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function updateSeed(uint256 tokenId, uint256 seed) external onlyOwner {
        require(canUpdateSeed, "Cannot set the seed");
        seeds[tokenId] = seed;
        emit SeedUpdated(tokenId, seed);
    }

    function disableSeedUpdate() external onlyOwner {
        canUpdateSeed = false;
    }

    function burn(uint256 tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn.");
        delete seeds[tokenId];
        _burn(tokenId);
    }

    function getSeed(uint256 tokenId) public view returns (uint256) {
        require(_exists(tokenId), "Dick does not exist.");
        return seeds[tokenId];
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Dick does not exist.");
        uint256 seed = seeds[tokenId];
        return descriptor.tokenURI(tokenId, seed);
    }

    function generateSeed(uint256 tokenId) private view returns (uint256) {
        uint256 r = random(tokenId);
        uint256 headSeed = 100 * (r % 7 + 10) + ((r >> 48) % 20 + 10);
        uint256 topshaftSeed = 100 * ((r >> 96) % 6 + 10) + ((r >> 96) % 20 + 10);
        uint256 bottomshaftSeed = 100 * ((r >> 192) % 2 + 10) + ((r >> 192) % 20 + 10);
        uint256 ballsSeed = 100 * ((r >> 144) % 7 + 10) + ((r >> 144) % 20 + 10);
        return 10000 * (10000 * (10000 * headSeed + topshaftSeed) + ballsSeed) + bottomshaftSeed;
    }

    function random(uint256 tokenId) private view returns (uint256 pseudoRandomness) {
        pseudoRandomness = uint256(
            keccak256(abi.encodePacked(blockhash(block.number - 1), tokenId))
        );

        return pseudoRandomness;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IDickriptor","name":"newDescriptor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"SeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canUpdateSeed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract IDickriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableSeedUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"contract IDickriptor","name":"newDescriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":"tokenId","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"updateSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526127106008556009805463ffffffff1916600117905566038d7ea4c68000600a55600b805461ffff19166101001790553480156200004157600080fd5b50604051620024a1380380620024a183398101604081905262000064916200020d565b604051806040016040528060058152602001644469636b7360d81b815250604051806040016040528060058152602001644449434b5360d81b8152508160009080519060200190620000b892919062000167565b508051620000ce90600190602084019062000167565b505050620000eb620000e56200011160201b60201c565b62000115565b600780546001600160a01b0319166001600160a01b03929092169190911790556200027b565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000175906200023f565b90600052602060002090601f016020900481019282620001995760008555620001e4565b82601f10620001b457805160ff1916838001178555620001e4565b82800160010185558215620001e4579182015b82811115620001e4578251825591602001919060010190620001c7565b50620001f2929150620001f6565b5090565b5b80821115620001f25760008155600101620001f7565b6000602082840312156200022057600080fd5b81516001600160a01b03811681146200023857600080fd5b9392505050565b600181811c908216806200025457607f821691505b6020821081036200027557634e487b7160e01b600052602260045260246000fd5b50919050565b612216806200028b6000396000f3fe60806040526004361061020f5760003560e01c80634f6ccce711610118578063b4c7f066116100a0578063e0d4ea371161006f578063e0d4ea37146105c5578063e94053c7146105e5578063e985e9c51461062d578063f2fde38b14610676578063f8bf51721461069657600080fd5b8063b4c7f0661461054f578063b88d4fde1461056f578063c87b56dd1461058f578063d5abeb01146105af57600080fd5b80637dc2268c116100e75780637dc2268c146104cf5780638da5cb5b146104e957806395d89b4114610507578063a22cb4651461051c578063a71bbebe1461053c57600080fd5b80634f6ccce71461045a5780636352211e1461047a57806370a082311461049a578063715018a6146104ba57600080fd5b806323b872dd1161019b5780633bb2c9381161016a5780633bb2c938146103dd5780633ccfd60b146103f257806342842e0e146103fa57806342966c681461041a5780634d9c18481461043a57600080fd5b806323b872dd1461035e5780632f745c591461037e578063303e74df1461039e57806333101e1f146103be57600080fd5b8063081812fc116101e2578063081812fc146102ad578063095ea7b3146102e557806313faede614610305578063176b72b41461032957806318160ddd1461034957600080fd5b806301b9a3971461021457806301ffc9a71461023657806306421c2f1461026b57806306fdde031461028b575b600080fd5b34801561022057600080fd5b5061023461022f366004611b7c565b6106b3565b005b34801561024257600080fd5b50610256610251366004611baf565b6106dd565b60405190151581526020015b60405180910390f35b34801561027757600080fd5b50610234610286366004611bcc565b610708565b34801561029757600080fd5b506102a0610719565b6040516102629190611c48565b3480156102b957600080fd5b506102cd6102c8366004611c5b565b6107ab565b6040516001600160a01b039091168152602001610262565b3480156102f157600080fd5b50610234610300366004611c74565b61081e565b34801561031157600080fd5b5061031b600a5481565b604051908152602001610262565b34801561033557600080fd5b50610234610344366004611ca0565b610933565b34801561035557600080fd5b5061031b6109d9565b34801561036a57600080fd5b50610234610379366004611cc2565b610a36565b34801561038a57600080fd5b5061031b610399366004611c74565b610a68565b3480156103aa57600080fd5b506007546102cd906001600160a01b031681565b3480156103ca57600080fd5b50600b5461025690610100900460ff1681565b3480156103e957600080fd5b50610234610b09565b610234610b1e565b34801561040657600080fd5b50610234610415366004611cc2565b610b9a565b34801561042657600080fd5b50610234610435366004611c5b565b610bb5565b34801561044657600080fd5b50610234610455366004611d03565b610c1a565b34801561046657600080fd5b5061031b610475366004611c5b565b610c3a565b34801561048657600080fd5b506102cd610495366004611c5b565b610ca7565b3480156104a657600080fd5b5061031b6104b5366004611b7c565b610d1c565b3480156104c657600080fd5b50610234610ddc565b3480156104db57600080fd5b50600b546102569060ff1681565b3480156104f557600080fd5b506005546001600160a01b03166102cd565b34801561051357600080fd5b506102a0610df0565b34801561052857600080fd5b50610234610537366004611d3b565b610dff565b61023461054a366004611d70565b610ec3565b34801561055b57600080fd5b5061023461056a366004611d96565b61116a565b34801561057b57600080fd5b5061023461058a366004611e20565b611185565b34801561059b57600080fd5b506102a06105aa366004611c5b565b6111b7565b3480156105bb57600080fd5b5061031b60085481565b3480156105d157600080fd5b5061031b6105e0366004611c5b565b611294565b3480156105f157600080fd5b50610618610600366004611b7c565b600c6020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610262565b34801561063957600080fd5b50610256610648366004611ecf565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561068257600080fd5b50610234610691366004611b7c565b6112f5565b3480156106a257600080fd5b506009546106189063ffffffff1681565b6106bb61136b565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806107025750610702826113c5565b92915050565b61071061136b565b61ffff16600855565b60606000805461072890611f08565b80601f016020809104026020016040519081016040528092919081815260200182805461075490611f08565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b60006107b682611415565b6108025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061082982610ca7565b9050806001600160a01b0316836001600160a01b0316036108965760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806108b257506108b28133610648565b6109245760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b61092e838361145f565b505050565b61093b61136b565b600b54610100900460ff166109885760405162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd081cd95d081d1a19481cd95959606a1b60448201526064016107f9565b600082815260066020526040908190208290555182907faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e0906109cd9084815260200190565b60405180910390a25050565b60008060005b600254811015610a305760006001600160a01b031660028281548110610a0757610a07611f3c565b6000918252602090912001546001600160a01b031614610a28578160010191505b6001016109df565b50919050565b610a41335b826114cd565b610a5d5760405162461bcd60e51b81526004016107f990611f52565b61092e83838361154c565b6000610a7383610d1c565b8210610a915760405162461bcd60e51b81526004016107f990611f9f565b6000805b600254811015610af05760028181548110610ab257610ab2611f3c565b6000918252602090912001546001600160a01b0390811690861603610ae857838203610ae15791506107029050565b8160010191505b600101610a95565b5060405162461bcd60e51b81526004016107f990611f9f565b610b1161136b565b600b805461ff0019169055565b610b2661136b565b6000610b3a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b84576040519150601f19603f3d011682016040523d82523d6000602084013e610b89565b606091505b5050905080610b9757600080fd5b50565b61092e83838360405180602001604052806000815250611185565b610bbe33610a3b565b610c025760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b60448201526064016107f9565b600081815260066020526040812055610b97816116b2565b610c2261136b565b6009805463ffffffff191660ff909216919091179055565b6002546000908210610ca35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107f9565b5090565b60008060028381548110610cbd57610cbd611f3c565b6000918252602090912001546001600160a01b03169050806107025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f9565b60006001600160a01b038216610d865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107f9565b6000805b600254811015610dd55760028181548110610da757610da7611f3c565b6000918252602090912001546001600160a01b0390811690851603610dcd578160010191505b600101610d8a565b5092915050565b610de461136b565b610dee6000611743565b565b60606001805461072890611f08565b6001600160a01b0382163303610e575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600c6020526040902054600b5463ffffffff9091169060ff16610f435760405162461bcd60e51b815260206004820152602c60248201527f4d696e74696e67206e6565647320746f20626520656e61626c656420746f207360448201526b74617274206d696e74696e6760a01b60648201526084016107f9565b60658263ffffffff1610610f995760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e0000000060448201526064016107f9565b60025460085463ffffffff8416820110610feb5760405162461bcd60e51b815260206004820152601360248201527222bc31b2b2b2399036b0bc1039bab838363c9760691b60448201526064016107f9565b60095463ffffffff9081169083161061105c578263ffffffff16600a546110129190612000565b3410156110575760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107f9565b6110ef565b6000611068838561201f565b60095490915063ffffffff90811690821611156110ed576009546110929063ffffffff1682612047565b90508063ffffffff16600a546110a89190612000565b3410156110ed5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107f9565b505b6110f9828461201f565b336000908152600c60205260408120805463ffffffff191663ffffffff93909316929092179091555b8363ffffffff168163ffffffff1610156111645761113f82611795565b6000838152600660205260409020556111583383611923565b60019182019101611122565b50505050565b61117261136b565b600b805460ff1916911515919091179055565b61118f33836114cd565b6111ab5760405162461bcd60e51b81526004016107f990611f52565b611164848484846119f5565b60606111c282611415565b6112055760405162461bcd60e51b81526020600482015260146024820152732234b1b5903237b2b9903737ba1032bc34b9ba1760611b60448201526064016107f9565b600082815260066020526040908190205460075491516392cb829d60e01b8152600481018590526024810182905290916001600160a01b0316906392cb829d90604401600060405180830381865afa158015611265573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261128d919081019061206c565b9392505050565b600061129f82611415565b6112e25760405162461bcd60e51b81526020600482015260146024820152732234b1b5903237b2b9903737ba1032bc34b9ba1760611b60448201526064016107f9565b5060009081526006602052604090205490565b6112fd61136b565b6001600160a01b0381166113625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610b9781611743565b6005546001600160a01b03163314610dee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b60006001600160e01b031982166380ac58cd60e01b14806113f657506001600160e01b03198216635b5e139f60e01b145b8061070257506301ffc9a760e01b6001600160e01b0319831614610702565b60025460009082108015610702575060006001600160a01b03166002838154811061144257611442611f3c565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061149482610ca7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806114d983610ca7565b9050806001600160a01b0316846001600160a01b0316148061152057506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806115445750836001600160a01b0316611539846107ab565b6001600160a01b0316145b949350505050565b826001600160a01b031661155f82610ca7565b6001600160a01b0316146115c35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107f9565b6001600160a01b0382166116255760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b600081815260036020526040902080546001600160a01b0319169055600280548391908390811061165857611658611f3c565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006116bd82610ca7565b600083815260036020526040902080546001600160a01b03191690556002805491925090839081106116f1576116f1611f3c565b6000918252602082200180546001600160a01b03191690556040518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806117a183611a28565b905060006117b46014603084901c6120e3565b6117bf90600a612105565b6117ca6007846120e3565b6117d590600a612105565b6117e0906064612000565b6117ea9190612105565b905060006117fd6014606085901c6120e3565b61180890600a612105565b6118176006606086901c6120e3565b61182290600a612105565b61182d906064612000565b6118379190612105565b9050600061184a601460c086901c6120e3565b61185590600a612105565b611864600260c087901c6120e3565b61186f90600a612105565b61187a906064612000565b6118849190612105565b905060006118976014609087901c6120e3565b6118a290600a612105565b6118b16007609088901c6120e3565b6118bc90600a612105565b6118c7906064612000565b6118d19190612105565b90508181846118e287612710612000565b6118ec9190612105565b6118f890612710612000565b6119029190612105565b61190e90612710612000565b6119189190612105565b979650505050505050565b61192c81611415565b156119795760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611a0084848461154c565b611a0c84848484611a66565b6111645760405162461bcd60e51b81526004016107f99061211d565b6000611a3560014361216f565b6040805191406020830152810183905260600160408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b15611b5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611aaa903390899088908890600401612186565b6020604051808303816000875af1925050508015611ae5575060408051601f3d908101601f19168201909252611ae2918101906121c3565b60015b611b42573d808015611b13576040519150601f19603f3d011682016040523d82523d6000602084013e611b18565b606091505b508051600003611b3a5760405162461bcd60e51b81526004016107f99061211d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611544565b506001949350505050565b6001600160a01b0381168114610b9757600080fd5b600060208284031215611b8e57600080fd5b813561128d81611b67565b6001600160e01b031981168114610b9757600080fd5b600060208284031215611bc157600080fd5b813561128d81611b99565b600060208284031215611bde57600080fd5b813561ffff8116811461128d57600080fd5b60005b83811015611c0b578181015183820152602001611bf3565b838111156111645750506000910152565b60008151808452611c34816020860160208601611bf0565b601f01601f19169290920160200192915050565b60208152600061128d6020830184611c1c565b600060208284031215611c6d57600080fd5b5035919050565b60008060408385031215611c8757600080fd5b8235611c9281611b67565b946020939093013593505050565b60008060408385031215611cb357600080fd5b50508035926020909101359150565b600080600060608486031215611cd757600080fd5b8335611ce281611b67565b92506020840135611cf281611b67565b929592945050506040919091013590565b600060208284031215611d1557600080fd5b813560ff8116811461128d57600080fd5b80358015158114611d3657600080fd5b919050565b60008060408385031215611d4e57600080fd5b8235611d5981611b67565b9150611d6760208401611d26565b90509250929050565b600060208284031215611d8257600080fd5b813563ffffffff8116811461128d57600080fd5b600060208284031215611da857600080fd5b61128d82611d26565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df057611df0611db1565b604052919050565b600067ffffffffffffffff821115611e1257611e12611db1565b50601f01601f191660200190565b60008060008060808587031215611e3657600080fd5b8435611e4181611b67565b93506020850135611e5181611b67565b925060408501359150606085013567ffffffffffffffff811115611e7457600080fd5b8501601f81018713611e8557600080fd5b8035611e98611e9382611df8565b611dc7565b818152886020838501011115611ead57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215611ee257600080fd5b8235611eed81611b67565b91506020830135611efd81611b67565b809150509250929050565b600181811c90821680611f1c57607f821691505b602082108103610a3057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561201a5761201a611fea565b500290565b600063ffffffff80831681851680830382111561203e5761203e611fea565b01949350505050565b600063ffffffff8381169083168181101561206457612064611fea565b039392505050565b60006020828403121561207e57600080fd5b815167ffffffffffffffff81111561209557600080fd5b8201601f810184136120a657600080fd5b80516120b4611e9382611df8565b8181528560208385010111156120c957600080fd5b6120da826020830160208601611bf0565b95945050505050565b60008261210057634e487b7160e01b600052601260045260246000fd5b500690565b6000821982111561211857612118611fea565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008282101561218157612181611fea565b500390565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121b990830184611c1c565b9695505050505050565b6000602082840312156121d557600080fd5b815161128d81611b9956fea26469706673582212200d973f3b56faeec4ee1701bc5d18948ab58caedb0a08677ee74f666143d2ec2a64736f6c634300080d003300000000000000000000000097f997dfceb2451744a0b9015fb79632528f6344

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80634f6ccce711610118578063b4c7f066116100a0578063e0d4ea371161006f578063e0d4ea37146105c5578063e94053c7146105e5578063e985e9c51461062d578063f2fde38b14610676578063f8bf51721461069657600080fd5b8063b4c7f0661461054f578063b88d4fde1461056f578063c87b56dd1461058f578063d5abeb01146105af57600080fd5b80637dc2268c116100e75780637dc2268c146104cf5780638da5cb5b146104e957806395d89b4114610507578063a22cb4651461051c578063a71bbebe1461053c57600080fd5b80634f6ccce71461045a5780636352211e1461047a57806370a082311461049a578063715018a6146104ba57600080fd5b806323b872dd1161019b5780633bb2c9381161016a5780633bb2c938146103dd5780633ccfd60b146103f257806342842e0e146103fa57806342966c681461041a5780634d9c18481461043a57600080fd5b806323b872dd1461035e5780632f745c591461037e578063303e74df1461039e57806333101e1f146103be57600080fd5b8063081812fc116101e2578063081812fc146102ad578063095ea7b3146102e557806313faede614610305578063176b72b41461032957806318160ddd1461034957600080fd5b806301b9a3971461021457806301ffc9a71461023657806306421c2f1461026b57806306fdde031461028b575b600080fd5b34801561022057600080fd5b5061023461022f366004611b7c565b6106b3565b005b34801561024257600080fd5b50610256610251366004611baf565b6106dd565b60405190151581526020015b60405180910390f35b34801561027757600080fd5b50610234610286366004611bcc565b610708565b34801561029757600080fd5b506102a0610719565b6040516102629190611c48565b3480156102b957600080fd5b506102cd6102c8366004611c5b565b6107ab565b6040516001600160a01b039091168152602001610262565b3480156102f157600080fd5b50610234610300366004611c74565b61081e565b34801561031157600080fd5b5061031b600a5481565b604051908152602001610262565b34801561033557600080fd5b50610234610344366004611ca0565b610933565b34801561035557600080fd5b5061031b6109d9565b34801561036a57600080fd5b50610234610379366004611cc2565b610a36565b34801561038a57600080fd5b5061031b610399366004611c74565b610a68565b3480156103aa57600080fd5b506007546102cd906001600160a01b031681565b3480156103ca57600080fd5b50600b5461025690610100900460ff1681565b3480156103e957600080fd5b50610234610b09565b610234610b1e565b34801561040657600080fd5b50610234610415366004611cc2565b610b9a565b34801561042657600080fd5b50610234610435366004611c5b565b610bb5565b34801561044657600080fd5b50610234610455366004611d03565b610c1a565b34801561046657600080fd5b5061031b610475366004611c5b565b610c3a565b34801561048657600080fd5b506102cd610495366004611c5b565b610ca7565b3480156104a657600080fd5b5061031b6104b5366004611b7c565b610d1c565b3480156104c657600080fd5b50610234610ddc565b3480156104db57600080fd5b50600b546102569060ff1681565b3480156104f557600080fd5b506005546001600160a01b03166102cd565b34801561051357600080fd5b506102a0610df0565b34801561052857600080fd5b50610234610537366004611d3b565b610dff565b61023461054a366004611d70565b610ec3565b34801561055b57600080fd5b5061023461056a366004611d96565b61116a565b34801561057b57600080fd5b5061023461058a366004611e20565b611185565b34801561059b57600080fd5b506102a06105aa366004611c5b565b6111b7565b3480156105bb57600080fd5b5061031b60085481565b3480156105d157600080fd5b5061031b6105e0366004611c5b565b611294565b3480156105f157600080fd5b50610618610600366004611b7c565b600c6020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610262565b34801561063957600080fd5b50610256610648366004611ecf565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561068257600080fd5b50610234610691366004611b7c565b6112f5565b3480156106a257600080fd5b506009546106189063ffffffff1681565b6106bb61136b565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806107025750610702826113c5565b92915050565b61071061136b565b61ffff16600855565b60606000805461072890611f08565b80601f016020809104026020016040519081016040528092919081815260200182805461075490611f08565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b60006107b682611415565b6108025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061082982610ca7565b9050806001600160a01b0316836001600160a01b0316036108965760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806108b257506108b28133610648565b6109245760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b61092e838361145f565b505050565b61093b61136b565b600b54610100900460ff166109885760405162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd081cd95d081d1a19481cd95959606a1b60448201526064016107f9565b600082815260066020526040908190208290555182907faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e0906109cd9084815260200190565b60405180910390a25050565b60008060005b600254811015610a305760006001600160a01b031660028281548110610a0757610a07611f3c565b6000918252602090912001546001600160a01b031614610a28578160010191505b6001016109df565b50919050565b610a41335b826114cd565b610a5d5760405162461bcd60e51b81526004016107f990611f52565b61092e83838361154c565b6000610a7383610d1c565b8210610a915760405162461bcd60e51b81526004016107f990611f9f565b6000805b600254811015610af05760028181548110610ab257610ab2611f3c565b6000918252602090912001546001600160a01b0390811690861603610ae857838203610ae15791506107029050565b8160010191505b600101610a95565b5060405162461bcd60e51b81526004016107f990611f9f565b610b1161136b565b600b805461ff0019169055565b610b2661136b565b6000610b3a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b84576040519150601f19603f3d011682016040523d82523d6000602084013e610b89565b606091505b5050905080610b9757600080fd5b50565b61092e83838360405180602001604052806000815250611185565b610bbe33610a3b565b610c025760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b60448201526064016107f9565b600081815260066020526040812055610b97816116b2565b610c2261136b565b6009805463ffffffff191660ff909216919091179055565b6002546000908210610ca35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107f9565b5090565b60008060028381548110610cbd57610cbd611f3c565b6000918252602090912001546001600160a01b03169050806107025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f9565b60006001600160a01b038216610d865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107f9565b6000805b600254811015610dd55760028181548110610da757610da7611f3c565b6000918252602090912001546001600160a01b0390811690851603610dcd578160010191505b600101610d8a565b5092915050565b610de461136b565b610dee6000611743565b565b60606001805461072890611f08565b6001600160a01b0382163303610e575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600c6020526040902054600b5463ffffffff9091169060ff16610f435760405162461bcd60e51b815260206004820152602c60248201527f4d696e74696e67206e6565647320746f20626520656e61626c656420746f207360448201526b74617274206d696e74696e6760a01b60648201526084016107f9565b60658263ffffffff1610610f995760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e0000000060448201526064016107f9565b60025460085463ffffffff8416820110610feb5760405162461bcd60e51b815260206004820152601360248201527222bc31b2b2b2399036b0bc1039bab838363c9760691b60448201526064016107f9565b60095463ffffffff9081169083161061105c578263ffffffff16600a546110129190612000565b3410156110575760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107f9565b6110ef565b6000611068838561201f565b60095490915063ffffffff90811690821611156110ed576009546110929063ffffffff1682612047565b90508063ffffffff16600a546110a89190612000565b3410156110ed5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107f9565b505b6110f9828461201f565b336000908152600c60205260408120805463ffffffff191663ffffffff93909316929092179091555b8363ffffffff168163ffffffff1610156111645761113f82611795565b6000838152600660205260409020556111583383611923565b60019182019101611122565b50505050565b61117261136b565b600b805460ff1916911515919091179055565b61118f33836114cd565b6111ab5760405162461bcd60e51b81526004016107f990611f52565b611164848484846119f5565b60606111c282611415565b6112055760405162461bcd60e51b81526020600482015260146024820152732234b1b5903237b2b9903737ba1032bc34b9ba1760611b60448201526064016107f9565b600082815260066020526040908190205460075491516392cb829d60e01b8152600481018590526024810182905290916001600160a01b0316906392cb829d90604401600060405180830381865afa158015611265573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261128d919081019061206c565b9392505050565b600061129f82611415565b6112e25760405162461bcd60e51b81526020600482015260146024820152732234b1b5903237b2b9903737ba1032bc34b9ba1760611b60448201526064016107f9565b5060009081526006602052604090205490565b6112fd61136b565b6001600160a01b0381166113625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610b9781611743565b6005546001600160a01b03163314610dee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f9565b60006001600160e01b031982166380ac58cd60e01b14806113f657506001600160e01b03198216635b5e139f60e01b145b8061070257506301ffc9a760e01b6001600160e01b0319831614610702565b60025460009082108015610702575060006001600160a01b03166002838154811061144257611442611f3c565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061149482610ca7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806114d983610ca7565b9050806001600160a01b0316846001600160a01b0316148061152057506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806115445750836001600160a01b0316611539846107ab565b6001600160a01b0316145b949350505050565b826001600160a01b031661155f82610ca7565b6001600160a01b0316146115c35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107f9565b6001600160a01b0382166116255760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b600081815260036020526040902080546001600160a01b0319169055600280548391908390811061165857611658611f3c565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006116bd82610ca7565b600083815260036020526040902080546001600160a01b03191690556002805491925090839081106116f1576116f1611f3c565b6000918252602082200180546001600160a01b03191690556040518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806117a183611a28565b905060006117b46014603084901c6120e3565b6117bf90600a612105565b6117ca6007846120e3565b6117d590600a612105565b6117e0906064612000565b6117ea9190612105565b905060006117fd6014606085901c6120e3565b61180890600a612105565b6118176006606086901c6120e3565b61182290600a612105565b61182d906064612000565b6118379190612105565b9050600061184a601460c086901c6120e3565b61185590600a612105565b611864600260c087901c6120e3565b61186f90600a612105565b61187a906064612000565b6118849190612105565b905060006118976014609087901c6120e3565b6118a290600a612105565b6118b16007609088901c6120e3565b6118bc90600a612105565b6118c7906064612000565b6118d19190612105565b90508181846118e287612710612000565b6118ec9190612105565b6118f890612710612000565b6119029190612105565b61190e90612710612000565b6119189190612105565b979650505050505050565b61192c81611415565b156119795760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611a0084848461154c565b611a0c84848484611a66565b6111645760405162461bcd60e51b81526004016107f99061211d565b6000611a3560014361216f565b6040805191406020830152810183905260600160408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b15611b5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611aaa903390899088908890600401612186565b6020604051808303816000875af1925050508015611ae5575060408051601f3d908101601f19168201909252611ae2918101906121c3565b60015b611b42573d808015611b13576040519150601f19603f3d011682016040523d82523d6000602084013e611b18565b606091505b508051600003611b3a5760405162461bcd60e51b81526004016107f99061211d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611544565b506001949350505050565b6001600160a01b0381168114610b9757600080fd5b600060208284031215611b8e57600080fd5b813561128d81611b67565b6001600160e01b031981168114610b9757600080fd5b600060208284031215611bc157600080fd5b813561128d81611b99565b600060208284031215611bde57600080fd5b813561ffff8116811461128d57600080fd5b60005b83811015611c0b578181015183820152602001611bf3565b838111156111645750506000910152565b60008151808452611c34816020860160208601611bf0565b601f01601f19169290920160200192915050565b60208152600061128d6020830184611c1c565b600060208284031215611c6d57600080fd5b5035919050565b60008060408385031215611c8757600080fd5b8235611c9281611b67565b946020939093013593505050565b60008060408385031215611cb357600080fd5b50508035926020909101359150565b600080600060608486031215611cd757600080fd5b8335611ce281611b67565b92506020840135611cf281611b67565b929592945050506040919091013590565b600060208284031215611d1557600080fd5b813560ff8116811461128d57600080fd5b80358015158114611d3657600080fd5b919050565b60008060408385031215611d4e57600080fd5b8235611d5981611b67565b9150611d6760208401611d26565b90509250929050565b600060208284031215611d8257600080fd5b813563ffffffff8116811461128d57600080fd5b600060208284031215611da857600080fd5b61128d82611d26565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df057611df0611db1565b604052919050565b600067ffffffffffffffff821115611e1257611e12611db1565b50601f01601f191660200190565b60008060008060808587031215611e3657600080fd5b8435611e4181611b67565b93506020850135611e5181611b67565b925060408501359150606085013567ffffffffffffffff811115611e7457600080fd5b8501601f81018713611e8557600080fd5b8035611e98611e9382611df8565b611dc7565b818152886020838501011115611ead57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215611ee257600080fd5b8235611eed81611b67565b91506020830135611efd81611b67565b809150509250929050565b600181811c90821680611f1c57607f821691505b602082108103610a3057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561201a5761201a611fea565b500290565b600063ffffffff80831681851680830382111561203e5761203e611fea565b01949350505050565b600063ffffffff8381169083168181101561206457612064611fea565b039392505050565b60006020828403121561207e57600080fd5b815167ffffffffffffffff81111561209557600080fd5b8201601f810184136120a657600080fd5b80516120b4611e9382611df8565b8181528560208385010111156120c957600080fd5b6120da826020830160208601611bf0565b95945050505050565b60008261210057634e487b7160e01b600052601260045260246000fd5b500690565b6000821982111561211857612118611fea565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008282101561218157612181611fea565b500390565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121b990830184611c1c565b9695505050505050565b6000602082840312156121d557600080fd5b815161128d81611b9956fea26469706673582212200d973f3b56faeec4ee1701bc5d18948ab58caedb0a08677ee74f666143d2ec2a64736f6c634300080d0033

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

00000000000000000000000097f997dfceb2451744a0b9015fb79632528f6344

-----Decoded View---------------
Arg [0] : newDescriptor (address): 0x97F997DFCeB2451744A0b9015Fb79632528f6344

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000097f997dfceb2451744a0b9015fb79632528f6344


Deployed Bytecode Sourcemap

36598:4066:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38652:114;;;;;;;;;;-1:-1:-1;38652:114:0;;;;;:::i;:::-;;:::i;:::-;;32265:224;;;;;;;;;;-1:-1:-1;32265:224:0;;;;;:::i;:::-;;:::i;:::-;;;999:14:1;;992:22;974:41;;962:2;947:18;32265:224:0;;;;;;;;38297:101;;;;;;;;;;-1:-1:-1;38297:101:0;;;;;:::i;:::-;;:::i;25622:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26261:201::-;;;;;;;;;;-1:-1:-1;26261:201:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2403:32:1;;;2385:51;;2373:2;2358:18;26261:201:0;2239:203:1;25842:411:0;;;;;;;;;;-1:-1:-1;25842:411:0;;;;;:::i;:::-;;:::i;36889:33::-;;;;;;;;;;;;;;;;;;;2926:25:1;;;2914:2;2899:18;36889:33:0;2780:177:1;38937:208:0;;;;;;;;;;-1:-1:-1;38937:208:0;;;;;:::i;:::-;;:::i;32497:388::-;;;;;;;;;;;;;:::i;26943:246::-;;;;;;;;;;-1:-1:-1;26943:246:0;;;;;:::i;:::-;;:::i;33114:659::-;;;;;;;;;;-1:-1:-1;33114:659:0;;;;;:::i;:::-;;:::i;36763:29::-;;;;;;;;;;-1:-1:-1;36763:29:0;;;;-1:-1:-1;;;;;36763:29:0;;;36963:32;;;;;;;;;;-1:-1:-1;36963:32:0;;;;;;;;;;;39153:88;;;;;;;;;;;;;:::i;38774:155::-;;;:::i;27197:151::-;;;;;;;;;;-1:-1:-1;27197:151:0;;;;;:::i;:::-;;:::i;39249:189::-;;;;;;;;;;-1:-1:-1;39249:189:0;;;;;:::i;:::-;;:::i;38406:145::-;;;;;;;;;;-1:-1:-1;38406:145:0;;;;;:::i;:::-;;:::i;32893:213::-;;;;;;;;;;-1:-1:-1;32893:213:0;;;;;:::i;:::-;;:::i;25392:222::-;;;;;;;;;;-1:-1:-1;25392:222:0;;;;;:::i;:::-;;:::i;24908:476::-;;;;;;;;;;-1:-1:-1;24908:476:0;;;;;:::i;:::-;;:::i;35604:103::-;;;;;;;;;;;;;:::i;36929:27::-;;;;;;;;;;-1:-1:-1;36929:27:0;;;;;;;;34956:87;;;;;;;;;;-1:-1:-1;35029:6:0;;-1:-1:-1;;;;;35029:6:0;34956:87;;25730:104;;;;;;;;;;;;;:::i;26470:293::-;;;;;;;;;;-1:-1:-1;26470:293:0;;;;;:::i;:::-;;:::i;37184:1105::-;;;;;;:::i;:::-;;:::i;38559:85::-;;;;;;;;;;-1:-1:-1;38559:85:0;;;;;:::i;:::-;;:::i;27356:279::-;;;;;;;;;;-1:-1:-1;27356:279:0;;;;;:::i;:::-;;:::i;39618:231::-;;;;;;;;;;-1:-1:-1;39618:231:0;;;;;:::i;:::-;;:::i;36799:32::-;;;;;;;;;;;;;;;;39446:164;;;;;;;;;;-1:-1:-1;39446:164:0;;;;;:::i;:::-;;:::i;37004:54::-;;;;;;;;;;-1:-1:-1;37004:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7257:10:1;7245:23;;;7227:42;;7215:2;7200:18;37004:54:0;7083:192:1;26771:164:0;;;;;;;;;;-1:-1:-1;26771:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26892:25:0;;;26868:4;26892:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26771:164;35862:201;;;;;;;;;;-1:-1:-1;35862:201:0;;;;;:::i;:::-;;:::i;36838:44::-;;;;;;;;;;-1:-1:-1;36838:44:0;;;;;;;;38652:114;34842:13;:11;:13::i;:::-;38732:10:::1;:26:::0;;-1:-1:-1;;;;;;38732:26:0::1;-1:-1:-1::0;;;;;38732:26:0;;;::::1;::::0;;;::::1;::::0;;38652:114::o;32265:224::-;32367:4;-1:-1:-1;;;;;;32391:50:0;;-1:-1:-1;;;32391:50:0;;:90;;;32445:36;32469:11;32445:23;:36::i;:::-;32384:97;32265:224;-1:-1:-1;;32265:224:0:o;38297:101::-;34842:13;:11;:13::i;:::-;38368:22:::1;;:9;:22:::0;38297:101::o;25622:100::-;25676:13;25709:5;25702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25622:100;:::o;26261:201::-;26337:7;26365:16;26373:7;26365;:16::i;:::-;26357:53;;;;-1:-1:-1;;;26357:53:0;;8286:2:1;26357:53:0;;;8268:21:1;8325:2;8305:18;;;8298:30;-1:-1:-1;;;8344:18:1;;;8337:54;8408:18;;26357:53:0;;;;;;;;;-1:-1:-1;26430:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26430:24:0;;26261:201::o;25842:411::-;25923:13;25939:23;25954:7;25939:14;:23::i;:::-;25923:39;;25987:5;-1:-1:-1;;;;;25981:11:0;:2;-1:-1:-1;;;;;25981:11:0;;25973:57;;;;-1:-1:-1;;;25973:57:0;;8639:2:1;25973:57:0;;;8621:21:1;8678:2;8658:18;;;8651:30;8717:34;8697:18;;;8690:62;-1:-1:-1;;;8768:18:1;;;8761:31;8809:19;;25973:57:0;8437:397:1;25973:57:0;23954:10;-1:-1:-1;;;;;26065:21:0;;;;:62;;-1:-1:-1;26090:37:0;26107:5;23954:10;26771:164;:::i;26090:37::-;26043:168;;;;-1:-1:-1;;;26043:168:0;;9041:2:1;26043:168:0;;;9023:21:1;9080:2;9060:18;;;9053:30;9119:34;9099:18;;;9092:62;9190:26;9170:18;;;9163:54;9234:19;;26043:168:0;8839:420:1;26043:168:0;26224:21;26233:2;26237:7;26224:8;:21::i;:::-;25912:341;25842:411;;:::o;38937:208::-;34842:13;:11;:13::i;:::-;39026::::1;::::0;::::1;::::0;::::1;;;39018:45;;;::::0;-1:-1:-1;;;39018:45:0;;9466:2:1;39018:45:0::1;::::0;::::1;9448:21:1::0;9505:2;9485:18;;;9478:30;-1:-1:-1;;;9524:18:1;;;9517:49;9583:18;;39018:45:0::1;9264:343:1::0;39018:45:0::1;39074:14;::::0;;;:5:::1;:14;::::0;;;;;;:21;;;39111:26;39080:7;;39111:26:::1;::::0;::::1;::::0;39091:4;2926:25:1;;2914:2;2899:18;;2780:177;39111:26:0::1;;;;;;;;38937:208:::0;;:::o;32497:388::-;32558:7;32578:13;32607:9;32602:251;32622:7;:14;32618:18;;32602:251;;;32680:1;-1:-1:-1;;;;;32658:24:0;:7;32666:1;32658:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;32658:10:0;:24;32654:124;;32736:7;;;;;32654:124;32823:3;;32602:251;;;-1:-1:-1;32872:5:0;32497:388;-1:-1:-1;32497:388:0:o;26943:246::-;27051:41;23954:10;27070:12;27084:7;27051:18;:41::i;:::-;27043:99;;;;-1:-1:-1;;;27043:99:0;;;;;;;:::i;:::-;27153:28;27163:4;27169:2;27173:7;27153:9;:28::i;33114:659::-;33211:15;33255:16;33265:5;33255:9;:16::i;:::-;33247:5;:24;33239:80;;;;-1:-1:-1;;;33239:80:0;;;;;;;:::i;:::-;33332:13;33360:9;33356:344;33375:7;:14;33371:18;;33356:344;;;33418:7;33426:1;33418:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;33418:10:0;;;33409:19;;;;33406:219;;33461:5;33452;:14;33449:161;;33475:1;-1:-1:-1;33468:8:0;;-1:-1:-1;33468:8:0;33449:161;33560:7;;;;;33449:161;33670:3;;33356:344;;;;33712:53;;-1:-1:-1;;;33712:53:0;;;;;;;:::i;39153:88::-;34842:13;:11;:13::i;:::-;39212::::1;:21:::0;;-1:-1:-1;;39212:21:0::1;::::0;;39153:88::o;38774:155::-;34842:13;:11;:13::i;:::-;38833:7:::1;38852;35029:6:::0;;-1:-1:-1;;;;;35029:6:0;;34956:87;38852:7:::1;-1:-1:-1::0;;;;;38844:21:0::1;38873;38844:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38832:67;;;38918:2;38910:11;;;::::0;::::1;;38821:108;38774:155::o:0;27197:151::-;27301:39;27318:4;27324:2;27328:7;27301:39;;;;;;;;;;;;:16;:39::i;39249:189::-;39306:41;23954:10;39325:12;23874:98;39306:41;39298:75;;;;-1:-1:-1;;;39298:75:0;;10982:2:1;39298:75:0;;;10964:21:1;11021:2;11001:18;;;10994:30;-1:-1:-1;;;11040:18:1;;;11033:51;11101:18;;39298:75:0;10780:345:1;39298:75:0;39391:14;;;;:5;:14;;;;;39384:21;39416:14;39397:7;39416:5;:14::i;38406:145::-;34842:13;:11;:13::i;:::-;38484:26:::1;:35:::0;;-1:-1:-1;;38484:35:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;38406:145::o;32893:213::-;33012:7;:14;32968:15;;33004:22;;32996:79;;;;-1:-1:-1;;;32996:79:0;;11332:2:1;32996:79:0;;;11314:21:1;11371:2;11351:18;;;11344:30;11410:34;11390:18;;;11383:62;-1:-1:-1;;;11461:18:1;;;11454:42;11513:19;;32996:79:0;11130:408:1;32996:79:0;-1:-1:-1;33093:5:0;32893:213::o;25392:222::-;25464:7;25484:13;25500:7;25508;25500:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25500:16:0;;-1:-1:-1;25500:16:0;25527:56;;;;-1:-1:-1;;;25527:56:0;;8286:2:1;25527:56:0;;;8268:21:1;8325:2;8305:18;;;8298:30;-1:-1:-1;;;8344:18:1;;;8337:54;8408:18;;25527:56:0;8084:348:1;24908:476:0;24980:7;-1:-1:-1;;;;;25008:19:0;;25000:73;;;;-1:-1:-1;;;25000:73:0;;11745:2:1;25000:73:0;;;11727:21:1;11784:2;11764:18;;;11757:30;11823:34;11803:18;;;11796:62;-1:-1:-1;;;11874:18:1;;;11867:39;11923:19;;25000:73:0;11543:405:1;25000:73:0;25086:13;25115:9;25110:244;25130:7;:14;25126:18;;25110:244;;;25175:7;25183:1;25175:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25175:10:0;;;25166:19;;;;25162:119;;25239:7;;;;;25162:119;25324:3;;25110:244;;;-1:-1:-1;25371:5:0;24908:476;-1:-1:-1;;24908:476:0:o;35604:103::-;34842:13;:11;:13::i;:::-;35669:30:::1;35696:1;35669:18;:30::i;:::-;35604:103::o:0;25730:104::-;25786:13;25819:7;25812:14;;;;;:::i;26470:293::-;-1:-1:-1;;;;;26573:24:0;;23954:10;26573:24;26565:62;;;;-1:-1:-1;;;26565:62:0;;12155:2:1;26565:62:0;;;12137:21:1;12194:2;12174:18;;;12167:30;12233:27;12213:18;;;12206:55;12278:18;;26565:62:0;11953:349:1;26565:62:0;23954:10;26638:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26638:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26638:53:0;;;;;;;;;;26707:48;;974:41:1;;;26638:42:0;;23954:10;26707:48;;947:18:1;26707:48:0;;;;;;;26470:293;;:::o;37184:1105::-;37273:10;37240;37253:31;;;:19;:31;;;;;;37303:7;;37253:31;;;;;37303:7;;37295:64;;;;-1:-1:-1;;;37295:64:0;;12509:2:1;37295:64:0;;;12491:21:1;12548:2;12528:18;;;12521:30;12587:34;12567:18;;;12560:62;-1:-1:-1;;;12638:18:1;;;12631:42;12690:19;;37295:64:0;12307:408:1;37295:64:0;37386:3;37378:5;:11;;;37370:52;;;;-1:-1:-1;;;37370:52:0;;12922:2:1;37370:52:0;;;12904:21:1;12961:2;12941:18;;;12934:30;13000;12980:18;;;12973:58;13048:18;;37370:52:0;12720:352:1;37370:52:0;37455:7;:14;37535:9;;37513:19;;;;;:31;37505:63;;;;-1:-1:-1;;;37505:63:0;;13279:2:1;37505:63:0;;;13261:21:1;13318:2;13298:18;;;13291:30;-1:-1:-1;;;13337:18:1;;;13330:49;13396:18;;37505:63:0;13077:343:1;37505:63:0;37603:26;;;;;;37596:33;;;;37593:427;;37683:5;37676:12;;:4;;:12;;;;:::i;:::-;37663:9;:25;;37655:57;;;;-1:-1:-1;;;37655:57:0;;13932:2:1;37655:57:0;;;13914:21:1;13971:2;13951:18;;;13944:30;-1:-1:-1;;;13990:18:1;;;13983:49;14049:18;;37655:57:0;13730:343:1;37655:57:0;37593:427;;;37754:17;37774:11;37782:3;37774:5;:11;:::i;:::-;37816:26;;37754:31;;-1:-1:-1;37816:26:0;;;;37803:39;;;;37800:209;;;37894:26;;37881:39;;37894:26;;37881:10;:39;:::i;:::-;37868:52;;37963:10;37956:17;;:4;;:17;;;;:::i;:::-;37943:9;:30;;37935:62;;;;-1:-1:-1;;;37935:62:0;;13932:2:1;37935:62:0;;;13914:21:1;13971:2;13951:18;;;13944:30;-1:-1:-1;;;13990:18:1;;;13983:49;14049:18;;37935:62:0;13730:343:1;37935:62:0;37739:281;37593:427;38064:11;38072:3;38064:5;:11;:::i;:::-;38050:10;38030:31;;;;:19;:31;;;;;:45;;-1:-1:-1;;38030:45:0;;;;;;;;;;;;;38088:194;38107:5;38103:9;;:1;:9;;;38088:194;;;38151:25;38164:11;38151:12;:25::i;:::-;38130:18;;;;:5;:18;;;;;:46;38191:32;23954:10;38211:11;38191:5;:32::i;:::-;38250:13;;;;;38265:3;38088:194;;;;37229:1060;;37184:1105;:::o;38559:85::-;34842:13;:11;:13::i;:::-;38621:7:::1;:15:::0;;-1:-1:-1;;38621:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38559:85::o;27356:279::-;27487:41;23954:10;27520:7;27487:18;:41::i;:::-;27479:99;;;;-1:-1:-1;;;27479:99:0;;;;;;;:::i;:::-;27589:38;27603:4;27609:2;27613:7;27622:4;27589:13;:38::i;39618:231::-;39674:13;39708:16;39716:7;39708;:16::i;:::-;39700:49;;;;-1:-1:-1;;;39700:49:0;;14739:2:1;39700:49:0;;;14721:21:1;14778:2;14758:18;;;14751:30;-1:-1:-1;;;14797:18:1;;;14790:50;14857:18;;39700:49:0;14537:344:1;39700:49:0;39760:12;39775:14;;;:5;:14;;;;;;;;39807:10;;:34;;-1:-1:-1;;;39807:34:0;;;;;15060:25:1;;;15101:18;;;15094:34;;;39775:14:0;;-1:-1:-1;;;;;39807:10:0;;:19;;15033:18:1;;39807:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39807:34:0;;;;;;;;;;;;:::i;:::-;39800:41;39618:231;-1:-1:-1;;;39618:231:0:o;39446:164::-;39501:7;39529:16;39537:7;39529;:16::i;:::-;39521:49;;;;-1:-1:-1;;;39521:49:0;;14739:2:1;39521:49:0;;;14721:21:1;14778:2;14758:18;;;14751:30;-1:-1:-1;;;14797:18:1;;;14790:50;14857:18;;39521:49:0;14537:344:1;39521:49:0;-1:-1:-1;39588:14:0;;;;:5;:14;;;;;;;39446:164::o;35862:201::-;34842:13;:11;:13::i;:::-;-1:-1:-1;;;;;35951:22:0;::::1;35943:73;;;::::0;-1:-1:-1;;;35943:73:0;;15981:2:1;35943:73:0::1;::::0;::::1;15963:21:1::0;16020:2;16000:18;;;15993:30;16059:34;16039:18;;;16032:62;-1:-1:-1;;;16110:18:1;;;16103:36;16156:19;;35943:73:0::1;15779:402:1::0;35943:73:0::1;36027:28;36046:8;36027:18;:28::i;35121:132::-:0;35029:6;;-1:-1:-1;;;;;35029:6:0;23954:10;35185:23;35177:68;;;;-1:-1:-1;;;35177:68:0;;16388:2:1;35177:68:0;;;16370:21:1;;;16407:18;;;16400:30;16466:34;16446:18;;;16439:62;16518:18;;35177:68:0;16186:356:1;24616:284:0;24718:4;-1:-1:-1;;;;;;24742:40:0;;-1:-1:-1;;;24742:40:0;;:101;;-1:-1:-1;;;;;;;24795:48:0;;-1:-1:-1;;;24795:48:0;24742:101;:150;;;-1:-1:-1;;;;;;;;;;17183:40:0;;;24856:36;17074:157;27921:155;28020:7;:14;27986:4;;28010:24;;:58;;;;;28066:1;-1:-1:-1;;;;;28038:30:0;:7;28046;28038:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28038:16:0;:30;;28003:65;27921:155;-1:-1:-1;;27921:155:0:o;29265:174::-;29340:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29340:29:0;-1:-1:-1;;;;;29340:29:0;;;;;;;;:24;;29394:23;29340:24;29394:14;:23::i;:::-;-1:-1:-1;;;;;29385:46:0;;;;;;;;;;;29265:174;;:::o;28084:264::-;28177:4;28194:13;28210:23;28225:7;28210:14;:23::i;:::-;28194:39;;28263:5;-1:-1:-1;;;;;28252:16:0;:7;-1:-1:-1;;;;;28252:16:0;;:52;;;-1:-1:-1;;;;;;26892:25:0;;;26868:4;26892:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28272:32;28252:87;;;;28332:7;-1:-1:-1;;;;;28308:31:0;:20;28320:7;28308:11;:20::i;:::-;-1:-1:-1;;;;;28308:31:0;;28252:87;28244:96;28084:264;-1:-1:-1;;;;28084:264:0:o;28829:428::-;28954:4;-1:-1:-1;;;;;28927:31:0;:23;28942:7;28927:14;:23::i;:::-;-1:-1:-1;;;;;28927:31:0;;28919:81;;;;-1:-1:-1;;;28919:81:0;;16749:2:1;28919:81:0;;;16731:21:1;16788:2;16768:18;;;16761:30;16827:34;16807:18;;;16800:62;-1:-1:-1;;;16878:18:1;;;16871:35;16923:19;;28919:81:0;16547:401:1;28919:81:0;-1:-1:-1;;;;;29019:16:0;;29011:65;;;;-1:-1:-1;;;29011:65:0;;17155:2:1;29011:65:0;;;17137:21:1;17194:2;17174:18;;;17167:30;17233:34;17213:18;;;17206:62;-1:-1:-1;;;17284:18:1;;;17277:34;17328:19;;29011:65:0;16953:400:1;29011:65:0;29148:24;;;;:15;:24;;;;;29141:31;;-1:-1:-1;;;;;;29141:31:0;;;29183:7;:16;;29202:2;;29183:7;29164;;29183:16;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;29183:21:0;-1:-1:-1;;;;;29183:21:0;;;;;;29222:27;;29241:7;;29222:27;;;;;;;;;;29183:16;29222:27;28829:428;;;:::o;28582:239::-;28642:13;28658:23;28673:7;28658:14;:23::i;:::-;28701:24;;;;:15;:24;;;;;28694:31;;-1:-1:-1;;;;;;28694:31:0;;;28743:7;:16;;28642:39;;-1:-1:-1;28743:7:0;28717;;28743:16;;;;;;:::i;:::-;;;;;;;;;28736:23;;-1:-1:-1;;;;;;28736:23:0;;;28777:36;;28805:7;;28743:16;-1:-1:-1;;;;;28777:36:0;;;;;28743:16;;28777:36;28631:190;28582:239;:::o;36223:191::-;36316:6;;;-1:-1:-1;;;;;36333:17:0;;;-1:-1:-1;;;;;;36333:17:0;;;;;;;36366:40;;36316:6;;;36333:17;36316:6;;36366:40;;36297:16;;36366:40;36286:128;36223:191;:::o;39857:543::-;39918:7;39938:9;39950:15;39957:7;39950:6;:15::i;:::-;39938:27;-1:-1:-1;39976:16:0;40017:14;40029:2;40023;40018:7;;;40017:14;:::i;:::-;:19;;40034:2;40017:19;:::i;:::-;40002:5;40006:1;40002;:5;:::i;:::-;:10;;40010:2;40002:10;:::i;:::-;39995:18;;:3;:18;:::i;:::-;:42;;;;:::i;:::-;39976:61;-1:-1:-1;40048:20:0;40101:14;40113:2;40107;40102:7;;;40101:14;:::i;:::-;:19;;40118:2;40101:19;:::i;:::-;40078:13;40090:1;40084:2;40079:7;;;40078:13;:::i;:::-;:18;;40094:2;40078:18;:::i;:::-;40071:26;;:3;:26;:::i;:::-;:50;;;;:::i;:::-;40048:73;-1:-1:-1;40132:23:0;40189:15;40202:2;40195:3;40190:8;;;40189:15;:::i;:::-;:20;;40207:2;40189:20;:::i;:::-;40165:14;40178:1;40171:3;40166:8;;;40165:14;:::i;:::-;:19;;40182:2;40165:19;:::i;:::-;40158:27;;:3;:27;:::i;:::-;:52;;;;:::i;:::-;40132:78;-1:-1:-1;40221:17:0;40272:15;40285:2;40278:3;40273:8;;;40272:15;:::i;:::-;:20;;40290:2;40272:20;:::i;:::-;40248:14;40261:1;40254:3;40249:8;;;40248:14;:::i;:::-;:19;;40265:2;40248:19;:::i;:::-;40241:27;;:3;:27;:::i;:::-;:52;;;;:::i;:::-;40221:72;-1:-1:-1;40377:15:0;40221:72;40348:12;40329:16;40337:8;40329:5;:16;:::i;:::-;:31;;;;:::i;:::-;40320:41;;:5;:41;:::i;:::-;:53;;;;:::i;:::-;40311:63;;:5;:63;:::i;:::-;:81;;;;:::i;:::-;40304:88;39857:543;-1:-1:-1;;;;;;;39857:543:0:o;28356:218::-;28437:16;28445:7;28437;:16::i;:::-;28436:17;28428:58;;;;-1:-1:-1;;;28428:58:0;;17907:2:1;28428:58:0;;;17889:21:1;17946:2;17926:18;;;17919:30;17985;17965:18;;;17958:58;18033:18;;28428:58:0;17705:352:1;28428:58:0;28499:7;:16;;;;;;;-1:-1:-1;28499:16:0;;;;;;;-1:-1:-1;;;;;;28499:16:0;-1:-1:-1;;;;;28499:16:0;;;;;;;;28533:33;;28558:7;;-1:-1:-1;28533:33:0;;-1:-1:-1;;28533:33:0;28356:218;;:::o;27643:270::-;27756:28;27766:4;27772:2;27776:7;27756:9;:28::i;:::-;27803:47;27826:4;27832:2;27836:7;27845:4;27803:22;:47::i;:::-;27795:110;;;;-1:-1:-1;;;27795:110:0;;;;;;;:::i;40408:253::-;40463:24;40578:16;40593:1;40578:12;:16;:::i;:::-;40551:54;;;40568:27;;40551:54;;;18768:19:1;18803:12;;18796:28;;;18840:12;;40551:54:0;;;-1:-1:-1;;40551:54:0;;;;;;;;;40541:65;;40551:54;40541:65;;;;;40408:253;-1:-1:-1;;40408:253:0:o;29447:734::-;29558:4;-1:-1:-1;;;;;29579:13:0;;17416:20;17464:8;29575:575;;29615:71;;-1:-1:-1;;;29615:71:0;;-1:-1:-1;;;;;29615:36:0;;;;;:71;;23954:10;;29666:4;;29672:7;;29681:4;;29615:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29615:71:0;;;;;;;;-1:-1:-1;;29615:71:0;;;;;;;;;;;;:::i;:::-;;;29611:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29856:6;:13;29873:1;29856:18;29852:272;;29899:60;;-1:-1:-1;;;29899:60:0;;;;;;;:::i;29852:272::-;30074:6;30068:13;30059:6;30055:2;30051:15;30044:38;29611:528;-1:-1:-1;;;;;;29737:51:0;-1:-1:-1;;;29737:51:0;;-1:-1:-1;29730:58:0;;29611:528;-1:-1:-1;30169:4:0;29447:734;;;;;;:::o;14:144:1:-;-1:-1:-1;;;;;102:31:1;;92:42;;82:70;;148:1;145;138:12;163:280;242:6;295:2;283:9;274:7;270:23;266:32;263:52;;;311:1;308;301:12;263:52;350:9;337:23;369:44;407:5;369:44;:::i;448:131::-;-1:-1:-1;;;;;;522:32:1;;512:43;;502:71;;569:1;566;559:12;584:245;642:6;695:2;683:9;674:7;670:23;666:32;663:52;;;711:1;708;701:12;663:52;750:9;737:23;769:30;793:5;769:30;:::i;1026:272::-;1084:6;1137:2;1125:9;1116:7;1112:23;1108:32;1105:52;;;1153:1;1150;1143:12;1105:52;1192:9;1179:23;1242:6;1235:5;1231:18;1224:5;1221:29;1211:57;;1264:1;1261;1254:12;1303:258;1375:1;1385:113;1399:6;1396:1;1393:13;1385:113;;;1475:11;;;1469:18;1456:11;;;1449:39;1421:2;1414:10;1385:113;;;1516:6;1513:1;1510:13;1507:48;;;-1:-1:-1;;1551:1:1;1533:16;;1526:27;1303:258::o;1566:::-;1608:3;1646:5;1640:12;1673:6;1668:3;1661:19;1689:63;1745:6;1738:4;1733:3;1729:14;1722:4;1715:5;1711:16;1689:63;:::i;:::-;1806:2;1785:15;-1:-1:-1;;1781:29:1;1772:39;;;;1813:4;1768:50;;1566:258;-1:-1:-1;;1566:258:1:o;1829:220::-;1978:2;1967:9;1960:21;1941:4;1998:45;2039:2;2028:9;2024:18;2016:6;1998:45;:::i;2054:180::-;2113:6;2166:2;2154:9;2145:7;2141:23;2137:32;2134:52;;;2182:1;2179;2172:12;2134:52;-1:-1:-1;2205:23:1;;2054:180;-1:-1:-1;2054:180:1:o;2447:328::-;2515:6;2523;2576:2;2564:9;2555:7;2551:23;2547:32;2544:52;;;2592:1;2589;2582:12;2544:52;2631:9;2618:23;2650:44;2688:5;2650:44;:::i;:::-;2713:5;2765:2;2750:18;;;;2737:32;;-1:-1:-1;;;2447:328:1:o;2962:248::-;3030:6;3038;3091:2;3079:9;3070:7;3066:23;3062:32;3059:52;;;3107:1;3104;3097:12;3059:52;-1:-1:-1;;3130:23:1;;;3200:2;3185:18;;;3172:32;;-1:-1:-1;2962:248:1:o;3215:482::-;3292:6;3300;3308;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;3416:9;3403:23;3435:44;3473:5;3435:44;:::i;:::-;3498:5;-1:-1:-1;3555:2:1;3540:18;;3527:32;3568:46;3527:32;3568:46;:::i;:::-;3215:482;;3633:7;;-1:-1:-1;;;3687:2:1;3672:18;;;;3659:32;;3215:482::o;3930:269::-;3987:6;4040:2;4028:9;4019:7;4015:23;4011:32;4008:52;;;4056:1;4053;4046:12;4008:52;4095:9;4082:23;4145:4;4138:5;4134:16;4127:5;4124:27;4114:55;;4165:1;4162;4155:12;4469:160;4534:20;;4590:13;;4583:21;4573:32;;4563:60;;4619:1;4616;4609:12;4563:60;4469:160;;;:::o;4634:328::-;4699:6;4707;4760:2;4748:9;4739:7;4735:23;4731:32;4728:52;;;4776:1;4773;4766:12;4728:52;4815:9;4802:23;4834:44;4872:5;4834:44;:::i;:::-;4897:5;-1:-1:-1;4921:35:1;4952:2;4937:18;;4921:35;:::i;:::-;4911:45;;4634:328;;;;;:::o;4967:276::-;5025:6;5078:2;5066:9;5057:7;5053:23;5049:32;5046:52;;;5094:1;5091;5084:12;5046:52;5133:9;5120:23;5183:10;5176:5;5172:22;5165:5;5162:33;5152:61;;5209:1;5206;5199:12;5248:180;5304:6;5357:2;5345:9;5336:7;5332:23;5328:32;5325:52;;;5373:1;5370;5363:12;5325:52;5396:26;5412:9;5396:26;:::i;5433:127::-;5494:10;5489:3;5485:20;5482:1;5475:31;5525:4;5522:1;5515:15;5549:4;5546:1;5539:15;5565:275;5636:2;5630:9;5701:2;5682:13;;-1:-1:-1;;5678:27:1;5666:40;;5736:18;5721:34;;5757:22;;;5718:62;5715:88;;;5783:18;;:::i;:::-;5819:2;5812:22;5565:275;;-1:-1:-1;5565:275:1:o;5845:186::-;5893:4;5926:18;5918:6;5915:30;5912:56;;;5948:18;;:::i;:::-;-1:-1:-1;6014:2:1;5993:15;-1:-1:-1;;5989:29:1;6020:4;5985:40;;5845:186::o;6036:1042::-;6131:6;6139;6147;6155;6208:3;6196:9;6187:7;6183:23;6179:33;6176:53;;;6225:1;6222;6215:12;6176:53;6264:9;6251:23;6283:44;6321:5;6283:44;:::i;:::-;6346:5;-1:-1:-1;6403:2:1;6388:18;;6375:32;6416:46;6375:32;6416:46;:::i;:::-;6481:7;-1:-1:-1;6535:2:1;6520:18;;6507:32;;-1:-1:-1;6590:2:1;6575:18;;6562:32;6617:18;6606:30;;6603:50;;;6649:1;6646;6639:12;6603:50;6672:22;;6725:4;6717:13;;6713:27;-1:-1:-1;6703:55:1;;6754:1;6751;6744:12;6703:55;6790:2;6777:16;6815:48;6831:31;6859:2;6831:31;:::i;:::-;6815:48;:::i;:::-;6886:2;6879:5;6872:17;6926:7;6921:2;6916;6912;6908:11;6904:20;6901:33;6898:53;;;6947:1;6944;6937:12;6898:53;7002:2;6997;6993;6989:11;6984:2;6977:5;6973:14;6960:45;7046:1;7041:2;7036;7029:5;7025:14;7021:23;7014:34;7067:5;7057:15;;;;;6036:1042;;;;;;;:::o;7280:414::-;7348:6;7356;7409:2;7397:9;7388:7;7384:23;7380:32;7377:52;;;7425:1;7422;7415:12;7377:52;7464:9;7451:23;7483:44;7521:5;7483:44;:::i;:::-;7546:5;-1:-1:-1;7603:2:1;7588:18;;7575:32;7616:46;7575:32;7616:46;:::i;:::-;7681:7;7671:17;;;7280:414;;;;;:::o;7699:380::-;7778:1;7774:12;;;;7821;;;7842:61;;7896:4;7888:6;7884:17;7874:27;;7842:61;7949:2;7941:6;7938:14;7918:18;7915:38;7912:161;;7995:10;7990:3;7986:20;7983:1;7976:31;8030:4;8027:1;8020:15;8058:4;8055:1;8048:15;9612:127;9673:10;9668:3;9664:20;9661:1;9654:31;9704:4;9701:1;9694:15;9728:4;9725:1;9718:15;9744:409;9946:2;9928:21;;;9985:2;9965:18;;;9958:30;10024:34;10019:2;10004:18;;9997:62;-1:-1:-1;;;10090:2:1;10075:18;;10068:43;10143:3;10128:19;;9744:409::o;10158:407::-;10360:2;10342:21;;;10399:2;10379:18;;;10372:30;10438:34;10433:2;10418:18;;10411:62;-1:-1:-1;;;10504:2:1;10489:18;;10482:41;10555:3;10540:19;;10158:407::o;13425:127::-;13486:10;13481:3;13477:20;13474:1;13467:31;13517:4;13514:1;13507:15;13541:4;13538:1;13531:15;13557:168;13597:7;13663:1;13659;13655:6;13651:14;13648:1;13645:21;13640:1;13633:9;13626:17;13622:45;13619:71;;;13670:18;;:::i;:::-;-1:-1:-1;13710:9:1;;13557:168::o;14078:228::-;14117:3;14145:10;14182:2;14179:1;14175:10;14212:2;14209:1;14205:10;14243:3;14239:2;14235:12;14230:3;14227:21;14224:47;;;14251:18;;:::i;:::-;14287:13;;14078:228;-1:-1:-1;;;;14078:228:1:o;14311:221::-;14350:4;14379:10;14439;;;;14409;;14461:12;;;14458:38;;;14476:18;;:::i;:::-;14513:13;;14311:221;-1:-1:-1;;;14311:221:1:o;15139:635::-;15219:6;15272:2;15260:9;15251:7;15247:23;15243:32;15240:52;;;15288:1;15285;15278:12;15240:52;15321:9;15315:16;15354:18;15346:6;15343:30;15340:50;;;15386:1;15383;15376:12;15340:50;15409:22;;15462:4;15454:13;;15450:27;-1:-1:-1;15440:55:1;;15491:1;15488;15481:12;15440:55;15520:2;15514:9;15545:48;15561:31;15589:2;15561:31;:::i;15545:48::-;15616:2;15609:5;15602:17;15656:7;15651:2;15646;15642;15638:11;15634:20;15631:33;15628:53;;;15677:1;15674;15667:12;15628:53;15690:54;15741:2;15736;15729:5;15725:14;15720:2;15716;15712:11;15690:54;:::i;:::-;15763:5;15139:635;-1:-1:-1;;;;;15139:635:1:o;17358:209::-;17390:1;17416;17406:132;;17460:10;17455:3;17451:20;17448:1;17441:31;17495:4;17492:1;17485:15;17523:4;17520:1;17513:15;17406:132;-1:-1:-1;17552:9:1;;17358:209::o;17572:128::-;17612:3;17643:1;17639:6;17636:1;17633:13;17630:39;;;17649:18;;:::i;:::-;-1:-1:-1;17685:9:1;;17572:128::o;18062:414::-;18264:2;18246:21;;;18303:2;18283:18;;;18276:30;18342:34;18337:2;18322:18;;18315:62;-1:-1:-1;;;18408:2:1;18393:18;;18386:48;18466:3;18451:19;;18062:414::o;18481:125::-;18521:4;18549:1;18546;18543:8;18540:34;;;18554:18;;:::i;:::-;-1:-1:-1;18591:9:1;;18481:125::o;18863:489::-;-1:-1:-1;;;;;19132:15:1;;;19114:34;;19184:15;;19179:2;19164:18;;19157:43;19231:2;19216:18;;19209:34;;;19279:3;19274:2;19259:18;;19252:31;;;19057:4;;19300:46;;19326:19;;19318:6;19300:46;:::i;:::-;19292:54;18863:489;-1:-1:-1;;;;;;18863:489:1:o;19357:249::-;19426:6;19479:2;19467:9;19458:7;19454:23;19450:32;19447:52;;;19495:1;19492;19485:12;19447:52;19527:9;19521:16;19546:30;19570:5;19546:30;:::i

Swarm Source

ipfs://0d973f3b56faeec4ee1701bc5d18948ab58caedb0a08677ee74f666143d2ec2a
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.