ETH Price: $3,633.69 (-0.66%)
 

Overview

TokenID

29

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/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 making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: 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: ChainCards.sol

//SPDX-License-Identifier: MIT
pragma solidity 0.8.13;




interface ChainCardsMembership {
    function balanceOf(address owner) external view returns (uint256);
}

contract ChainCards is ERC721A, Ownable, ReentrancyGuard {
    // ======== Properties =========
    uint256 public maxSupply;
    uint256 public maxMintsPerTx;
    string public artistName;

    string public cardURI = "IPFS HASH";
    string public baseURI;

    address private trustedWallet_A;
    address private trustedWallet_B;

    address public operator;

    ChainCardsMembership public membershipContract;

    // ======== Cost =========
    uint256 public cardPrice;
    uint256 public cardPriceDiscount;

    // ======== Sale status =========
    bool public saleIsActive = false;

    // ======== Mapping for freezing a token url =========
    mapping(uint256 => string) public frozenTokens;

    constructor(
    uint256 _maxSupply,
    uint256 _maxMintsPerTx,
    string memory _artistName,
    string memory _cardURI,
    string memory _name,
    string memory _symbol,
    address _trustedWallet_A,
    address _trustedWallet_B,
    uint256 _cardPrice
    ) ERC721A(_name, _symbol) {
    maxSupply = _maxSupply;
    maxMintsPerTx = _maxMintsPerTx;
    artistName = _artistName;
    cardURI = _cardURI;
    trustedWallet_A = _trustedWallet_A;
    trustedWallet_B = _trustedWallet_B;
    cardPrice = _cardPrice;
    }


    // ======== Modifier =========
    modifier onlyOperator() {
        require(operator == msg.sender, "Caller is not the operator");
        _;
    }

    // ======== Minting Function =========
    function mint(uint256 quantity, address recipient, bool discounted) public payable {
        uint256 supply = _totalMinted();
        require(saleIsActive, "Sale must be active to mint!");
        require(quantity < maxMintsPerTx + 1, "Exceeds max mint per tx!");
        require(supply + quantity <= maxSupply, "Exceeds max Card supply!");
        
        if (discounted) {
          require(membershipContract.balanceOf(recipient) > 0, "Must own a ChainCards Membership token");
          require(msg.value >= cardPriceDiscount * quantity,"Invalid discount ETH value sent!");
        } else {
          require(msg.value >= cardPrice * quantity, "Invalid ETH value sent!");
        }

        payment();

        _mint(recipient, quantity);
    }

    function payment() internal {
        unchecked {
            uint256 amount = (msg.value * 50) / 100;
            (bool success, ) = trustedWallet_A.call{value: amount}("");
            require(success, "Transfer A failed");

            amount = msg.value - amount;
            (success, ) = trustedWallet_B.call{value: amount}("");
            require(success, "Transfer B failed");
        }
    }

    function privateMint(uint256 _amountToMint, address _recipient) external onlyOwner() {
        uint256 supply = _totalMinted();
        require(supply + _amountToMint <= maxSupply, "Exceeds max card supply!"); 
        
        _mint(_recipient, _amountToMint);
    }

    // ======== State management =========
    function setSaleStatus(bool _value) public onlyOwner {
        saleIsActive = _value;
    }

    function setPrice(uint256 _newPrice) public onlyOwner {
        cardPrice = _newPrice;
    }

    function setDiscountPrice(uint256 _newPrice) public onlyOwner {
        cardPriceDiscount = _newPrice;
    }

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

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

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "URI query for invalid token");

        string memory uri = _baseURI();

        if(abi.encodePacked(frozenTokens[_tokenId]).length > 0) {
            uri = frozenTokens[_tokenId];
        } 

        return bytes(uri).length > 0 ? string(abi.encodePacked(uri, _toString(_tokenId))) : "";
    }

    function updateMembershipContract(address newAddress) public onlyOwner {
        membershipContract = ChainCardsMembership(newAddress);
    }

    function setTrustedWallet_A(address _trustedWallet) external onlyOwner {
        trustedWallet_A = _trustedWallet;
    }

    function setTrustedWallet_B(address _trustedWallet) external onlyOwner {
        trustedWallet_B = _trustedWallet;
    }

    // ======== Set Operator =========
    function setOperator(address _operator) public onlyOwner {
        operator = _operator;
    }

    // ======== Frozen Token URI Setter =========
    function setFrozenTokenURI(uint256 _tokenId, string memory _frozenURI) public onlyOperator {
        require(_exists(_tokenId), "Token ID does not exist");
        frozenTokens[_tokenId] = _frozenURI;
    }

    // ======== Withdraw =========
    function withdraw() public payable onlyOwner {
        uint balance = address(this).balance;
        require(payable(msg.sender).send(balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintsPerTx","type":"uint256"},{"internalType":"string","name":"_artistName","type":"string"},{"internalType":"string","name":"_cardURI","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_trustedWallet_A","type":"address"},{"internalType":"address","name":"_trustedWallet_B","type":"address"},{"internalType":"uint256","name":"_cardPrice","type":"uint256"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"artistName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"cardPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cardPriceDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cardURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"frozenTokens","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTx","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":"membershipContract","outputs":[{"internalType":"contract ChainCardsMembership","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"discounted","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"_amountToMint","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setDiscountPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_frozenURI","type":"string"}],"name":"setFrozenTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedWallet","type":"address"}],"name":"setTrustedWallet_A","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedWallet","type":"address"}],"name":"setTrustedWallet_B","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateMembershipContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600981526020017f4950465320484153480000000000000000000000000000000000000000000000815250600d908051906020019062000051929190620002bf565b506000601560006101000a81548160ff0219169083151502179055503480156200007a57600080fd5b5060405162004160380380620041608339818101604052810190620000a09190620005ac565b84848160029080519060200190620000ba929190620002bf565b508060039080519060200190620000d3929190620002bf565b50620000e4620001ec60201b60201c565b60008190555050506200010c62000100620001f160201b60201c565b620001f960201b60201c565b600160098190555088600a8190555087600b8190555086600c90805190602001906200013a929190620002bf565b5085600d908051906020019062000153929190620002bf565b5082600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806013819055505050505050505050506200076b565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002cd9062000736565b90600052602060002090601f016020900481019282620002f157600085556200033d565b82601f106200030c57805160ff19168380011785556200033d565b828001600101855582156200033d579182015b828111156200033c5782518255916020019190600101906200031f565b5b5090506200034c919062000350565b5090565b5b808211156200036b57600081600090555060010162000351565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620003988162000383565b8114620003a457600080fd5b50565b600081519050620003b8816200038d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200041382620003c8565b810181811067ffffffffffffffff82111715620004355762000434620003d9565b5b80604052505050565b60006200044a6200036f565b905062000458828262000408565b919050565b600067ffffffffffffffff8211156200047b576200047a620003d9565b5b6200048682620003c8565b9050602081019050919050565b60005b83811015620004b357808201518184015260208101905062000496565b83811115620004c3576000848401525b50505050565b6000620004e0620004da846200045d565b6200043e565b905082815260208101848484011115620004ff57620004fe620003c3565b5b6200050c84828562000493565b509392505050565b600082601f8301126200052c576200052b620003be565b5b81516200053e848260208601620004c9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005748262000547565b9050919050565b620005868162000567565b81146200059257600080fd5b50565b600081519050620005a6816200057b565b92915050565b60008060008060008060008060006101208a8c031215620005d257620005d162000379565b5b6000620005e28c828d01620003a7565b9950506020620005f58c828d01620003a7565b98505060408a015167ffffffffffffffff8111156200061957620006186200037e565b5b620006278c828d0162000514565b97505060608a015167ffffffffffffffff8111156200064b576200064a6200037e565b5b620006598c828d0162000514565b96505060808a015167ffffffffffffffff8111156200067d576200067c6200037e565b5b6200068b8c828d0162000514565b95505060a08a015167ffffffffffffffff811115620006af57620006ae6200037e565b5b620006bd8c828d0162000514565b94505060c0620006d08c828d0162000595565b93505060e0620006e38c828d0162000595565b925050610100620006f78c828d01620003a7565b9150509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074f57607f821691505b60208210810362000765576200076462000707565b5b50919050565b6139e5806200077b6000396000f3fe60806040526004361061023b5760003560e01c80638da5cb5b1161012e578063ccc48940116100ab578063e985e9c51161006f578063e985e9c5146107e7578063eb8d244414610824578063f2fde38b1461084f578063f33063e514610878578063f401f8a0146108a15761023b565b8063ccc4894014610714578063d5abeb011461073d578063d897833e14610768578063dc30158b14610791578063de34bacd146107bc5761023b565b8063b3ab15fb116100f2578063b3ab15fb1461064d578063b88d4fde14610676578063ba365d7e14610692578063bef870ca146106ae578063c87b56dd146106d75761023b565b80638da5cb5b1461057a57806391b7f5ed146105a557806395d89b41146105ce578063a22cb465146105f9578063a772cc41146106225761023b565b806351ec8d1e116101bc5780636c0360eb116101805780636c0360eb146104a957806370a08231146104d4578063715018a61461051157806374f27d3d146105285780638b78c116146105515761023b565b806351ec8d1e146103c257806355f804b3146103ed578063570ca735146104165780635b2f515b146104415780636352211e1461046c5761023b565b806318160ddd1161020357806318160ddd1461032a5780631d294e7b1461035557806323b872dd146103805780633ccfd60b1461039c57806342842e0e146103a65761023b565b806301ffc9a714610240578063033b8e2d1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906127c0565b6108de565b6040516102749190612808565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612881565b610970565b005b3480156102b257600080fd5b506102bb6109bc565b6040516102c89190612947565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f3919061299f565b610a4e565b60405161030591906129db565b60405180910390f35b610328600480360381019061032391906129f6565b610acd565b005b34801561033657600080fd5b5061033f610c11565b60405161034c9190612a45565b60405180910390f35b34801561036157600080fd5b5061036a610c28565b6040516103779190612a45565b60405180910390f35b61039a60048036038101906103959190612a60565b610c2e565b005b6103a4610f50565b005b6103c060048036038101906103bb9190612a60565b610f9e565b005b3480156103ce57600080fd5b506103d7610fbe565b6040516103e49190612b12565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190612c62565b610fe4565b005b34801561042257600080fd5b5061042b611006565b60405161043891906129db565b60405180910390f35b34801561044d57600080fd5b5061045661102c565b6040516104639190612947565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061299f565b6110ba565b6040516104a091906129db565b60405180910390f35b3480156104b557600080fd5b506104be6110cc565b6040516104cb9190612947565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612881565b61115a565b6040516105089190612a45565b60405180910390f35b34801561051d57600080fd5b50610526611212565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612cab565b611226565b005b34801561055d57600080fd5b506105786004803603810190610573919061299f565b61132a565b005b34801561058657600080fd5b5061058f61133c565b60405161059c91906129db565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c7919061299f565b611366565b005b3480156105da57600080fd5b506105e3611378565b6040516105f09190612947565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190612d33565b61140a565b005b34801561062e57600080fd5b50610637611515565b6040516106449190612947565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190612881565b6115a3565b005b610690600480360381019061068b9190612e14565b6115ef565b005b6106ac60048036038101906106a79190612e97565b611662565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190612eea565b6118ff565b005b3480156106e357600080fd5b506106fe60048036038101906106f9919061299f565b611972565b60405161070b9190612947565b60405180910390f35b34801561072057600080fd5b5061073b60048036038101906107369190612881565b611af3565b005b34801561074957600080fd5b50610752611b3f565b60405161075f9190612a45565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190612f2a565b611b45565b005b34801561079d57600080fd5b506107a6611b6a565b6040516107b39190612a45565b60405180910390f35b3480156107c857600080fd5b506107d1611b70565b6040516107de9190612a45565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f57565b611b76565b60405161081b9190612808565b60405180910390f35b34801561083057600080fd5b50610839611c0a565b6040516108469190612808565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190612881565b611c1d565b005b34801561088457600080fd5b5061089f600480360381019061089a9190612881565b611ca0565b005b3480156108ad57600080fd5b506108c860048036038101906108c3919061299f565b611cec565b6040516108d59190612947565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610978611d8c565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109cb90612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f790612fc6565b8015610a445780601f10610a1957610100808354040283529160200191610a44565b820191906000526020600020905b815481529060010190602001808311610a2757829003601f168201915b5050505050905090565b6000610a5982611e0a565b610a8f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad8826110ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610af9611e69565b73ffffffffffffffffffffffffffffffffffffffff1614610b5c57610b2581610b20611e69565b611b76565b610b5b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c1b611e71565b6001546000540303905090565b60145481565b6000610c3982611e76565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cac84611f42565b91509150610cc28187610cbd611e69565b611f69565b610d0e57610cd786610cd2611e69565b611b76565b610d0d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d74576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d818686866001611fad565b8015610d8c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e5a85610e36888887611fb3565b7c020000000000000000000000000000000000000000000000000000000017611fdb565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ee05760006001850190506000600460008381526020019081526020016000205403610ede576000548114610edd578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f488686866001612006565b505050505050565b610f58611d8c565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610f9b57600080fd5b50565b610fb9838383604051806020016040528060008152506115ef565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fec611d8c565b80600e90805190602001906110029291906126b1565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461103990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461106590612fc6565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050505081565b60006110c582611e76565b9050919050565b600e80546110d990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461110590612fc6565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61121a611d8c565b611224600061200c565b565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613043565b60405180910390fd5b6112bf82611e0a565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f5906130af565b60405180910390fd5b806016600084815260200190815260200160002090805190602001906113259291906126b1565b505050565b611332611d8c565b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61136e611d8c565b8060138190555050565b60606003805461138790612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546113b390612fc6565b80156114005780601f106113d557610100808354040283529160200191611400565b820191906000526020600020905b8154815290600101906020018083116113e357829003601f168201915b5050505050905090565b8060076000611417611e69565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c4611e69565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115099190612808565b60405180910390a35050565b600d805461152290612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461154e90612fc6565b801561159b5780601f106115705761010080835404028352916020019161159b565b820191906000526020600020905b81548152906001019060200180831161157e57829003601f168201915b505050505081565b6115ab611d8c565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115fa848484610c2e565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461165c57611625848484846120d2565b61165b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600061166c612222565b9050601560009054906101000a900460ff166116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b49061311b565b60405180910390fd5b6001600b546116cc919061316a565b841061170d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117049061320c565b60405180910390fd5b600a54848261171c919061316a565b111561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490613278565b60405180910390fd5b8115611896576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016117c091906129db565b602060405180830381865afa1580156117dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180191906132ad565b11611841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118389061334c565b60405180910390fd5b8360145461184f919061336c565b341015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890613412565b60405180910390fd5b6118e7565b836013546118a4919061336c565b3410156118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd9061347e565b60405180910390fd5b5b6118ef612235565b6118f983856123f3565b50505050565b611907611d8c565b6000611911612222565b9050600a548382611922919061316a565b1115611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a906134ea565b60405180910390fd5b61196d82846123f3565b505050565b606061197d82611e0a565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613556565b60405180910390fd5b60006119c66125ae565b90506000601660008581526020019081526020016000206040516020016119ed9190613615565b604051602081830303815290604052511115611aa257601660008481526020019081526020016000208054611a2190612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90612fc6565b8015611a9a5780601f10611a6f57610100808354040283529160200191611a9a565b820191906000526020600020905b815481529060010190602001808311611a7d57829003601f168201915b505050505090505b6000815111611ac05760405180602001604052806000815250611aeb565b80611aca84612640565b604051602001611adb92919061365d565b6040516020818303038152906040525b915050919050565b611afb611d8c565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b611b4d611d8c565b80601560006101000a81548160ff02191690831515021790555050565b600b5481565b60135481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900460ff1681565b611c25611d8c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b906136f3565b60405180910390fd5b611c9d8161200c565b50565b611ca8611d8c565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60166020528060005260406000206000915090508054611d0b90612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3790612fc6565b8015611d845780601f10611d5957610100808354040283529160200191611d84565b820191906000526020600020905b815481529060010190602001808311611d6757829003601f168201915b505050505081565b611d94612690565b73ffffffffffffffffffffffffffffffffffffffff16611db261133c565b73ffffffffffffffffffffffffffffffffffffffff1614611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff9061375f565b60405180910390fd5b565b600081611e15611e71565b11158015611e24575060005482105b8015611e62575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611e85611e71565b11611f0b57600054811015611f0a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f08575b60008103611efe576004600083600190039350838152602001908152602001600020549050611ed4565b8092505050611f3d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fca868684612698565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120f8611e69565b8786866040518563ffffffff1660e01b815260040161211a94939291906137d4565b6020604051808303816000875af192505050801561215657506040513d601f19601f820116820180604052508101906121539190613835565b60015b6121cf573d8060008114612186576040519150601f19603f3d011682016040523d82523d6000602084013e61218b565b606091505b5060008151036121c7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600061222c611e71565b60005403905090565b60006064603234028161224b5761224a613862565b5b0490506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612296906138c2565b60006040518083038185875af1925050503d80600081146122d3576040519150601f19603f3d011682016040523d82523d6000602084013e6122d8565b606091505b505090508061231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390613923565b60405180910390fd5b8134039150601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612367906138c2565b60006040518083038185875af1925050503d80600081146123a4576040519150601f19603f3d011682016040523d82523d6000602084013e6123a9565b606091505b505080915050806123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061398f565b60405180910390fd5b5050565b60008054905060008203612433576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124406000848385611fad565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124b7836124a86000866000611fb3565b6124b1856126a1565b17611fdb565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461255857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061251d565b5060008203612593576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125a96000848385612006565b505050565b6060600e80546125bd90612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546125e990612fc6565b80156126365780601f1061260b57610100808354040283529160200191612636565b820191906000526020600020905b81548152906001019060200180831161261957829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561267b57600184039350600a81066030018453600a8104905080612659575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b8280546126bd90612fc6565b90600052602060002090601f0160209004810192826126df5760008555612726565b82601f106126f857805160ff1916838001178555612726565b82800160010185558215612726579182015b8281111561272557825182559160200191906001019061270a565b5b5090506127339190612737565b5090565b5b80821115612750576000816000905550600101612738565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61279d81612768565b81146127a857600080fd5b50565b6000813590506127ba81612794565b92915050565b6000602082840312156127d6576127d561275e565b5b60006127e4848285016127ab565b91505092915050565b60008115159050919050565b612802816127ed565b82525050565b600060208201905061281d60008301846127f9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061284e82612823565b9050919050565b61285e81612843565b811461286957600080fd5b50565b60008135905061287b81612855565b92915050565b6000602082840312156128975761289661275e565b5b60006128a58482850161286c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128e85780820151818401526020810190506128cd565b838111156128f7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612919826128ae565b61292381856128b9565b93506129338185602086016128ca565b61293c816128fd565b840191505092915050565b60006020820190508181036000830152612961818461290e565b905092915050565b6000819050919050565b61297c81612969565b811461298757600080fd5b50565b60008135905061299981612973565b92915050565b6000602082840312156129b5576129b461275e565b5b60006129c38482850161298a565b91505092915050565b6129d581612843565b82525050565b60006020820190506129f060008301846129cc565b92915050565b60008060408385031215612a0d57612a0c61275e565b5b6000612a1b8582860161286c565b9250506020612a2c8582860161298a565b9150509250929050565b612a3f81612969565b82525050565b6000602082019050612a5a6000830184612a36565b92915050565b600080600060608486031215612a7957612a7861275e565b5b6000612a878682870161286c565b9350506020612a988682870161286c565b9250506040612aa98682870161298a565b9150509250925092565b6000819050919050565b6000612ad8612ad3612ace84612823565b612ab3565b612823565b9050919050565b6000612aea82612abd565b9050919050565b6000612afc82612adf565b9050919050565b612b0c81612af1565b82525050565b6000602082019050612b276000830184612b03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b6f826128fd565b810181811067ffffffffffffffff82111715612b8e57612b8d612b37565b5b80604052505050565b6000612ba1612754565b9050612bad8282612b66565b919050565b600067ffffffffffffffff821115612bcd57612bcc612b37565b5b612bd6826128fd565b9050602081019050919050565b82818337600083830152505050565b6000612c05612c0084612bb2565b612b97565b905082815260208101848484011115612c2157612c20612b32565b5b612c2c848285612be3565b509392505050565b600082601f830112612c4957612c48612b2d565b5b8135612c59848260208601612bf2565b91505092915050565b600060208284031215612c7857612c7761275e565b5b600082013567ffffffffffffffff811115612c9657612c95612763565b5b612ca284828501612c34565b91505092915050565b60008060408385031215612cc257612cc161275e565b5b6000612cd08582860161298a565b925050602083013567ffffffffffffffff811115612cf157612cf0612763565b5b612cfd85828601612c34565b9150509250929050565b612d10816127ed565b8114612d1b57600080fd5b50565b600081359050612d2d81612d07565b92915050565b60008060408385031215612d4a57612d4961275e565b5b6000612d588582860161286c565b9250506020612d6985828601612d1e565b9150509250929050565b600067ffffffffffffffff821115612d8e57612d8d612b37565b5b612d97826128fd565b9050602081019050919050565b6000612db7612db284612d73565b612b97565b905082815260208101848484011115612dd357612dd2612b32565b5b612dde848285612be3565b509392505050565b600082601f830112612dfb57612dfa612b2d565b5b8135612e0b848260208601612da4565b91505092915050565b60008060008060808587031215612e2e57612e2d61275e565b5b6000612e3c8782880161286c565b9450506020612e4d8782880161286c565b9350506040612e5e8782880161298a565b925050606085013567ffffffffffffffff811115612e7f57612e7e612763565b5b612e8b87828801612de6565b91505092959194509250565b600080600060608486031215612eb057612eaf61275e565b5b6000612ebe8682870161298a565b9350506020612ecf8682870161286c565b9250506040612ee086828701612d1e565b9150509250925092565b60008060408385031215612f0157612f0061275e565b5b6000612f0f8582860161298a565b9250506020612f208582860161286c565b9150509250929050565b600060208284031215612f4057612f3f61275e565b5b6000612f4e84828501612d1e565b91505092915050565b60008060408385031215612f6e57612f6d61275e565b5b6000612f7c8582860161286c565b9250506020612f8d8582860161286c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fde57607f821691505b602082108103612ff157612ff0612f97565b5b50919050565b7f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000600082015250565b600061302d601a836128b9565b915061303882612ff7565b602082019050919050565b6000602082019050818103600083015261305c81613020565b9050919050565b7f546f6b656e20494420646f6573206e6f74206578697374000000000000000000600082015250565b60006130996017836128b9565b91506130a482613063565b602082019050919050565b600060208201905081810360008301526130c88161308c565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e742100000000600082015250565b6000613105601c836128b9565b9150613110826130cf565b602082019050919050565b60006020820190508181036000830152613134816130f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317582612969565b915061318083612969565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b5576131b461313b565b5b828201905092915050565b7f45786365656473206d6178206d696e7420706572207478210000000000000000600082015250565b60006131f66018836128b9565b9150613201826131c0565b602082019050919050565b60006020820190508181036000830152613225816131e9565b9050919050565b7f45786365656473206d6178204361726420737570706c79210000000000000000600082015250565b60006132626018836128b9565b915061326d8261322c565b602082019050919050565b6000602082019050818103600083015261329181613255565b9050919050565b6000815190506132a781612973565b92915050565b6000602082840312156132c3576132c261275e565b5b60006132d184828501613298565b91505092915050565b7f4d757374206f776e206120436861696e4361726473204d656d6265727368697060008201527f20746f6b656e0000000000000000000000000000000000000000000000000000602082015250565b60006133366026836128b9565b9150613341826132da565b604082019050919050565b6000602082019050818103600083015261336581613329565b9050919050565b600061337782612969565b915061338283612969565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133bb576133ba61313b565b5b828202905092915050565b7f496e76616c696420646973636f756e74204554482076616c75652073656e7421600082015250565b60006133fc6020836128b9565b9150613407826133c6565b602082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b7f496e76616c6964204554482076616c75652073656e7421000000000000000000600082015250565b60006134686017836128b9565b915061347382613432565b602082019050919050565b600060208201905081810360008301526134978161345b565b9050919050565b7f45786365656473206d6178206361726420737570706c79210000000000000000600082015250565b60006134d46018836128b9565b91506134df8261349e565b602082019050919050565b60006020820190508181036000830152613503816134c7565b9050919050565b7f55524920717565727920666f7220696e76616c696420746f6b656e0000000000600082015250565b6000613540601b836128b9565b915061354b8261350a565b602082019050919050565b6000602082019050818103600083015261356f81613533565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546135a381612fc6565b6135ad8186613576565b945060018216600081146135c857600181146135d95761360c565b60ff1983168652818601935061360c565b6135e285613581565b60005b83811015613604578154818901526001820191506020810190506135e5565b838801955050505b50505092915050565b60006136218284613596565b915081905092915050565b6000613637826128ae565b6136418185613576565b93506136518185602086016128ca565b80840191505092915050565b6000613669828561362c565b9150613675828461362c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136dd6026836128b9565b91506136e882613681565b604082019050919050565b6000602082019050818103600083015261370c816136d0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137496020836128b9565b915061375482613713565b602082019050919050565b600060208201905081810360008301526137788161373c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006137a68261377f565b6137b0818561378a565b93506137c08185602086016128ca565b6137c9816128fd565b840191505092915050565b60006080820190506137e960008301876129cc565b6137f660208301866129cc565b6138036040830185612a36565b8181036060830152613815818461379b565b905095945050505050565b60008151905061382f81612794565b92915050565b60006020828403121561384b5761384a61275e565b5b600061385984828501613820565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081905092915050565b50565b60006138ac600083613891565b91506138b78261389c565b600082019050919050565b60006138cd8261389f565b9150819050919050565b7f5472616e736665722041206661696c6564000000000000000000000000000000600082015250565b600061390d6011836128b9565b9150613918826138d7565b602082019050919050565b6000602082019050818103600083015261393c81613900565b9050919050565b7f5472616e736665722042206661696c6564000000000000000000000000000000600082015250565b60006139796011836128b9565b915061398482613943565b602082019050919050565b600060208201905081810360008301526139a88161396c565b905091905056fea2646970667358221220a3e87d44e89a76289234dfd0217b14471a9327e48e59756a1b33d804dd63d14b64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000003098c04b75c7fecba9c7a80fc24c097995e95681000000000000000000000000fdb38cd20f0c698405dcc02f10b953fbec0c01d4000000000000000000000000000000000000000000000000001d7cce57a2c00000000000000000000000000000000000000000000000000000000000000000124c617572656e742043617374656c6c616e690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d4e5245353338714444474b347775716a536a53564d465a387544644d42644173626e5053427452384a6742650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024436861696e4361726473202d204c617572656e742043617374656c6c616e69202d20533100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43432d4c4341532d533100000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80638da5cb5b1161012e578063ccc48940116100ab578063e985e9c51161006f578063e985e9c5146107e7578063eb8d244414610824578063f2fde38b1461084f578063f33063e514610878578063f401f8a0146108a15761023b565b8063ccc4894014610714578063d5abeb011461073d578063d897833e14610768578063dc30158b14610791578063de34bacd146107bc5761023b565b8063b3ab15fb116100f2578063b3ab15fb1461064d578063b88d4fde14610676578063ba365d7e14610692578063bef870ca146106ae578063c87b56dd146106d75761023b565b80638da5cb5b1461057a57806391b7f5ed146105a557806395d89b41146105ce578063a22cb465146105f9578063a772cc41146106225761023b565b806351ec8d1e116101bc5780636c0360eb116101805780636c0360eb146104a957806370a08231146104d4578063715018a61461051157806374f27d3d146105285780638b78c116146105515761023b565b806351ec8d1e146103c257806355f804b3146103ed578063570ca735146104165780635b2f515b146104415780636352211e1461046c5761023b565b806318160ddd1161020357806318160ddd1461032a5780631d294e7b1461035557806323b872dd146103805780633ccfd60b1461039c57806342842e0e146103a65761023b565b806301ffc9a714610240578063033b8e2d1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906127c0565b6108de565b6040516102749190612808565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612881565b610970565b005b3480156102b257600080fd5b506102bb6109bc565b6040516102c89190612947565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f3919061299f565b610a4e565b60405161030591906129db565b60405180910390f35b610328600480360381019061032391906129f6565b610acd565b005b34801561033657600080fd5b5061033f610c11565b60405161034c9190612a45565b60405180910390f35b34801561036157600080fd5b5061036a610c28565b6040516103779190612a45565b60405180910390f35b61039a60048036038101906103959190612a60565b610c2e565b005b6103a4610f50565b005b6103c060048036038101906103bb9190612a60565b610f9e565b005b3480156103ce57600080fd5b506103d7610fbe565b6040516103e49190612b12565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190612c62565b610fe4565b005b34801561042257600080fd5b5061042b611006565b60405161043891906129db565b60405180910390f35b34801561044d57600080fd5b5061045661102c565b6040516104639190612947565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061299f565b6110ba565b6040516104a091906129db565b60405180910390f35b3480156104b557600080fd5b506104be6110cc565b6040516104cb9190612947565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612881565b61115a565b6040516105089190612a45565b60405180910390f35b34801561051d57600080fd5b50610526611212565b005b34801561053457600080fd5b5061054f600480360381019061054a9190612cab565b611226565b005b34801561055d57600080fd5b506105786004803603810190610573919061299f565b61132a565b005b34801561058657600080fd5b5061058f61133c565b60405161059c91906129db565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c7919061299f565b611366565b005b3480156105da57600080fd5b506105e3611378565b6040516105f09190612947565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190612d33565b61140a565b005b34801561062e57600080fd5b50610637611515565b6040516106449190612947565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190612881565b6115a3565b005b610690600480360381019061068b9190612e14565b6115ef565b005b6106ac60048036038101906106a79190612e97565b611662565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190612eea565b6118ff565b005b3480156106e357600080fd5b506106fe60048036038101906106f9919061299f565b611972565b60405161070b9190612947565b60405180910390f35b34801561072057600080fd5b5061073b60048036038101906107369190612881565b611af3565b005b34801561074957600080fd5b50610752611b3f565b60405161075f9190612a45565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190612f2a565b611b45565b005b34801561079d57600080fd5b506107a6611b6a565b6040516107b39190612a45565b60405180910390f35b3480156107c857600080fd5b506107d1611b70565b6040516107de9190612a45565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f57565b611b76565b60405161081b9190612808565b60405180910390f35b34801561083057600080fd5b50610839611c0a565b6040516108469190612808565b60405180910390f35b34801561085b57600080fd5b5061087660048036038101906108719190612881565b611c1d565b005b34801561088457600080fd5b5061089f600480360381019061089a9190612881565b611ca0565b005b3480156108ad57600080fd5b506108c860048036038101906108c3919061299f565b611cec565b6040516108d59190612947565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109695750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610978611d8c565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109cb90612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546109f790612fc6565b8015610a445780601f10610a1957610100808354040283529160200191610a44565b820191906000526020600020905b815481529060010190602001808311610a2757829003601f168201915b5050505050905090565b6000610a5982611e0a565b610a8f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad8826110ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610af9611e69565b73ffffffffffffffffffffffffffffffffffffffff1614610b5c57610b2581610b20611e69565b611b76565b610b5b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c1b611e71565b6001546000540303905090565b60145481565b6000610c3982611e76565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cac84611f42565b91509150610cc28187610cbd611e69565b611f69565b610d0e57610cd786610cd2611e69565b611b76565b610d0d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d74576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d818686866001611fad565b8015610d8c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e5a85610e36888887611fb3565b7c020000000000000000000000000000000000000000000000000000000017611fdb565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ee05760006001850190506000600460008381526020019081526020016000205403610ede576000548114610edd578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f488686866001612006565b505050505050565b610f58611d8c565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610f9b57600080fd5b50565b610fb9838383604051806020016040528060008152506115ef565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fec611d8c565b80600e90805190602001906110029291906126b1565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461103990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461106590612fc6565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050505081565b60006110c582611e76565b9050919050565b600e80546110d990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461110590612fc6565b80156111525780601f1061112757610100808354040283529160200191611152565b820191906000526020600020905b81548152906001019060200180831161113557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61121a611d8c565b611224600061200c565b565b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613043565b60405180910390fd5b6112bf82611e0a565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f5906130af565b60405180910390fd5b806016600084815260200190815260200160002090805190602001906113259291906126b1565b505050565b611332611d8c565b8060148190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61136e611d8c565b8060138190555050565b60606003805461138790612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546113b390612fc6565b80156114005780601f106113d557610100808354040283529160200191611400565b820191906000526020600020905b8154815290600101906020018083116113e357829003601f168201915b5050505050905090565b8060076000611417611e69565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c4611e69565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115099190612808565b60405180910390a35050565b600d805461152290612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461154e90612fc6565b801561159b5780601f106115705761010080835404028352916020019161159b565b820191906000526020600020905b81548152906001019060200180831161157e57829003601f168201915b505050505081565b6115ab611d8c565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115fa848484610c2e565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461165c57611625848484846120d2565b61165b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600061166c612222565b9050601560009054906101000a900460ff166116bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b49061311b565b60405180910390fd5b6001600b546116cc919061316a565b841061170d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117049061320c565b60405180910390fd5b600a54848261171c919061316a565b111561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490613278565b60405180910390fd5b8115611896576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016117c091906129db565b602060405180830381865afa1580156117dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180191906132ad565b11611841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118389061334c565b60405180910390fd5b8360145461184f919061336c565b341015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890613412565b60405180910390fd5b6118e7565b836013546118a4919061336c565b3410156118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd9061347e565b60405180910390fd5b5b6118ef612235565b6118f983856123f3565b50505050565b611907611d8c565b6000611911612222565b9050600a548382611922919061316a565b1115611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a906134ea565b60405180910390fd5b61196d82846123f3565b505050565b606061197d82611e0a565b6119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613556565b60405180910390fd5b60006119c66125ae565b90506000601660008581526020019081526020016000206040516020016119ed9190613615565b604051602081830303815290604052511115611aa257601660008481526020019081526020016000208054611a2190612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90612fc6565b8015611a9a5780601f10611a6f57610100808354040283529160200191611a9a565b820191906000526020600020905b815481529060010190602001808311611a7d57829003601f168201915b505050505090505b6000815111611ac05760405180602001604052806000815250611aeb565b80611aca84612640565b604051602001611adb92919061365d565b6040516020818303038152906040525b915050919050565b611afb611d8c565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b611b4d611d8c565b80601560006101000a81548160ff02191690831515021790555050565b600b5481565b60135481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560009054906101000a900460ff1681565b611c25611d8c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b906136f3565b60405180910390fd5b611c9d8161200c565b50565b611ca8611d8c565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60166020528060005260406000206000915090508054611d0b90612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3790612fc6565b8015611d845780601f10611d5957610100808354040283529160200191611d84565b820191906000526020600020905b815481529060010190602001808311611d6757829003601f168201915b505050505081565b611d94612690565b73ffffffffffffffffffffffffffffffffffffffff16611db261133c565b73ffffffffffffffffffffffffffffffffffffffff1614611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff9061375f565b60405180910390fd5b565b600081611e15611e71565b11158015611e24575060005482105b8015611e62575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611e85611e71565b11611f0b57600054811015611f0a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f08575b60008103611efe576004600083600190039350838152602001908152602001600020549050611ed4565b8092505050611f3d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fca868684612698565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120f8611e69565b8786866040518563ffffffff1660e01b815260040161211a94939291906137d4565b6020604051808303816000875af192505050801561215657506040513d601f19601f820116820180604052508101906121539190613835565b60015b6121cf573d8060008114612186576040519150601f19603f3d011682016040523d82523d6000602084013e61218b565b606091505b5060008151036121c7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600061222c611e71565b60005403905090565b60006064603234028161224b5761224a613862565b5b0490506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612296906138c2565b60006040518083038185875af1925050503d80600081146122d3576040519150601f19603f3d011682016040523d82523d6000602084013e6122d8565b606091505b505090508061231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390613923565b60405180910390fd5b8134039150601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612367906138c2565b60006040518083038185875af1925050503d80600081146123a4576040519150601f19603f3d011682016040523d82523d6000602084013e6123a9565b606091505b505080915050806123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061398f565b60405180910390fd5b5050565b60008054905060008203612433576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124406000848385611fad565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124b7836124a86000866000611fb3565b6124b1856126a1565b17611fdb565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461255857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061251d565b5060008203612593576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125a96000848385612006565b505050565b6060600e80546125bd90612fc6565b80601f01602080910402602001604051908101604052809291908181526020018280546125e990612fc6565b80156126365780601f1061260b57610100808354040283529160200191612636565b820191906000526020600020905b81548152906001019060200180831161261957829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561267b57600184039350600a81066030018453600a8104905080612659575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b8280546126bd90612fc6565b90600052602060002090601f0160209004810192826126df5760008555612726565b82601f106126f857805160ff1916838001178555612726565b82800160010185558215612726579182015b8281111561272557825182559160200191906001019061270a565b5b5090506127339190612737565b5090565b5b80821115612750576000816000905550600101612738565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61279d81612768565b81146127a857600080fd5b50565b6000813590506127ba81612794565b92915050565b6000602082840312156127d6576127d561275e565b5b60006127e4848285016127ab565b91505092915050565b60008115159050919050565b612802816127ed565b82525050565b600060208201905061281d60008301846127f9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061284e82612823565b9050919050565b61285e81612843565b811461286957600080fd5b50565b60008135905061287b81612855565b92915050565b6000602082840312156128975761289661275e565b5b60006128a58482850161286c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128e85780820151818401526020810190506128cd565b838111156128f7576000848401525b50505050565b6000601f19601f8301169050919050565b6000612919826128ae565b61292381856128b9565b93506129338185602086016128ca565b61293c816128fd565b840191505092915050565b60006020820190508181036000830152612961818461290e565b905092915050565b6000819050919050565b61297c81612969565b811461298757600080fd5b50565b60008135905061299981612973565b92915050565b6000602082840312156129b5576129b461275e565b5b60006129c38482850161298a565b91505092915050565b6129d581612843565b82525050565b60006020820190506129f060008301846129cc565b92915050565b60008060408385031215612a0d57612a0c61275e565b5b6000612a1b8582860161286c565b9250506020612a2c8582860161298a565b9150509250929050565b612a3f81612969565b82525050565b6000602082019050612a5a6000830184612a36565b92915050565b600080600060608486031215612a7957612a7861275e565b5b6000612a878682870161286c565b9350506020612a988682870161286c565b9250506040612aa98682870161298a565b9150509250925092565b6000819050919050565b6000612ad8612ad3612ace84612823565b612ab3565b612823565b9050919050565b6000612aea82612abd565b9050919050565b6000612afc82612adf565b9050919050565b612b0c81612af1565b82525050565b6000602082019050612b276000830184612b03565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b6f826128fd565b810181811067ffffffffffffffff82111715612b8e57612b8d612b37565b5b80604052505050565b6000612ba1612754565b9050612bad8282612b66565b919050565b600067ffffffffffffffff821115612bcd57612bcc612b37565b5b612bd6826128fd565b9050602081019050919050565b82818337600083830152505050565b6000612c05612c0084612bb2565b612b97565b905082815260208101848484011115612c2157612c20612b32565b5b612c2c848285612be3565b509392505050565b600082601f830112612c4957612c48612b2d565b5b8135612c59848260208601612bf2565b91505092915050565b600060208284031215612c7857612c7761275e565b5b600082013567ffffffffffffffff811115612c9657612c95612763565b5b612ca284828501612c34565b91505092915050565b60008060408385031215612cc257612cc161275e565b5b6000612cd08582860161298a565b925050602083013567ffffffffffffffff811115612cf157612cf0612763565b5b612cfd85828601612c34565b9150509250929050565b612d10816127ed565b8114612d1b57600080fd5b50565b600081359050612d2d81612d07565b92915050565b60008060408385031215612d4a57612d4961275e565b5b6000612d588582860161286c565b9250506020612d6985828601612d1e565b9150509250929050565b600067ffffffffffffffff821115612d8e57612d8d612b37565b5b612d97826128fd565b9050602081019050919050565b6000612db7612db284612d73565b612b97565b905082815260208101848484011115612dd357612dd2612b32565b5b612dde848285612be3565b509392505050565b600082601f830112612dfb57612dfa612b2d565b5b8135612e0b848260208601612da4565b91505092915050565b60008060008060808587031215612e2e57612e2d61275e565b5b6000612e3c8782880161286c565b9450506020612e4d8782880161286c565b9350506040612e5e8782880161298a565b925050606085013567ffffffffffffffff811115612e7f57612e7e612763565b5b612e8b87828801612de6565b91505092959194509250565b600080600060608486031215612eb057612eaf61275e565b5b6000612ebe8682870161298a565b9350506020612ecf8682870161286c565b9250506040612ee086828701612d1e565b9150509250925092565b60008060408385031215612f0157612f0061275e565b5b6000612f0f8582860161298a565b9250506020612f208582860161286c565b9150509250929050565b600060208284031215612f4057612f3f61275e565b5b6000612f4e84828501612d1e565b91505092915050565b60008060408385031215612f6e57612f6d61275e565b5b6000612f7c8582860161286c565b9250506020612f8d8582860161286c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fde57607f821691505b602082108103612ff157612ff0612f97565b5b50919050565b7f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000600082015250565b600061302d601a836128b9565b915061303882612ff7565b602082019050919050565b6000602082019050818103600083015261305c81613020565b9050919050565b7f546f6b656e20494420646f6573206e6f74206578697374000000000000000000600082015250565b60006130996017836128b9565b91506130a482613063565b602082019050919050565b600060208201905081810360008301526130c88161308c565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e742100000000600082015250565b6000613105601c836128b9565b9150613110826130cf565b602082019050919050565b60006020820190508181036000830152613134816130f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317582612969565b915061318083612969565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131b5576131b461313b565b5b828201905092915050565b7f45786365656473206d6178206d696e7420706572207478210000000000000000600082015250565b60006131f66018836128b9565b9150613201826131c0565b602082019050919050565b60006020820190508181036000830152613225816131e9565b9050919050565b7f45786365656473206d6178204361726420737570706c79210000000000000000600082015250565b60006132626018836128b9565b915061326d8261322c565b602082019050919050565b6000602082019050818103600083015261329181613255565b9050919050565b6000815190506132a781612973565b92915050565b6000602082840312156132c3576132c261275e565b5b60006132d184828501613298565b91505092915050565b7f4d757374206f776e206120436861696e4361726473204d656d6265727368697060008201527f20746f6b656e0000000000000000000000000000000000000000000000000000602082015250565b60006133366026836128b9565b9150613341826132da565b604082019050919050565b6000602082019050818103600083015261336581613329565b9050919050565b600061337782612969565b915061338283612969565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133bb576133ba61313b565b5b828202905092915050565b7f496e76616c696420646973636f756e74204554482076616c75652073656e7421600082015250565b60006133fc6020836128b9565b9150613407826133c6565b602082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b7f496e76616c6964204554482076616c75652073656e7421000000000000000000600082015250565b60006134686017836128b9565b915061347382613432565b602082019050919050565b600060208201905081810360008301526134978161345b565b9050919050565b7f45786365656473206d6178206361726420737570706c79210000000000000000600082015250565b60006134d46018836128b9565b91506134df8261349e565b602082019050919050565b60006020820190508181036000830152613503816134c7565b9050919050565b7f55524920717565727920666f7220696e76616c696420746f6b656e0000000000600082015250565b6000613540601b836128b9565b915061354b8261350a565b602082019050919050565b6000602082019050818103600083015261356f81613533565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546135a381612fc6565b6135ad8186613576565b945060018216600081146135c857600181146135d95761360c565b60ff1983168652818601935061360c565b6135e285613581565b60005b83811015613604578154818901526001820191506020810190506135e5565b838801955050505b50505092915050565b60006136218284613596565b915081905092915050565b6000613637826128ae565b6136418185613576565b93506136518185602086016128ca565b80840191505092915050565b6000613669828561362c565b9150613675828461362c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136dd6026836128b9565b91506136e882613681565b604082019050919050565b6000602082019050818103600083015261370c816136d0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137496020836128b9565b915061375482613713565b602082019050919050565b600060208201905081810360008301526137788161373c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006137a68261377f565b6137b0818561378a565b93506137c08185602086016128ca565b6137c9816128fd565b840191505092915050565b60006080820190506137e960008301876129cc565b6137f660208301866129cc565b6138036040830185612a36565b8181036060830152613815818461379b565b905095945050505050565b60008151905061382f81612794565b92915050565b60006020828403121561384b5761384a61275e565b5b600061385984828501613820565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081905092915050565b50565b60006138ac600083613891565b91506138b78261389c565b600082019050919050565b60006138cd8261389f565b9150819050919050565b7f5472616e736665722041206661696c6564000000000000000000000000000000600082015250565b600061390d6011836128b9565b9150613918826138d7565b602082019050919050565b6000602082019050818103600083015261393c81613900565b9050919050565b7f5472616e736665722042206661696c6564000000000000000000000000000000600082015250565b60006139796011836128b9565b915061398482613943565b602082019050919050565b600060208201905081810360008301526139a88161396c565b905091905056fea2646970667358221220a3e87d44e89a76289234dfd0217b14471a9327e48e59756a1b33d804dd63d14b64736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000003098c04b75c7fecba9c7a80fc24c097995e95681000000000000000000000000fdb38cd20f0c698405dcc02f10b953fbec0c01d4000000000000000000000000000000000000000000000000001d7cce57a2c00000000000000000000000000000000000000000000000000000000000000000124c617572656e742043617374656c6c616e690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d4e5245353338714444474b347775716a536a53564d465a387544644d42644173626e5053427452384a6742650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024436861696e4361726473202d204c617572656e742043617374656c6c616e69202d20533100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43432d4c4341532d533100000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _maxSupply (uint256): 1000
Arg [1] : _maxMintsPerTx (uint256): 10
Arg [2] : _artistName (string): Laurent Castellani
Arg [3] : _cardURI (string): QmNRE538qDDGK4wuqjSjSVMFZ8uDdMBdAsbnPSBtR8JgBe
Arg [4] : _name (string): ChainCards - Laurent Castellani - S1
Arg [5] : _symbol (string): CC-LCAS-S1
Arg [6] : _trustedWallet_A (address): 0x3098C04B75c7fECBA9c7A80Fc24C097995e95681
Arg [7] : _trustedWallet_B (address): 0xfdB38cD20F0c698405dcc02f10B953fBEc0C01D4
Arg [8] : _cardPrice (uint256): 8300000000000000

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [6] : 0000000000000000000000003098c04b75c7fecba9c7a80fc24c097995e95681
Arg [7] : 000000000000000000000000fdb38cd20f0c698405dcc02f10b953fbec0c01d4
Arg [8] : 000000000000000000000000000000000000000000000000001d7cce57a2c000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [10] : 4c617572656e742043617374656c6c616e690000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [12] : 516d4e5245353338714444474b347775716a536a53564d465a387544644d4264
Arg [13] : 4173626e5053427452384a674265000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [15] : 436861696e4361726473202d204c617572656e742043617374656c6c616e6920
Arg [16] : 2d20533100000000000000000000000000000000000000000000000000000000
Arg [17] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [18] : 43432d4c4341532d533100000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

58177:5063:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24943:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62376:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25845:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32336:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31769:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21596:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58678:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35975:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63084:153;;;:::i;:::-;;38896:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58560:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61680:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58528:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58345:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27238:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58420:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22780:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5722:103;;;;;;;;;;;;;:::i;:::-;;62831:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61387:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5074:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61285:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26021:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32894:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58378:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62676:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39687:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59668:765;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60860:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61786:431;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62225:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58279:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61184:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58310:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58647:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33285:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58758:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5980:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62506:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58859:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24943:639;25028:4;25367:10;25352:25;;:11;:25;;;;:102;;;;25444:10;25429:25;;:11;:25;;;;25352:102;:179;;;;25521:10;25506:25;;:11;:25;;;;25352:179;25332:199;;24943:639;;;:::o;62376:122::-;4960:13;:11;:13::i;:::-;62476:14:::1;62458:15;;:32;;;;;;;;;;;;;;;;;;62376:122:::0;:::o;25845:100::-;25899:13;25932:5;25925:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25845:100;:::o;32336:218::-;32412:7;32437:16;32445:7;32437;:16::i;:::-;32432:64;;32462:34;;;;;;;;;;;;;;32432:64;32516:15;:24;32532:7;32516:24;;;;;;;;;;;:30;;;;;;;;;;;;32509:37;;32336:218;;;:::o;31769:408::-;31858:13;31874:16;31882:7;31874;:16::i;:::-;31858:32;;31930:5;31907:28;;:19;:17;:19::i;:::-;:28;;;31903:175;;31955:44;31972:5;31979:19;:17;:19::i;:::-;31955:16;:44::i;:::-;31950:128;;32027:35;;;;;;;;;;;;;;31950:128;31903:175;32123:2;32090:15;:24;32106:7;32090:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32161:7;32157:2;32141:28;;32150:5;32141:28;;;;;;;;;;;;31847:330;31769:408;;:::o;21596:323::-;21657:7;21885:15;:13;:15::i;:::-;21870:12;;21854:13;;:28;:46;21847:53;;21596:323;:::o;58678:32::-;;;;:::o;35975:2825::-;36117:27;36147;36166:7;36147:18;:27::i;:::-;36117:57;;36232:4;36191:45;;36207:19;36191:45;;;36187:86;;36245:28;;;;;;;;;;;;;;36187:86;36287:27;36316:23;36343:35;36370:7;36343:26;:35::i;:::-;36286:92;;;;36478:68;36503:15;36520:4;36526:19;:17;:19::i;:::-;36478:24;:68::i;:::-;36473:180;;36566:43;36583:4;36589:19;:17;:19::i;:::-;36566:16;:43::i;:::-;36561:92;;36618:35;;;;;;;;;;;;;;36561:92;36473:180;36684:1;36670:16;;:2;:16;;;36666:52;;36695:23;;;;;;;;;;;;;;36666:52;36731:43;36753:4;36759:2;36763:7;36772:1;36731:21;:43::i;:::-;36867:15;36864:160;;;37007:1;36986:19;36979:30;36864:160;37404:18;:24;37423:4;37404:24;;;;;;;;;;;;;;;;37402:26;;;;;;;;;;;;37473:18;:22;37492:2;37473:22;;;;;;;;;;;;;;;;37471:24;;;;;;;;;;;37795:146;37832:2;37881:45;37896:4;37902:2;37906:19;37881:14;:45::i;:::-;17995:8;37853:73;37795:18;:146::i;:::-;37766:17;:26;37784:7;37766:26;;;;;;;;;;;:175;;;;38112:1;17995:8;38061:19;:47;:52;38057:627;;38134:19;38166:1;38156:7;:11;38134:33;;38323:1;38289:17;:30;38307:11;38289:30;;;;;;;;;;;;:35;38285:384;;38427:13;;38412:11;:28;38408:242;;38607:19;38574:17;:30;38592:11;38574:30;;;;;;;;;;;:52;;;;38408:242;38285:384;38115:569;38057:627;38731:7;38727:2;38712:27;;38721:4;38712:27;;;;;;;;;;;;38750:42;38771:4;38777:2;38781:7;38790:1;38750:20;:42::i;:::-;36106:2694;;;35975:2825;;;:::o;63084:153::-;4960:13;:11;:13::i;:::-;63140:12:::1;63155:21;63140:36;;63203:10;63195:24;;:33;63220:7;63195:33;;;;;;;;;;;;;;;;;;;;;;;63187:42;;;::::0;::::1;;63129:108;63084:153::o:0;38896:193::-;39042:39;39059:4;39065:2;39069:7;39042:39;;;;;;;;;;;;:16;:39::i;:::-;38896:193;;;:::o;58560:46::-;;;;;;;;;;;;;:::o;61680:98::-;4960:13;:11;:13::i;:::-;61762:8:::1;61752:7;:18;;;;;;;;;;;;:::i;:::-;;61680:98:::0;:::o;58528:23::-;;;;;;;;;;;;;:::o;58345:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27238:152::-;27310:7;27353:27;27372:7;27353:18;:27::i;:::-;27330:52;;27238:152;;;:::o;58420:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22780:233::-;22852:7;22893:1;22876:19;;:5;:19;;;22872:60;;22904:28;;;;;;;;;;;;;;22872:60;16939:13;22950:18;:25;22969:5;22950:25;;;;;;;;;;;;;;;;:55;22943:62;;22780:233;;;:::o;5722:103::-;4960:13;:11;:13::i;:::-;5787:30:::1;5814:1;5787:18;:30::i;:::-;5722:103::o:0;62831:209::-;59555:10;59543:22;;:8;;;;;;;;;;;:22;;;59535:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62941:17:::1;62949:8;62941:7;:17::i;:::-;62933:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63022:10;62997:12;:22;63010:8;62997:22;;;;;;;;;;;:35;;;;;;;;;;;;:::i;:::-;;62831:209:::0;;:::o;61387:110::-;4960:13;:11;:13::i;:::-;61480:9:::1;61460:17;:29;;;;61387:110:::0;:::o;5074:87::-;5120:7;5147:6;;;;;;;;;;;5140:13;;5074:87;:::o;61285:94::-;4960:13;:11;:13::i;:::-;61362:9:::1;61350;:21;;;;61285:94:::0;:::o;26021:104::-;26077:13;26110:7;26103:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26021:104;:::o;32894:234::-;33041:8;32989:18;:39;33008:19;:17;:19::i;:::-;32989:39;;;;;;;;;;;;;;;:49;33029:8;32989:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;33101:8;33065:55;;33080:19;:17;:19::i;:::-;33065:55;;;33111:8;33065:55;;;;;;:::i;:::-;;;;;;;;32894:234;;:::o;58378:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62676:96::-;4960:13;:11;:13::i;:::-;62755:9:::1;62744:8;;:20;;;;;;;;;;;;;;;;;;62676:96:::0;:::o;39687:407::-;39862:31;39875:4;39881:2;39885:7;39862:12;:31::i;:::-;39926:1;39908:2;:14;;;:19;39904:183;;39947:56;39978:4;39984:2;39988:7;39997:5;39947:30;:56::i;:::-;39942:145;;40031:40;;;;;;;;;;;;;;39942:145;39904:183;39687:407;;;;:::o;59668:765::-;59762:14;59779;:12;:14::i;:::-;59762:31;;59812:12;;;;;;;;;;;59804:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59903:1;59887:13;;:17;;;;:::i;:::-;59876:8;:28;59868:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59973:9;;59961:8;59952:6;:17;;;;:::i;:::-;:30;;59944:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60036:10;60032:333;;;60111:1;60069:18;;;;;;;;;;;:28;;;60098:9;60069:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;60061:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;60209:8;60189:17;;:28;;;;:::i;:::-;60176:9;:41;;60168:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;60032:333;;;60317:8;60305:9;;:20;;;;:::i;:::-;60292:9;:33;;60284:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60032:333;60377:9;:7;:9::i;:::-;60399:26;60405:9;60416:8;60399:5;:26::i;:::-;59751:682;59668:765;;;:::o;60860:272::-;4960:13;:11;:13::i;:::-;60956:14:::1;60973;:12;:14::i;:::-;60956:31;;61032:9;;61015:13;61006:6;:22;;;;:::i;:::-;:35;;60998:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61092:32;61098:10;61110:13;61092:5;:32::i;:::-;60945:187;60860:272:::0;;:::o;61786:431::-;61860:13;61894:17;61902:8;61894:7;:17::i;:::-;61886:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61956:17;61976:10;:8;:10::i;:::-;61956:30;;62052:1;62019:12;:22;62032:8;62019:22;;;;;;;;;;;62002:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;:47;:51;61999:111;;;62076:12;:22;62089:8;62076:22;;;;;;;;;;;62070:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61999:111;62150:1;62136:3;62130:17;:21;:79;;;;;;;;;;;;;;;;;62178:3;62183:19;62193:8;62183:9;:19::i;:::-;62161:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62130:79;62123:86;;;61786:431;;;:::o;62225:143::-;4960:13;:11;:13::i;:::-;62349:10:::1;62307:18;;:53;;;;;;;;;;;;;;;;;;62225:143:::0;:::o;58279:24::-;;;;:::o;61184:93::-;4960:13;:11;:13::i;:::-;61263:6:::1;61248:12;;:21;;;;;;;;;;;;;;;;;;61184:93:::0;:::o;58310:28::-;;;;:::o;58647:24::-;;;;:::o;33285:164::-;33382:4;33406:18;:25;33425:5;33406:25;;;;;;;;;;;;;;;:35;33432:8;33406:35;;;;;;;;;;;;;;;;;;;;;;;;;33399:42;;33285:164;;;;:::o;58758:32::-;;;;;;;;;;;;;:::o;5980:201::-;4960:13;:11;:13::i;:::-;6089:1:::1;6069:22;;:8;:22;;::::0;6061:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6145:28;6164:8;6145:18;:28::i;:::-;5980:201:::0;:::o;62506:122::-;4960:13;:11;:13::i;:::-;62606:14:::1;62588:15;;:32;;;;;;;;;;;;;;;;;;62506:122:::0;:::o;58859:46::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5239:132::-;5314:12;:10;:12::i;:::-;5303:23;;:7;:5;:7::i;:::-;:23;;;5295:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5239:132::o;33707:282::-;33772:4;33828:7;33809:15;:13;:15::i;:::-;:26;;:66;;;;;33862:13;;33852:7;:23;33809:66;:153;;;;;33961:1;17715:8;33913:17;:26;33931:7;33913:26;;;;;;;;;;;;:44;:49;33809:153;33789:173;;33707:282;;;:::o;56015:105::-;56075:7;56102:10;56095:17;;56015:105;:::o;21112:92::-;21168:7;21112:92;:::o;28393:1275::-;28460:7;28480:12;28495:7;28480:22;;28563:4;28544:15;:13;:15::i;:::-;:23;28540:1061;;28597:13;;28590:4;:20;28586:1015;;;28635:14;28652:17;:23;28670:4;28652:23;;;;;;;;;;;;28635:40;;28769:1;17715:8;28741:6;:24;:29;28737:845;;29406:113;29423:1;29413:6;:11;29406:113;;29466:17;:25;29484:6;;;;;;;29466:25;;;;;;;;;;;;29457:34;;29406:113;;;29552:6;29545:13;;;;;;28737:845;28612:989;28586:1015;28540:1061;29629:31;;;;;;;;;;;;;;28393:1275;;;;:::o;34870:485::-;34972:27;35001:23;35042:38;35083:15;:24;35099:7;35083:24;;;;;;;;;;;35042:65;;35260:18;35237:41;;35317:19;35311:26;35292:45;;35222:126;34870:485;;;:::o;34098:659::-;34247:11;34412:16;34405:5;34401:28;34392:37;;34572:16;34561:9;34557:32;34544:45;;34722:15;34711:9;34708:30;34700:5;34689:9;34686:20;34683:56;34673:66;;34098:659;;;;;:::o;40756:159::-;;;;;:::o;55324:311::-;55459:7;55479:16;18119:3;55505:19;:41;;55479:68;;18119:3;55573:31;55584:4;55590:2;55594:9;55573:10;:31::i;:::-;55565:40;;:62;;55558:69;;;55324:311;;;;;:::o;30216:450::-;30296:14;30464:16;30457:5;30453:28;30444:37;;30641:5;30627:11;30602:23;30598:41;30595:52;30588:5;30585:63;30575:73;;30216:450;;;;:::o;41580:158::-;;;;;:::o;6341:191::-;6415:16;6434:6;;;;;;;;;;;6415:25;;6460:8;6451:6;;:17;;;;;;;;;;;;;;;;;;6515:8;6484:40;;6505:8;6484:40;;;;;;;;;;;;6404:128;6341:191;:::o;42178:716::-;42341:4;42387:2;42362:45;;;42408:19;:17;:19::i;:::-;42429:4;42435:7;42444:5;42362:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42358:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42662:1;42645:6;:13;:18;42641:235;;42691:40;;;;;;;;;;;;;;42641:235;42834:6;42828:13;42819:6;42815:2;42811:15;42804:38;42358:529;42531:54;;;42521:64;;;:6;:64;;;;42514:71;;;42178:716;;;;;;:::o;22017:296::-;22072:7;22279:15;:13;:15::i;:::-;22263:13;;:31;22256:38;;22017:296;:::o;60441:411::-;60505:14;60541:3;60535:2;60523:9;:14;60522:22;;;;;:::i;:::-;;;60505:39;;60560:12;60578:15;;;;;;;;;;;:20;;60606:6;60578:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60559:58;;;60640:7;60632:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60707:6;60695:9;:18;60686:27;;60742:15;;;;;;;;;;;:20;;60770:6;60742:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60728:53;;;;;60804:7;60796:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60480:365;;60441:411::o;43356:2966::-;43429:20;43452:13;;43429:36;;43492:1;43480:8;:13;43476:44;;43502:18;;;;;;;;;;;;;;43476:44;43533:61;43563:1;43567:2;43571:12;43585:8;43533:21;:61::i;:::-;44077:1;17077:2;44047:1;:26;;44046:32;44034:8;:45;44008:18;:22;44027:2;44008:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44356:139;44393:2;44447:33;44470:1;44474:2;44478:1;44447:14;:33::i;:::-;44414:30;44435:8;44414:20;:30::i;:::-;:66;44356:18;:139::i;:::-;44322:17;:31;44340:12;44322:31;;;;;;;;;;;:173;;;;44512:16;44543:11;44572:8;44557:12;:23;44543:37;;45093:16;45089:2;45085:25;45073:37;;45465:12;45425:8;45384:1;45322:25;45263:1;45202;45175:335;45836:1;45822:12;45818:20;45776:346;45877:3;45868:7;45865:16;45776:346;;46095:7;46085:8;46082:1;46055:25;46052:1;46049;46044:59;45930:1;45921:7;45917:15;45906:26;;45776:346;;;45780:77;46167:1;46155:8;:13;46151:45;;46177:19;;;;;;;;;;;;;;46151:45;46229:3;46213:13;:19;;;;43782:2462;;46254:60;46283:1;46287:2;46291:12;46305:8;46254:20;:60::i;:::-;43418:2904;43356:2966;;:::o;61505:167::-;61619:13;61657:7;61650:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61505:167;:::o;56222:1745::-;56287:17;56721:4;56714;56708:11;56704:22;56813:1;56807:4;56800:15;56888:4;56885:1;56881:12;56874:19;;56970:1;56965:3;56958:14;57074:3;57313:5;57295:428;57321:1;57295:428;;;57361:1;57356:3;57352:11;57345:18;;57532:2;57526:4;57522:13;57518:2;57514:22;57509:3;57501:36;57626:2;57620:4;57616:13;57608:21;;57693:4;57295:428;57683:25;57295:428;57299:21;57762:3;57757;57753:13;57877:4;57872:3;57868:14;57861:21;;57942:6;57937:3;57930:19;56326:1634;;;56222:1745;;;:::o;3625:98::-;3678:7;3705:10;3698:17;;3625:98;:::o;55025:147::-;55162:6;55025:147;;;;;:::o;30768:324::-;30838:14;31071:1;31061:8;31058:15;31032:24;31028:46;31018:56;;30768:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:60::-;6278:3;6299:5;6292:12;;6250:60;;;:::o;6316:142::-;6366:9;6399:53;6417:34;6426:24;6444:5;6426:24;:::i;:::-;6417:34;:::i;:::-;6399:53;:::i;:::-;6386:66;;6316:142;;;:::o;6464:126::-;6514:9;6547:37;6578:5;6547:37;:::i;:::-;6534:50;;6464:126;;;:::o;6596:155::-;6675:9;6708:37;6739:5;6708:37;:::i;:::-;6695:50;;6596:155;;;:::o;6757:189::-;6873:66;6933:5;6873:66;:::i;:::-;6868:3;6861:79;6757:189;;:::o;6952:280::-;7074:4;7112:2;7101:9;7097:18;7089:26;;7125:100;7222:1;7211:9;7207:17;7198:6;7125:100;:::i;:::-;6952:280;;;;:::o;7238:117::-;7347:1;7344;7337:12;7361:117;7470:1;7467;7460:12;7484:180;7532:77;7529:1;7522:88;7629:4;7626:1;7619:15;7653:4;7650:1;7643:15;7670:281;7753:27;7775:4;7753:27;:::i;:::-;7745:6;7741:40;7883:6;7871:10;7868:22;7847:18;7835:10;7832:34;7829:62;7826:88;;;7894:18;;:::i;:::-;7826:88;7934:10;7930:2;7923:22;7713:238;7670:281;;:::o;7957:129::-;7991:6;8018:20;;:::i;:::-;8008:30;;8047:33;8075:4;8067:6;8047:33;:::i;:::-;7957:129;;;:::o;8092:308::-;8154:4;8244:18;8236:6;8233:30;8230:56;;;8266:18;;:::i;:::-;8230:56;8304:29;8326:6;8304:29;:::i;:::-;8296:37;;8388:4;8382;8378:15;8370:23;;8092:308;;;:::o;8406:154::-;8490:6;8485:3;8480;8467:30;8552:1;8543:6;8538:3;8534:16;8527:27;8406:154;;;:::o;8566:412::-;8644:5;8669:66;8685:49;8727:6;8685:49;:::i;:::-;8669:66;:::i;:::-;8660:75;;8758:6;8751:5;8744:21;8796:4;8789:5;8785:16;8834:3;8825:6;8820:3;8816:16;8813:25;8810:112;;;8841:79;;:::i;:::-;8810:112;8931:41;8965:6;8960:3;8955;8931:41;:::i;:::-;8650:328;8566:412;;;;;:::o;8998:340::-;9054:5;9103:3;9096:4;9088:6;9084:17;9080:27;9070:122;;9111:79;;:::i;:::-;9070:122;9228:6;9215:20;9253:79;9328:3;9320:6;9313:4;9305:6;9301:17;9253:79;:::i;:::-;9244:88;;9060:278;8998:340;;;;:::o;9344:509::-;9413:6;9462:2;9450:9;9441:7;9437:23;9433:32;9430:119;;;9468:79;;:::i;:::-;9430:119;9616:1;9605:9;9601:17;9588:31;9646:18;9638:6;9635:30;9632:117;;;9668:79;;:::i;:::-;9632:117;9773:63;9828:7;9819:6;9808:9;9804:22;9773:63;:::i;:::-;9763:73;;9559:287;9344:509;;;;:::o;9859:654::-;9937:6;9945;9994:2;9982:9;9973:7;9969:23;9965:32;9962:119;;;10000:79;;:::i;:::-;9962:119;10120:1;10145:53;10190:7;10181:6;10170:9;10166:22;10145:53;:::i;:::-;10135:63;;10091:117;10275:2;10264:9;10260:18;10247:32;10306:18;10298:6;10295:30;10292:117;;;10328:79;;:::i;:::-;10292:117;10433:63;10488:7;10479:6;10468:9;10464:22;10433:63;:::i;:::-;10423:73;;10218:288;9859:654;;;;;:::o;10519:116::-;10589:21;10604:5;10589:21;:::i;:::-;10582:5;10579:32;10569:60;;10625:1;10622;10615:12;10569:60;10519:116;:::o;10641:133::-;10684:5;10722:6;10709:20;10700:29;;10738:30;10762:5;10738:30;:::i;:::-;10641:133;;;;:::o;10780:468::-;10845:6;10853;10902:2;10890:9;10881:7;10877:23;10873:32;10870:119;;;10908:79;;:::i;:::-;10870:119;11028:1;11053:53;11098:7;11089:6;11078:9;11074:22;11053:53;:::i;:::-;11043:63;;10999:117;11155:2;11181:50;11223:7;11214:6;11203:9;11199:22;11181:50;:::i;:::-;11171:60;;11126:115;10780:468;;;;;:::o;11254:307::-;11315:4;11405:18;11397:6;11394:30;11391:56;;;11427:18;;:::i;:::-;11391:56;11465:29;11487:6;11465:29;:::i;:::-;11457:37;;11549:4;11543;11539:15;11531:23;;11254:307;;;:::o;11567:410::-;11644:5;11669:65;11685:48;11726:6;11685:48;:::i;:::-;11669:65;:::i;:::-;11660:74;;11757:6;11750:5;11743:21;11795:4;11788:5;11784:16;11833:3;11824:6;11819:3;11815:16;11812:25;11809:112;;;11840:79;;:::i;:::-;11809:112;11930:41;11964:6;11959:3;11954;11930:41;:::i;:::-;11650:327;11567:410;;;;;:::o;11996:338::-;12051:5;12100:3;12093:4;12085:6;12081:17;12077:27;12067:122;;12108:79;;:::i;:::-;12067:122;12225:6;12212:20;12250:78;12324:3;12316:6;12309:4;12301:6;12297:17;12250:78;:::i;:::-;12241:87;;12057:277;11996:338;;;;:::o;12340:943::-;12435:6;12443;12451;12459;12508:3;12496:9;12487:7;12483:23;12479:33;12476:120;;;12515:79;;:::i;:::-;12476:120;12635:1;12660:53;12705:7;12696:6;12685:9;12681:22;12660:53;:::i;:::-;12650:63;;12606:117;12762:2;12788:53;12833:7;12824:6;12813:9;12809:22;12788:53;:::i;:::-;12778:63;;12733:118;12890:2;12916:53;12961:7;12952:6;12941:9;12937:22;12916:53;:::i;:::-;12906:63;;12861:118;13046:2;13035:9;13031:18;13018:32;13077:18;13069:6;13066:30;13063:117;;;13099:79;;:::i;:::-;13063:117;13204:62;13258:7;13249:6;13238:9;13234:22;13204:62;:::i;:::-;13194:72;;12989:287;12340:943;;;;;;;:::o;13289:613::-;13363:6;13371;13379;13428:2;13416:9;13407:7;13403:23;13399:32;13396:119;;;13434:79;;:::i;:::-;13396:119;13554:1;13579:53;13624:7;13615:6;13604:9;13600:22;13579:53;:::i;:::-;13569:63;;13525:117;13681:2;13707:53;13752:7;13743:6;13732:9;13728:22;13707:53;:::i;:::-;13697:63;;13652:118;13809:2;13835:50;13877:7;13868:6;13857:9;13853:22;13835:50;:::i;:::-;13825:60;;13780:115;13289:613;;;;;:::o;13908:474::-;13976:6;13984;14033:2;14021:9;14012:7;14008:23;14004:32;14001:119;;;14039:79;;:::i;:::-;14001:119;14159:1;14184:53;14229:7;14220:6;14209:9;14205:22;14184:53;:::i;:::-;14174:63;;14130:117;14286:2;14312:53;14357:7;14348:6;14337:9;14333:22;14312:53;:::i;:::-;14302:63;;14257:118;13908:474;;;;;:::o;14388:323::-;14444:6;14493:2;14481:9;14472:7;14468:23;14464:32;14461:119;;;14499:79;;:::i;:::-;14461:119;14619:1;14644:50;14686:7;14677:6;14666:9;14662:22;14644:50;:::i;:::-;14634:60;;14590:114;14388:323;;;;:::o;14717:474::-;14785:6;14793;14842:2;14830:9;14821:7;14817:23;14813:32;14810:119;;;14848:79;;:::i;:::-;14810:119;14968:1;14993:53;15038:7;15029:6;15018:9;15014:22;14993:53;:::i;:::-;14983:63;;14939:117;15095:2;15121:53;15166:7;15157:6;15146:9;15142:22;15121:53;:::i;:::-;15111:63;;15066:118;14717:474;;;;;:::o;15197:180::-;15245:77;15242:1;15235:88;15342:4;15339:1;15332:15;15366:4;15363:1;15356:15;15383:320;15427:6;15464:1;15458:4;15454:12;15444:22;;15511:1;15505:4;15501:12;15532:18;15522:81;;15588:4;15580:6;15576:17;15566:27;;15522:81;15650:2;15642:6;15639:14;15619:18;15616:38;15613:84;;15669:18;;:::i;:::-;15613:84;15434:269;15383:320;;;:::o;15709:176::-;15849:28;15845:1;15837:6;15833:14;15826:52;15709:176;:::o;15891:366::-;16033:3;16054:67;16118:2;16113:3;16054:67;:::i;:::-;16047:74;;16130:93;16219:3;16130:93;:::i;:::-;16248:2;16243:3;16239:12;16232:19;;15891:366;;;:::o;16263:419::-;16429:4;16467:2;16456:9;16452:18;16444:26;;16516:9;16510:4;16506:20;16502:1;16491:9;16487:17;16480:47;16544:131;16670:4;16544:131;:::i;:::-;16536:139;;16263:419;;;:::o;16688:173::-;16828:25;16824:1;16816:6;16812:14;16805:49;16688:173;:::o;16867:366::-;17009:3;17030:67;17094:2;17089:3;17030:67;:::i;:::-;17023:74;;17106:93;17195:3;17106:93;:::i;:::-;17224:2;17219:3;17215:12;17208:19;;16867:366;;;:::o;17239:419::-;17405:4;17443:2;17432:9;17428:18;17420:26;;17492:9;17486:4;17482:20;17478:1;17467:9;17463:17;17456:47;17520:131;17646:4;17520:131;:::i;:::-;17512:139;;17239:419;;;:::o;17664:178::-;17804:30;17800:1;17792:6;17788:14;17781:54;17664:178;:::o;17848:366::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:419::-;18386:4;18424:2;18413:9;18409:18;18401:26;;18473:9;18467:4;18463:20;18459:1;18448:9;18444:17;18437:47;18501:131;18627:4;18501:131;:::i;:::-;18493:139;;18220:419;;;:::o;18645:180::-;18693:77;18690:1;18683:88;18790:4;18787:1;18780:15;18814:4;18811:1;18804:15;18831:305;18871:3;18890:20;18908:1;18890:20;:::i;:::-;18885:25;;18924:20;18942:1;18924:20;:::i;:::-;18919:25;;19078:1;19010:66;19006:74;19003:1;19000:81;18997:107;;;19084:18;;:::i;:::-;18997:107;19128:1;19125;19121:9;19114:16;;18831:305;;;;:::o;19142:174::-;19282:26;19278:1;19270:6;19266:14;19259:50;19142:174;:::o;19322:366::-;19464:3;19485:67;19549:2;19544:3;19485:67;:::i;:::-;19478:74;;19561:93;19650:3;19561:93;:::i;:::-;19679:2;19674:3;19670:12;19663:19;;19322:366;;;:::o;19694:419::-;19860:4;19898:2;19887:9;19883:18;19875:26;;19947:9;19941:4;19937:20;19933:1;19922:9;19918:17;19911:47;19975:131;20101:4;19975:131;:::i;:::-;19967:139;;19694:419;;;:::o;20119:174::-;20259:26;20255:1;20247:6;20243:14;20236:50;20119:174;:::o;20299:366::-;20441:3;20462:67;20526:2;20521:3;20462:67;:::i;:::-;20455:74;;20538:93;20627:3;20538:93;:::i;:::-;20656:2;20651:3;20647:12;20640:19;;20299:366;;;:::o;20671:419::-;20837:4;20875:2;20864:9;20860:18;20852:26;;20924:9;20918:4;20914:20;20910:1;20899:9;20895:17;20888:47;20952:131;21078:4;20952:131;:::i;:::-;20944:139;;20671:419;;;:::o;21096:143::-;21153:5;21184:6;21178:13;21169:22;;21200:33;21227:5;21200:33;:::i;:::-;21096:143;;;;:::o;21245:351::-;21315:6;21364:2;21352:9;21343:7;21339:23;21335:32;21332:119;;;21370:79;;:::i;:::-;21332:119;21490:1;21515:64;21571:7;21562:6;21551:9;21547:22;21515:64;:::i;:::-;21505:74;;21461:128;21245:351;;;;:::o;21602:225::-;21742:34;21738:1;21730:6;21726:14;21719:58;21811:8;21806:2;21798:6;21794:15;21787:33;21602:225;:::o;21833:366::-;21975:3;21996:67;22060:2;22055:3;21996:67;:::i;:::-;21989:74;;22072:93;22161:3;22072:93;:::i;:::-;22190:2;22185:3;22181:12;22174:19;;21833:366;;;:::o;22205:419::-;22371:4;22409:2;22398:9;22394:18;22386:26;;22458:9;22452:4;22448:20;22444:1;22433:9;22429:17;22422:47;22486:131;22612:4;22486:131;:::i;:::-;22478:139;;22205:419;;;:::o;22630:348::-;22670:7;22693:20;22711:1;22693:20;:::i;:::-;22688:25;;22727:20;22745:1;22727:20;:::i;:::-;22722:25;;22915:1;22847:66;22843:74;22840:1;22837:81;22832:1;22825:9;22818:17;22814:105;22811:131;;;22922:18;;:::i;:::-;22811:131;22970:1;22967;22963:9;22952:20;;22630:348;;;;:::o;22984:182::-;23124:34;23120:1;23112:6;23108:14;23101:58;22984:182;:::o;23172:366::-;23314:3;23335:67;23399:2;23394:3;23335:67;:::i;:::-;23328:74;;23411:93;23500:3;23411:93;:::i;:::-;23529:2;23524:3;23520:12;23513:19;;23172:366;;;:::o;23544:419::-;23710:4;23748:2;23737:9;23733:18;23725:26;;23797:9;23791:4;23787:20;23783:1;23772:9;23768:17;23761:47;23825:131;23951:4;23825:131;:::i;:::-;23817:139;;23544:419;;;:::o;23969:173::-;24109:25;24105:1;24097:6;24093:14;24086:49;23969:173;:::o;24148:366::-;24290:3;24311:67;24375:2;24370:3;24311:67;:::i;:::-;24304:74;;24387:93;24476:3;24387:93;:::i;:::-;24505:2;24500:3;24496:12;24489:19;;24148:366;;;:::o;24520:419::-;24686:4;24724:2;24713:9;24709:18;24701:26;;24773:9;24767:4;24763:20;24759:1;24748:9;24744:17;24737:47;24801:131;24927:4;24801:131;:::i;:::-;24793:139;;24520:419;;;:::o;24945:174::-;25085:26;25081:1;25073:6;25069:14;25062:50;24945:174;:::o;25125:366::-;25267:3;25288:67;25352:2;25347:3;25288:67;:::i;:::-;25281:74;;25364:93;25453:3;25364:93;:::i;:::-;25482:2;25477:3;25473:12;25466:19;;25125:366;;;:::o;25497:419::-;25663:4;25701:2;25690:9;25686:18;25678:26;;25750:9;25744:4;25740:20;25736:1;25725:9;25721:17;25714:47;25778:131;25904:4;25778:131;:::i;:::-;25770:139;;25497:419;;;:::o;25922:177::-;26062:29;26058:1;26050:6;26046:14;26039:53;25922:177;:::o;26105:366::-;26247:3;26268:67;26332:2;26327:3;26268:67;:::i;:::-;26261:74;;26344:93;26433:3;26344:93;:::i;:::-;26462:2;26457:3;26453:12;26446:19;;26105:366;;;:::o;26477:419::-;26643:4;26681:2;26670:9;26666:18;26658:26;;26730:9;26724:4;26720:20;26716:1;26705:9;26701:17;26694:47;26758:131;26884:4;26758:131;:::i;:::-;26750:139;;26477:419;;;:::o;26902:148::-;27004:11;27041:3;27026:18;;26902:148;;;;:::o;27056:141::-;27105:4;27128:3;27120:11;;27151:3;27148:1;27141:14;27185:4;27182:1;27172:18;27164:26;;27056:141;;;:::o;27227:845::-;27330:3;27367:5;27361:12;27396:36;27422:9;27396:36;:::i;:::-;27448:89;27530:6;27525:3;27448:89;:::i;:::-;27441:96;;27568:1;27557:9;27553:17;27584:1;27579:137;;;;27730:1;27725:341;;;;27546:520;;27579:137;27663:4;27659:9;27648;27644:25;27639:3;27632:38;27699:6;27694:3;27690:16;27683:23;;27579:137;;27725:341;27792:38;27824:5;27792:38;:::i;:::-;27852:1;27866:154;27880:6;27877:1;27874:13;27866:154;;;27954:7;27948:14;27944:1;27939:3;27935:11;27928:35;28004:1;27995:7;27991:15;27980:26;;27902:4;27899:1;27895:12;27890:17;;27866:154;;;28049:6;28044:3;28040:16;28033:23;;27732:334;;27546:520;;27334:738;;27227:845;;;;:::o;28078:269::-;28207:3;28229:92;28317:3;28308:6;28229:92;:::i;:::-;28222:99;;28338:3;28331:10;;28078:269;;;;:::o;28353:377::-;28459:3;28487:39;28520:5;28487:39;:::i;:::-;28542:89;28624:6;28619:3;28542:89;:::i;:::-;28535:96;;28640:52;28685:6;28680:3;28673:4;28666:5;28662:16;28640:52;:::i;:::-;28717:6;28712:3;28708:16;28701:23;;28463:267;28353:377;;;;:::o;28736:435::-;28916:3;28938:95;29029:3;29020:6;28938:95;:::i;:::-;28931:102;;29050:95;29141:3;29132:6;29050:95;:::i;:::-;29043:102;;29162:3;29155:10;;28736:435;;;;;:::o;29177:225::-;29317:34;29313:1;29305:6;29301:14;29294:58;29386:8;29381:2;29373:6;29369:15;29362:33;29177:225;:::o;29408:366::-;29550:3;29571:67;29635:2;29630:3;29571:67;:::i;:::-;29564:74;;29647:93;29736:3;29647:93;:::i;:::-;29765:2;29760:3;29756:12;29749:19;;29408:366;;;:::o;29780:419::-;29946:4;29984:2;29973:9;29969:18;29961:26;;30033:9;30027:4;30023:20;30019:1;30008:9;30004:17;29997:47;30061:131;30187:4;30061:131;:::i;:::-;30053:139;;29780:419;;;:::o;30205:182::-;30345:34;30341:1;30333:6;30329:14;30322:58;30205:182;:::o;30393:366::-;30535:3;30556:67;30620:2;30615:3;30556:67;:::i;:::-;30549:74;;30632:93;30721:3;30632:93;:::i;:::-;30750:2;30745:3;30741:12;30734:19;;30393:366;;;:::o;30765:419::-;30931:4;30969:2;30958:9;30954:18;30946:26;;31018:9;31012:4;31008:20;31004:1;30993:9;30989:17;30982:47;31046:131;31172:4;31046:131;:::i;:::-;31038:139;;30765:419;;;:::o;31190:98::-;31241:6;31275:5;31269:12;31259:22;;31190:98;;;:::o;31294:168::-;31377:11;31411:6;31406:3;31399:19;31451:4;31446:3;31442:14;31427:29;;31294:168;;;;:::o;31468:360::-;31554:3;31582:38;31614:5;31582:38;:::i;:::-;31636:70;31699:6;31694:3;31636:70;:::i;:::-;31629:77;;31715:52;31760:6;31755:3;31748:4;31741:5;31737:16;31715:52;:::i;:::-;31792:29;31814:6;31792:29;:::i;:::-;31787:3;31783:39;31776:46;;31558:270;31468:360;;;;:::o;31834:640::-;32029:4;32067:3;32056:9;32052:19;32044:27;;32081:71;32149:1;32138:9;32134:17;32125:6;32081:71;:::i;:::-;32162:72;32230:2;32219:9;32215:18;32206:6;32162:72;:::i;:::-;32244;32312:2;32301:9;32297:18;32288:6;32244:72;:::i;:::-;32363:9;32357:4;32353:20;32348:2;32337:9;32333:18;32326:48;32391:76;32462:4;32453:6;32391:76;:::i;:::-;32383:84;;31834:640;;;;;;;:::o;32480:141::-;32536:5;32567:6;32561:13;32552:22;;32583:32;32609:5;32583:32;:::i;:::-;32480:141;;;;:::o;32627:349::-;32696:6;32745:2;32733:9;32724:7;32720:23;32716:32;32713:119;;;32751:79;;:::i;:::-;32713:119;32871:1;32896:63;32951:7;32942:6;32931:9;32927:22;32896:63;:::i;:::-;32886:73;;32842:127;32627:349;;;;:::o;32982:180::-;33030:77;33027:1;33020:88;33127:4;33124:1;33117:15;33151:4;33148:1;33141:15;33168:147;33269:11;33306:3;33291:18;;33168:147;;;;:::o;33321:114::-;;:::o;33441:398::-;33600:3;33621:83;33702:1;33697:3;33621:83;:::i;:::-;33614:90;;33713:93;33802:3;33713:93;:::i;:::-;33831:1;33826:3;33822:11;33815:18;;33441:398;;;:::o;33845:379::-;34029:3;34051:147;34194:3;34051:147;:::i;:::-;34044:154;;34215:3;34208:10;;33845:379;;;:::o;34230:167::-;34370:19;34366:1;34358:6;34354:14;34347:43;34230:167;:::o;34403:366::-;34545:3;34566:67;34630:2;34625:3;34566:67;:::i;:::-;34559:74;;34642:93;34731:3;34642:93;:::i;:::-;34760:2;34755:3;34751:12;34744:19;;34403:366;;;:::o;34775:419::-;34941:4;34979:2;34968:9;34964:18;34956:26;;35028:9;35022:4;35018:20;35014:1;35003:9;34999:17;34992:47;35056:131;35182:4;35056:131;:::i;:::-;35048:139;;34775:419;;;:::o;35200:167::-;35340:19;35336:1;35328:6;35324:14;35317:43;35200:167;:::o;35373:366::-;35515:3;35536:67;35600:2;35595:3;35536:67;:::i;:::-;35529:74;;35612:93;35701:3;35612:93;:::i;:::-;35730:2;35725:3;35721:12;35714:19;;35373:366;;;:::o;35745:419::-;35911:4;35949:2;35938:9;35934:18;35926:26;;35998:9;35992:4;35988:20;35984:1;35973:9;35969:17;35962:47;36026:131;36152:4;36026:131;:::i;:::-;36018:139;;35745:419;;;:::o

Swarm Source

ipfs://a3e87d44e89a76289234dfd0217b14471a9327e48e59756a1b33d804dd63d14b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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