ETH Price: $3,117.44 (+1.52%)
Gas: 5 Gwei

Token

Kryptic Kids (Mini Degenerate)
 

Overview

Max Total Supply

2,006 Mini Degenerate

Holders

244

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
wontonsoupwtf.eth
Balance
2 Mini Degenerate
0x3722bc2806edd9a5a7151327a12eaac38c3da089
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:
KKPocketEdition

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: 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: Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: KKPocketEdition.sol


pragma solidity ^0.8.0;






//                                              |                             |                                                
//   .7~   ~!.                                 /#\                 ^!.  :~.  /#\       ~~                                      
//   .5?  7Y:                             ?7    V                  J5: ^J^    V       .5J                                      
//   :5? !?.    ^^ ^~  ~^   ^~  :~.:~^   ~YJ^  .~.    :~!^.        ?5 ^?.    .^.   :~^^5?    .^:.                              
//   :5J7P^     YP?~^  !P^ ^P!  ~P7!YP7  ^5J:  :5^  .J5~~Y?        ?5!5!     ^P^  :55^~57   !7::!^                             
//   :5P??5.   .5P^     JY J5   ^P: :5Y  .P7   :5:  ^G?   .        ?P5?5:    :P^  7P? .57   ?J^.                               
//   .5?  JY.  :PP:     .5?P!   ^P:  5J  .PJ   :P:  ^G?            J5. ?5    ^P^  ?G?  5?    .:~?~                             
//    5?  .5Y  :GG^      !G5.   ~G7.~G?   ?GJ: ~G^  .YP~~?~        Y5   5J   ^G^  ~G5:!G?  .!!::YJ                             
//    7~   :7: .7?^      :G!    !G^^!7:    ^?^ :7:   .~!~^         !!   :J:  :7.   !7~^7~   ^7J?!                              
//                      .~YJ     !G:                                                                                            
//                      .!^      ^?.                                                                                            

contract KKPocketEdition is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    string public baseURI;
	string public alteredURI;

  	//Settings
  	uint256 public maxSupply = 8128;
	bool public publicStatus = false;
	bool public podiumStatus = false;
	mapping(uint256 => bool) public krypticKidClaimed;
	mapping(uint256 => uint16) public tokenToKrypticKid;
	mapping(uint16 => uint256) public krypticKidToToken;
	mapping(uint256 => bool) public podiumEnabled;
	mapping(address => bool) public podiumDefaultForAddress;

	//Kryptic Kids Contract
	address public _krypticKidsContract = 0x67df41EDf21e1c581A77E939f60db7bAa5E96993;
	ERC721A private DEGENERATE = ERC721A(_krypticKidsContract);

	//Token
	constructor(
	string memory _name,
	string memory _symbol,
	string memory _initBaseURI,
	string memory _initAlteredURI
	) 
    ERC721A(_name, _symbol)
	{
	    baseURI = _initBaseURI;
		alteredURI = _initAlteredURI;
	}

	//Reading Functions
	function getKKBalanceOfAddress(address addr) public view returns(uint) {
		uint256 bal = DEGENERATE.balanceOf(addr);
		return bal;
	}

	function getKKOwner(uint16 token) public view returns(address) {
		address owner = DEGENERATE.ownerOf(token);
		return owner;
	}

	function checkIfClaimed(uint16 degen) public view returns(bool) {
		bool claimed = krypticKidClaimed[degen];
		return claimed;
	}

	function getPEParent(uint16 degen) public view returns(uint) {
		uint parent = tokenToKrypticKid[degen];
		return parent;
	}

	function getKKChild(uint16 degen) public view returns(uint) {
		uint child = krypticKidToToken[degen];
		return child;
	}

	function getPodiumValue(uint16 degen) public view returns(bool) {
		bool value = podiumEnabled[degen];
		return value;
	}

	function getDefaultPodiumValue(address _address) public view returns(bool) {
		bool value = podiumDefaultForAddress[_address];
		return value;
 	}		
	
	//Claim Single
	function claimSinglePE(uint16 degen) public nonReentrant {
		require(publicStatus == true, "Public status is not true");
		require(DEGENERATE.ownerOf(degen) == msg.sender, "Sender does not own specified token");
		require(krypticKidClaimed[degen] == false, "Already claimed with set token");
		//Align Pocket Edition to Kryptic Kid Metadata
		tokenToKrypticKid[totalSupply()] = degen;
		krypticKidToToken[degen] = totalSupply();
		//Set Kryptic Kid used to Claimed
		krypticKidClaimed[degen] = true;
		_safeMint(msg.sender, 1, "");
	}

	//Claim Multiple
	function claimMultiplePE(uint16[] calldata degens) public nonReentrant {
		require(publicStatus == true, "Public status is not true");
		require(degens.length <= 10, "Max claim at a time is 10");
		require(degens.length > 1, "Multi claim for 2+ tokens");

		uint currentSupply = totalSupply();

		//Check Tokens
		for(uint tokenIndex = 0; tokenIndex < degens.length; tokenIndex++) {
			require(DEGENERATE.ownerOf(degens[tokenIndex]) == msg.sender, "User doesn't own one of specified tokens");
			require(krypticKidClaimed[degens[tokenIndex]] == false, "One of users tokens already claimed");
		}
		//Write Contract Variables for Tokens
		for(uint tokenIndex = 0; tokenIndex < degens.length; tokenIndex++) {
			tokenToKrypticKid[currentSupply + tokenIndex] = degens[tokenIndex];
			krypticKidToToken[degens[tokenIndex]] = currentSupply + tokenIndex;
			krypticKidClaimed[degens[tokenIndex]] = true;
		}
		//Mint Tokens
		_safeMint(msg.sender, degens.length, "");
	}

	//Owner Claims
	function claimSinglePEOwner(uint16 degen) public onlyOwner nonReentrant {
		require(DEGENERATE.ownerOf(degen) == msg.sender, "Sender does not own specified token");
		require(krypticKidClaimed[degen] == false, "Already claimed with set token");
		//Align Pocket Edition to Kryptic Kid Metadata
		tokenToKrypticKid[totalSupply()] = degen;
		krypticKidToToken[degen] = totalSupply();
		//Set Kryptic Kid used to Claimed
		krypticKidClaimed[degen] = true;
		_safeMint(msg.sender, 1, "");
	}

	function claimMultiplePEOwner(uint16[] calldata degens) public onlyOwner nonReentrant {
		require(degens.length <= 10, "Max claim at a time is 10");
		require(degens.length > 1, "Multi claim for 2+ tokens");

		uint currentSupply = totalSupply();

		//Check Tokens
		for(uint tokenIndex = 0; tokenIndex < degens.length; tokenIndex++) {
			require(DEGENERATE.ownerOf(degens[tokenIndex]) == msg.sender, "User doesn't own one of specified tokens");
			require(krypticKidClaimed[degens[tokenIndex]] == false, "One of users tokens already claimed");
		}
		//Write Contract Variables for Tokens
		for(uint tokenIndex = 0; tokenIndex < degens.length; tokenIndex++) {
			tokenToKrypticKid[currentSupply + tokenIndex] = degens[tokenIndex];
			krypticKidToToken[degens[tokenIndex]] = currentSupply + tokenIndex;
			krypticKidClaimed[degens[tokenIndex]] = true;
		}
		//Mint Tokens
		_safeMint(msg.sender, degens.length, "");
	}

	//Toggle Single Podium
	function toggleSinglePodium(uint16 degen) public {
		uint altDegen = krypticKidToToken[degen];
		require(podiumStatus == true, "Podium Toggle not true");
		require(ownerOf(altDegen) == msg.sender, "Doesn't own specified token");
		podiumEnabled[altDegen] = !podiumEnabled[altDegen];
	}

	//Toggle All Podiums
	function toggleAllPodiums() public {
		require(podiumStatus == true, "Podium Toggle not true");
		require(balanceOf(msg.sender) >= 1, "Sender doesn't own Kryptic Kids: PE");
		podiumDefaultForAddress[msg.sender] = !podiumDefaultForAddress[msg.sender];
	}

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

	function _alteredURI() internal view virtual returns (string memory) {
	   return alteredURI;
	}


	function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) {
	   require(tokenId <= maxSupply);
	   string memory currentURI;
       bool defaultStatus = podiumDefaultForAddress[ownerOf(tokenId)];
	   bool singleStatus = podiumEnabled[tokenId];
	   if(defaultStatus == true) {
		   if(singleStatus == true) {
			   currentURI = baseURI;
		   } else  {
			   currentURI = alteredURI;
		   }
	   } else {
		   if(singleStatus == true) {
			   currentURI = alteredURI;
		   } else {
			   currentURI = baseURI;
		   } 
	   }
	   uint256 alteredTokenId = tokenToKrypticKid[tokenId];
	   return bytes(currentURI).length > 0	? string(abi.encodePacked(currentURI, alteredTokenId.toString())) : "";
	}
	
	//Write Metadata
	function setBaseURI(string memory _newBaseURI) public onlyOwner {
	   baseURI = _newBaseURI;
	}

	function setAltURI(string memory _newAltURI) public onlyOwner {
	   alteredURI = _newAltURI;
	}

	//Set Public Status
	function setP(bool _pstatus) public onlyOwner {
		publicStatus = _pstatus;
	}

	function setPodium(bool _pstatus) public onlyOwner {
		podiumStatus = _pstatus;
	}


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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initAlteredURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_krypticKidsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alteredURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"checkIfClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"degens","type":"uint16[]"}],"name":"claimMultiplePE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"degens","type":"uint16[]"}],"name":"claimMultiplePEOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"claimSinglePE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"claimSinglePEOwner","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":"address","name":"_address","type":"address"}],"name":"getDefaultPodiumValue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getKKBalanceOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"getKKChild","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"token","type":"uint16"}],"name":"getKKOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"getPEParent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"getPodiumValue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"krypticKidClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"krypticKidToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"podiumDefaultForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"podiumEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"podiumStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_newAltURI","type":"string"}],"name":"setAltURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pstatus","type":"bool"}],"name":"setP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pstatus","type":"bool"}],"name":"setPodium","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAllPodiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"degen","type":"uint16"}],"name":"toggleSinglePodium","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToKrypticKid","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052611fc0600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055507367df41edf21e1c581a77e939f60db7baa5e96993601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200010557600080fd5b50604051620055303803806200553083398181016040528101906200012b9190620003da565b83836200014d62000141620001db60201b60201c565b620001e360201b60201c565b816003908051906020019062000165929190620002ac565b5080600490805190602001906200017e929190620002ac565b506200018f620002a760201b60201c565b6001819055505050600160098190555081600a9080519060200190620001b7929190620002ac565b5080600b9080519060200190620001d0929190620002ac565b50505050506200064c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002ba906200055d565b90600052602060002090601f016020900481019282620002de57600085556200032a565b82601f10620002f957805160ff19168380011785556200032a565b828001600101855582156200032a579182015b82811115620003295782518255916020019190600101906200030c565b5b5090506200033991906200033d565b5090565b5b80821115620003585760008160009055506001016200033e565b5090565b6000620003736200036d84620004f1565b620004c8565b9050828152602081018484840111156200039257620003916200062c565b5b6200039f84828562000527565b509392505050565b600082601f830112620003bf57620003be62000627565b5b8151620003d18482602086016200035c565b91505092915050565b60008060008060808587031215620003f757620003f662000636565b5b600085015167ffffffffffffffff81111562000418576200041762000631565b5b6200042687828801620003a7565b945050602085015167ffffffffffffffff8111156200044a576200044962000631565b5b6200045887828801620003a7565b935050604085015167ffffffffffffffff8111156200047c576200047b62000631565b5b6200048a87828801620003a7565b925050606085015167ffffffffffffffff811115620004ae57620004ad62000631565b5b620004bc87828801620003a7565b91505092959194509250565b6000620004d4620004e7565b9050620004e2828262000593565b919050565b6000604051905090565b600067ffffffffffffffff8211156200050f576200050e620005f8565b5b6200051a826200063b565b9050602081019050919050565b60005b83811015620005475780820151818401526020810190506200052a565b8381111562000557576000848401525b50505050565b600060028204905060018216806200057657607f821691505b602082108114156200058d576200058c620005c9565b5b50919050565b6200059e826200063b565b810181811067ffffffffffffffff82111715620005c057620005bf620005f8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614ed4806200065c6000396000f3fe60806040526004361061027d5760003560e01c80638745cc781161014f578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb01146109af578063e985e9c5146109da578063f2fde38b14610a17578063f3905b4f14610a40578063f646579714610a7d578063f91798b114610aba5761027d565b8063b88d4fde1461088a578063ba6aeee9146108a6578063bf8ff64c146108cf578063c08698291461090c578063c87b56dd14610949578063c9b40990146109865761027d565b8063a22cb46511610113578063a22cb46514610756578063ab1f55a01461077f578063ab2e7d98146107aa578063b2172f4a146107e7578063b861eb5714610824578063b86d5c59146108615761027d565b80638745cc781461065d5780638da5cb5b1461069a57806395d89b41146106c55780639af7fda7146106f0578063a21ab7d4146107195761027d565b80633a9313a0116101f35780636c0360eb116101ac5780636c0360eb1461054d57806370a0823114610578578063715018a6146105b557806377230480146105cc57806384a303d61461060957806386a40970146106325761027d565b80633a9313a01461045b5780633ccfd60b1461048457806342842e0e1461048e57806355f804b3146104aa5780636352211e146104d3578063682bb6ff146105105761027d565b80630e248ed0116102455780630e248ed01461036e57806310e2b9bc1461038557806318160ddd146103ae57806323b872dd146103d9578063321cbd77146103f557806339b3446f1461041e5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea57806308bb35ae14610327578063095ea7b314610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614028565b610ae5565b6040516102b691906144ca565b60405180910390f35b3480156102cb57600080fd5b506102d4610b77565b6040516102e191906144e5565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906140f8565b610c09565b60405161031e9190614463565b60405180910390f35b34801561033357600080fd5b5061033c610c88565b6040516103499190614463565b60405180910390f35b61036c60048036038101906103679190613f6e565b610cae565b005b34801561037a57600080fd5b50610383610df2565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613fae565b610f3a565b005b3480156103ba57600080fd5b506103c36113e5565b6040516103d091906146dd565b60405180910390f35b6103f360048036038101906103ee9190613e58565b6113fc565b005b34801561040157600080fd5b5061041c600480360381019061041791906140cb565b611721565b005b34801561042a57600080fd5b50610445600480360381019061044091906140f8565b6119fa565b60405161045291906146a7565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613fae565b611a1b565b005b61048c611ea0565b005b6104a860048036038101906104a39190613e58565b611f95565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190614082565b611fb5565b005b3480156104df57600080fd5b506104fa60048036038101906104f591906140f8565b61204b565b6040516105079190614463565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613dbe565b61205d565b60405161054491906144ca565b60405180910390f35b34801561055957600080fd5b506105626120b8565b60405161056f91906144e5565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613dbe565b612146565b6040516105ac91906146dd565b60405180910390f35b3480156105c157600080fd5b506105ca6121ff565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906140cb565b612287565b60405161060091906144ca565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613ffb565b6122ba565b005b34801561063e57600080fd5b50610647612353565b60405161065491906144e5565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f91906140f8565b6123e1565b60405161069191906144ca565b60405180910390f35b3480156106a657600080fd5b506106af612401565b6040516106bc9190614463565b60405180910390f35b3480156106d157600080fd5b506106da61242a565b6040516106e791906144e5565b60405180910390f35b3480156106fc57600080fd5b5061071760048036038101906107129190614082565b6124bc565b005b34801561072557600080fd5b50610740600480360381019061073b9190613dbe565b612552565b60405161074d91906144ca565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190613f2e565b612572565b005b34801561078b57600080fd5b5061079461267d565b6040516107a191906144ca565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc91906140cb565b612690565b6040516107de9190614463565b60405180910390f35b3480156107f357600080fd5b5061080e600480360381019061080991906140cb565b612749565b60405161081b91906146dd565b60405180910390f35b34801561083057600080fd5b5061084b600480360381019061084691906140cb565b612781565b60405161085891906146dd565b60405180910390f35b34801561086d57600080fd5b50610888600480360381019061088391906140cb565b6127ab565b005b6108a4600480360381019061089f9190613eab565b6128e7565b005b3480156108b257600080fd5b506108cd60048036038101906108c891906140cb565b61295a565b005b3480156108db57600080fd5b506108f660048036038101906108f191906140f8565b612c59565b60405161090391906144ca565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613dbe565b612c79565b60405161094091906146dd565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b91906140f8565b612d32565b60405161097d91906144e5565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613ffb565b6130ae565b005b3480156109bb57600080fd5b506109c4613147565b6040516109d191906146dd565b60405180910390f35b3480156109e657600080fd5b50610a0160048036038101906109fc9190613e18565b61314d565b604051610a0e91906144ca565b60405180910390f35b348015610a2357600080fd5b50610a3e6004803603810190610a399190613dbe565b6131e1565b005b348015610a4c57600080fd5b50610a676004803603810190610a6291906140cb565b6132d9565b604051610a7491906144ca565b60405180910390f35b348015610a8957600080fd5b50610aa46004803603810190610a9f91906140cb565b61330c565b604051610ab191906146dd565b60405180910390f35b348015610ac657600080fd5b50610acf613324565b604051610adc91906144ca565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b705750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b869061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb29061495e565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050905090565b6000610c1482613337565b610c4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cb98261204b565b90508073ffffffffffffffffffffffffffffffffffffffff16610cda613396565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d57610d0681610d01613396565b61314d565b610d3c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60011515600d60019054906101000a900460ff16151514610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90614627565b60405180910390fd5b6001610e5333612146565b1015610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906145a7565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610f4261339e565b73ffffffffffffffffffffffffffffffffffffffff16610f60612401565b73ffffffffffffffffffffffffffffffffffffffff1614610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614607565b60405180910390fd5b60026009541415610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614687565b60405180910390fd5b6002600981905550600a82829050111561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290614587565b60405180910390fd5b60018282905011611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890614527565b60405180910390fd5b600061109b6113e5565b905060005b8383905081101561128f573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061111357611112614ac8565b5b905060200201602081019061112891906140cb565b6040518263ffffffff1660e01b815260040161114491906146c2565b60206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190613deb565b73ffffffffffffffffffffffffffffffffffffffff16146111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e1906145c7565b60405180910390fd5b60001515600e600086868581811061120557611204614ac8565b5b905060200201602081019061121a91906140cb565b61ffff16815260200190815260200160002060009054906101000a900460ff1615151461127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127390614647565b60405180910390fd5b8080611287906149c1565b9150506110a0565b5060005b838390508110156113ba578383828181106112b1576112b0614ac8565b5b90506020020160208101906112c691906140cb565b600f600083856112d691906147cd565b815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808261130a91906147cd565b6010600086868581811061132157611320614ac8565b5b905060200201602081019061133691906140cb565b61ffff1661ffff168152602001908152602001600020819055506001600e600086868581811061136957611368614ac8565b5b905060200201602081019061137e91906140cb565b61ffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113b2906149c1565b915050611293565b506113d83384849050604051806020016040528060008152506133a6565b5060016009819055505050565b60006113ef613444565b6002546001540303905090565b600061140782613449565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461146e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061147a84613517565b91509150611490818761148b613396565b61353e565b6114dc576114a5866114a0613396565b61314d565b6114db576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611543576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115508686866001613582565b801561155b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061162985611605888887613588565b7c0200000000000000000000000000000000000000000000000000000000176135b0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156116b15760006001850190506000600560008381526020019081526020016000205414156116af5760015481146116ae578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461171986868660016135db565b505050505050565b60026009541415611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614687565b60405180910390fd5b600260098190555060011515600d60009054906101000a900460ff161515146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90614507565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161183791906146c2565b60206040518083038186803b15801561184f57600080fd5b505afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190613deb565b73ffffffffffffffffffffffffffffffffffffffff16146118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d4906145e7565b60405180910390fd5b60001515600e60008361ffff16815260200190815260200160002060009054906101000a900460ff16151514611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614667565b60405180910390fd5b80600f60006119556113e5565b815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506119856113e5565b601060008361ffff1661ffff168152602001908152602001600020819055506001600e60008361ffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119ef336001604051806020016040528060008152506133a6565b600160098190555050565b600f6020528060005260406000206000915054906101000a900461ffff1681565b60026009541415611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614687565b60405180910390fd5b600260098190555060011515600d60009054906101000a900460ff16151514611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690614507565b60405180910390fd5b600a828290501115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90614587565b60405180910390fd5b60018282905011611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614527565b60405180910390fd5b6000611b566113e5565b905060005b83839050811015611d4a573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868685818110611bce57611bcd614ac8565b5b9050602002016020810190611be391906140cb565b6040518263ffffffff1660e01b8152600401611bff91906146c2565b60206040518083038186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190613deb565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c906145c7565b60405180910390fd5b60001515600e6000868685818110611cc057611cbf614ac8565b5b9050602002016020810190611cd591906140cb565b61ffff16815260200190815260200160002060009054906101000a900460ff16151514611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614647565b60405180910390fd5b8080611d42906149c1565b915050611b5b565b5060005b83839050811015611e7557838382818110611d6c57611d6b614ac8565b5b9050602002016020810190611d8191906140cb565b600f60008385611d9191906147cd565b815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508082611dc591906147cd565b60106000868685818110611ddc57611ddb614ac8565b5b9050602002016020810190611df191906140cb565b61ffff1661ffff168152602001908152602001600020819055506001600e6000868685818110611e2457611e23614ac8565b5b9050602002016020810190611e3991906140cb565b61ffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e6d906149c1565b915050611d4e565b50611e933384849050604051806020016040528060008152506133a6565b5060016009819055505050565b611ea861339e565b73ffffffffffffffffffffffffffffffffffffffff16611ec6612401565b73ffffffffffffffffffffffffffffffffffffffff1614611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614607565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611f429061444e565b60006040518083038185875af1925050503d8060008114611f7f576040519150601f19603f3d011682016040523d82523d6000602084013e611f84565b606091505b5050905080611f9257600080fd5b50565b611fb0838383604051806020016040528060008152506128e7565b505050565b611fbd61339e565b73ffffffffffffffffffffffffffffffffffffffff16611fdb612401565b73ffffffffffffffffffffffffffffffffffffffff1614612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890614607565b60405180910390fd5b80600a9080519060200190612047929190613b3d565b5050565b600061205682613449565b9050919050565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b600a80546120c59061495e565b80601f01602080910402602001604051908101604052809291908181526020018280546120f19061495e565b801561213e5780601f106121135761010080835404028352916020019161213e565b820191906000526020600020905b81548152906001019060200180831161212157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ae576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61220761339e565b73ffffffffffffffffffffffffffffffffffffffff16612225612401565b73ffffffffffffffffffffffffffffffffffffffff161461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614607565b60405180910390fd5b61228560006135e1565b565b600080601160008461ffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b6122c261339e565b73ffffffffffffffffffffffffffffffffffffffff166122e0612401565b73ffffffffffffffffffffffffffffffffffffffff1614612336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d90614607565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600b80546123609061495e565b80601f016020809104026020016040519081016040528092919081815260200182805461238c9061495e565b80156123d95780601f106123ae576101008083540402835291602001916123d9565b820191906000526020600020905b8154815290600101906020018083116123bc57829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546124399061495e565b80601f01602080910402602001604051908101604052809291908181526020018280546124659061495e565b80156124b25780601f10612487576101008083540402835291602001916124b2565b820191906000526020600020905b81548152906001019060200180831161249557829003601f168201915b5050505050905090565b6124c461339e565b73ffffffffffffffffffffffffffffffffffffffff166124e2612401565b73ffffffffffffffffffffffffffffffffffffffff1614612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614607565b60405180910390fd5b80600b908051906020019061254e929190613b3d565b5050565b60126020528060005260406000206000915054906101000a900460ff1681565b806008600061257f613396565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661262c613396565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161267191906144ca565b60405180910390a35050565b600d60019054906101000a900460ff1681565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016126ee91906146c2565b60206040518083038186803b15801561270657600080fd5b505afa15801561271a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273e9190613deb565b905080915050919050565b600080600f60008461ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16905080915050919050565b600080601060008461ffff1661ffff16815260200190815260200160002054905080915050919050565b6000601060008361ffff1661ffff16815260200190815260200160002054905060011515600d60019054906101000a900460ff16151514612821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281890614627565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166128418261204b565b73ffffffffffffffffffffffffffffffffffffffff1614612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614567565b60405180910390fd5b6011600082815260200190815260200160002060009054906101000a900460ff16156011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6128f28484846113fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129545761291d848484846136a5565b612953576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61296261339e565b73ffffffffffffffffffffffffffffffffffffffff16612980612401565b73ffffffffffffffffffffffffffffffffffffffff16146129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90614607565b60405180910390fd5b60026009541415612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1390614687565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612a9691906146c2565b60206040518083038186803b158015612aae57600080fd5b505afa158015612ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae69190613deb565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906145e7565b60405180910390fd5b60001515600e60008361ffff16815260200190815260200160002060009054906101000a900460ff16151514612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90614667565b60405180910390fd5b80600f6000612bb46113e5565b815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550612be46113e5565b601060008361ffff1661ffff168152602001908152602001600020819055506001600e60008361ffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612c4e336001604051806020016040528060008152506133a6565b600160098190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612cd79190614463565b60206040518083038186803b158015612cef57600080fd5b505afa158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190614125565b905080915050919050565b6060600c54821115612d4357600080fd5b6060600060126000612d548661204b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060006011600086815260200190815260200160002060009054906101000a900460ff169050600115158215151415612f0257600115158115151415612e6f57600a8054612dea9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612e169061495e565b8015612e635780601f10612e3857610100808354040283529160200191612e63565b820191906000526020600020905b815481529060010190602001808311612e4657829003601f168201915b50505050509250612efd565b600b8054612e7c9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea89061495e565b8015612ef55780601f10612eca57610100808354040283529160200191612ef5565b820191906000526020600020905b815481529060010190602001808311612ed857829003601f168201915b505050505092505b613030565b600115158115151415612fa157600b8054612f1c9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f489061495e565b8015612f955780601f10612f6a57610100808354040283529160200191612f95565b820191906000526020600020905b815481529060010190602001808311612f7857829003601f168201915b5050505050925061302f565b600a8054612fae9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612fda9061495e565b80156130275780601f10612ffc57610100808354040283529160200191613027565b820191906000526020600020905b81548152906001019060200180831161300a57829003601f168201915b505050505092505b5b6000600f600087815260200190815260200160002060009054906101000a900461ffff1661ffff169050600084511161307857604051806020016040528060008152506130a3565b8361308282613805565b60405160200161309392919061442a565b6040516020818303038152906040525b945050505050919050565b6130b661339e565b73ffffffffffffffffffffffffffffffffffffffff166130d4612401565b73ffffffffffffffffffffffffffffffffffffffff161461312a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312190614607565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6131e961339e565b73ffffffffffffffffffffffffffffffffffffffff16613207612401565b73ffffffffffffffffffffffffffffffffffffffff161461325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490614607565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c490614547565b60405180910390fd5b6132d6816135e1565b50565b600080600e60008461ffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b60106020528060005260406000206000915090505481565b600d60009054906101000a900460ff1681565b600081613342613444565b11158015613351575060015482105b801561338f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b6133b08383613966565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461343f5760006001549050600083820390505b6133f160008683806001019450866136a5565b613427576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106133de57816001541461343c57600080fd5b50505b505050565b600090565b60008082905080613458613444565b116134e0576001548110156134df5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156134dd575b60008114156134d35760056000836001900393508381526020019081526020016000205490506134a8565b8092505050613512565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861359f868684613b24565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136cb613396565b8786866040518563ffffffff1660e01b81526004016136ed949392919061447e565b602060405180830381600087803b15801561370757600080fd5b505af192505050801561373857506040513d601f19601f820116820180604052508101906137359190614055565b60015b6137b2573d8060008114613768576040519150601f19603f3d011682016040523d82523d6000602084013e61376d565b606091505b506000815114156137aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561384d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613961565b600082905060005b6000821461387f578080613868906149c1565b915050600a826138789190614823565b9150613855565b60008167ffffffffffffffff81111561389b5761389a614af7565b5b6040519080825280601f01601f1916602001820160405280156138cd5781602001600182028036833780820191505090505b5090505b6000851461395a576001826138e69190614854565b9150600a856138f59190614a0a565b603061390191906147cd565b60f81b81838151811061391757613916614ac8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139539190614823565b94506138d1565b8093505050505b919050565b6000600154905060008214156139a8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139b56000848385613582565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a2c83613a1d6000866000613588565b613a2685613b2d565b176135b0565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613acd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613a92565b506000821415613b09576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050613b1f60008483856135db565b505050565b60009392505050565b60006001821460e11b9050919050565b828054613b499061495e565b90600052602060002090601f016020900481019282613b6b5760008555613bb2565b82601f10613b8457805160ff1916838001178555613bb2565b82800160010185558215613bb2579182015b82811115613bb1578251825591602001919060010190613b96565b5b509050613bbf9190613bc3565b5090565b5b80821115613bdc576000816000905550600101613bc4565b5090565b6000613bf3613bee8461471d565b6146f8565b905082815260208101848484011115613c0f57613c0e614b35565b5b613c1a84828561491c565b509392505050565b6000613c35613c308461474e565b6146f8565b905082815260208101848484011115613c5157613c50614b35565b5b613c5c84828561491c565b509392505050565b600081359050613c7381614e2b565b92915050565b600081519050613c8881614e2b565b92915050565b60008083601f840112613ca457613ca3614b2b565b5b8235905067ffffffffffffffff811115613cc157613cc0614b26565b5b602083019150836020820283011115613cdd57613cdc614b30565b5b9250929050565b600081359050613cf381614e42565b92915050565b600081359050613d0881614e59565b92915050565b600081519050613d1d81614e59565b92915050565b600082601f830112613d3857613d37614b2b565b5b8135613d48848260208601613be0565b91505092915050565b600082601f830112613d6657613d65614b2b565b5b8135613d76848260208601613c22565b91505092915050565b600081359050613d8e81614e70565b92915050565b600081359050613da381614e87565b92915050565b600081519050613db881614e87565b92915050565b600060208284031215613dd457613dd3614b3f565b5b6000613de284828501613c64565b91505092915050565b600060208284031215613e0157613e00614b3f565b5b6000613e0f84828501613c79565b91505092915050565b60008060408385031215613e2f57613e2e614b3f565b5b6000613e3d85828601613c64565b9250506020613e4e85828601613c64565b9150509250929050565b600080600060608486031215613e7157613e70614b3f565b5b6000613e7f86828701613c64565b9350506020613e9086828701613c64565b9250506040613ea186828701613d94565b9150509250925092565b60008060008060808587031215613ec557613ec4614b3f565b5b6000613ed387828801613c64565b9450506020613ee487828801613c64565b9350506040613ef587828801613d94565b925050606085013567ffffffffffffffff811115613f1657613f15614b3a565b5b613f2287828801613d23565b91505092959194509250565b60008060408385031215613f4557613f44614b3f565b5b6000613f5385828601613c64565b9250506020613f6485828601613ce4565b9150509250929050565b60008060408385031215613f8557613f84614b3f565b5b6000613f9385828601613c64565b9250506020613fa485828601613d94565b9150509250929050565b60008060208385031215613fc557613fc4614b3f565b5b600083013567ffffffffffffffff811115613fe357613fe2614b3a565b5b613fef85828601613c8e565b92509250509250929050565b60006020828403121561401157614010614b3f565b5b600061401f84828501613ce4565b91505092915050565b60006020828403121561403e5761403d614b3f565b5b600061404c84828501613cf9565b91505092915050565b60006020828403121561406b5761406a614b3f565b5b600061407984828501613d0e565b91505092915050565b60006020828403121561409857614097614b3f565b5b600082013567ffffffffffffffff8111156140b6576140b5614b3a565b5b6140c284828501613d51565b91505092915050565b6000602082840312156140e1576140e0614b3f565b5b60006140ef84828501613d7f565b91505092915050565b60006020828403121561410e5761410d614b3f565b5b600061411c84828501613d94565b91505092915050565b60006020828403121561413b5761413a614b3f565b5b600061414984828501613da9565b91505092915050565b61415b81614888565b82525050565b61416a8161489a565b82525050565b600061417b8261477f565b6141858185614795565b935061419581856020860161492b565b61419e81614b44565b840191505092915050565b60006141b48261478a565b6141be81856147b1565b93506141ce81856020860161492b565b6141d781614b44565b840191505092915050565b60006141ed8261478a565b6141f781856147c2565b935061420781856020860161492b565b80840191505092915050565b60006142206019836147b1565b915061422b82614b55565b602082019050919050565b60006142436019836147b1565b915061424e82614b7e565b602082019050919050565b60006142666026836147b1565b915061427182614ba7565b604082019050919050565b6000614289601b836147b1565b915061429482614bf6565b602082019050919050565b60006142ac6019836147b1565b91506142b782614c1f565b602082019050919050565b60006142cf6023836147b1565b91506142da82614c48565b604082019050919050565b60006142f26028836147b1565b91506142fd82614c97565b604082019050919050565b60006143156023836147b1565b915061432082614ce6565b604082019050919050565b60006143386020836147b1565b915061434382614d35565b602082019050919050565b600061435b6016836147b1565b915061436682614d5e565b602082019050919050565b600061437e6000836147a6565b915061438982614d87565b600082019050919050565b60006143a16023836147b1565b91506143ac82614d8a565b604082019050919050565b60006143c4601e836147b1565b91506143cf82614dd9565b602082019050919050565b60006143e7601f836147b1565b91506143f282614e02565b602082019050919050565b614406816148d2565b82525050565b6144158161490a565b82525050565b61442481614900565b82525050565b600061443682856141e2565b915061444282846141e2565b91508190509392505050565b600061445982614371565b9150819050919050565b60006020820190506144786000830184614152565b92915050565b60006080820190506144936000830187614152565b6144a06020830186614152565b6144ad604083018561441b565b81810360608301526144bf8184614170565b905095945050505050565b60006020820190506144df6000830184614161565b92915050565b600060208201905081810360008301526144ff81846141a9565b905092915050565b6000602082019050818103600083015261452081614213565b9050919050565b6000602082019050818103600083015261454081614236565b9050919050565b6000602082019050818103600083015261456081614259565b9050919050565b600060208201905081810360008301526145808161427c565b9050919050565b600060208201905081810360008301526145a08161429f565b9050919050565b600060208201905081810360008301526145c0816142c2565b9050919050565b600060208201905081810360008301526145e0816142e5565b9050919050565b6000602082019050818103600083015261460081614308565b9050919050565b600060208201905081810360008301526146208161432b565b9050919050565b600060208201905081810360008301526146408161434e565b9050919050565b6000602082019050818103600083015261466081614394565b9050919050565b60006020820190508181036000830152614680816143b7565b9050919050565b600060208201905081810360008301526146a0816143da565b9050919050565b60006020820190506146bc60008301846143fd565b92915050565b60006020820190506146d7600083018461440c565b92915050565b60006020820190506146f2600083018461441b565b92915050565b6000614702614713565b905061470e8282614990565b919050565b6000604051905090565b600067ffffffffffffffff82111561473857614737614af7565b5b61474182614b44565b9050602081019050919050565b600067ffffffffffffffff82111561476957614768614af7565b5b61477282614b44565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147d882614900565b91506147e383614900565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561481857614817614a3b565b5b828201905092915050565b600061482e82614900565b915061483983614900565b92508261484957614848614a6a565b5b828204905092915050565b600061485f82614900565b915061486a83614900565b92508282101561487d5761487c614a3b565b5b828203905092915050565b6000614893826148e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614915826148d2565b9050919050565b82818337600083830152505050565b60005b8381101561494957808201518184015260208101905061492e565b83811115614958576000848401525b50505050565b6000600282049050600182168061497657607f821691505b6020821081141561498a57614989614a99565b5b50919050565b61499982614b44565b810181811067ffffffffffffffff821117156149b8576149b7614af7565b5b80604052505050565b60006149cc82614900565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149ff576149fe614a3b565b5b600182019050919050565b6000614a1582614900565b9150614a2083614900565b925082614a3057614a2f614a6a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c696320737461747573206973206e6f74207472756500000000000000600082015250565b7f4d756c746920636c61696d20666f7220322b20746f6b656e7300000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f446f65736e2774206f776e2073706563696669656420746f6b656e0000000000600082015250565b7f4d617820636c61696d20617420612074696d6520697320313000000000000000600082015250565b7f53656e64657220646f65736e2774206f776e204b727970746963204b6964733a60008201527f2050450000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220646f65736e2774206f776e206f6e65206f6620737065636966696560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f53656e64657220646f6573206e6f74206f776e2073706563696669656420746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506f6469756d20546f67676c65206e6f74207472756500000000000000000000600082015250565b50565b7f4f6e65206f6620757365727320746f6b656e7320616c726561647920636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b7f416c726561647920636c61696d656420776974682073657420746f6b656e0000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614e3481614888565b8114614e3f57600080fd5b50565b614e4b8161489a565b8114614e5657600080fd5b50565b614e62816148a6565b8114614e6d57600080fd5b50565b614e79816148d2565b8114614e8457600080fd5b50565b614e9081614900565b8114614e9b57600080fd5b5056fea264697066735822122022c5f04db2f00e0728fcca118e7c38e0c567edaa5c94a55f26f41c395b4843ac64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4b727970746963204b6964730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d696e6920446567656e65726174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003468747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e636f6d2f4e6f506f6469756d4d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e636f6d2f506f6469756d4d657461646174612f0000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80638745cc781161014f578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb01146109af578063e985e9c5146109da578063f2fde38b14610a17578063f3905b4f14610a40578063f646579714610a7d578063f91798b114610aba5761027d565b8063b88d4fde1461088a578063ba6aeee9146108a6578063bf8ff64c146108cf578063c08698291461090c578063c87b56dd14610949578063c9b40990146109865761027d565b8063a22cb46511610113578063a22cb46514610756578063ab1f55a01461077f578063ab2e7d98146107aa578063b2172f4a146107e7578063b861eb5714610824578063b86d5c59146108615761027d565b80638745cc781461065d5780638da5cb5b1461069a57806395d89b41146106c55780639af7fda7146106f0578063a21ab7d4146107195761027d565b80633a9313a0116101f35780636c0360eb116101ac5780636c0360eb1461054d57806370a0823114610578578063715018a6146105b557806377230480146105cc57806384a303d61461060957806386a40970146106325761027d565b80633a9313a01461045b5780633ccfd60b1461048457806342842e0e1461048e57806355f804b3146104aa5780636352211e146104d3578063682bb6ff146105105761027d565b80630e248ed0116102455780630e248ed01461036e57806310e2b9bc1461038557806318160ddd146103ae57806323b872dd146103d9578063321cbd77146103f557806339b3446f1461041e5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea57806308bb35ae14610327578063095ea7b314610352575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614028565b610ae5565b6040516102b691906144ca565b60405180910390f35b3480156102cb57600080fd5b506102d4610b77565b6040516102e191906144e5565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906140f8565b610c09565b60405161031e9190614463565b60405180910390f35b34801561033357600080fd5b5061033c610c88565b6040516103499190614463565b60405180910390f35b61036c60048036038101906103679190613f6e565b610cae565b005b34801561037a57600080fd5b50610383610df2565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613fae565b610f3a565b005b3480156103ba57600080fd5b506103c36113e5565b6040516103d091906146dd565b60405180910390f35b6103f360048036038101906103ee9190613e58565b6113fc565b005b34801561040157600080fd5b5061041c600480360381019061041791906140cb565b611721565b005b34801561042a57600080fd5b50610445600480360381019061044091906140f8565b6119fa565b60405161045291906146a7565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613fae565b611a1b565b005b61048c611ea0565b005b6104a860048036038101906104a39190613e58565b611f95565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190614082565b611fb5565b005b3480156104df57600080fd5b506104fa60048036038101906104f591906140f8565b61204b565b6040516105079190614463565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613dbe565b61205d565b60405161054491906144ca565b60405180910390f35b34801561055957600080fd5b506105626120b8565b60405161056f91906144e5565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613dbe565b612146565b6040516105ac91906146dd565b60405180910390f35b3480156105c157600080fd5b506105ca6121ff565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906140cb565b612287565b60405161060091906144ca565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613ffb565b6122ba565b005b34801561063e57600080fd5b50610647612353565b60405161065491906144e5565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f91906140f8565b6123e1565b60405161069191906144ca565b60405180910390f35b3480156106a657600080fd5b506106af612401565b6040516106bc9190614463565b60405180910390f35b3480156106d157600080fd5b506106da61242a565b6040516106e791906144e5565b60405180910390f35b3480156106fc57600080fd5b5061071760048036038101906107129190614082565b6124bc565b005b34801561072557600080fd5b50610740600480360381019061073b9190613dbe565b612552565b60405161074d91906144ca565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190613f2e565b612572565b005b34801561078b57600080fd5b5061079461267d565b6040516107a191906144ca565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc91906140cb565b612690565b6040516107de9190614463565b60405180910390f35b3480156107f357600080fd5b5061080e600480360381019061080991906140cb565b612749565b60405161081b91906146dd565b60405180910390f35b34801561083057600080fd5b5061084b600480360381019061084691906140cb565b612781565b60405161085891906146dd565b60405180910390f35b34801561086d57600080fd5b50610888600480360381019061088391906140cb565b6127ab565b005b6108a4600480360381019061089f9190613eab565b6128e7565b005b3480156108b257600080fd5b506108cd60048036038101906108c891906140cb565b61295a565b005b3480156108db57600080fd5b506108f660048036038101906108f191906140f8565b612c59565b60405161090391906144ca565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613dbe565b612c79565b60405161094091906146dd565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b91906140f8565b612d32565b60405161097d91906144e5565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613ffb565b6130ae565b005b3480156109bb57600080fd5b506109c4613147565b6040516109d191906146dd565b60405180910390f35b3480156109e657600080fd5b50610a0160048036038101906109fc9190613e18565b61314d565b604051610a0e91906144ca565b60405180910390f35b348015610a2357600080fd5b50610a3e6004803603810190610a399190613dbe565b6131e1565b005b348015610a4c57600080fd5b50610a676004803603810190610a6291906140cb565b6132d9565b604051610a7491906144ca565b60405180910390f35b348015610a8957600080fd5b50610aa46004803603810190610a9f91906140cb565b61330c565b604051610ab191906146dd565b60405180910390f35b348015610ac657600080fd5b50610acf613324565b604051610adc91906144ca565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b705750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b869061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb29061495e565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050905090565b6000610c1482613337565b610c4a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cb98261204b565b90508073ffffffffffffffffffffffffffffffffffffffff16610cda613396565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d57610d0681610d01613396565b61314d565b610d3c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60011515600d60019054906101000a900460ff16151514610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f90614627565b60405180910390fd5b6001610e5333612146565b1015610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906145a7565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610f4261339e565b73ffffffffffffffffffffffffffffffffffffffff16610f60612401565b73ffffffffffffffffffffffffffffffffffffffff1614610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614607565b60405180910390fd5b60026009541415610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614687565b60405180910390fd5b6002600981905550600a82829050111561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290614587565b60405180910390fd5b60018282905011611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890614527565b60405180910390fd5b600061109b6113e5565b905060005b8383905081101561128f573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061111357611112614ac8565b5b905060200201602081019061112891906140cb565b6040518263ffffffff1660e01b815260040161114491906146c2565b60206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190613deb565b73ffffffffffffffffffffffffffffffffffffffff16146111ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e1906145c7565b60405180910390fd5b60001515600e600086868581811061120557611204614ac8565b5b905060200201602081019061121a91906140cb565b61ffff16815260200190815260200160002060009054906101000a900460ff1615151461127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127390614647565b60405180910390fd5b8080611287906149c1565b9150506110a0565b5060005b838390508110156113ba578383828181106112b1576112b0614ac8565b5b90506020020160208101906112c691906140cb565b600f600083856112d691906147cd565b815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550808261130a91906147cd565b6010600086868581811061132157611320614ac8565b5b905060200201602081019061133691906140cb565b61ffff1661ffff168152602001908152602001600020819055506001600e600086868581811061136957611368614ac8565b5b905060200201602081019061137e91906140cb565b61ffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113b2906149c1565b915050611293565b506113d83384849050604051806020016040528060008152506133a6565b5060016009819055505050565b60006113ef613444565b6002546001540303905090565b600061140782613449565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461146e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061147a84613517565b91509150611490818761148b613396565b61353e565b6114dc576114a5866114a0613396565b61314d565b6114db576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611543576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115508686866001613582565b801561155b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061162985611605888887613588565b7c0200000000000000000000000000000000000000000000000000000000176135b0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156116b15760006001850190506000600560008381526020019081526020016000205414156116af5760015481146116ae578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461171986868660016135db565b505050505050565b60026009541415611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614687565b60405180910390fd5b600260098190555060011515600d60009054906101000a900460ff161515146117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc90614507565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161183791906146c2565b60206040518083038186803b15801561184f57600080fd5b505afa158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190613deb565b73ffffffffffffffffffffffffffffffffffffffff16146118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d4906145e7565b60405180910390fd5b60001515600e60008361ffff16815260200190815260200160002060009054906101000a900460ff16151514611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614667565b60405180910390fd5b80600f60006119556113e5565b815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055506119856113e5565b601060008361ffff1661ffff168152602001908152602001600020819055506001600e60008361ffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119ef336001604051806020016040528060008152506133a6565b600160098190555050565b600f6020528060005260406000206000915054906101000a900461ffff1681565b60026009541415611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614687565b60405180910390fd5b600260098190555060011515600d60009054906101000a900460ff16151514611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690614507565b60405180910390fd5b600a828290501115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90614587565b60405180910390fd5b60018282905011611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614527565b60405180910390fd5b6000611b566113e5565b905060005b83839050811015611d4a573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868685818110611bce57611bcd614ac8565b5b9050602002016020810190611be391906140cb565b6040518263ffffffff1660e01b8152600401611bff91906146c2565b60206040518083038186803b158015611c1757600080fd5b505afa158015611c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4f9190613deb565b73ffffffffffffffffffffffffffffffffffffffff1614611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c906145c7565b60405180910390fd5b60001515600e6000868685818110611cc057611cbf614ac8565b5b9050602002016020810190611cd591906140cb565b61ffff16815260200190815260200160002060009054906101000a900460ff16151514611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614647565b60405180910390fd5b8080611d42906149c1565b915050611b5b565b5060005b83839050811015611e7557838382818110611d6c57611d6b614ac8565b5b9050602002016020810190611d8191906140cb565b600f60008385611d9191906147cd565b815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508082611dc591906147cd565b60106000868685818110611ddc57611ddb614ac8565b5b9050602002016020810190611df191906140cb565b61ffff1661ffff168152602001908152602001600020819055506001600e6000868685818110611e2457611e23614ac8565b5b9050602002016020810190611e3991906140cb565b61ffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e6d906149c1565b915050611d4e565b50611e933384849050604051806020016040528060008152506133a6565b5060016009819055505050565b611ea861339e565b73ffffffffffffffffffffffffffffffffffffffff16611ec6612401565b73ffffffffffffffffffffffffffffffffffffffff1614611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614607565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611f429061444e565b60006040518083038185875af1925050503d8060008114611f7f576040519150601f19603f3d011682016040523d82523d6000602084013e611f84565b606091505b5050905080611f9257600080fd5b50565b611fb0838383604051806020016040528060008152506128e7565b505050565b611fbd61339e565b73ffffffffffffffffffffffffffffffffffffffff16611fdb612401565b73ffffffffffffffffffffffffffffffffffffffff1614612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890614607565b60405180910390fd5b80600a9080519060200190612047929190613b3d565b5050565b600061205682613449565b9050919050565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b600a80546120c59061495e565b80601f01602080910402602001604051908101604052809291908181526020018280546120f19061495e565b801561213e5780601f106121135761010080835404028352916020019161213e565b820191906000526020600020905b81548152906001019060200180831161212157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ae576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61220761339e565b73ffffffffffffffffffffffffffffffffffffffff16612225612401565b73ffffffffffffffffffffffffffffffffffffffff161461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614607565b60405180910390fd5b61228560006135e1565b565b600080601160008461ffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b6122c261339e565b73ffffffffffffffffffffffffffffffffffffffff166122e0612401565b73ffffffffffffffffffffffffffffffffffffffff1614612336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232d90614607565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600b80546123609061495e565b80601f016020809104026020016040519081016040528092919081815260200182805461238c9061495e565b80156123d95780601f106123ae576101008083540402835291602001916123d9565b820191906000526020600020905b8154815290600101906020018083116123bc57829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546124399061495e565b80601f01602080910402602001604051908101604052809291908181526020018280546124659061495e565b80156124b25780601f10612487576101008083540402835291602001916124b2565b820191906000526020600020905b81548152906001019060200180831161249557829003601f168201915b5050505050905090565b6124c461339e565b73ffffffffffffffffffffffffffffffffffffffff166124e2612401565b73ffffffffffffffffffffffffffffffffffffffff1614612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614607565b60405180910390fd5b80600b908051906020019061254e929190613b3d565b5050565b60126020528060005260406000206000915054906101000a900460ff1681565b806008600061257f613396565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661262c613396565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161267191906144ca565b60405180910390a35050565b600d60019054906101000a900460ff1681565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016126ee91906146c2565b60206040518083038186803b15801561270657600080fd5b505afa15801561271a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273e9190613deb565b905080915050919050565b600080600f60008461ffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16905080915050919050565b600080601060008461ffff1661ffff16815260200190815260200160002054905080915050919050565b6000601060008361ffff1661ffff16815260200190815260200160002054905060011515600d60019054906101000a900460ff16151514612821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281890614627565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166128418261204b565b73ffffffffffffffffffffffffffffffffffffffff1614612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614567565b60405180910390fd5b6011600082815260200190815260200160002060009054906101000a900460ff16156011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6128f28484846113fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129545761291d848484846136a5565b612953576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61296261339e565b73ffffffffffffffffffffffffffffffffffffffff16612980612401565b73ffffffffffffffffffffffffffffffffffffffff16146129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd90614607565b60405180910390fd5b60026009541415612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1390614687565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612a9691906146c2565b60206040518083038186803b158015612aae57600080fd5b505afa158015612ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae69190613deb565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906145e7565b60405180910390fd5b60001515600e60008361ffff16815260200190815260200160002060009054906101000a900460ff16151514612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90614667565b60405180910390fd5b80600f6000612bb46113e5565b815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550612be46113e5565b601060008361ffff1661ffff168152602001908152602001600020819055506001600e60008361ffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612c4e336001604051806020016040528060008152506133a6565b600160098190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612cd79190614463565b60206040518083038186803b158015612cef57600080fd5b505afa158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190614125565b905080915050919050565b6060600c54821115612d4357600080fd5b6060600060126000612d548661204b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060006011600086815260200190815260200160002060009054906101000a900460ff169050600115158215151415612f0257600115158115151415612e6f57600a8054612dea9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612e169061495e565b8015612e635780601f10612e3857610100808354040283529160200191612e63565b820191906000526020600020905b815481529060010190602001808311612e4657829003601f168201915b50505050509250612efd565b600b8054612e7c9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ea89061495e565b8015612ef55780601f10612eca57610100808354040283529160200191612ef5565b820191906000526020600020905b815481529060010190602001808311612ed857829003601f168201915b505050505092505b613030565b600115158115151415612fa157600b8054612f1c9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612f489061495e565b8015612f955780601f10612f6a57610100808354040283529160200191612f95565b820191906000526020600020905b815481529060010190602001808311612f7857829003601f168201915b5050505050925061302f565b600a8054612fae9061495e565b80601f0160208091040260200160405190810160405280929190818152602001828054612fda9061495e565b80156130275780601f10612ffc57610100808354040283529160200191613027565b820191906000526020600020905b81548152906001019060200180831161300a57829003601f168201915b505050505092505b5b6000600f600087815260200190815260200160002060009054906101000a900461ffff1661ffff169050600084511161307857604051806020016040528060008152506130a3565b8361308282613805565b60405160200161309392919061442a565b6040516020818303038152906040525b945050505050919050565b6130b661339e565b73ffffffffffffffffffffffffffffffffffffffff166130d4612401565b73ffffffffffffffffffffffffffffffffffffffff161461312a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312190614607565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b600c5481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6131e961339e565b73ffffffffffffffffffffffffffffffffffffffff16613207612401565b73ffffffffffffffffffffffffffffffffffffffff161461325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490614607565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c490614547565b60405180910390fd5b6132d6816135e1565b50565b600080600e60008461ffff16815260200190815260200160002060009054906101000a900460ff16905080915050919050565b60106020528060005260406000206000915090505481565b600d60009054906101000a900460ff1681565b600081613342613444565b11158015613351575060015482105b801561338f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b6133b08383613966565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461343f5760006001549050600083820390505b6133f160008683806001019450866136a5565b613427576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106133de57816001541461343c57600080fd5b50505b505050565b600090565b60008082905080613458613444565b116134e0576001548110156134df5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156134dd575b60008114156134d35760056000836001900393508381526020019081526020016000205490506134a8565b8092505050613512565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861359f868684613b24565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136cb613396565b8786866040518563ffffffff1660e01b81526004016136ed949392919061447e565b602060405180830381600087803b15801561370757600080fd5b505af192505050801561373857506040513d601f19601f820116820180604052508101906137359190614055565b60015b6137b2573d8060008114613768576040519150601f19603f3d011682016040523d82523d6000602084013e61376d565b606091505b506000815114156137aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561384d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613961565b600082905060005b6000821461387f578080613868906149c1565b915050600a826138789190614823565b9150613855565b60008167ffffffffffffffff81111561389b5761389a614af7565b5b6040519080825280601f01601f1916602001820160405280156138cd5781602001600182028036833780820191505090505b5090505b6000851461395a576001826138e69190614854565b9150600a856138f59190614a0a565b603061390191906147cd565b60f81b81838151811061391757613916614ac8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139539190614823565b94506138d1565b8093505050505b919050565b6000600154905060008214156139a8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139b56000848385613582565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a2c83613a1d6000866000613588565b613a2685613b2d565b176135b0565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613acd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613a92565b506000821415613b09576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050613b1f60008483856135db565b505050565b60009392505050565b60006001821460e11b9050919050565b828054613b499061495e565b90600052602060002090601f016020900481019282613b6b5760008555613bb2565b82601f10613b8457805160ff1916838001178555613bb2565b82800160010185558215613bb2579182015b82811115613bb1578251825591602001919060010190613b96565b5b509050613bbf9190613bc3565b5090565b5b80821115613bdc576000816000905550600101613bc4565b5090565b6000613bf3613bee8461471d565b6146f8565b905082815260208101848484011115613c0f57613c0e614b35565b5b613c1a84828561491c565b509392505050565b6000613c35613c308461474e565b6146f8565b905082815260208101848484011115613c5157613c50614b35565b5b613c5c84828561491c565b509392505050565b600081359050613c7381614e2b565b92915050565b600081519050613c8881614e2b565b92915050565b60008083601f840112613ca457613ca3614b2b565b5b8235905067ffffffffffffffff811115613cc157613cc0614b26565b5b602083019150836020820283011115613cdd57613cdc614b30565b5b9250929050565b600081359050613cf381614e42565b92915050565b600081359050613d0881614e59565b92915050565b600081519050613d1d81614e59565b92915050565b600082601f830112613d3857613d37614b2b565b5b8135613d48848260208601613be0565b91505092915050565b600082601f830112613d6657613d65614b2b565b5b8135613d76848260208601613c22565b91505092915050565b600081359050613d8e81614e70565b92915050565b600081359050613da381614e87565b92915050565b600081519050613db881614e87565b92915050565b600060208284031215613dd457613dd3614b3f565b5b6000613de284828501613c64565b91505092915050565b600060208284031215613e0157613e00614b3f565b5b6000613e0f84828501613c79565b91505092915050565b60008060408385031215613e2f57613e2e614b3f565b5b6000613e3d85828601613c64565b9250506020613e4e85828601613c64565b9150509250929050565b600080600060608486031215613e7157613e70614b3f565b5b6000613e7f86828701613c64565b9350506020613e9086828701613c64565b9250506040613ea186828701613d94565b9150509250925092565b60008060008060808587031215613ec557613ec4614b3f565b5b6000613ed387828801613c64565b9450506020613ee487828801613c64565b9350506040613ef587828801613d94565b925050606085013567ffffffffffffffff811115613f1657613f15614b3a565b5b613f2287828801613d23565b91505092959194509250565b60008060408385031215613f4557613f44614b3f565b5b6000613f5385828601613c64565b9250506020613f6485828601613ce4565b9150509250929050565b60008060408385031215613f8557613f84614b3f565b5b6000613f9385828601613c64565b9250506020613fa485828601613d94565b9150509250929050565b60008060208385031215613fc557613fc4614b3f565b5b600083013567ffffffffffffffff811115613fe357613fe2614b3a565b5b613fef85828601613c8e565b92509250509250929050565b60006020828403121561401157614010614b3f565b5b600061401f84828501613ce4565b91505092915050565b60006020828403121561403e5761403d614b3f565b5b600061404c84828501613cf9565b91505092915050565b60006020828403121561406b5761406a614b3f565b5b600061407984828501613d0e565b91505092915050565b60006020828403121561409857614097614b3f565b5b600082013567ffffffffffffffff8111156140b6576140b5614b3a565b5b6140c284828501613d51565b91505092915050565b6000602082840312156140e1576140e0614b3f565b5b60006140ef84828501613d7f565b91505092915050565b60006020828403121561410e5761410d614b3f565b5b600061411c84828501613d94565b91505092915050565b60006020828403121561413b5761413a614b3f565b5b600061414984828501613da9565b91505092915050565b61415b81614888565b82525050565b61416a8161489a565b82525050565b600061417b8261477f565b6141858185614795565b935061419581856020860161492b565b61419e81614b44565b840191505092915050565b60006141b48261478a565b6141be81856147b1565b93506141ce81856020860161492b565b6141d781614b44565b840191505092915050565b60006141ed8261478a565b6141f781856147c2565b935061420781856020860161492b565b80840191505092915050565b60006142206019836147b1565b915061422b82614b55565b602082019050919050565b60006142436019836147b1565b915061424e82614b7e565b602082019050919050565b60006142666026836147b1565b915061427182614ba7565b604082019050919050565b6000614289601b836147b1565b915061429482614bf6565b602082019050919050565b60006142ac6019836147b1565b91506142b782614c1f565b602082019050919050565b60006142cf6023836147b1565b91506142da82614c48565b604082019050919050565b60006142f26028836147b1565b91506142fd82614c97565b604082019050919050565b60006143156023836147b1565b915061432082614ce6565b604082019050919050565b60006143386020836147b1565b915061434382614d35565b602082019050919050565b600061435b6016836147b1565b915061436682614d5e565b602082019050919050565b600061437e6000836147a6565b915061438982614d87565b600082019050919050565b60006143a16023836147b1565b91506143ac82614d8a565b604082019050919050565b60006143c4601e836147b1565b91506143cf82614dd9565b602082019050919050565b60006143e7601f836147b1565b91506143f282614e02565b602082019050919050565b614406816148d2565b82525050565b6144158161490a565b82525050565b61442481614900565b82525050565b600061443682856141e2565b915061444282846141e2565b91508190509392505050565b600061445982614371565b9150819050919050565b60006020820190506144786000830184614152565b92915050565b60006080820190506144936000830187614152565b6144a06020830186614152565b6144ad604083018561441b565b81810360608301526144bf8184614170565b905095945050505050565b60006020820190506144df6000830184614161565b92915050565b600060208201905081810360008301526144ff81846141a9565b905092915050565b6000602082019050818103600083015261452081614213565b9050919050565b6000602082019050818103600083015261454081614236565b9050919050565b6000602082019050818103600083015261456081614259565b9050919050565b600060208201905081810360008301526145808161427c565b9050919050565b600060208201905081810360008301526145a08161429f565b9050919050565b600060208201905081810360008301526145c0816142c2565b9050919050565b600060208201905081810360008301526145e0816142e5565b9050919050565b6000602082019050818103600083015261460081614308565b9050919050565b600060208201905081810360008301526146208161432b565b9050919050565b600060208201905081810360008301526146408161434e565b9050919050565b6000602082019050818103600083015261466081614394565b9050919050565b60006020820190508181036000830152614680816143b7565b9050919050565b600060208201905081810360008301526146a0816143da565b9050919050565b60006020820190506146bc60008301846143fd565b92915050565b60006020820190506146d7600083018461440c565b92915050565b60006020820190506146f2600083018461441b565b92915050565b6000614702614713565b905061470e8282614990565b919050565b6000604051905090565b600067ffffffffffffffff82111561473857614737614af7565b5b61474182614b44565b9050602081019050919050565b600067ffffffffffffffff82111561476957614768614af7565b5b61477282614b44565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147d882614900565b91506147e383614900565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561481857614817614a3b565b5b828201905092915050565b600061482e82614900565b915061483983614900565b92508261484957614848614a6a565b5b828204905092915050565b600061485f82614900565b915061486a83614900565b92508282101561487d5761487c614a3b565b5b828203905092915050565b6000614893826148e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614915826148d2565b9050919050565b82818337600083830152505050565b60005b8381101561494957808201518184015260208101905061492e565b83811115614958576000848401525b50505050565b6000600282049050600182168061497657607f821691505b6020821081141561498a57614989614a99565b5b50919050565b61499982614b44565b810181811067ffffffffffffffff821117156149b8576149b7614af7565b5b80604052505050565b60006149cc82614900565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149ff576149fe614a3b565b5b600182019050919050565b6000614a1582614900565b9150614a2083614900565b925082614a3057614a2f614a6a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c696320737461747573206973206e6f74207472756500000000000000600082015250565b7f4d756c746920636c61696d20666f7220322b20746f6b656e7300000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f446f65736e2774206f776e2073706563696669656420746f6b656e0000000000600082015250565b7f4d617820636c61696d20617420612074696d6520697320313000000000000000600082015250565b7f53656e64657220646f65736e2774206f776e204b727970746963204b6964733a60008201527f2050450000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220646f65736e2774206f776e206f6e65206f6620737065636966696560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f53656e64657220646f6573206e6f74206f776e2073706563696669656420746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506f6469756d20546f67676c65206e6f74207472756500000000000000000000600082015250565b50565b7f4f6e65206f6620757365727320746f6b656e7320616c726561647920636c616960008201527f6d65640000000000000000000000000000000000000000000000000000000000602082015250565b7f416c726561647920636c61696d656420776974682073657420746f6b656e0000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614e3481614888565b8114614e3f57600080fd5b50565b614e4b8161489a565b8114614e5657600080fd5b50565b614e62816148a6565b8114614e6d57600080fd5b50565b614e79816148d2565b8114614e8457600080fd5b50565b614e9081614900565b8114614e9b57600080fd5b5056fea264697066735822122022c5f04db2f00e0728fcca118e7c38e0c567edaa5c94a55f26f41c395b4843ac64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c4b727970746963204b6964730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d696e6920446567656e65726174650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003468747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e636f6d2f4e6f506f6469756d4d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003268747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e636f6d2f506f6469756d4d657461646174612f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Kryptic Kids
Arg [1] : _symbol (string): Mini Degenerate
Arg [2] : _initBaseURI (string): https://kkmetadata.s3.filebase.com/NoPodiumMetadata/
Arg [3] : _initAlteredURI (string): https://kkmetadata.s3.filebase.com/PodiumMetadata/

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 4b727970746963204b6964730000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [7] : 4d696e6920446567656e65726174650000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000034
Arg [9] : 68747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e63
Arg [10] : 6f6d2f4e6f506f6469756d4d657461646174612f000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [12] : 68747470733a2f2f6b6b6d657461646174612e73332e66696c65626173652e63
Arg [13] : 6f6d2f506f6469756d4d657461646174612f0000000000000000000000000000


Deployed Bytecode Sourcemap

60712:7152:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20479:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21381:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27872:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61291:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27305:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66040:258;;;;;;;;;;;;;:::i;:::-;;64756:936;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17132:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31511:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62681:544;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61045:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63249:984;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67702:157;;;:::i;:::-;;34432:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67301:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22774:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62507:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60813:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18316:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58591:94;;;;;;;;;;;;;:::i;:::-;;62378:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67527:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60838:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61155:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21557:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67403:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61204:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28430:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60956:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61844:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62117:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62249:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65722:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35223:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64255:496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60992:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61703:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66533:743;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67611:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60885:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28821:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61980:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61100:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60920:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20479:639;20564:4;20903:10;20888:25;;:11;:25;;;;:102;;;;20980:10;20965:25;;:11;:25;;;;20888:102;:179;;;;21057:10;21042:25;;:11;:25;;;;20888:179;20868:199;;20479:639;;;:::o;21381:100::-;21435:13;21468:5;21461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21381:100;:::o;27872:218::-;27948:7;27973:16;27981:7;27973;:16::i;:::-;27968:64;;27998:34;;;;;;;;;;;;;;27968:64;28052:15;:24;28068:7;28052:24;;;;;;;;;;;:30;;;;;;;;;;;;28045:37;;27872:218;;;:::o;61291:80::-;;;;;;;;;;;;;:::o;27305:408::-;27394:13;27410:16;27418:7;27410;:16::i;:::-;27394:32;;27466:5;27443:28;;:19;:17;:19::i;:::-;:28;;;27439:175;;27491:44;27508:5;27515:19;:17;:19::i;:::-;27491:16;:44::i;:::-;27486:128;;27563:35;;;;;;;;;;;;;;27486:128;27439:175;27659:2;27626:15;:24;27642:7;27626:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;27697:7;27693:2;27677:28;;27686:5;27677:28;;;;;;;;;;;;27383:330;27305:408;;:::o;66040:258::-;66104:4;66088:20;;:12;;;;;;;;;;;:20;;;66080:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66173:1;66148:21;66158:10;66148:9;:21::i;:::-;:26;;66140:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;66258:23;:35;66282:10;66258:35;;;;;;;;;;;;;;;;;;;;;;;;;66257:36;66219:23;:35;66243:10;66219:35;;;;;;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;66040:258::o;64756:936::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1:::1;55820:7;;:19;;55812:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1;55953:7;:18;;;;64872:2:::2;64855:6;;:13;;:19;;64847:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64933:1;64917:6;;:13;;:17;64909:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;64971:18;64992:13;:11;:13::i;:::-;64971:34;;65034:15;65030:284;65068:6;;:13;;65055:10;:26;65030:284;;;65153:10;65111:52;;:10;;;;;;;;;;;:18;;;65130:6;;65137:10;65130:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65111:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;65103:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;65263:5;65222:46;;:17;:37;65240:6;;65247:10;65240:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65222:37;;;;;;;;;;;;;;;;;;;;;;;:46;;;65214:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;65083:12;;;;;:::i;:::-;;;;65030:284;;;;65363:15;65359:267;65397:6;;:13;;65384:10;:26;65359:267;;;65480:6;;65487:10;65480:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65432:17;:45;65466:10;65450:13;:26;;;;:::i;:::-;65432:45;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;65560:10;65544:13;:26;;;;:::i;:::-;65504:17;:37;65522:6;;65529:10;65522:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65504:37;;;;;;;;;;;;;;;:66;;;;65616:4;65576:17;:37;65594:6;;65601:10;65594:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65576:37;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;65412:12;;;;;:::i;:::-;;;;65359:267;;;;65647:40;65657:10;65669:6;;:13;;65647:40;;;;;;;;;;;::::0;:9:::2;:40::i;:::-;64842:850;55180:1:::1;56132:7;:22;;;;64756:936:::0;;:::o;17132:323::-;17193:7;17421:15;:13;:15::i;:::-;17406:12;;17390:13;;:28;:46;17383:53;;17132:323;:::o;31511:2825::-;31653:27;31683;31702:7;31683:18;:27::i;:::-;31653:57;;31768:4;31727:45;;31743:19;31727:45;;;31723:86;;31781:28;;;;;;;;;;;;;;31723:86;31823:27;31852:23;31879:35;31906:7;31879:26;:35::i;:::-;31822:92;;;;32014:68;32039:15;32056:4;32062:19;:17;:19::i;:::-;32014:24;:68::i;:::-;32009:180;;32102:43;32119:4;32125:19;:17;:19::i;:::-;32102:16;:43::i;:::-;32097:92;;32154:35;;;;;;;;;;;;;;32097:92;32009:180;32220:1;32206:16;;:2;:16;;;32202:52;;;32231:23;;;;;;;;;;;;;;32202:52;32267:43;32289:4;32295:2;32299:7;32308:1;32267:21;:43::i;:::-;32403:15;32400:160;;;32543:1;32522:19;32515:30;32400:160;32940:18;:24;32959:4;32940:24;;;;;;;;;;;;;;;;32938:26;;;;;;;;;;;;33009:18;:22;33028:2;33009:22;;;;;;;;;;;;;;;;33007:24;;;;;;;;;;;33331:146;33368:2;33417:45;33432:4;33438:2;33442:19;33417:14;:45::i;:::-;13531:8;33389:73;33331:18;:146::i;:::-;33302:17;:26;33320:7;33302:26;;;;;;;;;;;:175;;;;33648:1;13531:8;33597:19;:47;:52;33593:627;;;33670:19;33702:1;33692:7;:11;33670:33;;33859:1;33825:17;:30;33843:11;33825:30;;;;;;;;;;;;:35;33821:384;;;33963:13;;33948:11;:28;33944:242;;34143:19;34110:17;:30;34128:11;34110:30;;;;;;;;;;;:52;;;;33944:242;33821:384;33651:569;33593:627;34267:7;34263:2;34248:27;;34257:4;34248:27;;;;;;;;;;;;34286:42;34307:4;34313:2;34317:7;34326:1;34286:20;:42::i;:::-;31642:2694;;;31511:2825;;;:::o;62681:544::-;55224:1;55820:7;;:19;;55812:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1;55953:7;:18;;;;62767:4:::1;62751:20;;:12;;;;;;;;;;;:20;;;62743:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62843:10;62814:39;;:10;;;;;;;;;;;:18;;;62833:5;62814:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;62806:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62934:5;62906:33;;:17;:24;62924:5;62906:24;;;;;;;;;;;;;;;;;;;;;;;:33;;;62898:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;63064:5;63029:17;:32;63047:13;:11;:13::i;:::-;63029:32;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;63101:13;:11;:13::i;:::-;63074:17;:24;63092:5;63074:24;;;;;;;;;;;;;;;:40;;;;63183:4;63156:17;:24;63174:5;63156:24;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;63192:28;63202:10;63214:1;63192:28;;;;;;;;;;;::::0;:9:::1;:28::i;:::-;55180:1:::0;56132:7;:22;;;;62681:544;:::o;61045:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;63249:984::-;55224:1;55820:7;;:19;;55812:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1;55953:7;:18;;;;63349:4:::1;63333:20;;:12;;;;;;;;;;;:20;;;63325:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63413:2;63396:6;;:13;;:19;;63388:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;63474:1;63458:6;;:13;;:17;63450:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63512:18;63533:13;:11;:13::i;:::-;63512:34;;63575:15;63571:284;63609:6;;:13;;63596:10;:26;63571:284;;;63694:10;63652:52;;:10;;;;;;;;;;;:18;;;63671:6;;63678:10;63671:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63652:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;63644:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;63804:5;63763:46;;:17;:37;63781:6;;63788:10;63781:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63763:37;;;;;;;;;;;;;;;;;;;;;;;:46;;;63755:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;63624:12;;;;;:::i;:::-;;;;63571:284;;;;63904:15;63900:267;63938:6;;:13;;63925:10;:26;63900:267;;;64021:6;;64028:10;64021:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63973:17;:45;64007:10;63991:13;:26;;;;:::i;:::-;63973:45;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;64101:10;64085:13;:26;;;;:::i;:::-;64045:17;:37;64063:6;;64070:10;64063:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;64045:37;;;;;;;;;;;;;;;:66;;;;64157:4;64117:17;:37;64135:6;;64142:10;64135:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;64117:37;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;63953:12;;;;;:::i;:::-;;;;63900:267;;;;64188:40;64198:10;64210:6;;:13;;64188:40;;;;;;;;;;;::::0;:9:::1;:40::i;:::-;63320:913;55180:1:::0;56132:7;:22;;;;63249:984;;:::o;67702:157::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67755:12:::1;67781:10;67773:24;;67805:21;67773:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67754:77;;;67846:7;67838:16;;;::::0;::::1;;67747:112;67702:157::o:0;34432:193::-;34578:39;34595:4;34601:2;34605:7;34578:39;;;;;;;;;;;;:16;:39::i;:::-;34432:193;;;:::o;67301:97::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67382:11:::1;67372:7;:21;;;;;;;;;;;;:::i;:::-;;67301:97:::0;:::o;22774:152::-;22846:7;22889:27;22908:7;22889:18;:27::i;:::-;22866:52;;22774:152;;;:::o;62507:149::-;62576:4;62587:10;62600:23;:33;62624:8;62600:33;;;;;;;;;;;;;;;;;;;;;;;;;62587:46;;62645:5;62638:12;;;62507:149;;;:::o;60813:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18316:233::-;18388:7;18429:1;18412:19;;:5;:19;;;18408:60;;;18440:28;;;;;;;;;;;;;;18408:60;12475:13;18486:18;:25;18505:5;18486:25;;;;;;;;;;;;;;;;:55;18479:62;;18316:233;;;:::o;58591:94::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58656:21:::1;58674:1;58656:9;:21::i;:::-;58591:94::o:0;62378:124::-;62436:4;62447:10;62460:13;:20;62474:5;62460:20;;;;;;;;;;;;;;;;;;;;;;;62447:33;;62492:5;62485:12;;;62378:124;;;:::o;67527:79::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67593:8:::1;67578:12;;:23;;;;;;;;;;;;;;;;;;67527:79:::0;:::o;60838:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61155:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;57940:87::-;57986:7;58013:6;;;;;;;;;;;58006:13;;57940:87;:::o;21557:104::-;21613:13;21646:7;21639:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21557:104;:::o;67403:97::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67485:10:::1;67472;:23;;;;;;;;;;;;:::i;:::-;;67403:97:::0;:::o;61204:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;28430:234::-;28577:8;28525:18;:39;28544:19;:17;:19::i;:::-;28525:39;;;;;;;;;;;;;;;:49;28565:8;28525:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28637:8;28601:55;;28616:19;:17;:19::i;:::-;28601:55;;;28647:8;28601:55;;;;;;:::i;:::-;;;;;;;;28430:234;;:::o;60956:32::-;;;;;;;;;;;;;:::o;61844:131::-;61898:7;61912:13;61928:10;;;;;;;;;;;:18;;;61947:5;61928:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61912:41;;61965:5;61958:12;;;61844:131;;;:::o;62117:127::-;62172:4;62183:11;62197:17;:24;62215:5;62197:24;;;;;;;;;;;;;;;;;;;;;;;62183:38;;;;62233:6;62226:13;;;62117:127;;;:::o;62249:124::-;62303:4;62314:10;62327:17;:24;62345:5;62327:24;;;;;;;;;;;;;;;;62314:37;;62363:5;62356:12;;;62249:124;;;:::o;65722:290::-;65776:13;65792:17;:24;65810:5;65792:24;;;;;;;;;;;;;;;;65776:40;;65845:4;65829:20;;:12;;;;;;;;;;;:20;;;65821:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;65910:10;65889:31;;:17;65897:8;65889:7;:17::i;:::-;:31;;;65881:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65984:13;:23;65998:8;65984:23;;;;;;;;;;;;;;;;;;;;;65983:24;65957:13;:23;65971:8;65957:23;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;65771:241;65722:290;:::o;35223:407::-;35398:31;35411:4;35417:2;35421:7;35398:12;:31::i;:::-;35462:1;35444:2;:14;;;:19;35440:183;;35483:56;35514:4;35520:2;35524:7;35533:5;35483:30;:56::i;:::-;35478:145;;35567:40;;;;;;;;;;;;;;35478:145;35440:183;35223:407;;;;:::o;64255:496::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1:::1;55820:7;;:19;;55812:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:1;55953:7;:18;;;;64369:10:::2;64340:39;;:10;;;;;;;;;;;:18;;;64359:5;64340:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;64332:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;64460:5;64432:33;;:17;:24;64450:5;64432:24;;;;;;;;;;;;;;;;;;;;;;;:33;;;64424:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64590:5;64555:17;:32;64573:13;:11;:13::i;:::-;64555:32;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;64627:13;:11;:13::i;:::-;64600:17;:24;64618:5;64600:24;;;;;;;;;;;;;;;:40;;;;64709:4;64682:17;:24;64700:5;64682:24;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;64718:28;64728:10;64740:1;64718:28;;;;;;;;;;;::::0;:9:::2;:28::i;:::-;55180:1:::1;56132:7;:22;;;;64255:496:::0;:::o;60992:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;61703:136::-;61768:4;61779:11;61793:10;;;;;;;;;;;:20;;;61814:4;61793:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61779:40;;61831:3;61824:10;;;61703:136;;;:::o;66533:743::-;66607:13;66648:9;;66637:7;:20;;66629:29;;;;;;66665:24;66699:18;66720:23;:41;66744:16;66752:7;66744;:16::i;:::-;66720:41;;;;;;;;;;;;;;;;;;;;;;;;;66699:62;;66768:17;66788:13;:22;66802:7;66788:22;;;;;;;;;;;;;;;;;;;;;66768:42;;66837:4;66820:21;;:13;:21;;;66817:284;;;66870:4;66854:20;;:12;:20;;;66851:111;;;66898:7;66885:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66851:111;;;66943:10;66930:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66851:111;66817:284;;;67002:4;66986:20;;:12;:20;;;66983:110;;;67030:10;67017:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66983:110;;;67077:7;67064:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66983:110;66817:284;67107:22;67132:17;:26;67150:7;67132:26;;;;;;;;;;;;;;;;;;;;;67107:51;;;;67199:1;67178:10;67172:24;:28;:99;;;;;;;;;;;;;;;;;67227:10;67239:25;:14;:23;:25::i;:::-;67210:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67172:99;67165:106;;;;;;66533:743;;;:::o;67611:84::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67682:8:::1;67667:12;;:23;;;;;;;;;;;;;;;;;;67611:84:::0;:::o;60885:31::-;;;;:::o;28821:164::-;28918:4;28942:18;:25;28961:5;28942:25;;;;;;;;;;;;;;;:35;28968:8;28942:35;;;;;;;;;;;;;;;;;;;;;;;;;28935:42;;28821:164;;;;:::o;58840:192::-;58171:12;:10;:12::i;:::-;58160:23;;:7;:5;:7::i;:::-;:23;;;58152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58949:1:::1;58929:22;;:8;:22;;;;58921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59005:19;59015:8;59005:9;:19::i;:::-;58840:192:::0;:::o;61980:132::-;62038:4;62049:12;62064:17;:24;62082:5;62064:24;;;;;;;;;;;;;;;;;;;;;;;62049:39;;62100:7;62093:14;;;61980:132;;;:::o;61100:51::-;;;;;;;;;;;;;;;;;:::o;60920:32::-;;;;;;;;;;;;;:::o;29243:282::-;29308:4;29364:7;29345:15;:13;:15::i;:::-;:26;;:66;;;;;29398:13;;29388:7;:23;29345:66;:153;;;;;29497:1;13251:8;29449:17;:26;29467:7;29449:26;;;;;;;;;;;;:44;:49;29345:153;29325:173;;29243:282;;;:::o;51551:105::-;51611:7;51638:10;51631:17;;51551:105;:::o;56761:98::-;56814:7;56841:10;56834:17;;56761:98;:::o;44610:689::-;44741:19;44747:2;44751:8;44741:5;:19::i;:::-;44820:1;44802:2;:14;;;:19;44798:483;;44842:11;44856:13;;44842:27;;44888:13;44910:8;44904:3;:14;44888:30;;44937:233;44968:62;45007:1;45011:2;45015:7;;;;;;45024:5;44968:30;:62::i;:::-;44963:167;;45066:40;;;;;;;;;;;;;;44963:167;45165:3;45157:5;:11;44937:233;;45252:3;45235:13;;:20;45231:34;;45257:8;;;45231:34;44823:458;;44798:483;44610:689;;;:::o;16648:92::-;16704:7;16648:92;:::o;23929:1275::-;23996:7;24016:12;24031:7;24016:22;;24099:4;24080:15;:13;:15::i;:::-;:23;24076:1061;;24133:13;;24126:4;:20;24122:1015;;;24171:14;24188:17;:23;24206:4;24188:23;;;;;;;;;;;;24171:40;;24305:1;13251:8;24277:6;:24;:29;24273:845;;;24942:113;24959:1;24949:6;:11;24942:113;;;25002:17;:25;25020:6;;;;;;;25002:25;;;;;;;;;;;;24993:34;;24942:113;;;25088:6;25081:13;;;;;;24273:845;24148:989;24122:1015;24076:1061;25165:31;;;;;;;;;;;;;;23929:1275;;;;:::o;30406:485::-;30508:27;30537:23;30578:38;30619:15;:24;30635:7;30619:24;;;;;;;;;;;30578:65;;30796:18;30773:41;;30853:19;30847:26;30828:45;;30758:126;30406:485;;;:::o;29634:659::-;29783:11;29948:16;29941:5;29937:28;29928:37;;30108:16;30097:9;30093:32;30080:45;;30258:15;30247:9;30244:30;30236:5;30225:9;30222:20;30219:56;30209:66;;29634:659;;;;;:::o;36292:159::-;;;;;:::o;50860:311::-;50995:7;51015:16;13655:3;51041:19;:41;;51015:68;;13655:3;51109:31;51120:4;51126:2;51130:9;51109:10;:31::i;:::-;51101:40;;:62;;51094:69;;;50860:311;;;;;:::o;25752:450::-;25832:14;26000:16;25993:5;25989:28;25980:37;;26177:5;26163:11;26138:23;26134:41;26131:52;26124:5;26121:63;26111:73;;25752:450;;;;:::o;37116:158::-;;;;;:::o;59040:173::-;59096:16;59115:6;;;;;;;;;;;59096:25;;59141:8;59132:6;;:17;;;;;;;;;;;;;;;;;;59196:8;59165:40;;59186:8;59165:40;;;;;;;;;;;;59085:128;59040:173;:::o;37714:716::-;37877:4;37923:2;37898:45;;;37944:19;:17;:19::i;:::-;37965:4;37971:7;37980:5;37898:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37894:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38198:1;38181:6;:13;:18;38177:235;;;38227:40;;;;;;;;;;;;;;38177:235;38370:6;38364:13;38355:6;38351:2;38347:15;38340:38;37894:529;38067:54;;;38057:64;;;:6;:64;;;;38050:71;;;37714:716;;;;;;:::o;318:723::-;374:13;604:1;595:5;:10;591:53;;;622:10;;;;;;;;;;;;;;;;;;;;;591:53;654:12;669:5;654:20;;685:14;710:78;725:1;717:4;:9;710:78;;743:8;;;;;:::i;:::-;;;;774:2;766:10;;;;;:::i;:::-;;;710:78;;;798:19;830:6;820:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;798:39;;848:154;864:1;855:5;:10;848:154;;892:1;882:11;;;;;:::i;:::-;;;959:2;951:5;:10;;;;:::i;:::-;938:2;:24;;;;:::i;:::-;925:39;;908:6;915;908:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;988:2;979:11;;;;;:::i;:::-;;;848:154;;;1026:6;1012:21;;;;;318:723;;;;:::o;38892:2966::-;38965:20;38988:13;;38965:36;;39028:1;39016:8;:13;39012:44;;;39038:18;;;;;;;;;;;;;;39012:44;39069:61;39099:1;39103:2;39107:12;39121:8;39069:21;:61::i;:::-;39613:1;12613:2;39583:1;:26;;39582:32;39570:8;:45;39544:18;:22;39563:2;39544:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39892:139;39929:2;39983:33;40006:1;40010:2;40014:1;39983:14;:33::i;:::-;39950:30;39971:8;39950:20;:30::i;:::-;:66;39892:18;:139::i;:::-;39858:17;:31;39876:12;39858:31;;;;;;;;;;;:173;;;;40048:16;40079:11;40108:8;40093:12;:23;40079:37;;40629:16;40625:2;40621:25;40609:37;;41001:12;40961:8;40920:1;40858:25;40799:1;40738;40711:335;41372:1;41358:12;41354:20;41312:346;41413:3;41404:7;41401:16;41312:346;;41631:7;41621:8;41618:1;41591:25;41588:1;41585;41580:59;41466:1;41457:7;41453:15;41442:26;;41312:346;;;41316:77;41703:1;41691:8;:13;41687:45;;;41713:19;;;;;;;;;;;;;;41687:45;41765:3;41749:13;:19;;;;39318:2462;;41790:60;41819:1;41823:2;41827:12;41841:8;41790:20;:60::i;:::-;38954:2904;38892:2966;;:::o;50561:147::-;50698:6;50561:147;;;;;:::o;26304:324::-;26374:14;26607:1;26597:8;26594:15;26568:24;26564:46;26554:56;;26304:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1151:567::-;1223:8;1233:6;1283:3;1276:4;1268:6;1264:17;1260:27;1250:122;;1291:79;;:::i;:::-;1250:122;1404:6;1391:20;1381:30;;1434:18;1426:6;1423:30;1420:117;;;1456:79;;:::i;:::-;1420:117;1570:4;1562:6;1558:17;1546:29;;1624:3;1616:4;1608:6;1604:17;1594:8;1590:32;1587:41;1584:128;;;1631:79;;:::i;:::-;1584:128;1151:567;;;;;:::o;1724:133::-;1767:5;1805:6;1792:20;1783:29;;1821:30;1845:5;1821:30;:::i;:::-;1724:133;;;;:::o;1863:137::-;1908:5;1946:6;1933:20;1924:29;;1962:32;1988:5;1962:32;:::i;:::-;1863:137;;;;:::o;2006:141::-;2062:5;2093:6;2087:13;2078:22;;2109:32;2135:5;2109:32;:::i;:::-;2006:141;;;;:::o;2166:338::-;2221:5;2270:3;2263:4;2255:6;2251:17;2247:27;2237:122;;2278:79;;:::i;:::-;2237:122;2395:6;2382:20;2420:78;2494:3;2486:6;2479:4;2471:6;2467:17;2420:78;:::i;:::-;2411:87;;2227:277;2166:338;;;;:::o;2524:340::-;2580:5;2629:3;2622:4;2614:6;2610:17;2606:27;2596:122;;2637:79;;:::i;:::-;2596:122;2754:6;2741:20;2779:79;2854:3;2846:6;2839:4;2831:6;2827:17;2779:79;:::i;:::-;2770:88;;2586:278;2524:340;;;;:::o;2870:137::-;2915:5;2953:6;2940:20;2931:29;;2969:32;2995:5;2969:32;:::i;:::-;2870:137;;;;:::o;3013:139::-;3059:5;3097:6;3084:20;3075:29;;3113:33;3140:5;3113:33;:::i;:::-;3013:139;;;;:::o;3158:143::-;3215:5;3246:6;3240:13;3231:22;;3262:33;3289:5;3262:33;:::i;:::-;3158:143;;;;:::o;3307:329::-;3366:6;3415:2;3403:9;3394:7;3390:23;3386:32;3383:119;;;3421:79;;:::i;:::-;3383:119;3541:1;3566:53;3611:7;3602:6;3591:9;3587:22;3566:53;:::i;:::-;3556:63;;3512:117;3307:329;;;;:::o;3642:351::-;3712:6;3761:2;3749:9;3740:7;3736:23;3732:32;3729:119;;;3767:79;;:::i;:::-;3729:119;3887:1;3912:64;3968:7;3959:6;3948:9;3944:22;3912:64;:::i;:::-;3902:74;;3858:128;3642:351;;;;:::o;3999:474::-;4067:6;4075;4124:2;4112:9;4103:7;4099:23;4095:32;4092:119;;;4130:79;;:::i;:::-;4092:119;4250:1;4275:53;4320:7;4311:6;4300:9;4296:22;4275:53;:::i;:::-;4265:63;;4221:117;4377:2;4403:53;4448:7;4439:6;4428:9;4424:22;4403:53;:::i;:::-;4393:63;;4348:118;3999:474;;;;;:::o;4479:619::-;4556:6;4564;4572;4621:2;4609:9;4600:7;4596:23;4592:32;4589:119;;;4627:79;;:::i;:::-;4589:119;4747:1;4772:53;4817:7;4808:6;4797:9;4793:22;4772:53;:::i;:::-;4762:63;;4718:117;4874:2;4900:53;4945:7;4936:6;4925:9;4921:22;4900:53;:::i;:::-;4890:63;;4845:118;5002:2;5028:53;5073:7;5064:6;5053:9;5049:22;5028:53;:::i;:::-;5018:63;;4973:118;4479:619;;;;;:::o;5104:943::-;5199:6;5207;5215;5223;5272:3;5260:9;5251:7;5247:23;5243:33;5240:120;;;5279:79;;:::i;:::-;5240:120;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5526:2;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5497:118;5654:2;5680:53;5725:7;5716:6;5705:9;5701:22;5680:53;:::i;:::-;5670:63;;5625:118;5810:2;5799:9;5795:18;5782:32;5841:18;5833:6;5830:30;5827:117;;;5863:79;;:::i;:::-;5827:117;5968:62;6022:7;6013:6;6002:9;5998:22;5968:62;:::i;:::-;5958:72;;5753:287;5104:943;;;;;;;:::o;6053:468::-;6118:6;6126;6175:2;6163:9;6154:7;6150:23;6146:32;6143:119;;;6181:79;;:::i;:::-;6143:119;6301:1;6326:53;6371:7;6362:6;6351:9;6347:22;6326:53;:::i;:::-;6316:63;;6272:117;6428:2;6454:50;6496:7;6487:6;6476:9;6472:22;6454:50;:::i;:::-;6444:60;;6399:115;6053:468;;;;;:::o;6527:474::-;6595:6;6603;6652:2;6640:9;6631:7;6627:23;6623:32;6620:119;;;6658:79;;:::i;:::-;6620:119;6778:1;6803:53;6848:7;6839:6;6828:9;6824:22;6803:53;:::i;:::-;6793:63;;6749:117;6905:2;6931:53;6976:7;6967:6;6956:9;6952:22;6931:53;:::i;:::-;6921:63;;6876:118;6527:474;;;;;:::o;7007:557::-;7092:6;7100;7149:2;7137:9;7128:7;7124:23;7120:32;7117:119;;;7155:79;;:::i;:::-;7117:119;7303:1;7292:9;7288:17;7275:31;7333:18;7325:6;7322:30;7319:117;;;7355:79;;:::i;:::-;7319:117;7468:79;7539:7;7530:6;7519:9;7515:22;7468:79;:::i;:::-;7450:97;;;;7246:311;7007:557;;;;;:::o;7570:323::-;7626:6;7675:2;7663:9;7654:7;7650:23;7646:32;7643:119;;;7681:79;;:::i;:::-;7643:119;7801:1;7826:50;7868:7;7859:6;7848:9;7844:22;7826:50;:::i;:::-;7816:60;;7772:114;7570:323;;;;:::o;7899:327::-;7957:6;8006:2;7994:9;7985:7;7981:23;7977:32;7974:119;;;8012:79;;:::i;:::-;7974:119;8132:1;8157:52;8201:7;8192:6;8181:9;8177:22;8157:52;:::i;:::-;8147:62;;8103:116;7899:327;;;;:::o;8232:349::-;8301:6;8350:2;8338:9;8329:7;8325:23;8321:32;8318:119;;;8356:79;;:::i;:::-;8318:119;8476:1;8501:63;8556:7;8547:6;8536:9;8532:22;8501:63;:::i;:::-;8491:73;;8447:127;8232:349;;;;:::o;8587:509::-;8656:6;8705:2;8693:9;8684:7;8680:23;8676:32;8673:119;;;8711:79;;:::i;:::-;8673:119;8859:1;8848:9;8844:17;8831:31;8889:18;8881:6;8878:30;8875:117;;;8911:79;;:::i;:::-;8875:117;9016:63;9071:7;9062:6;9051:9;9047:22;9016:63;:::i;:::-;9006:73;;8802:287;8587:509;;;;:::o;9102:327::-;9160:6;9209:2;9197:9;9188:7;9184:23;9180:32;9177:119;;;9215:79;;:::i;:::-;9177:119;9335:1;9360:52;9404:7;9395:6;9384:9;9380:22;9360:52;:::i;:::-;9350:62;;9306:116;9102:327;;;;:::o;9435:329::-;9494:6;9543:2;9531:9;9522:7;9518:23;9514:32;9511:119;;;9549:79;;:::i;:::-;9511:119;9669:1;9694:53;9739:7;9730:6;9719:9;9715:22;9694:53;:::i;:::-;9684:63;;9640:117;9435:329;;;;:::o;9770:351::-;9840:6;9889:2;9877:9;9868:7;9864:23;9860:32;9857:119;;;9895:79;;:::i;:::-;9857:119;10015:1;10040:64;10096:7;10087:6;10076:9;10072:22;10040:64;:::i;:::-;10030:74;;9986:128;9770:351;;;;:::o;10127:118::-;10214:24;10232:5;10214:24;:::i;:::-;10209:3;10202:37;10127:118;;:::o;10251:109::-;10332:21;10347:5;10332:21;:::i;:::-;10327:3;10320:34;10251:109;;:::o;10366:360::-;10452:3;10480:38;10512:5;10480:38;:::i;:::-;10534:70;10597:6;10592:3;10534:70;:::i;:::-;10527:77;;10613:52;10658:6;10653:3;10646:4;10639:5;10635:16;10613:52;:::i;:::-;10690:29;10712:6;10690:29;:::i;:::-;10685:3;10681:39;10674:46;;10456:270;10366:360;;;;:::o;10732:364::-;10820:3;10848:39;10881:5;10848:39;:::i;:::-;10903:71;10967:6;10962:3;10903:71;:::i;:::-;10896:78;;10983:52;11028:6;11023:3;11016:4;11009:5;11005:16;10983:52;:::i;:::-;11060:29;11082:6;11060:29;:::i;:::-;11055:3;11051:39;11044:46;;10824:272;10732:364;;;;:::o;11102:377::-;11208:3;11236:39;11269:5;11236:39;:::i;:::-;11291:89;11373:6;11368:3;11291:89;:::i;:::-;11284:96;;11389:52;11434:6;11429:3;11422:4;11415:5;11411:16;11389:52;:::i;:::-;11466:6;11461:3;11457:16;11450:23;;11212:267;11102:377;;;;:::o;11485:366::-;11627:3;11648:67;11712:2;11707:3;11648:67;:::i;:::-;11641:74;;11724:93;11813:3;11724:93;:::i;:::-;11842:2;11837:3;11833:12;11826:19;;11485:366;;;:::o;11857:::-;11999:3;12020:67;12084:2;12079:3;12020:67;:::i;:::-;12013:74;;12096:93;12185:3;12096:93;:::i;:::-;12214:2;12209:3;12205:12;12198:19;;11857:366;;;:::o;12229:::-;12371:3;12392:67;12456:2;12451:3;12392:67;:::i;:::-;12385:74;;12468:93;12557:3;12468:93;:::i;:::-;12586:2;12581:3;12577:12;12570:19;;12229:366;;;:::o;12601:::-;12743:3;12764:67;12828:2;12823:3;12764:67;:::i;:::-;12757:74;;12840:93;12929:3;12840:93;:::i;:::-;12958:2;12953:3;12949:12;12942:19;;12601:366;;;:::o;12973:::-;13115:3;13136:67;13200:2;13195:3;13136:67;:::i;:::-;13129:74;;13212:93;13301:3;13212:93;:::i;:::-;13330:2;13325:3;13321:12;13314:19;;12973:366;;;:::o;13345:::-;13487:3;13508:67;13572:2;13567:3;13508:67;:::i;:::-;13501:74;;13584:93;13673:3;13584:93;:::i;:::-;13702:2;13697:3;13693:12;13686:19;;13345:366;;;:::o;13717:::-;13859:3;13880:67;13944:2;13939:3;13880:67;:::i;:::-;13873:74;;13956:93;14045:3;13956:93;:::i;:::-;14074:2;14069:3;14065:12;14058:19;;13717:366;;;:::o;14089:::-;14231:3;14252:67;14316:2;14311:3;14252:67;:::i;:::-;14245:74;;14328:93;14417:3;14328:93;:::i;:::-;14446:2;14441:3;14437:12;14430:19;;14089:366;;;:::o;14461:::-;14603:3;14624:67;14688:2;14683:3;14624:67;:::i;:::-;14617:74;;14700:93;14789:3;14700:93;:::i;:::-;14818:2;14813:3;14809:12;14802:19;;14461:366;;;:::o;14833:::-;14975:3;14996:67;15060:2;15055:3;14996:67;:::i;:::-;14989:74;;15072:93;15161:3;15072:93;:::i;:::-;15190:2;15185:3;15181:12;15174:19;;14833:366;;;:::o;15205:398::-;15364:3;15385:83;15466:1;15461:3;15385:83;:::i;:::-;15378:90;;15477:93;15566:3;15477:93;:::i;:::-;15595:1;15590:3;15586:11;15579:18;;15205:398;;;:::o;15609:366::-;15751:3;15772:67;15836:2;15831:3;15772:67;:::i;:::-;15765:74;;15848:93;15937:3;15848:93;:::i;:::-;15966:2;15961:3;15957:12;15950:19;;15609:366;;;:::o;15981:::-;16123:3;16144:67;16208:2;16203:3;16144:67;:::i;:::-;16137:74;;16220:93;16309:3;16220:93;:::i;:::-;16338:2;16333:3;16329:12;16322:19;;15981:366;;;:::o;16353:::-;16495:3;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16592:93;16681:3;16592:93;:::i;:::-;16710:2;16705:3;16701:12;16694:19;;16353:366;;;:::o;16725:115::-;16810:23;16827:5;16810:23;:::i;:::-;16805:3;16798:36;16725:115;;:::o;16846:129::-;16932:36;16962:5;16932:36;:::i;:::-;16927:3;16920:49;16846:129;;:::o;16981:118::-;17068:24;17086:5;17068:24;:::i;:::-;17063:3;17056:37;16981:118;;:::o;17105:435::-;17285:3;17307:95;17398:3;17389:6;17307:95;:::i;:::-;17300:102;;17419:95;17510:3;17501:6;17419:95;:::i;:::-;17412:102;;17531:3;17524:10;;17105:435;;;;;:::o;17546:379::-;17730:3;17752:147;17895:3;17752:147;:::i;:::-;17745:154;;17916:3;17909:10;;17546:379;;;:::o;17931:222::-;18024:4;18062:2;18051:9;18047:18;18039:26;;18075:71;18143:1;18132:9;18128:17;18119:6;18075:71;:::i;:::-;17931:222;;;;:::o;18159:640::-;18354:4;18392:3;18381:9;18377:19;18369:27;;18406:71;18474:1;18463:9;18459:17;18450:6;18406:71;:::i;:::-;18487:72;18555:2;18544:9;18540:18;18531:6;18487:72;:::i;:::-;18569;18637:2;18626:9;18622:18;18613:6;18569:72;:::i;:::-;18688:9;18682:4;18678:20;18673:2;18662:9;18658:18;18651:48;18716:76;18787:4;18778:6;18716:76;:::i;:::-;18708:84;;18159:640;;;;;;;:::o;18805:210::-;18892:4;18930:2;18919:9;18915:18;18907:26;;18943:65;19005:1;18994:9;18990:17;18981:6;18943:65;:::i;:::-;18805:210;;;;:::o;19021:313::-;19134:4;19172:2;19161:9;19157:18;19149:26;;19221:9;19215:4;19211:20;19207:1;19196:9;19192:17;19185:47;19249:78;19322:4;19313:6;19249:78;:::i;:::-;19241:86;;19021:313;;;;:::o;19340:419::-;19506:4;19544:2;19533:9;19529:18;19521:26;;19593:9;19587:4;19583:20;19579:1;19568:9;19564:17;19557:47;19621:131;19747:4;19621:131;:::i;:::-;19613:139;;19340:419;;;:::o;19765:::-;19931:4;19969:2;19958:9;19954:18;19946:26;;20018:9;20012:4;20008:20;20004:1;19993:9;19989:17;19982:47;20046:131;20172:4;20046:131;:::i;:::-;20038:139;;19765:419;;;:::o;20190:::-;20356:4;20394:2;20383:9;20379:18;20371:26;;20443:9;20437:4;20433:20;20429:1;20418:9;20414:17;20407:47;20471:131;20597:4;20471:131;:::i;:::-;20463:139;;20190:419;;;:::o;20615:::-;20781:4;20819:2;20808:9;20804:18;20796:26;;20868:9;20862:4;20858:20;20854:1;20843:9;20839:17;20832:47;20896:131;21022:4;20896:131;:::i;:::-;20888:139;;20615:419;;;:::o;21040:::-;21206:4;21244:2;21233:9;21229:18;21221:26;;21293:9;21287:4;21283:20;21279:1;21268:9;21264:17;21257:47;21321:131;21447:4;21321:131;:::i;:::-;21313:139;;21040:419;;;:::o;21465:::-;21631:4;21669:2;21658:9;21654:18;21646:26;;21718:9;21712:4;21708:20;21704:1;21693:9;21689:17;21682:47;21746:131;21872:4;21746:131;:::i;:::-;21738:139;;21465:419;;;:::o;21890:::-;22056:4;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;21890:419;;;:::o;22315:::-;22481:4;22519:2;22508:9;22504:18;22496:26;;22568:9;22562:4;22558:20;22554:1;22543:9;22539:17;22532:47;22596:131;22722:4;22596:131;:::i;:::-;22588:139;;22315:419;;;:::o;22740:::-;22906:4;22944:2;22933:9;22929:18;22921:26;;22993:9;22987:4;22983:20;22979:1;22968:9;22964:17;22957:47;23021:131;23147:4;23021:131;:::i;:::-;23013:139;;22740:419;;;:::o;23165:::-;23331:4;23369:2;23358:9;23354:18;23346:26;;23418:9;23412:4;23408:20;23404:1;23393:9;23389:17;23382:47;23446:131;23572:4;23446:131;:::i;:::-;23438:139;;23165:419;;;:::o;23590:::-;23756:4;23794:2;23783:9;23779:18;23771:26;;23843:9;23837:4;23833:20;23829:1;23818:9;23814:17;23807:47;23871:131;23997:4;23871:131;:::i;:::-;23863:139;;23590:419;;;:::o;24015:::-;24181:4;24219:2;24208:9;24204:18;24196:26;;24268:9;24262:4;24258:20;24254:1;24243:9;24239:17;24232:47;24296:131;24422:4;24296:131;:::i;:::-;24288:139;;24015:419;;;:::o;24440:::-;24606:4;24644:2;24633:9;24629:18;24621:26;;24693:9;24687:4;24683:20;24679:1;24668:9;24664:17;24657:47;24721:131;24847:4;24721:131;:::i;:::-;24713:139;;24440:419;;;:::o;24865:218::-;24956:4;24994:2;24983:9;24979:18;24971:26;;25007:69;25073:1;25062:9;25058:17;25049:6;25007:69;:::i;:::-;24865:218;;;;:::o;25089:220::-;25181:4;25219:2;25208:9;25204:18;25196:26;;25232:70;25299:1;25288:9;25284:17;25275:6;25232:70;:::i;:::-;25089:220;;;;:::o;25315:222::-;25408:4;25446:2;25435:9;25431:18;25423:26;;25459:71;25527:1;25516:9;25512:17;25503:6;25459:71;:::i;:::-;25315:222;;;;:::o;25543:129::-;25577:6;25604:20;;:::i;:::-;25594:30;;25633:33;25661:4;25653:6;25633:33;:::i;:::-;25543:129;;;:::o;25678:75::-;25711:6;25744:2;25738:9;25728:19;;25678:75;:::o;25759:307::-;25820:4;25910:18;25902:6;25899:30;25896:56;;;25932:18;;:::i;:::-;25896:56;25970:29;25992:6;25970:29;:::i;:::-;25962:37;;26054:4;26048;26044:15;26036:23;;25759:307;;;:::o;26072:308::-;26134:4;26224:18;26216:6;26213:30;26210:56;;;26246:18;;:::i;:::-;26210:56;26284:29;26306:6;26284:29;:::i;:::-;26276:37;;26368:4;26362;26358:15;26350:23;;26072:308;;;:::o;26386:98::-;26437:6;26471:5;26465:12;26455:22;;26386:98;;;:::o;26490:99::-;26542:6;26576:5;26570:12;26560:22;;26490:99;;;:::o;26595:168::-;26678:11;26712:6;26707:3;26700:19;26752:4;26747:3;26743:14;26728:29;;26595:168;;;;:::o;26769:147::-;26870:11;26907:3;26892:18;;26769:147;;;;:::o;26922:169::-;27006:11;27040:6;27035:3;27028:19;27080:4;27075:3;27071:14;27056:29;;26922:169;;;;:::o;27097:148::-;27199:11;27236:3;27221:18;;27097:148;;;;:::o;27251:305::-;27291:3;27310:20;27328:1;27310:20;:::i;:::-;27305:25;;27344:20;27362:1;27344:20;:::i;:::-;27339:25;;27498:1;27430:66;27426:74;27423:1;27420:81;27417:107;;;27504:18;;:::i;:::-;27417:107;27548:1;27545;27541:9;27534:16;;27251:305;;;;:::o;27562:185::-;27602:1;27619:20;27637:1;27619:20;:::i;:::-;27614:25;;27653:20;27671:1;27653:20;:::i;:::-;27648:25;;27692:1;27682:35;;27697:18;;:::i;:::-;27682:35;27739:1;27736;27732:9;27727:14;;27562:185;;;;:::o;27753:191::-;27793:4;27813:20;27831:1;27813:20;:::i;:::-;27808:25;;27847:20;27865:1;27847:20;:::i;:::-;27842:25;;27886:1;27883;27880:8;27877:34;;;27891:18;;:::i;:::-;27877:34;27936:1;27933;27929:9;27921:17;;27753:191;;;;:::o;27950:96::-;27987:7;28016:24;28034:5;28016:24;:::i;:::-;28005:35;;27950:96;;;:::o;28052:90::-;28086:7;28129:5;28122:13;28115:21;28104:32;;28052:90;;;:::o;28148:149::-;28184:7;28224:66;28217:5;28213:78;28202:89;;28148:149;;;:::o;28303:89::-;28339:7;28379:6;28372:5;28368:18;28357:29;;28303:89;;;:::o;28398:126::-;28435:7;28475:42;28468:5;28464:54;28453:65;;28398:126;;;:::o;28530:77::-;28567:7;28596:5;28585:16;;28530:77;;;:::o;28613:111::-;28662:9;28695:23;28712:5;28695:23;:::i;:::-;28682:36;;28613:111;;;:::o;28730:154::-;28814:6;28809:3;28804;28791:30;28876:1;28867:6;28862:3;28858:16;28851:27;28730:154;;;:::o;28890:307::-;28958:1;28968:113;28982:6;28979:1;28976:13;28968:113;;;29067:1;29062:3;29058:11;29052:18;29048:1;29043:3;29039:11;29032:39;29004:2;29001:1;28997:10;28992:15;;28968:113;;;29099:6;29096:1;29093:13;29090:101;;;29179:1;29170:6;29165:3;29161:16;29154:27;29090:101;28939:258;28890:307;;;:::o;29203:320::-;29247:6;29284:1;29278:4;29274:12;29264:22;;29331:1;29325:4;29321:12;29352:18;29342:81;;29408:4;29400:6;29396:17;29386:27;;29342:81;29470:2;29462:6;29459:14;29439:18;29436:38;29433:84;;;29489:18;;:::i;:::-;29433:84;29254:269;29203:320;;;:::o;29529:281::-;29612:27;29634:4;29612:27;:::i;:::-;29604:6;29600:40;29742:6;29730:10;29727:22;29706:18;29694:10;29691:34;29688:62;29685:88;;;29753:18;;:::i;:::-;29685:88;29793:10;29789:2;29782:22;29572:238;29529:281;;:::o;29816:233::-;29855:3;29878:24;29896:5;29878:24;:::i;:::-;29869:33;;29924:66;29917:5;29914:77;29911:103;;;29994:18;;:::i;:::-;29911:103;30041:1;30034:5;30030:13;30023:20;;29816:233;;;:::o;30055:176::-;30087:1;30104:20;30122:1;30104:20;:::i;:::-;30099:25;;30138:20;30156:1;30138:20;:::i;:::-;30133:25;;30177:1;30167:35;;30182:18;;:::i;:::-;30167:35;30223:1;30220;30216:9;30211:14;;30055:176;;;;:::o;30237:180::-;30285:77;30282:1;30275:88;30382:4;30379:1;30372:15;30406:4;30403:1;30396:15;30423:180;30471:77;30468:1;30461:88;30568:4;30565:1;30558:15;30592:4;30589:1;30582:15;30609:180;30657:77;30654:1;30647:88;30754:4;30751:1;30744:15;30778:4;30775:1;30768:15;30795:180;30843:77;30840:1;30833:88;30940:4;30937:1;30930:15;30964:4;30961:1;30954:15;30981:180;31029:77;31026:1;31019:88;31126:4;31123:1;31116:15;31150:4;31147:1;31140:15;31167:117;31276:1;31273;31266:12;31290:117;31399:1;31396;31389:12;31413:117;31522:1;31519;31512:12;31536:117;31645:1;31642;31635:12;31659:117;31768:1;31765;31758:12;31782:117;31891:1;31888;31881:12;31905:102;31946:6;31997:2;31993:7;31988:2;31981:5;31977:14;31973:28;31963:38;;31905:102;;;:::o;32013:175::-;32153:27;32149:1;32141:6;32137:14;32130:51;32013:175;:::o;32194:::-;32334:27;32330:1;32322:6;32318:14;32311:51;32194:175;:::o;32375:225::-;32515:34;32511:1;32503:6;32499:14;32492:58;32584:8;32579:2;32571:6;32567:15;32560:33;32375:225;:::o;32606:177::-;32746:29;32742:1;32734:6;32730:14;32723:53;32606:177;:::o;32789:175::-;32929:27;32925:1;32917:6;32913:14;32906:51;32789:175;:::o;32970:222::-;33110:34;33106:1;33098:6;33094:14;33087:58;33179:5;33174:2;33166:6;33162:15;33155:30;32970:222;:::o;33198:227::-;33338:34;33334:1;33326:6;33322:14;33315:58;33407:10;33402:2;33394:6;33390:15;33383:35;33198:227;:::o;33431:222::-;33571:34;33567:1;33559:6;33555:14;33548:58;33640:5;33635:2;33627:6;33623:15;33616:30;33431:222;:::o;33659:182::-;33799:34;33795:1;33787:6;33783:14;33776:58;33659:182;:::o;33847:172::-;33987:24;33983:1;33975:6;33971:14;33964:48;33847:172;:::o;34025:114::-;;:::o;34145:222::-;34285:34;34281:1;34273:6;34269:14;34262:58;34354:5;34349:2;34341:6;34337:15;34330:30;34145:222;:::o;34373:180::-;34513:32;34509:1;34501:6;34497:14;34490:56;34373:180;:::o;34559:181::-;34699:33;34695:1;34687:6;34683:14;34676:57;34559:181;:::o;34746:122::-;34819:24;34837:5;34819:24;:::i;:::-;34812:5;34809:35;34799:63;;34858:1;34855;34848:12;34799:63;34746:122;:::o;34874:116::-;34944:21;34959:5;34944:21;:::i;:::-;34937:5;34934:32;34924:60;;34980:1;34977;34970:12;34924:60;34874:116;:::o;34996:120::-;35068:23;35085:5;35068:23;:::i;:::-;35061:5;35058:34;35048:62;;35106:1;35103;35096:12;35048:62;34996:120;:::o;35122:::-;35194:23;35211:5;35194:23;:::i;:::-;35187:5;35184:34;35174:62;;35232:1;35229;35222:12;35174:62;35122:120;:::o;35248:122::-;35321:24;35339:5;35321:24;:::i;:::-;35314:5;35311:35;35301:63;;35360:1;35357;35350:12;35301:63;35248:122;:::o

Swarm Source

ipfs://22c5f04db2f00e0728fcca118e7c38e0c567edaa5c94a55f26f41c395b4843ac
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.