ETH Price: $3,244.16 (-1.15%)

Token

Cats(E) (CATSE)
 

Overview

Max Total Supply

108 CATSE

Holders

26

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 CATSE
0x25b4b8A471B863cB0718682964bC987cB5B42183
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:
CatsEthereum

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-09
*/

// SPDX-License-Identifier: MIT
// File: contracts/ICatsDescriptor1.sol





pragma solidity ^0.8.13;

interface ICatsDescriptor1 {
    function tokenURI(uint256 tokenId, uint256 seed) external view returns (string memory);
}
// File: contracts/lib/Address.sol



pragma solidity ^0.8.13;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// File: @openzeppelin/contracts/utils/math/Math.sol


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

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


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

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


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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

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


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

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


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

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


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

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


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

// File: contracts/lib/ERC721.sol



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;
    }
}
// File: contracts/lib/ERC721Enumerable.sol



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");
    }
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

// File: contracts/CatsEthereum.sol





pragma solidity ^0.8.13;




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

    mapping(uint256 => uint256) internal seeds;
    ICatsDescriptor1 public descriptor;
    uint256 public maxSupply = 6000;
    bool public minting = false;
    bool public canUpdateSeed = true;

    constructor(ICatsDescriptor1 newDescriptor) ERC721("Cats(E)", "CATSE") {
        descriptor = newDescriptor;
    }

    function mintByOwner(uint32 count) external onlyOwner {
        require(minting, "Minting needs to be enabled to start minting");
        uint256 nextTokenId = _owners.length;
        unchecked {
            require(nextTokenId + count < maxSupply, "Exceeds max supply.");
        }

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

    function mint(uint32 count) external payable {
        require(minting, "Minting needs to be enabled to start minting");
        require(count < 2, "Exceeds max per transaction.");
        uint256 nextTokenId = _owners.length;
        unchecked {
            require(nextTokenId + count < maxSupply, "Exceeds max supply.");
        }

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

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

    function setDescriptor(ICatsDescriptor1 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), "TEST does not exist.");
        return seeds[tokenId];
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "TEST 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 faceSeed = 100 * ((r >> 96) % 6 + 10) + ((r >> 96) % 20 + 10);
        uint256 bodySeed = 100 * ((r >> 144) % 7 + 10) + ((r >> 144) % 20 + 10);
        uint256 legsSeed = 100 * ((r >> 192) % 2 + 10) + ((r >> 192) % 20 + 10);
        return 10000 * (10000 * (10000 * headSeed + faceSeed) + bodySeed) + legsSeed;
    }

    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 ICatsDescriptor1","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":"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":"descriptor","outputs":[{"internalType":"contract ICatsDescriptor1","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":"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":[{"internalType":"uint32","name":"count","type":"uint32"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","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 ICatsDescriptor1","name":"newDescriptor","type":"address"}],"name":"setDescriptor","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"}]

60806040526117706008556000600960006101000a81548160ff0219169083151502179055506001600960016101000a81548160ff0219169083151502179055503480156200004d57600080fd5b5060405162004163380380620041638339818101604052810190620000739190620002b9565b6040518060400160405280600781526020017f43617473284529000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43415453450000000000000000000000000000000000000000000000000000008152508160009081620000f0919062000565565b50806001908162000102919062000565565b50505062000125620001196200016d60201b60201c565b6200017560201b60201c565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200064c565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200026d8262000240565b9050919050565b6000620002818262000260565b9050919050565b620002938162000274565b81146200029f57600080fd5b50565b600081519050620002b38162000288565b92915050565b600060208284031215620002d257620002d16200023b565b5b6000620002e284828501620002a2565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036d57607f821691505b60208210810362000383576200038262000325565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ae565b620003f98683620003ae565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000446620004406200043a8462000411565b6200041b565b62000411565b9050919050565b6000819050919050565b620004628362000425565b6200047a62000471826200044d565b848454620003bb565b825550505050565b600090565b6200049162000482565b6200049e81848462000457565b505050565b5b81811015620004c657620004ba60008262000487565b600181019050620004a4565b5050565b601f8211156200051557620004df8162000389565b620004ea846200039e565b81016020851015620004fa578190505b6200051262000509856200039e565b830182620004a3565b50505b505050565b600082821c905092915050565b60006200053a600019846008026200051a565b1980831691505092915050565b600062000555838362000527565b9150826002028217905092915050565b6200057082620002eb565b67ffffffffffffffff8111156200058c576200058b620002f6565b5b62000598825462000354565b620005a5828285620004ca565b600060209050601f831160018114620005dd5760008415620005c8578287015190505b620005d4858262000547565b86555062000644565b601f198416620005ed8662000389565b60005b828110156200061757848901518255600182019150602085019450602081019050620005f0565b8683101562000637578489015162000633601f89168262000527565b8355505b6001600288020188555050505b505050505050565b613b07806200065c6000396000f3fe6080604052600436106101e35760003560e01c80634f6ccce711610102578063a71bbebe11610095578063d5abeb0111610064578063d5abeb01146106ae578063e0d4ea37146106d9578063e985e9c514610716578063f2fde38b14610753576101e3565b8063a71bbebe14610603578063b4c7f0661461061f578063b88d4fde14610648578063c87b56dd14610671576101e3565b80637dc2268c116100d15780637dc2268c146105595780638da5cb5b1461058457806395d89b41146105af578063a22cb465146105da576101e3565b80634f6ccce71461048b5780636352211e146104c857806370a0823114610505578063715018a614610542576101e3565b806326f6bb2d1161017a5780633bb2c938116101495780633bb2c938146104185780633ccfd60b1461042f57806342842e0e1461043957806342966c6814610462576101e3565b806326f6bb2d1461035c5780632f745c5914610385578063303e74df146103c257806333101e1f146103ed576101e3565b8063095ea7b3116101b6578063095ea7b3146102b6578063176b72b4146102df57806318160ddd1461030857806323b872dd14610333576101e3565b806301b9a397146101e857806301ffc9a71461021157806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612552565b61077c565b005b34801561021d57600080fd5b50610238600480360381019061023391906125d7565b6107c8565b604051610245919061261f565b60405180910390f35b34801561025a57600080fd5b50610263610842565b60405161027091906126ca565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612722565b6108d4565b6040516102ad919061275e565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906127a5565b610959565b005b3480156102eb57600080fd5b50610306600480360381019061030191906127e5565b610a70565b005b34801561031457600080fd5b5061031d610b1b565b60405161032a9190612834565b60405180910390f35b34801561033f57600080fd5b5061035a6004803603810190610355919061284f565b610bba565b005b34801561036857600080fd5b50610383600480360381019061037e91906128de565b610c1a565b005b34801561039157600080fd5b506103ac60048036038101906103a791906127a5565b610d25565b6040516103b99190612834565b60405180910390f35b3480156103ce57600080fd5b506103d7610e58565b6040516103e4919061296a565b60405180910390f35b3480156103f957600080fd5b50610402610e7e565b60405161040f919061261f565b60405180910390f35b34801561042457600080fd5b5061042d610e91565b005b610437610eb6565b005b34801561044557600080fd5b50610460600480360381019061045b919061284f565b610f3e565b005b34801561046e57600080fd5b5061048960048036038101906104849190612722565b610f5e565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612722565b610fd1565b6040516104bf9190612834565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612722565b611022565b6040516104fc919061275e565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190612985565b6110de565b6040516105399190612834565b60405180910390f35b34801561054e57600080fd5b506105576111ec565b005b34801561056557600080fd5b5061056e611200565b60405161057b919061261f565b60405180910390f35b34801561059057600080fd5b50610599611213565b6040516105a6919061275e565b60405180910390f35b3480156105bb57600080fd5b506105c461123d565b6040516105d191906126ca565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906129de565b6112cf565b005b61061d600480360381019061061891906128de565b61144f565b005b34801561062b57600080fd5b5061064660048036038101906106419190612a1e565b61159b565b005b34801561065457600080fd5b5061066f600480360381019061066a9190612b80565b6115c0565b005b34801561067d57600080fd5b5061069860048036038101906106939190612722565b611622565b6040516106a591906126ca565b60405180910390f35b3480156106ba57600080fd5b506106c361172f565b6040516106d09190612834565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612722565b611735565b60405161070d9190612834565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612c03565b61179a565b60405161074a919061261f565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190612985565b61182e565b005b6107846118b1565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083b575061083a8261192f565b5b9050919050565b60606000805461085190612c72565b80601f016020809104026020016040519081016040528092919081815260200182805461087d90612c72565b80156108ca5780601f1061089f576101008083540402835291602001916108ca565b820191906000526020600020905b8154815290600101906020018083116108ad57829003601f168201915b5050505050905090565b60006108df82611a11565b61091e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091590612cef565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096482611022565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90612d81565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f3611a99565b73ffffffffffffffffffffffffffffffffffffffff161480610a225750610a2181610a1c611a99565b61179a565b5b610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890612e13565b60405180910390fd5b610a6b8383611aa1565b505050565b610a786118b1565b600960019054906101000a900460ff16610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612e7f565b60405180910390fd5b806006600084815260200190815260200160002081905550817faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e082604051610b0f9190612834565b60405180910390a25050565b60008060005b600280549050811015610bb257600073ffffffffffffffffffffffffffffffffffffffff1660028281548110610b5a57610b59612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba7578160010191505b806001019050610b21565b508091505090565b610bcb610bc5611a99565b82611b5a565b610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190612f40565b60405180910390fd5b610c15838383611bef565b505050565b610c226118b1565b600960009054906101000a900460ff16610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890612fd2565b60405180910390fd5b600060028054905090506008548263ffffffff16820110610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe9061303e565b60405180910390fd5b60005b8263ffffffff168163ffffffff161015610d2057610ce782611dc7565b6006600084815260200190815260200160002081905550610d0f610d09611213565b83611f76565b816001019150806001019050610cca565b505050565b6000610d30836110de565b8210610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906130d0565b60405180910390fd5b6000805b600280549050811015610e165760028181548110610d9657610d95612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e0b57838203610e04578092505050610e52565b8160010191505b806001019050610d75565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906130d0565b60405180910390fd5b92915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960019054906101000a900460ff1681565b610e996118b1565b6000600960016101000a81548160ff021916908315150217905550565b610ebe6118b1565b6000610ec8611213565b73ffffffffffffffffffffffffffffffffffffffff1647604051610eeb90613121565b60006040518083038185875af1925050503d8060008114610f28576040519150601f19603f3d011682016040523d82523d6000602084013e610f2d565b606091505b5050905080610f3b57600080fd5b50565b610f59838383604051806020016040528060008152506115c0565b505050565b610f6f610f69611a99565b82611b5a565b610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613182565b60405180910390fd5b6006600082815260200190815260200160002060009055610fce81612082565b50565b6000600280549050821061101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613214565b60405180910390fd5b819050919050565b6000806002838154811061103957611038612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90612cef565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906132a6565b60405180910390fd5b6000805b6002805490508110156111e2576002818154811061117357611172612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111d7578160010191505b806001019050611152565b5080915050919050565b6111f46118b1565b6111fe6000612166565b565b600960009054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124c90612c72565b80601f016020809104026020016040519081016040528092919081815260200182805461127890612c72565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b8173ffffffffffffffffffffffffffffffffffffffff166112ee611a99565b73ffffffffffffffffffffffffffffffffffffffff1603611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90613312565b60405180910390fd5b8060046000611351611a99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113fe611a99565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611443919061261f565b60405180910390a35050565b600960009054906101000a900460ff1661149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590612fd2565b60405180910390fd5b60028163ffffffff16106114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de9061337e565b60405180910390fd5b600060028054905090506008548263ffffffff1682011061153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115349061303e565b60405180910390fd5b60005b8263ffffffff168163ffffffff1610156115965761155d82611dc7565b600660008481526020019081526020016000208190555061158561157f611a99565b83611f76565b816001019150806001019050611540565b505050565b6115a36118b1565b80600960006101000a81548160ff02191690831515021790555050565b6115d16115cb611a99565b83611b5a565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790612f40565b60405180910390fd5b61161c8484848461222c565b50505050565b606061162d82611a11565b61166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906133ea565b60405180910390fd5b600060066000848152602001908152602001600020549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d84836040518363ffffffff1660e01b81526004016116e192919061340a565b600060405180830381865afa1580156116fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061172791906134d4565b915050919050565b60085481565b600061174082611a11565b61177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906133ea565b60405180910390fd5b60066000838152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118366118b1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c9061358f565b60405180910390fd5b6118ae81612166565b50565b6118b9611a99565b73ffffffffffffffffffffffffffffffffffffffff166118d7611213565b73ffffffffffffffffffffffffffffffffffffffff161461192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906135fb565b60405180910390fd5b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a0a5750611a0982612288565b5b9050919050565b600060028054905082108015611a925750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110611a4e57611a4d612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b1483611022565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611b6683611022565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ba85750611ba7818561179a565b5b80611be657508373ffffffffffffffffffffffffffffffffffffffff16611bce846108d4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c0f82611022565b73ffffffffffffffffffffffffffffffffffffffff1614611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061368d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061371f565b60405180910390fd5b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558160028281548110611d1f57611d1e612e9f565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080611dd3836122f2565b90506000600a6014603084901c611dea919061376e565b611df491906137ce565b600a600784611e03919061376e565b611e0d91906137ce565b6064611e199190613802565b611e2391906137ce565b90506000600a6014606085901c611e3a919061376e565b611e4491906137ce565b600a6006606086901c611e57919061376e565b611e6191906137ce565b6064611e6d9190613802565b611e7791906137ce565b90506000600a6014609086901c611e8e919061376e565b611e9891906137ce565b600a6007609087901c611eab919061376e565b611eb591906137ce565b6064611ec19190613802565b611ecb91906137ce565b90506000600a601460c087901c611ee2919061376e565b611eec91906137ce565b600a600260c088901c611eff919061376e565b611f0991906137ce565b6064611f159190613802565b611f1f91906137ce565b905080828486612710611f329190613802565b611f3c91906137ce565b612710611f499190613802565b611f5391906137ce565b612710611f609190613802565b611f6a91906137ce565b95505050505050919050565b611f7f81611a11565b15611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613890565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061208d82611022565b90506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282815481106120d9576120d8612e9f565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612237848484611bef565b61224384848484612334565b612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990613922565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001436123019190613942565b40826040516020016123149291906139c2565b6040516020818303038152906040528051906020012060001c9050919050565b60006123558473ffffffffffffffffffffffffffffffffffffffff166124bb565b156124ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237e611a99565b8786866040518563ffffffff1660e01b81526004016123a09493929190613a43565b6020604051808303816000875af19250505080156123dc57506040513d601f19601f820116820180604052508101906123d99190613aa4565b60015b61245e573d806000811461240c576040519150601f19603f3d011682016040523d82523d6000602084013e612411565b606091505b506000815103612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90613922565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124b3565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061250d826124e2565b9050919050565b600061251f82612502565b9050919050565b61252f81612514565b811461253a57600080fd5b50565b60008135905061254c81612526565b92915050565b600060208284031215612568576125676124d8565b5b60006125768482850161253d565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125b48161257f565b81146125bf57600080fd5b50565b6000813590506125d1816125ab565b92915050565b6000602082840312156125ed576125ec6124d8565b5b60006125fb848285016125c2565b91505092915050565b60008115159050919050565b61261981612604565b82525050565b60006020820190506126346000830184612610565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612674578082015181840152602081019050612659565b60008484015250505050565b6000601f19601f8301169050919050565b600061269c8261263a565b6126a68185612645565b93506126b6818560208601612656565b6126bf81612680565b840191505092915050565b600060208201905081810360008301526126e48184612691565b905092915050565b6000819050919050565b6126ff816126ec565b811461270a57600080fd5b50565b60008135905061271c816126f6565b92915050565b600060208284031215612738576127376124d8565b5b60006127468482850161270d565b91505092915050565b61275881612502565b82525050565b6000602082019050612773600083018461274f565b92915050565b61278281612502565b811461278d57600080fd5b50565b60008135905061279f81612779565b92915050565b600080604083850312156127bc576127bb6124d8565b5b60006127ca85828601612790565b92505060206127db8582860161270d565b9150509250929050565b600080604083850312156127fc576127fb6124d8565b5b600061280a8582860161270d565b925050602061281b8582860161270d565b9150509250929050565b61282e816126ec565b82525050565b60006020820190506128496000830184612825565b92915050565b600080600060608486031215612868576128676124d8565b5b600061287686828701612790565b935050602061288786828701612790565b92505060406128988682870161270d565b9150509250925092565b600063ffffffff82169050919050565b6128bb816128a2565b81146128c657600080fd5b50565b6000813590506128d8816128b2565b92915050565b6000602082840312156128f4576128f36124d8565b5b6000612902848285016128c9565b91505092915050565b6000819050919050565b600061293061292b612926846124e2565b61290b565b6124e2565b9050919050565b600061294282612915565b9050919050565b600061295482612937565b9050919050565b61296481612949565b82525050565b600060208201905061297f600083018461295b565b92915050565b60006020828403121561299b5761299a6124d8565b5b60006129a984828501612790565b91505092915050565b6129bb81612604565b81146129c657600080fd5b50565b6000813590506129d8816129b2565b92915050565b600080604083850312156129f5576129f46124d8565b5b6000612a0385828601612790565b9250506020612a14858286016129c9565b9150509250929050565b600060208284031215612a3457612a336124d8565b5b6000612a42848285016129c9565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a8d82612680565b810181811067ffffffffffffffff82111715612aac57612aab612a55565b5b80604052505050565b6000612abf6124ce565b9050612acb8282612a84565b919050565b600067ffffffffffffffff821115612aeb57612aea612a55565b5b612af482612680565b9050602081019050919050565b82818337600083830152505050565b6000612b23612b1e84612ad0565b612ab5565b905082815260208101848484011115612b3f57612b3e612a50565b5b612b4a848285612b01565b509392505050565b600082601f830112612b6757612b66612a4b565b5b8135612b77848260208601612b10565b91505092915050565b60008060008060808587031215612b9a57612b996124d8565b5b6000612ba887828801612790565b9450506020612bb987828801612790565b9350506040612bca8782880161270d565b925050606085013567ffffffffffffffff811115612beb57612bea6124dd565b5b612bf787828801612b52565b91505092959194509250565b60008060408385031215612c1a57612c196124d8565b5b6000612c2885828601612790565b9250506020612c3985828601612790565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c8a57607f821691505b602082108103612c9d57612c9c612c43565b5b50919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cd9601883612645565b9150612ce482612ca3565b602082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d6b602183612645565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dfd603883612645565b9150612e0882612da1565b604082019050919050565b60006020820190508181036000830152612e2c81612df0565b9050919050565b7f43616e6e6f742073657420746865207365656400000000000000000000000000600082015250565b6000612e69601383612645565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612f2a602d83612645565b9150612f3582612ece565b604082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4d696e74696e67206e6565647320746f20626520656e61626c656420746f207360008201527f74617274206d696e74696e670000000000000000000000000000000000000000602082015250565b6000612fbc602c83612645565b9150612fc782612f60565b604082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000613028601383612645565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006130ba602b83612645565b91506130c58261305e565b604082019050919050565b600060208201905081810360008301526130e9816130ad565b9050919050565b600081905092915050565b50565b600061310b6000836130f0565b9150613116826130fb565b600082019050919050565b600061312c826130fe565b9150819050919050565b7f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000600082015250565b600061316c601583612645565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006131fe602c83612645565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613290602983612645565b915061329b82613234565b604082019050919050565b600060208201905081810360008301526132bf81613283565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132fc601983612645565b9150613307826132c6565b602082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b6000613368601c83612645565b915061337382613332565b602082019050919050565b600060208201905081810360008301526133978161335b565b9050919050565b7f5445535420646f6573206e6f742065786973742e000000000000000000000000600082015250565b60006133d4601483612645565b91506133df8261339e565b602082019050919050565b60006020820190508181036000830152613403816133c7565b9050919050565b600060408201905061341f6000830185612825565b61342c6020830184612825565b9392505050565b600067ffffffffffffffff82111561344e5761344d612a55565b5b61345782612680565b9050602081019050919050565b600061347761347284613433565b612ab5565b90508281526020810184848401111561349357613492612a50565b5b61349e848285612656565b509392505050565b600082601f8301126134bb576134ba612a4b565b5b81516134cb848260208601613464565b91505092915050565b6000602082840312156134ea576134e96124d8565b5b600082015167ffffffffffffffff811115613508576135076124dd565b5b613514848285016134a6565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613579602683612645565b91506135848261351d565b604082019050919050565b600060208201905081810360008301526135a88161356c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e5602083612645565b91506135f0826135af565b602082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613677602583612645565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613709602483612645565b9150613714826136ad565b604082019050919050565b60006020820190508181036000830152613738816136fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613779826126ec565b9150613784836126ec565b9250826137945761379361373f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137d9826126ec565b91506137e4836126ec565b92508282019050808211156137fc576137fb61379f565b5b92915050565b600061380d826126ec565b9150613818836126ec565b9250828202613826816126ec565b9150828204841483151761383d5761383c61379f565b5b5092915050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061387a601c83612645565b915061388582613844565b602082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061390c603283612645565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b600061394d826126ec565b9150613958836126ec565b92508282039050818111156139705761396f61379f565b5b92915050565b6000819050919050565b6000819050919050565b61399b61399682613976565b613980565b82525050565b6000819050919050565b6139bc6139b7826126ec565b6139a1565b82525050565b60006139ce828561398a565b6020820191506139de82846139ab565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613a15826139ee565b613a1f81856139f9565b9350613a2f818560208601612656565b613a3881612680565b840191505092915050565b6000608082019050613a58600083018761274f565b613a65602083018661274f565b613a726040830185612825565b8181036060830152613a848184613a0a565b905095945050505050565b600081519050613a9e816125ab565b92915050565b600060208284031215613aba57613ab96124d8565b5b6000613ac884828501613a8f565b9150509291505056fea2646970667358221220913800c4a9bd70240f51351eb27f1920ceed2b703f212400f7960cc68cffa46464736f6c6343000813003300000000000000000000000063ffc8b48b4a0bc3030802d003922771ebc8ad19

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80634f6ccce711610102578063a71bbebe11610095578063d5abeb0111610064578063d5abeb01146106ae578063e0d4ea37146106d9578063e985e9c514610716578063f2fde38b14610753576101e3565b8063a71bbebe14610603578063b4c7f0661461061f578063b88d4fde14610648578063c87b56dd14610671576101e3565b80637dc2268c116100d15780637dc2268c146105595780638da5cb5b1461058457806395d89b41146105af578063a22cb465146105da576101e3565b80634f6ccce71461048b5780636352211e146104c857806370a0823114610505578063715018a614610542576101e3565b806326f6bb2d1161017a5780633bb2c938116101495780633bb2c938146104185780633ccfd60b1461042f57806342842e0e1461043957806342966c6814610462576101e3565b806326f6bb2d1461035c5780632f745c5914610385578063303e74df146103c257806333101e1f146103ed576101e3565b8063095ea7b3116101b6578063095ea7b3146102b6578063176b72b4146102df57806318160ddd1461030857806323b872dd14610333576101e3565b806301b9a397146101e857806301ffc9a71461021157806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612552565b61077c565b005b34801561021d57600080fd5b50610238600480360381019061023391906125d7565b6107c8565b604051610245919061261f565b60405180910390f35b34801561025a57600080fd5b50610263610842565b60405161027091906126ca565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612722565b6108d4565b6040516102ad919061275e565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906127a5565b610959565b005b3480156102eb57600080fd5b50610306600480360381019061030191906127e5565b610a70565b005b34801561031457600080fd5b5061031d610b1b565b60405161032a9190612834565b60405180910390f35b34801561033f57600080fd5b5061035a6004803603810190610355919061284f565b610bba565b005b34801561036857600080fd5b50610383600480360381019061037e91906128de565b610c1a565b005b34801561039157600080fd5b506103ac60048036038101906103a791906127a5565b610d25565b6040516103b99190612834565b60405180910390f35b3480156103ce57600080fd5b506103d7610e58565b6040516103e4919061296a565b60405180910390f35b3480156103f957600080fd5b50610402610e7e565b60405161040f919061261f565b60405180910390f35b34801561042457600080fd5b5061042d610e91565b005b610437610eb6565b005b34801561044557600080fd5b50610460600480360381019061045b919061284f565b610f3e565b005b34801561046e57600080fd5b5061048960048036038101906104849190612722565b610f5e565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612722565b610fd1565b6040516104bf9190612834565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612722565b611022565b6040516104fc919061275e565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190612985565b6110de565b6040516105399190612834565b60405180910390f35b34801561054e57600080fd5b506105576111ec565b005b34801561056557600080fd5b5061056e611200565b60405161057b919061261f565b60405180910390f35b34801561059057600080fd5b50610599611213565b6040516105a6919061275e565b60405180910390f35b3480156105bb57600080fd5b506105c461123d565b6040516105d191906126ca565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906129de565b6112cf565b005b61061d600480360381019061061891906128de565b61144f565b005b34801561062b57600080fd5b5061064660048036038101906106419190612a1e565b61159b565b005b34801561065457600080fd5b5061066f600480360381019061066a9190612b80565b6115c0565b005b34801561067d57600080fd5b5061069860048036038101906106939190612722565b611622565b6040516106a591906126ca565b60405180910390f35b3480156106ba57600080fd5b506106c361172f565b6040516106d09190612834565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190612722565b611735565b60405161070d9190612834565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190612c03565b61179a565b60405161074a919061261f565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190612985565b61182e565b005b6107846118b1565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083b575061083a8261192f565b5b9050919050565b60606000805461085190612c72565b80601f016020809104026020016040519081016040528092919081815260200182805461087d90612c72565b80156108ca5780601f1061089f576101008083540402835291602001916108ca565b820191906000526020600020905b8154815290600101906020018083116108ad57829003601f168201915b5050505050905090565b60006108df82611a11565b61091e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091590612cef565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096482611022565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb90612d81565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f3611a99565b73ffffffffffffffffffffffffffffffffffffffff161480610a225750610a2181610a1c611a99565b61179a565b5b610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890612e13565b60405180910390fd5b610a6b8383611aa1565b505050565b610a786118b1565b600960019054906101000a900460ff16610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90612e7f565b60405180910390fd5b806006600084815260200190815260200160002081905550817faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e082604051610b0f9190612834565b60405180910390a25050565b60008060005b600280549050811015610bb257600073ffffffffffffffffffffffffffffffffffffffff1660028281548110610b5a57610b59612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba7578160010191505b806001019050610b21565b508091505090565b610bcb610bc5611a99565b82611b5a565b610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190612f40565b60405180910390fd5b610c15838383611bef565b505050565b610c226118b1565b600960009054906101000a900460ff16610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890612fd2565b60405180910390fd5b600060028054905090506008548263ffffffff16820110610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe9061303e565b60405180910390fd5b60005b8263ffffffff168163ffffffff161015610d2057610ce782611dc7565b6006600084815260200190815260200160002081905550610d0f610d09611213565b83611f76565b816001019150806001019050610cca565b505050565b6000610d30836110de565b8210610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906130d0565b60405180910390fd5b6000805b600280549050811015610e165760028181548110610d9657610d95612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e0b57838203610e04578092505050610e52565b8160010191505b806001019050610d75565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906130d0565b60405180910390fd5b92915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960019054906101000a900460ff1681565b610e996118b1565b6000600960016101000a81548160ff021916908315150217905550565b610ebe6118b1565b6000610ec8611213565b73ffffffffffffffffffffffffffffffffffffffff1647604051610eeb90613121565b60006040518083038185875af1925050503d8060008114610f28576040519150601f19603f3d011682016040523d82523d6000602084013e610f2d565b606091505b5050905080610f3b57600080fd5b50565b610f59838383604051806020016040528060008152506115c0565b505050565b610f6f610f69611a99565b82611b5a565b610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613182565b60405180910390fd5b6006600082815260200190815260200160002060009055610fce81612082565b50565b6000600280549050821061101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613214565b60405180910390fd5b819050919050565b6000806002838154811061103957611038612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90612cef565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906132a6565b60405180910390fd5b6000805b6002805490508110156111e2576002818154811061117357611172612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111d7578160010191505b806001019050611152565b5080915050919050565b6111f46118b1565b6111fe6000612166565b565b600960009054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124c90612c72565b80601f016020809104026020016040519081016040528092919081815260200182805461127890612c72565b80156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050905090565b8173ffffffffffffffffffffffffffffffffffffffff166112ee611a99565b73ffffffffffffffffffffffffffffffffffffffff1603611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90613312565b60405180910390fd5b8060046000611351611a99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113fe611a99565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611443919061261f565b60405180910390a35050565b600960009054906101000a900460ff1661149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590612fd2565b60405180910390fd5b60028163ffffffff16106114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de9061337e565b60405180910390fd5b600060028054905090506008548263ffffffff1682011061153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115349061303e565b60405180910390fd5b60005b8263ffffffff168163ffffffff1610156115965761155d82611dc7565b600660008481526020019081526020016000208190555061158561157f611a99565b83611f76565b816001019150806001019050611540565b505050565b6115a36118b1565b80600960006101000a81548160ff02191690831515021790555050565b6115d16115cb611a99565b83611b5a565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790612f40565b60405180910390fd5b61161c8484848461222c565b50505050565b606061162d82611a11565b61166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906133ea565b60405180910390fd5b600060066000848152602001908152602001600020549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d84836040518363ffffffff1660e01b81526004016116e192919061340a565b600060405180830381865afa1580156116fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061172791906134d4565b915050919050565b60085481565b600061174082611a11565b61177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906133ea565b60405180910390fd5b60066000838152602001908152602001600020549050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118366118b1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c9061358f565b60405180910390fd5b6118ae81612166565b50565b6118b9611a99565b73ffffffffffffffffffffffffffffffffffffffff166118d7611213565b73ffffffffffffffffffffffffffffffffffffffff161461192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906135fb565b60405180910390fd5b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a0a5750611a0982612288565b5b9050919050565b600060028054905082108015611a925750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110611a4e57611a4d612e9f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b1483611022565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611b6683611022565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ba85750611ba7818561179a565b5b80611be657508373ffffffffffffffffffffffffffffffffffffffff16611bce846108d4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c0f82611022565b73ffffffffffffffffffffffffffffffffffffffff1614611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061368d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061371f565b60405180910390fd5b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558160028281548110611d1f57611d1e612e9f565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080611dd3836122f2565b90506000600a6014603084901c611dea919061376e565b611df491906137ce565b600a600784611e03919061376e565b611e0d91906137ce565b6064611e199190613802565b611e2391906137ce565b90506000600a6014606085901c611e3a919061376e565b611e4491906137ce565b600a6006606086901c611e57919061376e565b611e6191906137ce565b6064611e6d9190613802565b611e7791906137ce565b90506000600a6014609086901c611e8e919061376e565b611e9891906137ce565b600a6007609087901c611eab919061376e565b611eb591906137ce565b6064611ec19190613802565b611ecb91906137ce565b90506000600a601460c087901c611ee2919061376e565b611eec91906137ce565b600a600260c088901c611eff919061376e565b611f0991906137ce565b6064611f159190613802565b611f1f91906137ce565b905080828486612710611f329190613802565b611f3c91906137ce565b612710611f499190613802565b611f5391906137ce565b612710611f609190613802565b611f6a91906137ce565b95505050505050919050565b611f7f81611a11565b15611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690613890565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061208d82611022565b90506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600282815481106120d9576120d8612e9f565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612237848484611bef565b61224384848484612334565b612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990613922565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006001436123019190613942565b40826040516020016123149291906139c2565b6040516020818303038152906040528051906020012060001c9050919050565b60006123558473ffffffffffffffffffffffffffffffffffffffff166124bb565b156124ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237e611a99565b8786866040518563ffffffff1660e01b81526004016123a09493929190613a43565b6020604051808303816000875af19250505080156123dc57506040513d601f19601f820116820180604052508101906123d99190613aa4565b60015b61245e573d806000811461240c576040519150601f19603f3d011682016040523d82523d6000602084013e612411565b606091505b506000815103612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90613922565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124b3565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061250d826124e2565b9050919050565b600061251f82612502565b9050919050565b61252f81612514565b811461253a57600080fd5b50565b60008135905061254c81612526565b92915050565b600060208284031215612568576125676124d8565b5b60006125768482850161253d565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125b48161257f565b81146125bf57600080fd5b50565b6000813590506125d1816125ab565b92915050565b6000602082840312156125ed576125ec6124d8565b5b60006125fb848285016125c2565b91505092915050565b60008115159050919050565b61261981612604565b82525050565b60006020820190506126346000830184612610565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612674578082015181840152602081019050612659565b60008484015250505050565b6000601f19601f8301169050919050565b600061269c8261263a565b6126a68185612645565b93506126b6818560208601612656565b6126bf81612680565b840191505092915050565b600060208201905081810360008301526126e48184612691565b905092915050565b6000819050919050565b6126ff816126ec565b811461270a57600080fd5b50565b60008135905061271c816126f6565b92915050565b600060208284031215612738576127376124d8565b5b60006127468482850161270d565b91505092915050565b61275881612502565b82525050565b6000602082019050612773600083018461274f565b92915050565b61278281612502565b811461278d57600080fd5b50565b60008135905061279f81612779565b92915050565b600080604083850312156127bc576127bb6124d8565b5b60006127ca85828601612790565b92505060206127db8582860161270d565b9150509250929050565b600080604083850312156127fc576127fb6124d8565b5b600061280a8582860161270d565b925050602061281b8582860161270d565b9150509250929050565b61282e816126ec565b82525050565b60006020820190506128496000830184612825565b92915050565b600080600060608486031215612868576128676124d8565b5b600061287686828701612790565b935050602061288786828701612790565b92505060406128988682870161270d565b9150509250925092565b600063ffffffff82169050919050565b6128bb816128a2565b81146128c657600080fd5b50565b6000813590506128d8816128b2565b92915050565b6000602082840312156128f4576128f36124d8565b5b6000612902848285016128c9565b91505092915050565b6000819050919050565b600061293061292b612926846124e2565b61290b565b6124e2565b9050919050565b600061294282612915565b9050919050565b600061295482612937565b9050919050565b61296481612949565b82525050565b600060208201905061297f600083018461295b565b92915050565b60006020828403121561299b5761299a6124d8565b5b60006129a984828501612790565b91505092915050565b6129bb81612604565b81146129c657600080fd5b50565b6000813590506129d8816129b2565b92915050565b600080604083850312156129f5576129f46124d8565b5b6000612a0385828601612790565b9250506020612a14858286016129c9565b9150509250929050565b600060208284031215612a3457612a336124d8565b5b6000612a42848285016129c9565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a8d82612680565b810181811067ffffffffffffffff82111715612aac57612aab612a55565b5b80604052505050565b6000612abf6124ce565b9050612acb8282612a84565b919050565b600067ffffffffffffffff821115612aeb57612aea612a55565b5b612af482612680565b9050602081019050919050565b82818337600083830152505050565b6000612b23612b1e84612ad0565b612ab5565b905082815260208101848484011115612b3f57612b3e612a50565b5b612b4a848285612b01565b509392505050565b600082601f830112612b6757612b66612a4b565b5b8135612b77848260208601612b10565b91505092915050565b60008060008060808587031215612b9a57612b996124d8565b5b6000612ba887828801612790565b9450506020612bb987828801612790565b9350506040612bca8782880161270d565b925050606085013567ffffffffffffffff811115612beb57612bea6124dd565b5b612bf787828801612b52565b91505092959194509250565b60008060408385031215612c1a57612c196124d8565b5b6000612c2885828601612790565b9250506020612c3985828601612790565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c8a57607f821691505b602082108103612c9d57612c9c612c43565b5b50919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612cd9601883612645565b9150612ce482612ca3565b602082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d6b602183612645565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dfd603883612645565b9150612e0882612da1565b604082019050919050565b60006020820190508181036000830152612e2c81612df0565b9050919050565b7f43616e6e6f742073657420746865207365656400000000000000000000000000600082015250565b6000612e69601383612645565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612f2a602d83612645565b9150612f3582612ece565b604082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4d696e74696e67206e6565647320746f20626520656e61626c656420746f207360008201527f74617274206d696e74696e670000000000000000000000000000000000000000602082015250565b6000612fbc602c83612645565b9150612fc782612f60565b604082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000613028601383612645565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006130ba602b83612645565b91506130c58261305e565b604082019050919050565b600060208201905081810360008301526130e9816130ad565b9050919050565b600081905092915050565b50565b600061310b6000836130f0565b9150613116826130fb565b600082019050919050565b600061312c826130fe565b9150819050919050565b7f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000600082015250565b600061316c601583612645565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006131fe602c83612645565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613290602983612645565b915061329b82613234565b604082019050919050565b600060208201905081810360008301526132bf81613283565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132fc601983612645565b9150613307826132c6565b602082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b7f45786365656473206d617820706572207472616e73616374696f6e2e00000000600082015250565b6000613368601c83612645565b915061337382613332565b602082019050919050565b600060208201905081810360008301526133978161335b565b9050919050565b7f5445535420646f6573206e6f742065786973742e000000000000000000000000600082015250565b60006133d4601483612645565b91506133df8261339e565b602082019050919050565b60006020820190508181036000830152613403816133c7565b9050919050565b600060408201905061341f6000830185612825565b61342c6020830184612825565b9392505050565b600067ffffffffffffffff82111561344e5761344d612a55565b5b61345782612680565b9050602081019050919050565b600061347761347284613433565b612ab5565b90508281526020810184848401111561349357613492612a50565b5b61349e848285612656565b509392505050565b600082601f8301126134bb576134ba612a4b565b5b81516134cb848260208601613464565b91505092915050565b6000602082840312156134ea576134e96124d8565b5b600082015167ffffffffffffffff811115613508576135076124dd565b5b613514848285016134a6565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613579602683612645565b91506135848261351d565b604082019050919050565b600060208201905081810360008301526135a88161356c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e5602083612645565b91506135f0826135af565b602082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613677602583612645565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613709602483612645565b9150613714826136ad565b604082019050919050565b60006020820190508181036000830152613738816136fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613779826126ec565b9150613784836126ec565b9250826137945761379361373f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137d9826126ec565b91506137e4836126ec565b92508282019050808211156137fc576137fb61379f565b5b92915050565b600061380d826126ec565b9150613818836126ec565b9250828202613826816126ec565b9150828204841483151761383d5761383c61379f565b5b5092915050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061387a601c83612645565b915061388582613844565b602082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061390c603283612645565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b600061394d826126ec565b9150613958836126ec565b92508282039050818111156139705761396f61379f565b5b92915050565b6000819050919050565b6000819050919050565b61399b61399682613976565b613980565b82525050565b6000819050919050565b6139bc6139b7826126ec565b6139a1565b82525050565b60006139ce828561398a565b6020820191506139de82846139ab565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613a15826139ee565b613a1f81856139f9565b9350613a2f818560208601612656565b613a3881612680565b840191505092915050565b6000608082019050613a58600083018761274f565b613a65602083018661274f565b613a726040830185612825565b8181036060830152613a848184613a0a565b905095945050505050565b600081519050613a9e816125ab565b92915050565b600060208284031215613aba57613ab96124d8565b5b6000613ac884828501613a8f565b9150509291505056fea2646970667358221220913800c4a9bd70240f51351eb27f1920ceed2b703f212400f7960cc68cffa46464736f6c63430008130033

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

00000000000000000000000063ffc8b48b4a0bc3030802d003922771ebc8ad19

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000063ffc8b48b4a0bc3030802d003922771ebc8ad19


Deployed Bytecode Sourcemap

37216:3599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38822:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32922:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28205:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28844:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28425:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39112:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33154:388;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29526:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37666:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33771:659;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37388:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37501:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39328:88;;;;;;;;;;;;;:::i;:::-;;38949:155;;;:::i;:::-;;29780:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39424:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33550:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27975:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27491:476;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36318:103;;;;;;;;;;;;;:::i;:::-;;37467:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35670:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28313:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29053:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38169:552;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38729:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29939:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39793:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37429:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39621:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36576:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38822:119;35556:13;:11;:13::i;:::-;38920::::1;38907:10;;:26;;;;;;;;;;;;;;;;;;38822:119:::0;:::o;32922:224::-;33024:4;33063:35;33048:50;;;:11;:50;;;;:90;;;;33102:36;33126:11;33102:23;:36::i;:::-;33048:90;33041:97;;32922:224;;;:::o;28205:100::-;28259:13;28292:5;28285:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28205:100;:::o;28844:201::-;28920:7;28948:16;28956:7;28948;:16::i;:::-;28940:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;29013:15;:24;29029:7;29013:24;;;;;;;;;;;;;;;;;;;;;29006:31;;28844:201;;;:::o;28425:411::-;28506:13;28522:23;28537:7;28522:14;:23::i;:::-;28506:39;;28570:5;28564:11;;:2;:11;;;28556:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28664:5;28648:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28673:37;28690:5;28697:12;:10;:12::i;:::-;28673:16;:37::i;:::-;28648:62;28626:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28807:21;28816:2;28820:7;28807:8;:21::i;:::-;28495:341;28425:411;;:::o;39112:208::-;35556:13;:11;:13::i;:::-;39201::::1;;;;;;;;;;;39193:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;39266:4;39249:5;:14;39255:7;39249:14;;;;;;;;;;;:21;;;;39298:7;39286:26;39307:4;39286:26;;;;;;:::i;:::-;;;;;;;;39112:208:::0;;:::o;33154:388::-;33215:7;33235:13;33264:9;33259:251;33279:7;:14;;;;33275:1;:18;33259:251;;;33337:1;33315:24;;:7;33323:1;33315:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:24;;;33311:124;;33393:7;;;;;33311:124;33480:3;;;;;33259:251;;;;33529:5;33522:12;;;33154:388;:::o;29526:246::-;29634:41;29653:12;:10;:12::i;:::-;29667:7;29634:18;:41::i;:::-;29626:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;29736:28;29746:4;29752:2;29756:7;29736:9;:28::i;:::-;29526:246;;;:::o;37666:495::-;35556:13;:11;:13::i;:::-;37739:7:::1;;;;;;;;;;;37731:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37806:19;37828:7;:14;;;;37806:36;;37908:9;;37900:5;37886:19;;:11;:19;:31;37878:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37970:8;37965:189;37984:5;37980:9;;:1;:9;;;37965:189;;;38028:25;38041:11;38028:12;:25::i;:::-;38007:5;:18;38013:11;38007:18;;;;;;;;;;;:46;;;;38068:27;38074:7;:5;:7::i;:::-;38083:11;38068:5;:27::i;:::-;38122:13;;;;;38137:3;;;;;37965:189;;;;37720:441;37666:495:::0;:::o;33771:659::-;33868:15;33912:16;33922:5;33912:9;:16::i;:::-;33904:5;:24;33896:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33989:13;34017:9;34013:344;34032:7;:14;;;;34028:1;:18;34013:344;;;34075:7;34083:1;34075:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34066:19;;:5;:19;;;34063:219;;34118:5;34109;:14;34106:161;;34132:1;34125:8;;;;;;34106:161;34217:7;;;;;34063:219;34327:3;;;;;34013:344;;;;34369:53;;;;;;;;;;:::i;:::-;;;;;;;;33771:659;;;;;:::o;37388:34::-;;;;;;;;;;;;;:::o;37501:32::-;;;;;;;;;;;;;:::o;39328:88::-;35556:13;:11;:13::i;:::-;39403:5:::1;39387:13;;:21;;;;;;;;;;;;;;;;;;39328:88::o:0;38949:155::-;35556:13;:11;:13::i;:::-;39008:7:::1;39027;:5;:7::i;:::-;39019:21;;39048;39019:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39007:67;;;39093:2;39085:11;;;::::0;::::1;;38996:108;38949:155::o:0;29780:151::-;29884:39;29901:4;29907:2;29911:7;29884:39;;;;;;;;;;;;:16;:39::i;:::-;29780:151;;;:::o;39424:189::-;39481:41;39500:12;:10;:12::i;:::-;39514:7;39481:18;:41::i;:::-;39473:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39566:5;:14;39572:7;39566:14;;;;;;;;;;;39559:21;;;39591:14;39597:7;39591:5;:14::i;:::-;39424:189;:::o;33550:213::-;33625:15;33669:7;:14;;;;33661:5;:22;33653:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33750:5;33743:12;;33550:213;;;:::o;27975:222::-;28047:7;28067:13;28083:7;28091;28083:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28067:32;;28135:1;28118:19;;:5;:19;;;28110:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;28184:5;28177:12;;;27975:222;;;:::o;27491:476::-;27563:7;27608:1;27591:19;;:5;:19;;;27583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27669:13;27698:9;27693:244;27713:7;:14;;;;27709:1;:18;27693:244;;;27758:7;27766:1;27758:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27749:19;;:5;:19;;;27745:119;;27822:7;;;;;27745:119;27907:3;;;;;27693:244;;;;27954:5;27947:12;;;27491:476;;;:::o;36318:103::-;35556:13;:11;:13::i;:::-;36383:30:::1;36410:1;36383:18;:30::i;:::-;36318:103::o:0;37467:27::-;;;;;;;;;;;;;:::o;35670:87::-;35716:7;35743:6;;;;;;;;;;;35736:13;;35670:87;:::o;28313:104::-;28369:13;28402:7;28395:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28313:104;:::o;29053:293::-;29172:8;29156:24;;:12;:10;:12::i;:::-;:24;;;29148:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29266:8;29221:18;:32;29240:12;:10;:12::i;:::-;29221:32;;;;;;;;;;;;;;;:42;29254:8;29221:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29319:8;29290:48;;29305:12;:10;:12::i;:::-;29290:48;;;29329:8;29290:48;;;;;;:::i;:::-;;;;;;;;29053:293;;:::o;38169:552::-;38233:7;;;;;;;;;;;38225:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;38316:1;38308:5;:9;;;38300:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;38361:19;38383:7;:14;;;;38361:36;;38463:9;;38455:5;38441:19;;:11;:19;:31;38433:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38525:8;38520:194;38539:5;38535:9;;:1;:9;;;38520:194;;;38583:25;38596:11;38583:12;:25::i;:::-;38562:5;:18;38568:11;38562:18;;;;;;;;;;;:46;;;;38623:32;38629:12;:10;:12::i;:::-;38643:11;38623:5;:32::i;:::-;38682:13;;;;;38697:3;;;;;38520:194;;;;38214:507;38169:552;:::o;38729:85::-;35556:13;:11;:13::i;:::-;38801:5:::1;38791:7;;:15;;;;;;;;;;;;;;;;;;38729:85:::0;:::o;29939:279::-;30070:41;30089:12;:10;:12::i;:::-;30103:7;30070:18;:41::i;:::-;30062:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30172:38;30186:4;30192:2;30196:7;30205:4;30172:13;:38::i;:::-;29939:279;;;;:::o;39793:231::-;39849:13;39883:16;39891:7;39883;:16::i;:::-;39875:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39935:12;39950:5;:14;39956:7;39950:14;;;;;;;;;;;;39935:29;;39982:10;;;;;;;;;;;:19;;;40002:7;40011:4;39982:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39975:41;;;39793:231;;;:::o;37429:31::-;;;;:::o;39621:164::-;39676:7;39704:16;39712:7;39704;:16::i;:::-;39696:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39763:5;:14;39769:7;39763:14;;;;;;;;;;;;39756:21;;39621:164;;;:::o;29354:::-;29451:4;29475:18;:25;29494:5;29475:25;;;;;;;;;;;;;;;:35;29501:8;29475:35;;;;;;;;;;;;;;;;;;;;;;;;;29468:42;;29354:164;;;;:::o;36576:201::-;35556:13;:11;:13::i;:::-;36685:1:::1;36665:22;;:8;:22;;::::0;36657:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36741:28;36760:8;36741:18;:28::i;:::-;36576:201:::0;:::o;35835:132::-;35910:12;:10;:12::i;:::-;35899:23;;:7;:5;:7::i;:::-;:23;;;35891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35835:132::o;27199:284::-;27301:4;27340:25;27325:40;;;:11;:40;;;;:101;;;;27393:33;27378:48;;;:11;:48;;;;27325:101;:150;;;;27439:36;27463:11;27439:23;:36::i;:::-;27325:150;27318:157;;27199:284;;;:::o;30504:155::-;30569:4;30603:7;:14;;;;30593:7;:24;:58;;;;;30649:1;30621:30;;:7;30629;30621:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;30593:58;30586:65;;30504:155;;;:::o;26404:98::-;26457:7;26484:10;26477:17;;26404:98;:::o;31848:174::-;31950:2;31923:15;:24;31939:7;31923:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32006:7;32002:2;31968:46;;31977:23;31992:7;31977:14;:23::i;:::-;31968:46;;;;;;;;;;;;31848:174;;:::o;30667:264::-;30760:4;30777:13;30793:23;30808:7;30793:14;:23::i;:::-;30777:39;;30846:5;30835:16;;:7;:16;;;:52;;;;30855:32;30872:5;30879:7;30855:16;:32::i;:::-;30835:52;:87;;;;30915:7;30891:31;;:20;30903:7;30891:11;:20::i;:::-;:31;;;30835:87;30827:96;;;30667:264;;;;:::o;31412:428::-;31537:4;31510:31;;:23;31525:7;31510:14;:23::i;:::-;:31;;;31502:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31616:1;31602:16;;:2;:16;;;31594:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31731:15;:24;31747:7;31731:24;;;;;;;;;;;;31724:31;;;;;;;;;;;31785:2;31766:7;31774;31766:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31824:7;31820:2;31805:27;;31814:4;31805:27;;;;;;;;;;;;31412:428;;;:::o;40032:519::-;40093:7;40113:9;40125:15;40132:7;40125:6;:15::i;:::-;40113:27;;40151:16;40209:2;40204;40198;40193:1;:7;;40192:14;;;;:::i;:::-;:19;;;;:::i;:::-;40185:2;40181:1;40177;:5;;;;:::i;:::-;:10;;;;:::i;:::-;40170:3;:18;;;;:::i;:::-;:42;;;;:::i;:::-;40151:61;;40223:16;40289:2;40284;40278;40273:1;:7;;40272:14;;;;:::i;:::-;:19;;;;:::i;:::-;40265:2;40261:1;40255:2;40250:1;:7;;40249:13;;;;:::i;:::-;:18;;;;:::i;:::-;40242:3;:26;;;;:::i;:::-;:50;;;;:::i;:::-;40223:69;;40303:16;40371:2;40366;40359:3;40354:1;:8;;40353:15;;;;:::i;:::-;:20;;;;:::i;:::-;40346:2;40342:1;40335:3;40330:1;:8;;40329:14;;;;:::i;:::-;:19;;;;:::i;:::-;40322:3;:27;;;;:::i;:::-;:52;;;;:::i;:::-;40303:71;;40385:16;40453:2;40448;40441:3;40436:1;:8;;40435:15;;;;:::i;:::-;:20;;;;:::i;:::-;40428:2;40424:1;40417:3;40412:1;:8;;40411:14;;;;:::i;:::-;:19;;;;:::i;:::-;40404:3;:27;;;;:::i;:::-;:52;;;;:::i;:::-;40385:71;;40535:8;40523;40511;40500;40492:5;:16;;;;:::i;:::-;:27;;;;:::i;:::-;40483:5;:37;;;;:::i;:::-;:48;;;;:::i;:::-;40474:5;:58;;;;:::i;:::-;:69;;;;:::i;:::-;40467:76;;;;;;;40032:519;;;:::o;30939:218::-;31020:16;31028:7;31020;:16::i;:::-;31019:17;31011:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31082:7;31095:2;31082:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31141:7;31137:2;31116:33;;31133:1;31116:33;;;;;;;;;;;;30939:218;;:::o;31165:239::-;31225:13;31241:23;31256:7;31241:14;:23::i;:::-;31225:39;;31284:15;:24;31300:7;31284:24;;;;;;;;;;;;31277:31;;;;;;;;;;;31326:7;31334;31326:16;;;;;;;;:::i;:::-;;;;;;;;;;31319:23;;;;;;;;;;;31388:7;31384:1;31360:36;;31369:5;31360:36;;;;;;;;;;;;31214:190;31165:239;:::o;36937:191::-;37011:16;37030:6;;;;;;;;;;;37011:25;;37056:8;37047:6;;:17;;;;;;;;;;;;;;;;;;37111:8;37080:40;;37101:8;37080:40;;;;;;;;;;;;37000:128;36937:191;:::o;30226:270::-;30339:28;30349:4;30355:2;30359:7;30339:9;:28::i;:::-;30386:47;30409:4;30415:2;30419:7;30428:4;30386:22;:47::i;:::-;30378:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30226:270;;;;:::o;18564:157::-;18649:4;18688:25;18673:40;;;:11;:40;;;;18666:47;;18564:157;;;:::o;40559:253::-;40614:24;40744:1;40729:12;:16;;;;:::i;:::-;40719:27;40748:7;40702:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40692:65;;;;;;40670:98;;40651:117;;40559:253;;;:::o;32030:734::-;32141:4;32162:15;:2;:13;;;:15::i;:::-;32158:575;;;32214:2;32198:36;;;32235:12;:10;:12::i;:::-;32249:4;32255:7;32264:4;32198:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32194:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32456:1;32439:6;:13;:18;32435:272;;32482:60;;;;;;;;;;:::i;:::-;;;;;;;;32435:272;32657:6;32651:13;32642:6;32638:2;32634:15;32627:38;32194:528;32330:41;;;32320:51;;;:6;:51;;;;32313:58;;;;;32158:575;32752:4;32745:11;;32030:734;;;;;;;:::o;331:193::-;391:4;408:9;472:7;460:20;452:28;;515:1;508:4;:8;501:15;;;331:193;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:119::-;628:7;657:24;675:5;657:24;:::i;:::-;646:35;;568:119;;;:::o;693:168::-;789:47;830:5;789:47;:::i;:::-;782:5;779:58;769:86;;851:1;848;841:12;769:86;693:168;:::o;867:185::-;936:5;974:6;961:20;952:29;;990:56;1040:5;990:56;:::i;:::-;867:185;;;;:::o;1058:375::-;1140:6;1189:2;1177:9;1168:7;1164:23;1160:32;1157:119;;;1195:79;;:::i;:::-;1157:119;1315:1;1340:76;1408:7;1399:6;1388:9;1384:22;1340:76;:::i;:::-;1330:86;;1286:140;1058:375;;;;:::o;1439:149::-;1475:7;1515:66;1508:5;1504:78;1493:89;;1439:149;;;:::o;1594:120::-;1666:23;1683:5;1666:23;:::i;:::-;1659:5;1656:34;1646:62;;1704:1;1701;1694:12;1646:62;1594:120;:::o;1720:137::-;1765:5;1803:6;1790:20;1781:29;;1819:32;1845:5;1819:32;:::i;:::-;1720:137;;;;:::o;1863:327::-;1921:6;1970:2;1958:9;1949:7;1945:23;1941:32;1938:119;;;1976:79;;:::i;:::-;1938:119;2096:1;2121:52;2165:7;2156:6;2145:9;2141:22;2121:52;:::i;:::-;2111:62;;2067:116;1863:327;;;;:::o;2196:90::-;2230:7;2273:5;2266:13;2259:21;2248:32;;2196:90;;;:::o;2292:109::-;2373:21;2388:5;2373:21;:::i;:::-;2368:3;2361:34;2292:109;;:::o;2407:210::-;2494:4;2532:2;2521:9;2517:18;2509:26;;2545:65;2607:1;2596:9;2592:17;2583:6;2545:65;:::i;:::-;2407:210;;;;:::o;2623:99::-;2675:6;2709:5;2703:12;2693:22;;2623:99;;;:::o;2728:169::-;2812:11;2846:6;2841:3;2834:19;2886:4;2881:3;2877:14;2862:29;;2728:169;;;;:::o;2903:246::-;2984:1;2994:113;3008:6;3005:1;3002:13;2994:113;;;3093:1;3088:3;3084:11;3078:18;3074:1;3069:3;3065:11;3058:39;3030:2;3027:1;3023:10;3018:15;;2994:113;;;3141:1;3132:6;3127:3;3123:16;3116:27;2965:184;2903:246;;;:::o;3155:102::-;3196:6;3247:2;3243:7;3238:2;3231:5;3227:14;3223:28;3213:38;;3155:102;;;:::o;3263:377::-;3351:3;3379:39;3412:5;3379:39;:::i;:::-;3434:71;3498:6;3493:3;3434:71;:::i;:::-;3427:78;;3514:65;3572:6;3567:3;3560:4;3553:5;3549:16;3514:65;:::i;:::-;3604:29;3626:6;3604:29;:::i;:::-;3599:3;3595:39;3588:46;;3355:285;3263:377;;;;:::o;3646:313::-;3759:4;3797:2;3786:9;3782:18;3774:26;;3846:9;3840:4;3836:20;3832:1;3821:9;3817:17;3810:47;3874:78;3947:4;3938:6;3874:78;:::i;:::-;3866:86;;3646:313;;;;:::o;3965:77::-;4002:7;4031:5;4020:16;;3965:77;;;:::o;4048:122::-;4121:24;4139:5;4121:24;:::i;:::-;4114:5;4111:35;4101:63;;4160:1;4157;4150:12;4101:63;4048:122;:::o;4176:139::-;4222:5;4260:6;4247:20;4238:29;;4276:33;4303:5;4276:33;:::i;:::-;4176:139;;;;:::o;4321:329::-;4380:6;4429:2;4417:9;4408:7;4404:23;4400:32;4397:119;;;4435:79;;:::i;:::-;4397:119;4555:1;4580:53;4625:7;4616:6;4605:9;4601:22;4580:53;:::i;:::-;4570:63;;4526:117;4321:329;;;;:::o;4656:118::-;4743:24;4761:5;4743:24;:::i;:::-;4738:3;4731:37;4656:118;;:::o;4780:222::-;4873:4;4911:2;4900:9;4896:18;4888:26;;4924:71;4992:1;4981:9;4977:17;4968:6;4924:71;:::i;:::-;4780:222;;;;:::o;5008:122::-;5081:24;5099:5;5081:24;:::i;:::-;5074:5;5071:35;5061:63;;5120:1;5117;5110:12;5061:63;5008:122;:::o;5136:139::-;5182:5;5220:6;5207:20;5198:29;;5236:33;5263:5;5236:33;:::i;:::-;5136:139;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:::-;5829:6;5837;5886:2;5874:9;5865:7;5861:23;5857:32;5854:119;;;5892:79;;:::i;:::-;5854:119;6012:1;6037:53;6082:7;6073:6;6062:9;6058:22;6037:53;:::i;:::-;6027:63;;5983:117;6139:2;6165:53;6210:7;6201:6;6190:9;6186:22;6165:53;:::i;:::-;6155:63;;6110:118;5761:474;;;;;:::o;6241:118::-;6328:24;6346:5;6328:24;:::i;:::-;6323:3;6316:37;6241:118;;:::o;6365:222::-;6458:4;6496:2;6485:9;6481:18;6473:26;;6509:71;6577:1;6566:9;6562:17;6553:6;6509:71;:::i;:::-;6365:222;;;;:::o;6593:619::-;6670:6;6678;6686;6735:2;6723:9;6714:7;6710:23;6706:32;6703:119;;;6741:79;;:::i;:::-;6703:119;6861:1;6886:53;6931:7;6922:6;6911:9;6907:22;6886:53;:::i;:::-;6876:63;;6832:117;6988:2;7014:53;7059:7;7050:6;7039:9;7035:22;7014:53;:::i;:::-;7004:63;;6959:118;7116:2;7142:53;7187:7;7178:6;7167:9;7163:22;7142:53;:::i;:::-;7132:63;;7087:118;6593:619;;;;;:::o;7218:93::-;7254:7;7294:10;7287:5;7283:22;7272:33;;7218:93;;;:::o;7317:120::-;7389:23;7406:5;7389:23;:::i;:::-;7382:5;7379:34;7369:62;;7427:1;7424;7417:12;7369:62;7317:120;:::o;7443:137::-;7488:5;7526:6;7513:20;7504:29;;7542:32;7568:5;7542:32;:::i;:::-;7443:137;;;;:::o;7586:327::-;7644:6;7693:2;7681:9;7672:7;7668:23;7664:32;7661:119;;;7699:79;;:::i;:::-;7661:119;7819:1;7844:52;7888:7;7879:6;7868:9;7864:22;7844:52;:::i;:::-;7834:62;;7790:116;7586:327;;;;:::o;7919:60::-;7947:3;7968:5;7961:12;;7919:60;;;:::o;7985:142::-;8035:9;8068:53;8086:34;8095:24;8113:5;8095:24;:::i;:::-;8086:34;:::i;:::-;8068:53;:::i;:::-;8055:66;;7985:142;;;:::o;8133:126::-;8183:9;8216:37;8247:5;8216:37;:::i;:::-;8203:50;;8133:126;;;:::o;8265:149::-;8338:9;8371:37;8402:5;8371:37;:::i;:::-;8358:50;;8265:149;;;:::o;8420:177::-;8530:60;8584:5;8530:60;:::i;:::-;8525:3;8518:73;8420:177;;:::o;8603:268::-;8719:4;8757:2;8746:9;8742:18;8734:26;;8770:94;8861:1;8850:9;8846:17;8837:6;8770:94;:::i;:::-;8603:268;;;;:::o;8877:329::-;8936:6;8985:2;8973:9;8964:7;8960:23;8956:32;8953:119;;;8991:79;;:::i;:::-;8953:119;9111:1;9136:53;9181:7;9172:6;9161:9;9157:22;9136:53;:::i;:::-;9126:63;;9082:117;8877:329;;;;:::o;9212:116::-;9282:21;9297:5;9282:21;:::i;:::-;9275:5;9272:32;9262:60;;9318:1;9315;9308:12;9262:60;9212:116;:::o;9334:133::-;9377:5;9415:6;9402:20;9393:29;;9431:30;9455:5;9431:30;:::i;:::-;9334:133;;;;:::o;9473:468::-;9538:6;9546;9595:2;9583:9;9574:7;9570:23;9566:32;9563:119;;;9601:79;;:::i;:::-;9563:119;9721:1;9746:53;9791:7;9782:6;9771:9;9767:22;9746:53;:::i;:::-;9736:63;;9692:117;9848:2;9874:50;9916:7;9907:6;9896:9;9892:22;9874:50;:::i;:::-;9864:60;;9819:115;9473:468;;;;;:::o;9947:323::-;10003:6;10052:2;10040:9;10031:7;10027:23;10023:32;10020:119;;;10058:79;;:::i;:::-;10020:119;10178:1;10203:50;10245:7;10236:6;10225:9;10221:22;10203:50;:::i;:::-;10193:60;;10149:114;9947:323;;;;:::o;10276:117::-;10385:1;10382;10375:12;10399:117;10508:1;10505;10498:12;10522:180;10570:77;10567:1;10560:88;10667:4;10664:1;10657:15;10691:4;10688:1;10681:15;10708:281;10791:27;10813:4;10791:27;:::i;:::-;10783:6;10779:40;10921:6;10909:10;10906:22;10885:18;10873:10;10870:34;10867:62;10864:88;;;10932:18;;:::i;:::-;10864:88;10972:10;10968:2;10961:22;10751:238;10708:281;;:::o;10995:129::-;11029:6;11056:20;;:::i;:::-;11046:30;;11085:33;11113:4;11105:6;11085:33;:::i;:::-;10995:129;;;:::o;11130:307::-;11191:4;11281:18;11273:6;11270:30;11267:56;;;11303:18;;:::i;:::-;11267:56;11341:29;11363:6;11341:29;:::i;:::-;11333:37;;11425:4;11419;11415:15;11407:23;;11130:307;;;:::o;11443:146::-;11540:6;11535:3;11530;11517:30;11581:1;11572:6;11567:3;11563:16;11556:27;11443:146;;;:::o;11595:423::-;11672:5;11697:65;11713:48;11754:6;11713:48;:::i;:::-;11697:65;:::i;:::-;11688:74;;11785:6;11778:5;11771:21;11823:4;11816:5;11812:16;11861:3;11852:6;11847:3;11843:16;11840:25;11837:112;;;11868:79;;:::i;:::-;11837:112;11958:54;12005:6;12000:3;11995;11958:54;:::i;:::-;11678:340;11595:423;;;;;:::o;12037:338::-;12092:5;12141:3;12134:4;12126:6;12122:17;12118:27;12108:122;;12149:79;;:::i;:::-;12108:122;12266:6;12253:20;12291:78;12365:3;12357:6;12350:4;12342:6;12338:17;12291:78;:::i;:::-;12282:87;;12098:277;12037:338;;;;:::o;12381:943::-;12476:6;12484;12492;12500;12549:3;12537:9;12528:7;12524:23;12520:33;12517:120;;;12556:79;;:::i;:::-;12517:120;12676:1;12701:53;12746:7;12737:6;12726:9;12722:22;12701:53;:::i;:::-;12691:63;;12647:117;12803:2;12829:53;12874:7;12865:6;12854:9;12850:22;12829:53;:::i;:::-;12819:63;;12774:118;12931:2;12957:53;13002:7;12993:6;12982:9;12978:22;12957:53;:::i;:::-;12947:63;;12902:118;13087:2;13076:9;13072:18;13059:32;13118:18;13110:6;13107:30;13104:117;;;13140:79;;:::i;:::-;13104:117;13245:62;13299:7;13290:6;13279:9;13275:22;13245:62;:::i;:::-;13235:72;;13030:287;12381:943;;;;;;;:::o;13330:474::-;13398:6;13406;13455:2;13443:9;13434:7;13430:23;13426:32;13423:119;;;13461:79;;:::i;:::-;13423:119;13581:1;13606:53;13651:7;13642:6;13631:9;13627:22;13606:53;:::i;:::-;13596:63;;13552:117;13708:2;13734:53;13779:7;13770:6;13759:9;13755:22;13734:53;:::i;:::-;13724:63;;13679:118;13330:474;;;;;:::o;13810:180::-;13858:77;13855:1;13848:88;13955:4;13952:1;13945:15;13979:4;13976:1;13969:15;13996:320;14040:6;14077:1;14071:4;14067:12;14057:22;;14124:1;14118:4;14114:12;14145:18;14135:81;;14201:4;14193:6;14189:17;14179:27;;14135:81;14263:2;14255:6;14252:14;14232:18;14229:38;14226:84;;14282:18;;:::i;:::-;14226:84;14047:269;13996:320;;;:::o;14322:174::-;14462:26;14458:1;14450:6;14446:14;14439:50;14322:174;:::o;14502:366::-;14644:3;14665:67;14729:2;14724:3;14665:67;:::i;:::-;14658:74;;14741:93;14830:3;14741:93;:::i;:::-;14859:2;14854:3;14850:12;14843:19;;14502:366;;;:::o;14874:419::-;15040:4;15078:2;15067:9;15063:18;15055:26;;15127:9;15121:4;15117:20;15113:1;15102:9;15098:17;15091:47;15155:131;15281:4;15155:131;:::i;:::-;15147:139;;14874:419;;;:::o;15299:220::-;15439:34;15435:1;15427:6;15423:14;15416:58;15508:3;15503:2;15495:6;15491:15;15484:28;15299:220;:::o;15525:366::-;15667:3;15688:67;15752:2;15747:3;15688:67;:::i;:::-;15681:74;;15764:93;15853:3;15764:93;:::i;:::-;15882:2;15877:3;15873:12;15866:19;;15525:366;;;:::o;15897:419::-;16063:4;16101:2;16090:9;16086:18;16078:26;;16150:9;16144:4;16140:20;16136:1;16125:9;16121:17;16114:47;16178:131;16304:4;16178:131;:::i;:::-;16170:139;;15897:419;;;:::o;16322:243::-;16462:34;16458:1;16450:6;16446:14;16439:58;16531:26;16526:2;16518:6;16514:15;16507:51;16322:243;:::o;16571:366::-;16713:3;16734:67;16798:2;16793:3;16734:67;:::i;:::-;16727:74;;16810:93;16899:3;16810:93;:::i;:::-;16928:2;16923:3;16919:12;16912:19;;16571:366;;;:::o;16943:419::-;17109:4;17147:2;17136:9;17132:18;17124:26;;17196:9;17190:4;17186:20;17182:1;17171:9;17167:17;17160:47;17224:131;17350:4;17224:131;:::i;:::-;17216:139;;16943:419;;;:::o;17368:169::-;17508:21;17504:1;17496:6;17492:14;17485:45;17368:169;:::o;17543:366::-;17685:3;17706:67;17770:2;17765:3;17706:67;:::i;:::-;17699:74;;17782:93;17871:3;17782:93;:::i;:::-;17900:2;17895:3;17891:12;17884:19;;17543:366;;;:::o;17915:419::-;18081:4;18119:2;18108:9;18104:18;18096:26;;18168:9;18162:4;18158:20;18154:1;18143:9;18139:17;18132:47;18196:131;18322:4;18196:131;:::i;:::-;18188:139;;17915:419;;;:::o;18340:180::-;18388:77;18385:1;18378:88;18485:4;18482:1;18475:15;18509:4;18506:1;18499:15;18526:232;18666:34;18662:1;18654:6;18650:14;18643:58;18735:15;18730:2;18722:6;18718:15;18711:40;18526:232;:::o;18764:366::-;18906:3;18927:67;18991:2;18986:3;18927:67;:::i;:::-;18920:74;;19003:93;19092:3;19003:93;:::i;:::-;19121:2;19116:3;19112:12;19105:19;;18764:366;;;:::o;19136:419::-;19302:4;19340:2;19329:9;19325:18;19317:26;;19389:9;19383:4;19379:20;19375:1;19364:9;19360:17;19353:47;19417:131;19543:4;19417:131;:::i;:::-;19409:139;;19136:419;;;:::o;19561:231::-;19701:34;19697:1;19689:6;19685:14;19678:58;19770:14;19765:2;19757:6;19753:15;19746:39;19561:231;:::o;19798:366::-;19940:3;19961:67;20025:2;20020:3;19961:67;:::i;:::-;19954:74;;20037:93;20126:3;20037:93;:::i;:::-;20155:2;20150:3;20146:12;20139:19;;19798:366;;;:::o;20170:419::-;20336:4;20374:2;20363:9;20359:18;20351:26;;20423:9;20417:4;20413:20;20409:1;20398:9;20394:17;20387:47;20451:131;20577:4;20451:131;:::i;:::-;20443:139;;20170:419;;;:::o;20595:169::-;20735:21;20731:1;20723:6;20719:14;20712:45;20595:169;:::o;20770:366::-;20912:3;20933:67;20997:2;20992:3;20933:67;:::i;:::-;20926:74;;21009:93;21098:3;21009:93;:::i;:::-;21127:2;21122:3;21118:12;21111:19;;20770:366;;;:::o;21142:419::-;21308:4;21346:2;21335:9;21331:18;21323:26;;21395:9;21389:4;21385:20;21381:1;21370:9;21366:17;21359:47;21423:131;21549:4;21423:131;:::i;:::-;21415:139;;21142:419;;;:::o;21567:230::-;21707:34;21703:1;21695:6;21691:14;21684:58;21776:13;21771:2;21763:6;21759:15;21752:38;21567:230;:::o;21803:366::-;21945:3;21966:67;22030:2;22025:3;21966:67;:::i;:::-;21959:74;;22042:93;22131:3;22042:93;:::i;:::-;22160:2;22155:3;22151:12;22144:19;;21803:366;;;:::o;22175:419::-;22341:4;22379:2;22368:9;22364:18;22356:26;;22428:9;22422:4;22418:20;22414:1;22403:9;22399:17;22392:47;22456:131;22582:4;22456:131;:::i;:::-;22448:139;;22175:419;;;:::o;22600:147::-;22701:11;22738:3;22723:18;;22600:147;;;;:::o;22753:114::-;;:::o;22873:398::-;23032:3;23053:83;23134:1;23129:3;23053:83;:::i;:::-;23046:90;;23145:93;23234:3;23145:93;:::i;:::-;23263:1;23258:3;23254:11;23247:18;;22873:398;;;:::o;23277:379::-;23461:3;23483:147;23626:3;23483:147;:::i;:::-;23476:154;;23647:3;23640:10;;23277:379;;;:::o;23662:171::-;23802:23;23798:1;23790:6;23786:14;23779:47;23662:171;:::o;23839:366::-;23981:3;24002:67;24066:2;24061:3;24002:67;:::i;:::-;23995:74;;24078:93;24167:3;24078:93;:::i;:::-;24196:2;24191:3;24187:12;24180:19;;23839:366;;;:::o;24211:419::-;24377:4;24415:2;24404:9;24400:18;24392:26;;24464:9;24458:4;24454:20;24450:1;24439:9;24435:17;24428:47;24492:131;24618:4;24492:131;:::i;:::-;24484:139;;24211:419;;;:::o;24636:231::-;24776:34;24772:1;24764:6;24760:14;24753:58;24845:14;24840:2;24832:6;24828:15;24821:39;24636:231;:::o;24873:366::-;25015:3;25036:67;25100:2;25095:3;25036:67;:::i;:::-;25029:74;;25112:93;25201:3;25112:93;:::i;:::-;25230:2;25225:3;25221:12;25214:19;;24873:366;;;:::o;25245:419::-;25411:4;25449:2;25438:9;25434:18;25426:26;;25498:9;25492:4;25488:20;25484:1;25473:9;25469:17;25462:47;25526:131;25652:4;25526:131;:::i;:::-;25518:139;;25245:419;;;:::o;25670:228::-;25810:34;25806:1;25798:6;25794:14;25787:58;25879:11;25874:2;25866:6;25862:15;25855:36;25670:228;:::o;25904:366::-;26046:3;26067:67;26131:2;26126:3;26067:67;:::i;:::-;26060:74;;26143:93;26232:3;26143:93;:::i;:::-;26261:2;26256:3;26252:12;26245:19;;25904:366;;;:::o;26276:419::-;26442:4;26480:2;26469:9;26465:18;26457:26;;26529:9;26523:4;26519:20;26515:1;26504:9;26500:17;26493:47;26557:131;26683:4;26557:131;:::i;:::-;26549:139;;26276:419;;;:::o;26701:175::-;26841:27;26837:1;26829:6;26825:14;26818:51;26701:175;:::o;26882:366::-;27024:3;27045:67;27109:2;27104:3;27045:67;:::i;:::-;27038:74;;27121:93;27210:3;27121:93;:::i;:::-;27239:2;27234:3;27230:12;27223:19;;26882:366;;;:::o;27254:419::-;27420:4;27458:2;27447:9;27443:18;27435:26;;27507:9;27501:4;27497:20;27493:1;27482:9;27478:17;27471:47;27535:131;27661:4;27535:131;:::i;:::-;27527:139;;27254:419;;;:::o;27679:178::-;27819:30;27815:1;27807:6;27803:14;27796:54;27679:178;:::o;27863:366::-;28005:3;28026:67;28090:2;28085:3;28026:67;:::i;:::-;28019:74;;28102:93;28191:3;28102:93;:::i;:::-;28220:2;28215:3;28211:12;28204:19;;27863:366;;;:::o;28235:419::-;28401:4;28439:2;28428:9;28424:18;28416:26;;28488:9;28482:4;28478:20;28474:1;28463:9;28459:17;28452:47;28516:131;28642:4;28516:131;:::i;:::-;28508:139;;28235:419;;;:::o;28660:170::-;28800:22;28796:1;28788:6;28784:14;28777:46;28660:170;:::o;28836:366::-;28978:3;28999:67;29063:2;29058:3;28999:67;:::i;:::-;28992:74;;29075:93;29164:3;29075:93;:::i;:::-;29193:2;29188:3;29184:12;29177:19;;28836:366;;;:::o;29208:419::-;29374:4;29412:2;29401:9;29397:18;29389:26;;29461:9;29455:4;29451:20;29447:1;29436:9;29432:17;29425:47;29489:131;29615:4;29489:131;:::i;:::-;29481:139;;29208:419;;;:::o;29633:332::-;29754:4;29792:2;29781:9;29777:18;29769:26;;29805:71;29873:1;29862:9;29858:17;29849:6;29805:71;:::i;:::-;29886:72;29954:2;29943:9;29939:18;29930:6;29886:72;:::i;:::-;29633:332;;;;;:::o;29971:308::-;30033:4;30123:18;30115:6;30112:30;30109:56;;;30145:18;;:::i;:::-;30109:56;30183:29;30205:6;30183:29;:::i;:::-;30175:37;;30267:4;30261;30257:15;30249:23;;29971:308;;;:::o;30285:434::-;30374:5;30399:66;30415:49;30457:6;30415:49;:::i;:::-;30399:66;:::i;:::-;30390:75;;30488:6;30481:5;30474:21;30526:4;30519:5;30515:16;30564:3;30555:6;30550:3;30546:16;30543:25;30540:112;;;30571:79;;:::i;:::-;30540:112;30661:52;30706:6;30701:3;30696;30661:52;:::i;:::-;30380:339;30285:434;;;;;:::o;30739:355::-;30806:5;30855:3;30848:4;30840:6;30836:17;30832:27;30822:122;;30863:79;;:::i;:::-;30822:122;30973:6;30967:13;30998:90;31084:3;31076:6;31069:4;31061:6;31057:17;30998:90;:::i;:::-;30989:99;;30812:282;30739:355;;;;:::o;31100:524::-;31180:6;31229:2;31217:9;31208:7;31204:23;31200:32;31197:119;;;31235:79;;:::i;:::-;31197:119;31376:1;31365:9;31361:17;31355:24;31406:18;31398:6;31395:30;31392:117;;;31428:79;;:::i;:::-;31392:117;31533:74;31599:7;31590:6;31579:9;31575:22;31533:74;:::i;:::-;31523:84;;31326:291;31100:524;;;;:::o;31630:225::-;31770:34;31766:1;31758:6;31754:14;31747:58;31839:8;31834:2;31826:6;31822:15;31815:33;31630:225;:::o;31861:366::-;32003:3;32024:67;32088:2;32083:3;32024:67;:::i;:::-;32017:74;;32100:93;32189:3;32100:93;:::i;:::-;32218:2;32213:3;32209:12;32202:19;;31861:366;;;:::o;32233:419::-;32399:4;32437:2;32426:9;32422:18;32414:26;;32486:9;32480:4;32476:20;32472:1;32461:9;32457:17;32450:47;32514:131;32640:4;32514:131;:::i;:::-;32506:139;;32233:419;;;:::o;32658:182::-;32798:34;32794:1;32786:6;32782:14;32775:58;32658:182;:::o;32846:366::-;32988:3;33009:67;33073:2;33068:3;33009:67;:::i;:::-;33002:74;;33085:93;33174:3;33085:93;:::i;:::-;33203:2;33198:3;33194:12;33187:19;;32846:366;;;:::o;33218:419::-;33384:4;33422:2;33411:9;33407:18;33399:26;;33471:9;33465:4;33461:20;33457:1;33446:9;33442:17;33435:47;33499:131;33625:4;33499:131;:::i;:::-;33491:139;;33218:419;;;:::o;33643:224::-;33783:34;33779:1;33771:6;33767:14;33760:58;33852:7;33847:2;33839:6;33835:15;33828:32;33643:224;:::o;33873:366::-;34015:3;34036:67;34100:2;34095:3;34036:67;:::i;:::-;34029:74;;34112:93;34201:3;34112:93;:::i;:::-;34230:2;34225:3;34221:12;34214:19;;33873:366;;;:::o;34245:419::-;34411:4;34449:2;34438:9;34434:18;34426:26;;34498:9;34492:4;34488:20;34484:1;34473:9;34469:17;34462:47;34526:131;34652:4;34526:131;:::i;:::-;34518:139;;34245:419;;;:::o;34670:223::-;34810:34;34806:1;34798:6;34794:14;34787:58;34879:6;34874:2;34866:6;34862:15;34855:31;34670:223;:::o;34899:366::-;35041:3;35062:67;35126:2;35121:3;35062:67;:::i;:::-;35055:74;;35138:93;35227:3;35138:93;:::i;:::-;35256:2;35251:3;35247:12;35240:19;;34899:366;;;:::o;35271:419::-;35437:4;35475:2;35464:9;35460:18;35452:26;;35524:9;35518:4;35514:20;35510:1;35499:9;35495:17;35488:47;35552:131;35678:4;35552:131;:::i;:::-;35544:139;;35271:419;;;:::o;35696:180::-;35744:77;35741:1;35734:88;35841:4;35838:1;35831:15;35865:4;35862:1;35855:15;35882:176;35914:1;35931:20;35949:1;35931:20;:::i;:::-;35926:25;;35965:20;35983:1;35965:20;:::i;:::-;35960:25;;36004:1;35994:35;;36009:18;;:::i;:::-;35994:35;36050:1;36047;36043:9;36038:14;;35882:176;;;;:::o;36064:180::-;36112:77;36109:1;36102:88;36209:4;36206:1;36199:15;36233:4;36230:1;36223:15;36250:191;36290:3;36309:20;36327:1;36309:20;:::i;:::-;36304:25;;36343:20;36361:1;36343:20;:::i;:::-;36338:25;;36386:1;36383;36379:9;36372:16;;36407:3;36404:1;36401:10;36398:36;;;36414:18;;:::i;:::-;36398:36;36250:191;;;;:::o;36447:410::-;36487:7;36510:20;36528:1;36510:20;:::i;:::-;36505:25;;36544:20;36562:1;36544:20;:::i;:::-;36539:25;;36599:1;36596;36592:9;36621:30;36639:11;36621:30;:::i;:::-;36610:41;;36800:1;36791:7;36787:15;36784:1;36781:22;36761:1;36754:9;36734:83;36711:139;;36830:18;;:::i;:::-;36711:139;36495:362;36447:410;;;;:::o;36863:178::-;37003:30;36999:1;36991:6;36987:14;36980:54;36863:178;:::o;37047:366::-;37189:3;37210:67;37274:2;37269:3;37210:67;:::i;:::-;37203:74;;37286:93;37375:3;37286:93;:::i;:::-;37404:2;37399:3;37395:12;37388:19;;37047:366;;;:::o;37419:419::-;37585:4;37623:2;37612:9;37608:18;37600:26;;37672:9;37666:4;37662:20;37658:1;37647:9;37643:17;37636:47;37700:131;37826:4;37700:131;:::i;:::-;37692:139;;37419:419;;;:::o;37844:237::-;37984:34;37980:1;37972:6;37968:14;37961:58;38053:20;38048:2;38040:6;38036:15;38029:45;37844:237;:::o;38087:366::-;38229:3;38250:67;38314:2;38309:3;38250:67;:::i;:::-;38243:74;;38326:93;38415:3;38326:93;:::i;:::-;38444:2;38439:3;38435:12;38428:19;;38087:366;;;:::o;38459:419::-;38625:4;38663:2;38652:9;38648:18;38640:26;;38712:9;38706:4;38702:20;38698:1;38687:9;38683:17;38676:47;38740:131;38866:4;38740:131;:::i;:::-;38732:139;;38459:419;;;:::o;38884:194::-;38924:4;38944:20;38962:1;38944:20;:::i;:::-;38939:25;;38978:20;38996:1;38978:20;:::i;:::-;38973:25;;39022:1;39019;39015:9;39007:17;;39046:1;39040:4;39037:11;39034:37;;;39051:18;;:::i;:::-;39034:37;38884:194;;;;:::o;39084:77::-;39121:7;39150:5;39139:16;;39084:77;;;:::o;39167:79::-;39206:7;39235:5;39224:16;;39167:79;;;:::o;39252:157::-;39357:45;39377:24;39395:5;39377:24;:::i;:::-;39357:45;:::i;:::-;39352:3;39345:58;39252:157;;:::o;39415:79::-;39454:7;39483:5;39472:16;;39415:79;;;:::o;39500:157::-;39605:45;39625:24;39643:5;39625:24;:::i;:::-;39605:45;:::i;:::-;39600:3;39593:58;39500:157;;:::o;39663:397::-;39803:3;39818:75;39889:3;39880:6;39818:75;:::i;:::-;39918:2;39913:3;39909:12;39902:19;;39931:75;40002:3;39993:6;39931:75;:::i;:::-;40031:2;40026:3;40022:12;40015:19;;40051:3;40044:10;;39663:397;;;;;:::o;40066:98::-;40117:6;40151:5;40145:12;40135:22;;40066:98;;;:::o;40170:168::-;40253:11;40287:6;40282:3;40275:19;40327:4;40322:3;40318:14;40303:29;;40170:168;;;;:::o;40344:373::-;40430:3;40458:38;40490:5;40458:38;:::i;:::-;40512:70;40575:6;40570:3;40512:70;:::i;:::-;40505:77;;40591:65;40649:6;40644:3;40637:4;40630:5;40626:16;40591:65;:::i;:::-;40681:29;40703:6;40681:29;:::i;:::-;40676:3;40672:39;40665:46;;40434:283;40344:373;;;;:::o;40723:640::-;40918:4;40956:3;40945:9;40941:19;40933:27;;40970:71;41038:1;41027:9;41023:17;41014:6;40970:71;:::i;:::-;41051:72;41119:2;41108:9;41104:18;41095:6;41051:72;:::i;:::-;41133;41201:2;41190:9;41186:18;41177:6;41133:72;:::i;:::-;41252:9;41246:4;41242:20;41237:2;41226:9;41222:18;41215:48;41280:76;41351:4;41342:6;41280:76;:::i;:::-;41272:84;;40723:640;;;;;;;:::o;41369:141::-;41425:5;41456:6;41450:13;41441:22;;41472:32;41498:5;41472:32;:::i;:::-;41369:141;;;;:::o;41516:349::-;41585:6;41634:2;41622:9;41613:7;41609:23;41605:32;41602:119;;;41640:79;;:::i;:::-;41602:119;41760:1;41785:63;41840:7;41831:6;41820:9;41816:22;41785:63;:::i;:::-;41775:73;;41731:127;41516:349;;;;:::o

Swarm Source

ipfs://913800c4a9bd70240f51351eb27f1920ceed2b703f212400f7960cc68cffa464
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.