ETH Price: $3,842.48 (+5.84%)

Token

ETH Senders (ETHS)
 

Overview

Max Total Supply

7,777 ETHS

Holders

2,605

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ETHS
0x57c56ed52ee50a23730ba533b9a2b48053591ba6
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:
ETHSenders

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-06-08
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.13;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

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


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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId, bool approvalCheck) internal virtual {
        address owner = ownerOf(tokenId);

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

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

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

abstract contract Ownable {
    address public owner; 
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
    function transferOwnership(address new_) external onlyOwner { owner = new_; }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

abstract contract MerkleProof {
    bytes32 internal _merkleRoot;
    function _setMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _merkleRoot = merkleRoot_;
    }

    function isTeam(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRoot;
    }
}

contract ETHSenders is ERC721A, Ownable, OperatorFilterer, MerkleProof {

    uint256 public maxToken = 7777;
    uint256 public maxFreeSupply = 7777;
    uint256 public mintMax = 7; 

    // booleans for if mint is enabled
    bool public mintEnabled = false;

    uint256 public mintPrice = 0.005 ether;

    bool public revealed;

    string private revealURI;
    string private baseTokenURI;

    mapping(address => uint256) public minted;

    constructor() ERC721A("ETH Senders", "ETHS") OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {
        sethiddenBaseURI("yougetnothing.eth");
    }

    //mint function

    function mint(uint256 _amount) public payable onlySender { 
        require(mintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax >= _amount, "Exceed max per tx");
        require(mintMax >= minted[msg.sender] + _amount, "Exceed max per address");

        if ((_amount + totalSupply() <= maxFreeSupply) && (minted[msg.sender] == 0)) {
            require(msg.value >= ((_amount * mintPrice) - mintPrice), "Not enough ether sent");
        } else {
            require(msg.value >= mintPrice * _amount, "Value sent is not correct");
        }

        payable(owner).transfer(msg.value);
        minted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    function teamMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(isTeam(msg.sender, proof_), "You are not team member!");
        payable(owner).transfer(msg.value);
        _safeMint(msg.sender, _amount);
    }
    //owner function

    function toggleMint() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setMaxMint(uint256 newMax) external onlyOwner {
        mintMax = newMax;
    }
    
    function setPrice(uint256 newPrice) external onlyOwner {
        mintPrice = newPrice;
    }

    function setMaxFreeSupply(uint256 newMaxFreeSupply) external onlyOwner {
        maxFreeSupply = newMaxFreeSupply;
    }

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        _setMerkleRoot(merkleRoot_);
    }

    function setReveal() public onlyOwner {
        revealed = !revealed;
    }

    function sethiddenBaseURI(string memory uri_) public onlyOwner {
        revealURI = uri_;
    }

    function setBaseURI(string memory uri_) public onlyOwner {
        baseTokenURI = uri_;
    }

    //view function

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function currentBaseURI() private view returns (string memory){
        return baseTokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if(revealed == false) {
        return revealURI;
        }
        return string(abi.encodePacked(currentBaseURI(), Strings.toString(tokenId), ".json"));
    }

    //modifier

    modifier onlySender() {
        require(msg.sender == tx.origin, "No smart contract");
        _;
    }

    //filterer

    function transferFrom(address from, address to, uint256 tokenId)
        public
        payable
        override
        onlyAllowedOperator(from)
    {
        super.transferFrom(from, to, tokenId);
    }

    function reserveBulk(address[] memory to) external onlyOwner {
        for (uint i = 0; i < to.length;i++) {
            _safeMint(to[i], 1);
        }
    }

    function safeTransferFrom(address from, address to, uint256 tokenId)
        public
        payable
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"reserveBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxFreeSupply","type":"uint256"}],"name":"setMaxFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"sethiddenBaseURI","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":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","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":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611e61600a55611e61600b556007600c556000600d60006101000a81548160ff0219169083151502179055506611c37937e08000600e553480156200004857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f4554482053656e646572730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f45544853000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e492919062000452565b508060039080519060200190620000fd92919062000452565b506200010e6200039a60201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034c57801562000212576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d892919062000547565b600060405180830381600087803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050506200034b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029292919062000547565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050506200034a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000315919062000574565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b505050505b5b5b5050620003946040518060400160405280601181526020017f796f756765746e6f7468696e672e657468000000000000000000000000000000815250620003a360201b60201c565b62000678565b60006001905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000436576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042d90620005f2565b60405180910390fd5b80601090805190602001906200044e92919062000452565b5050565b828054620004609062000643565b90600052602060002090601f016020900481019282620004845760008555620004d0565b82601f106200049f57805160ff1916838001178555620004d0565b82800160010185558215620004d0579182015b82811115620004cf578251825591602001919060010190620004b2565b5b509050620004df9190620004e3565b5090565b5b80821115620004fe576000816000905550600101620004e4565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200052f8262000502565b9050919050565b620005418162000522565b82525050565b60006040820190506200055e600083018562000536565b6200056d602083018462000536565b9392505050565b60006020820190506200058b600083018462000536565b92915050565b600082825260208201905092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000620005da600a8362000591565b9150620005e782620005a2565b602082019050919050565b600060208201905081810360008301526200060d81620005cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065c57607f821691505b60208210810362000672576200067162000614565b5b50919050565b6141d880620006886000396000f3fe6080604052600436106102045760003560e01c80637664531511610118578063a22cb465116100a0578063ca69e3231161006f578063ca69e32314610713578063d12397301461073e578063d3dd5fe014610769578063e985e9c514610780578063f2fde38b146107bd57610204565b8063a22cb46514610675578063b0ee9f761461069e578063b88d4fde146106ba578063c87b56dd146106d657610204565b80638da5cb5b116100e75780638da5cb5b146105b157806391b7f5ed146105dc57806395d89b4114610605578063a0712d6814610630578063a08c008b1461064c57610204565b8063766453151461050b5780637b47d0fd146105225780637ba5b5fb1461055f5780637cb647591461058857610204565b8063475133341161019b57806355f804b31161016a57806355f804b3146104145780635b28fd911461043d5780636352211e146104665780636817c76c146104a357806370a08231146104ce57610204565b8063475133341461036a5780634d1555611461039557806351830227146103c0578063547520fe146103eb57610204565b806318160ddd116101d757806318160ddd146102ca5780631e7269c5146102f557806323b872dd1461033257806342842e0e1461034e57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612ee4565b6107e6565b60405161023d9190612f2c565b60405180910390f35b34801561025257600080fd5b5061025b610878565b6040516102689190612fe0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613038565b61090a565b6040516102a591906130a6565b60405180910390f35b6102c860048036038101906102c391906130ed565b610989565b005b3480156102d657600080fd5b506102df610999565b6040516102ec919061313c565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613157565b6109b0565b604051610329919061313c565b60405180910390f35b61034c60048036038101906103479190613184565b6109c8565b005b61036860048036038101906103639190613184565b610baa565b005b34801561037657600080fd5b5061037f610d8c565b60405161038c919061313c565b60405180910390f35b3480156103a157600080fd5b506103aa610d92565b6040516103b7919061313c565b60405180910390f35b3480156103cc57600080fd5b506103d5610d98565b6040516103e29190612f2c565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613038565b610dab565b005b34801561042057600080fd5b5061043b6004803603810190610436919061330c565b610e45565b005b34801561044957600080fd5b50610464600480360381019061045f9190613038565b610eef565b005b34801561047257600080fd5b5061048d60048036038101906104889190613038565b610f89565b60405161049a91906130a6565b60405180910390f35b3480156104af57600080fd5b506104b8610f9b565b6040516104c5919061313c565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613157565b610fa1565b604051610502919061313c565b60405180910390f35b34801561051757600080fd5b50610520611059565b005b34801561052e57600080fd5b5061054960048036038101906105449190613453565b611115565b6040516105569190612f2c565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613572565b61121e565b005b34801561059457600080fd5b506105af60048036038101906105aa91906135bb565b6112f6565b005b3480156105bd57600080fd5b506105c6611392565b6040516105d391906130a6565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613038565b6113b8565b005b34801561061157600080fd5b5061061a611452565b6040516106279190612fe0565b60405180910390f35b61064a60048036038101906106459190613038565b6114e4565b005b34801561065857600080fd5b50610673600480360381019061066e919061330c565b6118ba565b005b34801561068157600080fd5b5061069c60048036038101906106979190613614565b611964565b005b6106b860048036038101906106b39190613654565b611a6f565b005b6106d460048036038101906106cf9190613751565b611b9d565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190613038565b611d82565b60405161070a9190612fe0565b60405180910390f35b34801561071f57600080fd5b50610728611eb2565b604051610735919061313c565b60405180910390f35b34801561074a57600080fd5b50610753611eb8565b6040516107609190612f2c565b60405180910390f35b34801561077557600080fd5b5061077e611ecb565b005b34801561078c57600080fd5b506107a760048036038101906107a291906137d4565b611f87565b6040516107b49190612f2c565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190613157565b61201b565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461088790613843565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613843565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b6000610915826120ef565b61094b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109958282600161214e565b5050565b60006109a361229e565b6001546000540303905090565b60126020528060005260406000206000915090505481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b98573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3a57610a358484846122a7565b610ba4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a83929190613874565b602060405180830381865afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac491906138b2565b8015610b5657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b14929190613874565b602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906138b2565b5b610b9757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8e91906130a6565b60405180910390fd5b5b610ba38484846122a7565b5b50505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c57610c178484846125c9565b610d86565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c65929190613874565b602060405180830381865afa158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca691906138b2565b8015610d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cf6929190613874565b602060405180830381865afa158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906138b2565b5b610d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d7091906130a6565b60405180910390fd5b5b610d858484846125c9565b5b50505050565b600b5481565b600c5481565b600f60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e329061392b565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc9061392b565b60405180910390fd5b8060119080519060200190610eeb929190612dd5565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061392b565b60405180910390fd5b80600b8190555050565b6000610f94826125e9565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611008576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061392b565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600080836040516020016111299190613993565b60405160208183030381529060405280519060200120905060005b835181101561120f578381815181106111605761115f6139ae565b5b602002602001015182106111b657838181518110611181576111806139ae565b5b60200260200101518260405160200161119b9291906139fe565b604051602081830303815290604052805190602001206111fa565b818482815181106111ca576111c96139ae565b5b60200260200101516040516020016111e39291906139fe565b604051602081830303815290604052805190602001205b9150808061120790613a59565b915050611144565b50600954811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061392b565b60405180910390fd5b60005b81518110156112f2576112df8282815181106112d0576112cf6139ae565b5b602002602001015160016126b5565b80806112ea90613a59565b9150506112b1565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d9061392b565b60405180910390fd5b61138f816126d3565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061392b565b60405180910390fd5b80600e8190555050565b60606003805461146190613843565b80601f016020809104026020016040519081016040528092919081815260200182805461148d90613843565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613aed565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90613b59565b60405180910390fd5b600a546115b3610999565b826115be9190613b79565b11156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613c1b565b60405180910390fd5b80600c541015611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90613c87565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461168f9190613b79565b600c5410156116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613cf3565b60405180910390fd5b600b546116de610999565b826116e99190613b79565b1115801561173657506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561179d57600e54600e548261174c9190613d13565b6117569190613d6d565b341015611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613ded565b60405180910390fd5b6117ee565b80600e546117ab9190613d13565b3410156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613e59565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611856573d6000803e3d6000fd5b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118a69190613b79565b925050819055506118b733826126b5565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119419061392b565b60405180910390fd5b8060109080519060200190611960929190612dd5565b5050565b80600760006119716126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1e6126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a639190612f2c565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613aed565b60405180910390fd5b611ae73382611115565b611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90613ec5565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b8e573d6000803e3d6000fd5b50611b9933836126b5565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d6e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c1057611c0b858585856126e5565b611d7b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c59929190613874565b602060405180830381865afa158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9a91906138b2565b8015611d2c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cea929190613874565b602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b91906138b2565b5b611d6d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d6491906130a6565b60405180910390fd5b5b611d7a858585856126e5565b5b5050505050565b6060611d8d826120ef565b611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390613f57565b60405180910390fd5b60001515600f60009054906101000a900460ff16151503611e795760108054611df490613843565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2090613843565b8015611e6d5780601f10611e4257610100808354040283529160200191611e6d565b820191906000526020600020905b815481529060010190602001808311611e5057829003601f168201915b50505050509050611ead565b611e81612758565b611e8a836127ea565b604051602001611e9b929190613fff565b60405160208183030381529060405290505b919050565b600a5481565b600d60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061392b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a29061392b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816120fa61229e565b11158015612109575060005482105b8015612147575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061215983610f89565b905081801561219b57508073ffffffffffffffffffffffffffffffffffffffff166121826126dd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156121e8576121b1816121ac6126dd565b611f87565b6121e7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006122b2826125e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612319576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123258461294a565b9150915061233b81876123366126dd565b612971565b612387576123508661234b6126dd565b611f87565b612386576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fa86868660016129b5565b801561240557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124d3856124af8888876129bb565b7c0200000000000000000000000000000000000000000000000000000000176129e3565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125595760006001850190506000600460008381526020019081526020016000205403612557576000548114612556578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18686866001612a0e565b505050505050565b6125e483838360405180602001604052806000815250611b9d565b505050565b600080829050806125f861229e565b1161267e5760005481101561267d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361267b575b60008103612671576004600083600190039350838152602001908152602001600020549050612647565b80925050506126b0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6126cf828260405180602001604052806000815250612a14565b5050565b8060098190555050565b600033905090565b6126f08484846109c8565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127525761271b84848484612ab1565b612751576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461276790613843565b80601f016020809104026020016040519081016040528092919081815260200182805461279390613843565b80156127e05780601f106127b5576101008083540402835291602001916127e0565b820191906000526020600020905b8154815290600101906020018083116127c357829003601f168201915b5050505050905090565b606060008203612831576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b6000821461286357808061284c90613a59565b915050600a8261285c919061405d565b9150612839565b60008167ffffffffffffffff81111561287f5761287e6131e1565b5b6040519080825280601f01601f1916602001820160405280156128b15781602001600182028036833780820191505090505b5090505b6000851461293e576001826128ca9190613d6d565b9150600a856128d9919061408e565b60306128e59190613b79565b60f81b8183815181106128fb576128fa6139ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612937919061405d565b94506128b5565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d2868684612c01565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1e8383612c0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612aac57600080549050600083820390505b612a5e6000868380600101945086612ab1565b612a94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a4b578160005414612aa957600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ad76126dd565b8786866040518563ffffffff1660e01b8152600401612af99493929190614114565b6020604051808303816000875af1925050508015612b3557506040513d601f19601f82011682018060405250810190612b329190614175565b60015b612bae573d8060008114612b65576040519150601f19603f3d011682016040523d82523d6000602084013e612b6a565b606091505b506000815103612ba6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612c4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5760008483856129b5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cce83612cbf60008660006129bb565b612cc885612dc5565b176129e3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612d6f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612d34565b5060008203612daa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612dc06000848385612a0e565b505050565b60006001821460e11b9050919050565b828054612de190613843565b90600052602060002090601f016020900481019282612e035760008555612e4a565b82601f10612e1c57805160ff1916838001178555612e4a565b82800160010185558215612e4a579182015b82811115612e49578251825591602001919060010190612e2e565b5b509050612e579190612e5b565b5090565b5b80821115612e74576000816000905550600101612e5c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ec181612e8c565b8114612ecc57600080fd5b50565b600081359050612ede81612eb8565b92915050565b600060208284031215612efa57612ef9612e82565b5b6000612f0884828501612ecf565b91505092915050565b60008115159050919050565b612f2681612f11565b82525050565b6000602082019050612f416000830184612f1d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f81578082015181840152602081019050612f66565b83811115612f90576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fcc818560208601612f63565b612fd581612f96565b840191505092915050565b60006020820190508181036000830152612ffa8184612fa7565b905092915050565b6000819050919050565b61301581613002565b811461302057600080fd5b50565b6000813590506130328161300c565b92915050565b60006020828403121561304e5761304d612e82565b5b600061305c84828501613023565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309082613065565b9050919050565b6130a081613085565b82525050565b60006020820190506130bb6000830184613097565b92915050565b6130ca81613085565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612e82565b5b6000613112858286016130d8565b925050602061312385828601613023565b9150509250929050565b61313681613002565b82525050565b6000602082019050613151600083018461312d565b92915050565b60006020828403121561316d5761316c612e82565b5b600061317b848285016130d8565b91505092915050565b60008060006060848603121561319d5761319c612e82565b5b60006131ab868287016130d8565b93505060206131bc868287016130d8565b92505060406131cd86828701613023565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61321982612f96565b810181811067ffffffffffffffff82111715613238576132376131e1565b5b80604052505050565b600061324b612e78565b90506132578282613210565b919050565b600067ffffffffffffffff821115613277576132766131e1565b5b61328082612f96565b9050602081019050919050565b82818337600083830152505050565b60006132af6132aa8461325c565b613241565b9050828152602081018484840111156132cb576132ca6131dc565b5b6132d684828561328d565b509392505050565b600082601f8301126132f3576132f26131d7565b5b813561330384826020860161329c565b91505092915050565b60006020828403121561332257613321612e82565b5b600082013567ffffffffffffffff8111156133405761333f612e87565b5b61334c848285016132de565b91505092915050565b600067ffffffffffffffff8211156133705761336f6131e1565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61339981613386565b81146133a457600080fd5b50565b6000813590506133b681613390565b92915050565b60006133cf6133ca84613355565b613241565b905080838252602082019050602084028301858111156133f2576133f1613381565b5b835b8181101561341b578061340788826133a7565b8452602084019350506020810190506133f4565b5050509392505050565b600082601f83011261343a576134396131d7565b5b813561344a8482602086016133bc565b91505092915050565b6000806040838503121561346a57613469612e82565b5b6000613478858286016130d8565b925050602083013567ffffffffffffffff81111561349957613498612e87565b5b6134a585828601613425565b9150509250929050565b600067ffffffffffffffff8211156134ca576134c96131e1565b5b602082029050602081019050919050565b60006134ee6134e9846134af565b613241565b9050808382526020820190506020840283018581111561351157613510613381565b5b835b8181101561353a578061352688826130d8565b845260208401935050602081019050613513565b5050509392505050565b600082601f830112613559576135586131d7565b5b81356135698482602086016134db565b91505092915050565b60006020828403121561358857613587612e82565b5b600082013567ffffffffffffffff8111156135a6576135a5612e87565b5b6135b284828501613544565b91505092915050565b6000602082840312156135d1576135d0612e82565b5b60006135df848285016133a7565b91505092915050565b6135f181612f11565b81146135fc57600080fd5b50565b60008135905061360e816135e8565b92915050565b6000806040838503121561362b5761362a612e82565b5b6000613639858286016130d8565b925050602061364a858286016135ff565b9150509250929050565b6000806040838503121561366b5761366a612e82565b5b600061367985828601613023565b925050602083013567ffffffffffffffff81111561369a57613699612e87565b5b6136a685828601613425565b9150509250929050565b600067ffffffffffffffff8211156136cb576136ca6131e1565b5b6136d482612f96565b9050602081019050919050565b60006136f46136ef846136b0565b613241565b9050828152602081018484840111156137105761370f6131dc565b5b61371b84828561328d565b509392505050565b600082601f830112613738576137376131d7565b5b81356137488482602086016136e1565b91505092915050565b6000806000806080858703121561376b5761376a612e82565b5b6000613779878288016130d8565b945050602061378a878288016130d8565b935050604061379b87828801613023565b925050606085013567ffffffffffffffff8111156137bc576137bb612e87565b5b6137c887828801613723565b91505092959194509250565b600080604083850312156137eb576137ea612e82565b5b60006137f9858286016130d8565b925050602061380a858286016130d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385b57607f821691505b60208210810361386e5761386d613814565b5b50919050565b60006040820190506138896000830185613097565b6138966020830184613097565b9392505050565b6000815190506138ac816135e8565b92915050565b6000602082840312156138c8576138c7612e82565b5b60006138d68482850161389d565b91505092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613915600a83612f52565b9150613920826138df565b602082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b60008160601b9050919050565b60006139638261394b565b9050919050565b600061397582613958565b9050919050565b61398d61398882613085565b61396a565b82525050565b600061399f828461397c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6139f86139f382613386565b6139dd565b82525050565b6000613a0a82856139e7565b602082019150613a1a82846139e7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a6482613002565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9657613a95613a2a565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b6000613ad7601183612f52565b9150613ae282613aa1565b602082019050919050565b60006020820190508181036000830152613b0681613aca565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b6000613b43600d83612f52565b9150613b4e82613b0d565b602082019050919050565b60006020820190508181036000830152613b7281613b36565b9050919050565b6000613b8482613002565b9150613b8f83613002565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc457613bc3613a2a565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000613c05600c83612f52565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000613c71601183612f52565b9150613c7c82613c3b565b602082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000613cdd601683612f52565b9150613ce882613ca7565b602082019050919050565b60006020820190508181036000830152613d0c81613cd0565b9050919050565b6000613d1e82613002565b9150613d2983613002565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6257613d61613a2a565b5b828202905092915050565b6000613d7882613002565b9150613d8383613002565b925082821015613d9657613d95613a2a565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613dd7601583612f52565b9150613de282613da1565b602082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613e43601983612f52565b9150613e4e82613e0d565b602082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f596f7520617265206e6f74207465616d206d656d626572210000000000000000600082015250565b6000613eaf601883612f52565b9150613eba82613e79565b602082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f41602f83612f52565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b600081905092915050565b6000613f8d82612f47565b613f978185613f77565b9350613fa7818560208601612f63565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613fe9600583613f77565b9150613ff482613fb3565b600582019050919050565b600061400b8285613f82565b91506140178284613f82565b915061402282613fdc565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406882613002565b915061407383613002565b9250826140835761408261402e565b5b828204905092915050565b600061409982613002565b91506140a483613002565b9250826140b4576140b361402e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140e6826140bf565b6140f081856140ca565b9350614100818560208601612f63565b61410981612f96565b840191505092915050565b60006080820190506141296000830187613097565b6141366020830186613097565b614143604083018561312d565b818103606083015261415581846140db565b905095945050505050565b60008151905061416f81612eb8565b92915050565b60006020828403121561418b5761418a612e82565b5b600061419984828501614160565b9150509291505056fea2646970667358221220bb8fec8954ac8e79cfa037d1caf82a11e50443a0471feff0391ca5a5e1981cc864736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637664531511610118578063a22cb465116100a0578063ca69e3231161006f578063ca69e32314610713578063d12397301461073e578063d3dd5fe014610769578063e985e9c514610780578063f2fde38b146107bd57610204565b8063a22cb46514610675578063b0ee9f761461069e578063b88d4fde146106ba578063c87b56dd146106d657610204565b80638da5cb5b116100e75780638da5cb5b146105b157806391b7f5ed146105dc57806395d89b4114610605578063a0712d6814610630578063a08c008b1461064c57610204565b8063766453151461050b5780637b47d0fd146105225780637ba5b5fb1461055f5780637cb647591461058857610204565b8063475133341161019b57806355f804b31161016a57806355f804b3146104145780635b28fd911461043d5780636352211e146104665780636817c76c146104a357806370a08231146104ce57610204565b8063475133341461036a5780634d1555611461039557806351830227146103c0578063547520fe146103eb57610204565b806318160ddd116101d757806318160ddd146102ca5780631e7269c5146102f557806323b872dd1461033257806342842e0e1461034e57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612ee4565b6107e6565b60405161023d9190612f2c565b60405180910390f35b34801561025257600080fd5b5061025b610878565b6040516102689190612fe0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613038565b61090a565b6040516102a591906130a6565b60405180910390f35b6102c860048036038101906102c391906130ed565b610989565b005b3480156102d657600080fd5b506102df610999565b6040516102ec919061313c565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613157565b6109b0565b604051610329919061313c565b60405180910390f35b61034c60048036038101906103479190613184565b6109c8565b005b61036860048036038101906103639190613184565b610baa565b005b34801561037657600080fd5b5061037f610d8c565b60405161038c919061313c565b60405180910390f35b3480156103a157600080fd5b506103aa610d92565b6040516103b7919061313c565b60405180910390f35b3480156103cc57600080fd5b506103d5610d98565b6040516103e29190612f2c565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613038565b610dab565b005b34801561042057600080fd5b5061043b6004803603810190610436919061330c565b610e45565b005b34801561044957600080fd5b50610464600480360381019061045f9190613038565b610eef565b005b34801561047257600080fd5b5061048d60048036038101906104889190613038565b610f89565b60405161049a91906130a6565b60405180910390f35b3480156104af57600080fd5b506104b8610f9b565b6040516104c5919061313c565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613157565b610fa1565b604051610502919061313c565b60405180910390f35b34801561051757600080fd5b50610520611059565b005b34801561052e57600080fd5b5061054960048036038101906105449190613453565b611115565b6040516105569190612f2c565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613572565b61121e565b005b34801561059457600080fd5b506105af60048036038101906105aa91906135bb565b6112f6565b005b3480156105bd57600080fd5b506105c6611392565b6040516105d391906130a6565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613038565b6113b8565b005b34801561061157600080fd5b5061061a611452565b6040516106279190612fe0565b60405180910390f35b61064a60048036038101906106459190613038565b6114e4565b005b34801561065857600080fd5b50610673600480360381019061066e919061330c565b6118ba565b005b34801561068157600080fd5b5061069c60048036038101906106979190613614565b611964565b005b6106b860048036038101906106b39190613654565b611a6f565b005b6106d460048036038101906106cf9190613751565b611b9d565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190613038565b611d82565b60405161070a9190612fe0565b60405180910390f35b34801561071f57600080fd5b50610728611eb2565b604051610735919061313c565b60405180910390f35b34801561074a57600080fd5b50610753611eb8565b6040516107609190612f2c565b60405180910390f35b34801561077557600080fd5b5061077e611ecb565b005b34801561078c57600080fd5b506107a760048036038101906107a291906137d4565b611f87565b6040516107b49190612f2c565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190613157565b61201b565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461088790613843565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613843565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b6000610915826120ef565b61094b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109958282600161214e565b5050565b60006109a361229e565b6001546000540303905090565b60126020528060005260406000206000915090505481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b98573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3a57610a358484846122a7565b610ba4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a83929190613874565b602060405180830381865afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac491906138b2565b8015610b5657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b14929190613874565b602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906138b2565b5b610b9757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8e91906130a6565b60405180910390fd5b5b610ba38484846122a7565b5b50505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c57610c178484846125c9565b610d86565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c65929190613874565b602060405180830381865afa158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca691906138b2565b8015610d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cf6929190613874565b602060405180830381865afa158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906138b2565b5b610d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d7091906130a6565b60405180910390fd5b5b610d858484846125c9565b5b50505050565b600b5481565b600c5481565b600f60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e329061392b565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc9061392b565b60405180910390fd5b8060119080519060200190610eeb929190612dd5565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061392b565b60405180910390fd5b80600b8190555050565b6000610f94826125e9565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611008576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061392b565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600080836040516020016111299190613993565b60405160208183030381529060405280519060200120905060005b835181101561120f578381815181106111605761115f6139ae565b5b602002602001015182106111b657838181518110611181576111806139ae565b5b60200260200101518260405160200161119b9291906139fe565b604051602081830303815290604052805190602001206111fa565b818482815181106111ca576111c96139ae565b5b60200260200101516040516020016111e39291906139fe565b604051602081830303815290604052805190602001205b9150808061120790613a59565b915050611144565b50600954811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061392b565b60405180910390fd5b60005b81518110156112f2576112df8282815181106112d0576112cf6139ae565b5b602002602001015160016126b5565b80806112ea90613a59565b9150506112b1565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d9061392b565b60405180910390fd5b61138f816126d3565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f9061392b565b60405180910390fd5b80600e8190555050565b60606003805461146190613843565b80601f016020809104026020016040519081016040528092919081815260200182805461148d90613843565b80156114da5780601f106114af576101008083540402835291602001916114da565b820191906000526020600020905b8154815290600101906020018083116114bd57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613aed565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90613b59565b60405180910390fd5b600a546115b3610999565b826115be9190613b79565b11156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613c1b565b60405180910390fd5b80600c541015611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b90613c87565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461168f9190613b79565b600c5410156116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90613cf3565b60405180910390fd5b600b546116de610999565b826116e99190613b79565b1115801561173657506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561179d57600e54600e548261174c9190613d13565b6117569190613d6d565b341015611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613ded565b60405180910390fd5b6117ee565b80600e546117ab9190613d13565b3410156117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613e59565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611856573d6000803e3d6000fd5b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118a69190613b79565b925050819055506118b733826126b5565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119419061392b565b60405180910390fd5b8060109080519060200190611960929190612dd5565b5050565b80600760006119716126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1e6126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a639190612f2c565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613aed565b60405180910390fd5b611ae73382611115565b611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90613ec5565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b8e573d6000803e3d6000fd5b50611b9933836126b5565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d6e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c1057611c0b858585856126e5565b611d7b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c59929190613874565b602060405180830381865afa158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9a91906138b2565b8015611d2c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cea929190613874565b602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b91906138b2565b5b611d6d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d6491906130a6565b60405180910390fd5b5b611d7a858585856126e5565b5b5050505050565b6060611d8d826120ef565b611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390613f57565b60405180910390fd5b60001515600f60009054906101000a900460ff16151503611e795760108054611df490613843565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2090613843565b8015611e6d5780601f10611e4257610100808354040283529160200191611e6d565b820191906000526020600020905b815481529060010190602001808311611e5057829003601f168201915b50505050509050611ead565b611e81612758565b611e8a836127ea565b604051602001611e9b929190613fff565b60405160208183030381529060405290505b919050565b600a5481565b600d60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f529061392b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a29061392b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816120fa61229e565b11158015612109575060005482105b8015612147575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061215983610f89565b905081801561219b57508073ffffffffffffffffffffffffffffffffffffffff166121826126dd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156121e8576121b1816121ac6126dd565b611f87565b6121e7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006122b2826125e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612319576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123258461294a565b9150915061233b81876123366126dd565b612971565b612387576123508661234b6126dd565b611f87565b612386576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fa86868660016129b5565b801561240557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124d3856124af8888876129bb565b7c0200000000000000000000000000000000000000000000000000000000176129e3565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125595760006001850190506000600460008381526020019081526020016000205403612557576000548114612556578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18686866001612a0e565b505050505050565b6125e483838360405180602001604052806000815250611b9d565b505050565b600080829050806125f861229e565b1161267e5760005481101561267d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361267b575b60008103612671576004600083600190039350838152602001908152602001600020549050612647565b80925050506126b0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6126cf828260405180602001604052806000815250612a14565b5050565b8060098190555050565b600033905090565b6126f08484846109c8565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127525761271b84848484612ab1565b612751576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461276790613843565b80601f016020809104026020016040519081016040528092919081815260200182805461279390613843565b80156127e05780601f106127b5576101008083540402835291602001916127e0565b820191906000526020600020905b8154815290600101906020018083116127c357829003601f168201915b5050505050905090565b606060008203612831576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b6000821461286357808061284c90613a59565b915050600a8261285c919061405d565b9150612839565b60008167ffffffffffffffff81111561287f5761287e6131e1565b5b6040519080825280601f01601f1916602001820160405280156128b15781602001600182028036833780820191505090505b5090505b6000851461293e576001826128ca9190613d6d565b9150600a856128d9919061408e565b60306128e59190613b79565b60f81b8183815181106128fb576128fa6139ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612937919061405d565b94506128b5565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d2868684612c01565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1e8383612c0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612aac57600080549050600083820390505b612a5e6000868380600101945086612ab1565b612a94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a4b578160005414612aa957600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ad76126dd565b8786866040518563ffffffff1660e01b8152600401612af99493929190614114565b6020604051808303816000875af1925050508015612b3557506040513d601f19601f82011682018060405250810190612b329190614175565b60015b612bae573d8060008114612b65576040519150601f19603f3d011682016040523d82523d6000602084013e612b6a565b606091505b506000815103612ba6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612c4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5760008483856129b5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cce83612cbf60008660006129bb565b612cc885612dc5565b176129e3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612d6f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612d34565b5060008203612daa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612dc06000848385612a0e565b505050565b60006001821460e11b9050919050565b828054612de190613843565b90600052602060002090601f016020900481019282612e035760008555612e4a565b82601f10612e1c57805160ff1916838001178555612e4a565b82800160010185558215612e4a579182015b82811115612e49578251825591602001919060010190612e2e565b5b509050612e579190612e5b565b5090565b5b80821115612e74576000816000905550600101612e5c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ec181612e8c565b8114612ecc57600080fd5b50565b600081359050612ede81612eb8565b92915050565b600060208284031215612efa57612ef9612e82565b5b6000612f0884828501612ecf565b91505092915050565b60008115159050919050565b612f2681612f11565b82525050565b6000602082019050612f416000830184612f1d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f81578082015181840152602081019050612f66565b83811115612f90576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fcc818560208601612f63565b612fd581612f96565b840191505092915050565b60006020820190508181036000830152612ffa8184612fa7565b905092915050565b6000819050919050565b61301581613002565b811461302057600080fd5b50565b6000813590506130328161300c565b92915050565b60006020828403121561304e5761304d612e82565b5b600061305c84828501613023565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309082613065565b9050919050565b6130a081613085565b82525050565b60006020820190506130bb6000830184613097565b92915050565b6130ca81613085565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612e82565b5b6000613112858286016130d8565b925050602061312385828601613023565b9150509250929050565b61313681613002565b82525050565b6000602082019050613151600083018461312d565b92915050565b60006020828403121561316d5761316c612e82565b5b600061317b848285016130d8565b91505092915050565b60008060006060848603121561319d5761319c612e82565b5b60006131ab868287016130d8565b93505060206131bc868287016130d8565b92505060406131cd86828701613023565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61321982612f96565b810181811067ffffffffffffffff82111715613238576132376131e1565b5b80604052505050565b600061324b612e78565b90506132578282613210565b919050565b600067ffffffffffffffff821115613277576132766131e1565b5b61328082612f96565b9050602081019050919050565b82818337600083830152505050565b60006132af6132aa8461325c565b613241565b9050828152602081018484840111156132cb576132ca6131dc565b5b6132d684828561328d565b509392505050565b600082601f8301126132f3576132f26131d7565b5b813561330384826020860161329c565b91505092915050565b60006020828403121561332257613321612e82565b5b600082013567ffffffffffffffff8111156133405761333f612e87565b5b61334c848285016132de565b91505092915050565b600067ffffffffffffffff8211156133705761336f6131e1565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61339981613386565b81146133a457600080fd5b50565b6000813590506133b681613390565b92915050565b60006133cf6133ca84613355565b613241565b905080838252602082019050602084028301858111156133f2576133f1613381565b5b835b8181101561341b578061340788826133a7565b8452602084019350506020810190506133f4565b5050509392505050565b600082601f83011261343a576134396131d7565b5b813561344a8482602086016133bc565b91505092915050565b6000806040838503121561346a57613469612e82565b5b6000613478858286016130d8565b925050602083013567ffffffffffffffff81111561349957613498612e87565b5b6134a585828601613425565b9150509250929050565b600067ffffffffffffffff8211156134ca576134c96131e1565b5b602082029050602081019050919050565b60006134ee6134e9846134af565b613241565b9050808382526020820190506020840283018581111561351157613510613381565b5b835b8181101561353a578061352688826130d8565b845260208401935050602081019050613513565b5050509392505050565b600082601f830112613559576135586131d7565b5b81356135698482602086016134db565b91505092915050565b60006020828403121561358857613587612e82565b5b600082013567ffffffffffffffff8111156135a6576135a5612e87565b5b6135b284828501613544565b91505092915050565b6000602082840312156135d1576135d0612e82565b5b60006135df848285016133a7565b91505092915050565b6135f181612f11565b81146135fc57600080fd5b50565b60008135905061360e816135e8565b92915050565b6000806040838503121561362b5761362a612e82565b5b6000613639858286016130d8565b925050602061364a858286016135ff565b9150509250929050565b6000806040838503121561366b5761366a612e82565b5b600061367985828601613023565b925050602083013567ffffffffffffffff81111561369a57613699612e87565b5b6136a685828601613425565b9150509250929050565b600067ffffffffffffffff8211156136cb576136ca6131e1565b5b6136d482612f96565b9050602081019050919050565b60006136f46136ef846136b0565b613241565b9050828152602081018484840111156137105761370f6131dc565b5b61371b84828561328d565b509392505050565b600082601f830112613738576137376131d7565b5b81356137488482602086016136e1565b91505092915050565b6000806000806080858703121561376b5761376a612e82565b5b6000613779878288016130d8565b945050602061378a878288016130d8565b935050604061379b87828801613023565b925050606085013567ffffffffffffffff8111156137bc576137bb612e87565b5b6137c887828801613723565b91505092959194509250565b600080604083850312156137eb576137ea612e82565b5b60006137f9858286016130d8565b925050602061380a858286016130d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385b57607f821691505b60208210810361386e5761386d613814565b5b50919050565b60006040820190506138896000830185613097565b6138966020830184613097565b9392505050565b6000815190506138ac816135e8565b92915050565b6000602082840312156138c8576138c7612e82565b5b60006138d68482850161389d565b91505092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613915600a83612f52565b9150613920826138df565b602082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b60008160601b9050919050565b60006139638261394b565b9050919050565b600061397582613958565b9050919050565b61398d61398882613085565b61396a565b82525050565b600061399f828461397c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6139f86139f382613386565b6139dd565b82525050565b6000613a0a82856139e7565b602082019150613a1a82846139e7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a6482613002565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9657613a95613a2a565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b6000613ad7601183612f52565b9150613ae282613aa1565b602082019050919050565b60006020820190508181036000830152613b0681613aca565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b6000613b43600d83612f52565b9150613b4e82613b0d565b602082019050919050565b60006020820190508181036000830152613b7281613b36565b9050919050565b6000613b8482613002565b9150613b8f83613002565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc457613bc3613a2a565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000613c05600c83612f52565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000613c71601183612f52565b9150613c7c82613c3b565b602082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000613cdd601683612f52565b9150613ce882613ca7565b602082019050919050565b60006020820190508181036000830152613d0c81613cd0565b9050919050565b6000613d1e82613002565b9150613d2983613002565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6257613d61613a2a565b5b828202905092915050565b6000613d7882613002565b9150613d8383613002565b925082821015613d9657613d95613a2a565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613dd7601583612f52565b9150613de282613da1565b602082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613e43601983612f52565b9150613e4e82613e0d565b602082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f596f7520617265206e6f74207465616d206d656d626572210000000000000000600082015250565b6000613eaf601883612f52565b9150613eba82613e79565b602082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f41602f83612f52565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b600081905092915050565b6000613f8d82612f47565b613f978185613f77565b9350613fa7818560208601612f63565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613fe9600583613f77565b9150613ff482613fb3565b600582019050919050565b600061400b8285613f82565b91506140178284613f82565b915061402282613fdc565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406882613002565b915061407383613002565b9250826140835761408261402e565b5b828204905092915050565b600061409982613002565b91506140a483613002565b9250826140b4576140b361402e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140e6826140bf565b6140f081856140ca565b9350614100818560208601612f63565b61410981612f96565b840191505092915050565b60006080820190506141296000830187613097565b6141366020830186613097565b614143604083018561312d565b818103606083015261415581846140db565b905095945050505050565b60008151905061416f81612eb8565b92915050565b60006020828403121561418b5761418a612e82565b5b600061419984828501614160565b9150509291505056fea2646970667358221220bb8fec8954ac8e79cfa037d1caf82a11e50443a0471feff0391ca5a5e1981cc864736f6c634300080d0033

Deployed Bytecode Sourcemap

58950:4187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20193:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21095:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27058:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16846:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59368:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62272:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62661:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59067:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59109:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59272:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60779:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61421:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60983:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22488:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59225:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61230:77;;;;;;;;;;;;;:::i;:::-;;58545:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62492:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61113:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53968:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60881:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59626:766;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61315:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27616:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60400:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62889:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61764:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59030:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59185:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60685:86;;;;;;;;;;;;;:::i;:::-;;28007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54114:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20193:639;20278:4;20617:10;20602:25;;:11;:25;;;;:102;;;;20694:10;20679:25;;:11;:25;;;;20602:102;:179;;;;20771:10;20756:25;;:11;:25;;;;20602:179;20582:199;;20193:639;;;:::o;21095:100::-;21149:13;21182:5;21175:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21095:100;:::o;27058:218::-;27134:7;27159:16;27167:7;27159;:16::i;:::-;27154:64;;27184:34;;;;;;;;;;;;;;27154:64;27238:15;:24;27254:7;27238:24;;;;;;;;;;;:30;;;;;;;;;;;;27231:37;;27058:218;;;:::o;26775:124::-;26864:27;26873:2;26877:7;26886:4;26864:8;:27::i;:::-;26775:124;;:::o;16846:323::-;16907:7;17135:15;:13;:15::i;:::-;17120:12;;17104:13;;:28;:46;17097:53;;16846:323;:::o;59368:41::-;;;;;;;;;;;;;;;;;:::o;62272:212::-;62417:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;62439:37:::1;62458:4;62464:2;62468:7;62439:18;:37::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;62439:37:::1;62458:4;62464:2;62468:7;62439:18;:37::i;:::-;62272:212:::0;;;;;:::o;62661:220::-;62810:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;62832:41:::1;62855:4;62861:2;62865:7;62832:22;:41::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;62832:41:::1;62855:4;62861:2;62865:7;62832:22;:41::i;:::-;62661:220:::0;;;;;:::o;59067:35::-;;;;:::o;59109:26::-;;;;:::o;59272:20::-;;;;;;;;;;;;;:::o;60779:90::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60855:6:::1;60845:7;:16;;;;60779:90:::0;:::o;61421:95::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61504:4:::1;61489:12;:19;;;;;;;;;;;;:::i;:::-;;61421:95:::0;:::o;60983:122::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61081:16:::1;61065:13;:32;;;;60983:122:::0;:::o;22488:152::-;22560:7;22603:27;22622:7;22603:18;:27::i;:::-;22580:52;;22488:152;;;:::o;59225:38::-;;;;:::o;18030:233::-;18102:7;18143:1;18126:19;;:5;:19;;;18122:60;;18154:28;;;;;;;;;;;;;;18122:60;12189:13;18200:18;:25;18219:5;18200:25;;;;;;;;;;;;;;;;:55;18193:62;;18030:233;;;:::o;61230:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61291:8:::1;;;;;;;;;;;61290:9;61279:8;;:20;;;;;;;;;;;;;;;;;;61230:77::o:0;58545:398::-;58625:4;58642:13;58685:8;58668:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;58658:37;;;;;;58642:53;;58711:9;58706:192;58730:6;:13;58726:1;:17;58706:192;;;58781:6;58788:1;58781:9;;;;;;;;:::i;:::-;;;;;;;;58773:5;:17;:113;;58868:6;58875:1;58868:9;;;;;;;;:::i;:::-;;;;;;;;58879:5;58851:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58841:45;;;;;;58773:113;;;58820:5;58827:6;58834:1;58827:9;;;;;;;;:::i;:::-;;;;;;;;58803:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58793:45;;;;;;58773:113;58765:121;;58745:3;;;;;:::i;:::-;;;;58706:192;;;;58924:11;;58915:5;:20;58908:27;;;58545:398;;;;:::o;62492:161::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62569:6:::1;62564:82;62585:2;:9;62581:1;:13;62564:82;;;62615:19;62625:2;62628:1;62625:5;;;;;;;;:::i;:::-;;;;;;;;62632:1;62615:9;:19::i;:::-;62595:3;;;;;:::i;:::-;;;;62564:82;;;;62492:161:::0;:::o;61113:109::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61187:27:::1;61202:11;61187:14;:27::i;:::-;61113:109:::0;:::o;53968:20::-;;;;;;;;;;;;;:::o;60881:94::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60959:8:::1;60947:9;:20;;;;60881:94:::0;:::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21271:104;:::o;59626:766::-;62195:9;62181:23;;:10;:23;;;62173:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59718:4:::1;59703:19;;:11;;;;;;;;;;;:19;;;59695:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59786:8;;59769:13;:11;:13::i;:::-;59759:7;:23;;;;:::i;:::-;:35;;59751:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59841:7;59830;;:18;;59822:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59921:7;59900:6;:18;59907:10;59900:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;59889:7;;:39;;59881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;60000:13;;59983;:11;:13::i;:::-;59973:7;:23;;;;:::i;:::-;:40;;59972:71;;;;;60041:1;60019:6;:18;60026:10;60019:18;;;;;;;;;;;;;;;;:23;59972:71;59968:289;;;60106:9;;60093;;60083:7;:19;;;;:::i;:::-;60082:33;;;;:::i;:::-;60068:9;:48;;60060:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;59968:289;;;60208:7;60196:9;;:19;;;;:::i;:::-;60183:9;:32;;60175:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59968:289;60277:5;;;;;;;;;;;60269:23;;:34;60293:9;60269:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60336:7;60314:6;:18;60321:10;60314:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;60354:30;60364:10;60376:7;60354:9;:30::i;:::-;59626:766:::0;:::o;61315:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61401:4:::1;61389:9;:16;;;;;;;;;;;;:::i;:::-;;61315:98:::0;:::o;27616:234::-;27763:8;27711:18;:39;27730:19;:17;:19::i;:::-;27711:39;;;;;;;;;;;;;;;:49;27751:8;27711:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27823:8;27787:55;;27802:19;:17;:19::i;:::-;27787:55;;;27833:8;27787:55;;;;;;:::i;:::-;;;;;;;;27616:234;;:::o;60400:255::-;62195:9;62181:23;;:10;:23;;;62173:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60506:26:::1;60513:10;60525:6;60506;:26::i;:::-;60498:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;60580:5;;;;;;;;;;;60572:23;;:34;60596:9;60572:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60617:30;60627:10;60639:7;60617:9;:30::i;:::-;60400:255:::0;;:::o;62889:245::-;63057:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;63079:47:::1;63102:4;63108:2;63112:7;63121:4;63079:22;:47::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;63079:47:::1;63102:4;63108:2;63112:7;63121:4;63079:22;:47::i;:::-;62889:245:::0;;;;;;:::o;61764:350::-;61837:13;61871:16;61879:7;61871;:16::i;:::-;61863:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61965:5;61953:17;;:8;;;;;;;;;;;:17;;;61950:61;;61990:9;61983:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61950:61;62052:16;:14;:16::i;:::-;62070:25;62087:7;62070:16;:25::i;:::-;62035:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62021:85;;61764:350;;;;:::o;59030:30::-;;;;:::o;59185:31::-;;;;;;;;;;;;;:::o;60685:86::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60752:11:::1;;;;;;;;;;;60751:12;60737:11;;:26;;;;;;;;;;;;;;;;;;60685:86::o:0;28007:164::-;28104:4;28128:18;:25;28147:5;28128:25;;;;;;;;;;;;;;;:35;28154:8;28128:35;;;;;;;;;;;;;;;;;;;;;;;;;28121:42;;28007:164;;;;:::o;54114:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54184:4:::1;54176:5;;:12;;;;;;;;;;;;;;;;;;54114:77:::0;:::o;28429:282::-;28494:4;28550:7;28531:15;:13;:15::i;:::-;:26;;:66;;;;;28584:13;;28574:7;:23;28531:66;:153;;;;;28683:1;12965:8;28635:17;:26;28653:7;28635:26;;;;;;;;;;;;:44;:49;28531:153;28511:173;;28429:282;;;:::o;45489:431::-;45584:13;45600:16;45608:7;45600;:16::i;:::-;45584:32;;45633:13;:45;;;;;45673:5;45650:28;;:19;:17;:19::i;:::-;:28;;;;45633:45;45629:192;;;45698:44;45715:5;45722:19;:17;:19::i;:::-;45698:16;:44::i;:::-;45693:128;;45770:35;;;;;;;;;;;;;;45693:128;45629:192;45866:2;45833:15;:24;45849:7;45833:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45904:7;45900:2;45884:28;;45893:5;45884:28;;;;;;;;;;;;45573:347;45489:431;;;:::o;61547:101::-;61612:7;61639:1;61632:8;;61547:101;:::o;30697:2825::-;30839:27;30869;30888:7;30869:18;:27::i;:::-;30839:57;;30954:4;30913:45;;30929:19;30913:45;;;30909:86;;30967:28;;;;;;;;;;;;;;30909:86;31009:27;31038:23;31065:35;31092:7;31065:26;:35::i;:::-;31008:92;;;;31200:68;31225:15;31242:4;31248:19;:17;:19::i;:::-;31200:24;:68::i;:::-;31195:180;;31288:43;31305:4;31311:19;:17;:19::i;:::-;31288:16;:43::i;:::-;31283:92;;31340:35;;;;;;;;;;;;;;31283:92;31195:180;31406:1;31392:16;;:2;:16;;;31388:52;;31417:23;;;;;;;;;;;;;;31388:52;31453:43;31475:4;31481:2;31485:7;31494:1;31453:21;:43::i;:::-;31589:15;31586:160;;;31729:1;31708:19;31701:30;31586:160;32126:18;:24;32145:4;32126:24;;;;;;;;;;;;;;;;32124:26;;;;;;;;;;;;32195:18;:22;32214:2;32195:22;;;;;;;;;;;;;;;;32193:24;;;;;;;;;;;32517:146;32554:2;32603:45;32618:4;32624:2;32628:19;32603:14;:45::i;:::-;13245:8;32575:73;32517:18;:146::i;:::-;32488:17;:26;32506:7;32488:26;;;;;;;;;;;:175;;;;32834:1;13245:8;32783:19;:47;:52;32779:627;;32856:19;32888:1;32878:7;:11;32856:33;;33045:1;33011:17;:30;33029:11;33011:30;;;;;;;;;;;;:35;33007:384;;33149:13;;33134:11;:28;33130:242;;33329:19;33296:17;:30;33314:11;33296:30;;;;;;;;;;;:52;;;;33130:242;33007:384;32837:569;32779:627;33453:7;33449:2;33434:27;;33443:4;33434:27;;;;;;;;;;;;33472:42;33493:4;33499:2;33503:7;33512:1;33472:20;:42::i;:::-;30828:2694;;;30697:2825;;;:::o;33618:193::-;33764:39;33781:4;33787:2;33791:7;33764:39;;;;;;;;;;;;:16;:39::i;:::-;33618:193;;;:::o;23643:1275::-;23710:7;23730:12;23745:7;23730:22;;23813:4;23794:15;:13;:15::i;:::-;:23;23790:1061;;23847:13;;23840:4;:20;23836:1015;;;23885:14;23902:17;:23;23920:4;23902:23;;;;;;;;;;;;23885:40;;24019:1;12965:8;23991:6;:24;:29;23987:845;;24656:113;24673:1;24663:6;:11;24656:113;;24716:17;:25;24734:6;;;;;;;24716:25;;;;;;;;;;;;24707:34;;24656:113;;;24802:6;24795:13;;;;;;23987:845;23862:989;23836:1015;23790:1061;24879:31;;;;;;;;;;;;;;23643:1275;;;;:::o;44569:112::-;44646:27;44656:2;44660:8;44646:27;;;;;;;;;;;;:9;:27::i;:::-;44569:112;;:::o;58431:106::-;58518:11;58504;:25;;;;58431:106;:::o;51976:105::-;52036:7;52063:10;52056:17;;51976:105;:::o;34409:407::-;34584:31;34597:4;34603:2;34607:7;34584:12;:31::i;:::-;34648:1;34630:2;:14;;;:19;34626:183;;34669:56;34700:4;34706:2;34710:7;34719:5;34669:30;:56::i;:::-;34664:145;;34753:40;;;;;;;;;;;;;;34664:145;34626:183;34409:407;;;;:::o;61656:100::-;61704:13;61736:12;61729:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61656:100;:::o;258:723::-;314:13;544:1;535:5;:10;531:53;;562:10;;;;;;;;;;;;;;;;;;;;;531:53;594:12;609:5;594:20;;625:14;650:78;665:1;657:4;:9;650:78;;683:8;;;;;:::i;:::-;;;;714:2;706:10;;;;;:::i;:::-;;;650:78;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;788:154;804:1;795:5;:10;788:154;;832:1;822:11;;;;;:::i;:::-;;;899:2;891:5;:10;;;;:::i;:::-;878:2;:24;;;;:::i;:::-;865:39;;848:6;855;848:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;788:154;;;966:6;952:21;;;;;258:723;;;;:::o;29592:485::-;29694:27;29723:23;29764:38;29805:15;:24;29821:7;29805:24;;;;;;;;;;;29764:65;;29982:18;29959:41;;30039:19;30033:26;30014:45;;29944:126;29592:485;;;:::o;28820:659::-;28969:11;29134:16;29127:5;29123:28;29114:37;;29294:16;29283:9;29279:32;29266:45;;29444:15;29433:9;29430:30;29422:5;29411:9;29408:20;29405:56;29395:66;;28820:659;;;;;:::o;35478:159::-;;;;;:::o;51285:311::-;51420:7;51440:16;13369:3;51466:19;:41;;51440:68;;13369:3;51534:31;51545:4;51551:2;51555:9;51534:10;:31::i;:::-;51526:40;;:62;;51519:69;;;51285:311;;;;;:::o;25466:450::-;25546:14;25714:16;25707:5;25703:28;25694:37;;25891:5;25877:11;25852:23;25848:41;25845:52;25838:5;25835:63;25825:73;;25466:450;;;;:::o;36302:158::-;;;;;:::o;43796:689::-;43927:19;43933:2;43937:8;43927:5;:19::i;:::-;44006:1;43988:2;:14;;;:19;43984:483;;44028:11;44042:13;;44028:27;;44074:13;44096:8;44090:3;:14;44074:30;;44123:233;44154:62;44193:1;44197:2;44201:7;;;;;;44210:5;44154:30;:62::i;:::-;44149:167;;44252:40;;;;;;;;;;;;;;44149:167;44351:3;44343:5;:11;44123:233;;44438:3;44421:13;;:20;44417:34;;44443:8;;;44417:34;44009:458;;43984:483;43796:689;;;:::o;36900:716::-;37063:4;37109:2;37084:45;;;37130:19;:17;:19::i;:::-;37151:4;37157:7;37166:5;37084:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37080:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37384:1;37367:6;:13;:18;37363:235;;37413:40;;;;;;;;;;;;;;37363:235;37556:6;37550:13;37541:6;37537:2;37533:15;37526:38;37080:529;37253:54;;;37243:64;;;:6;:64;;;;37236:71;;;36900:716;;;;;;:::o;50986:147::-;51123:6;50986:147;;;;;:::o;38078:2966::-;38151:20;38174:13;;38151:36;;38214:1;38202:8;:13;38198:44;;38224:18;;;;;;;;;;;;;;38198:44;38255:61;38285:1;38289:2;38293:12;38307:8;38255:21;:61::i;:::-;38799:1;12327:2;38769:1;:26;;38768:32;38756:8;:45;38730:18;:22;38749:2;38730:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39078:139;39115:2;39169:33;39192:1;39196:2;39200:1;39169:14;:33::i;:::-;39136:30;39157:8;39136:20;:30::i;:::-;:66;39078:18;:139::i;:::-;39044:17;:31;39062:12;39044:31;;;;;;;;;;;:173;;;;39234:16;39265:11;39294:8;39279:12;:23;39265:37;;39815:16;39811:2;39807:25;39795:37;;40187:12;40147:8;40106:1;40044:25;39985:1;39924;39897:335;40558:1;40544:12;40540:20;40498:346;40599:3;40590:7;40587:16;40498:346;;40817:7;40807:8;40804:1;40777:25;40774:1;40771;40766:59;40652:1;40643:7;40639:15;40628:26;;40498:346;;;40502:77;40889:1;40877:8;:13;40873:45;;40899:19;;;;;;;;;;;;;;40873:45;40951:3;40935:13;:19;;;;38504:2462;;40976:60;41005:1;41009:2;41013:12;41027:8;40976:20;:60::i;:::-;38140:2904;38078:2966;;:::o;26018:324::-;26088:14;26321:1;26311:8;26308:15;26282:24;26278:46;26268:56;;26018: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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::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:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:311::-;8948:4;9038:18;9030:6;9027:30;9024:56;;;9060:18;;:::i;:::-;9024:56;9110:4;9102:6;9098:17;9090:25;;9170:4;9164;9160:15;9152:23;;8871:311;;;:::o;9188:117::-;9297:1;9294;9287:12;9311:77;9348:7;9377:5;9366:16;;9311:77;;;:::o;9394:122::-;9467:24;9485:5;9467:24;:::i;:::-;9460:5;9457:35;9447:63;;9506:1;9503;9496:12;9447:63;9394:122;:::o;9522:139::-;9568:5;9606:6;9593:20;9584:29;;9622:33;9649:5;9622:33;:::i;:::-;9522:139;;;;:::o;9684:710::-;9780:5;9805:81;9821:64;9878:6;9821:64;:::i;:::-;9805:81;:::i;:::-;9796:90;;9906:5;9935:6;9928:5;9921:21;9969:4;9962:5;9958:16;9951:23;;10022:4;10014:6;10010:17;10002:6;9998:30;10051:3;10043:6;10040:15;10037:122;;;10070:79;;:::i;:::-;10037:122;10185:6;10168:220;10202:6;10197:3;10194:15;10168:220;;;10277:3;10306:37;10339:3;10327:10;10306:37;:::i;:::-;10301:3;10294:50;10373:4;10368:3;10364:14;10357:21;;10244:144;10228:4;10223:3;10219:14;10212:21;;10168:220;;;10172:21;9786:608;;9684:710;;;;;:::o;10417:370::-;10488:5;10537:3;10530:4;10522:6;10518:17;10514:27;10504:122;;10545:79;;:::i;:::-;10504:122;10662:6;10649:20;10687:94;10777:3;10769:6;10762:4;10754:6;10750:17;10687:94;:::i;:::-;10678:103;;10494:293;10417:370;;;;:::o;10793:684::-;10886:6;10894;10943:2;10931:9;10922:7;10918:23;10914:32;10911:119;;;10949:79;;:::i;:::-;10911:119;11069:1;11094:53;11139:7;11130:6;11119:9;11115:22;11094:53;:::i;:::-;11084:63;;11040:117;11224:2;11213:9;11209:18;11196:32;11255:18;11247:6;11244:30;11241:117;;;11277:79;;:::i;:::-;11241:117;11382:78;11452:7;11443:6;11432:9;11428:22;11382:78;:::i;:::-;11372:88;;11167:303;10793:684;;;;;:::o;11483:311::-;11560:4;11650:18;11642:6;11639:30;11636:56;;;11672:18;;:::i;:::-;11636:56;11722:4;11714:6;11710:17;11702:25;;11782:4;11776;11772:15;11764:23;;11483:311;;;:::o;11817:710::-;11913:5;11938:81;11954:64;12011:6;11954:64;:::i;:::-;11938:81;:::i;:::-;11929:90;;12039:5;12068:6;12061:5;12054:21;12102:4;12095:5;12091:16;12084:23;;12155:4;12147:6;12143:17;12135:6;12131:30;12184:3;12176:6;12173:15;12170:122;;;12203:79;;:::i;:::-;12170:122;12318:6;12301:220;12335:6;12330:3;12327:15;12301:220;;;12410:3;12439:37;12472:3;12460:10;12439:37;:::i;:::-;12434:3;12427:50;12506:4;12501:3;12497:14;12490:21;;12377:144;12361:4;12356:3;12352:14;12345:21;;12301:220;;;12305:21;11919:608;;11817:710;;;;;:::o;12550:370::-;12621:5;12670:3;12663:4;12655:6;12651:17;12647:27;12637:122;;12678:79;;:::i;:::-;12637:122;12795:6;12782:20;12820:94;12910:3;12902:6;12895:4;12887:6;12883:17;12820:94;:::i;:::-;12811:103;;12627:293;12550:370;;;;:::o;12926:539::-;13010:6;13059:2;13047:9;13038:7;13034:23;13030:32;13027:119;;;13065:79;;:::i;:::-;13027:119;13213:1;13202:9;13198:17;13185:31;13243:18;13235:6;13232:30;13229:117;;;13265:79;;:::i;:::-;13229:117;13370:78;13440:7;13431:6;13420:9;13416:22;13370:78;:::i;:::-;13360:88;;13156:302;12926:539;;;;:::o;13471:329::-;13530:6;13579:2;13567:9;13558:7;13554:23;13550:32;13547:119;;;13585:79;;:::i;:::-;13547:119;13705:1;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13676:117;13471:329;;;;:::o;13806:116::-;13876:21;13891:5;13876:21;:::i;:::-;13869:5;13866:32;13856:60;;13912:1;13909;13902:12;13856:60;13806:116;:::o;13928:133::-;13971:5;14009:6;13996:20;13987:29;;14025:30;14049:5;14025:30;:::i;:::-;13928:133;;;;:::o;14067:468::-;14132:6;14140;14189:2;14177:9;14168:7;14164:23;14160:32;14157:119;;;14195:79;;:::i;:::-;14157:119;14315:1;14340:53;14385:7;14376:6;14365:9;14361:22;14340:53;:::i;:::-;14330:63;;14286:117;14442:2;14468:50;14510:7;14501:6;14490:9;14486:22;14468:50;:::i;:::-;14458:60;;14413:115;14067:468;;;;;:::o;14541:684::-;14634:6;14642;14691:2;14679:9;14670:7;14666:23;14662:32;14659:119;;;14697:79;;:::i;:::-;14659:119;14817:1;14842:53;14887:7;14878:6;14867:9;14863:22;14842:53;:::i;:::-;14832:63;;14788:117;14972:2;14961:9;14957:18;14944:32;15003:18;14995:6;14992:30;14989:117;;;15025:79;;:::i;:::-;14989:117;15130:78;15200:7;15191:6;15180:9;15176:22;15130:78;:::i;:::-;15120:88;;14915:303;14541:684;;;;;:::o;15231:307::-;15292:4;15382:18;15374:6;15371:30;15368:56;;;15404:18;;:::i;:::-;15368:56;15442:29;15464:6;15442:29;:::i;:::-;15434:37;;15526:4;15520;15516:15;15508:23;;15231:307;;;:::o;15544:410::-;15621:5;15646:65;15662:48;15703:6;15662:48;:::i;:::-;15646:65;:::i;:::-;15637:74;;15734:6;15727:5;15720:21;15772:4;15765:5;15761:16;15810:3;15801:6;15796:3;15792:16;15789:25;15786:112;;;15817:79;;:::i;:::-;15786:112;15907:41;15941:6;15936:3;15931;15907:41;:::i;:::-;15627:327;15544:410;;;;;:::o;15973:338::-;16028:5;16077:3;16070:4;16062:6;16058:17;16054:27;16044:122;;16085:79;;:::i;:::-;16044:122;16202:6;16189:20;16227:78;16301:3;16293:6;16286:4;16278:6;16274:17;16227:78;:::i;:::-;16218:87;;16034:277;15973:338;;;;:::o;16317:943::-;16412:6;16420;16428;16436;16485:3;16473:9;16464:7;16460:23;16456:33;16453:120;;;16492:79;;:::i;:::-;16453:120;16612:1;16637:53;16682:7;16673:6;16662:9;16658:22;16637:53;:::i;:::-;16627:63;;16583:117;16739:2;16765:53;16810:7;16801:6;16790:9;16786:22;16765:53;:::i;:::-;16755:63;;16710:118;16867:2;16893:53;16938:7;16929:6;16918:9;16914:22;16893:53;:::i;:::-;16883:63;;16838:118;17023:2;17012:9;17008:18;16995:32;17054:18;17046:6;17043:30;17040:117;;;17076:79;;:::i;:::-;17040:117;17181:62;17235:7;17226:6;17215:9;17211:22;17181:62;:::i;:::-;17171:72;;16966:287;16317:943;;;;;;;:::o;17266:474::-;17334:6;17342;17391:2;17379:9;17370:7;17366:23;17362:32;17359:119;;;17397:79;;:::i;:::-;17359:119;17517:1;17542:53;17587:7;17578:6;17567:9;17563:22;17542:53;:::i;:::-;17532:63;;17488:117;17644:2;17670:53;17715:7;17706:6;17695:9;17691:22;17670:53;:::i;:::-;17660:63;;17615:118;17266:474;;;;;:::o;17746:180::-;17794:77;17791:1;17784:88;17891:4;17888:1;17881:15;17915:4;17912:1;17905:15;17932:320;17976:6;18013:1;18007:4;18003:12;17993:22;;18060:1;18054:4;18050:12;18081:18;18071:81;;18137:4;18129:6;18125:17;18115:27;;18071:81;18199:2;18191:6;18188:14;18168:18;18165:38;18162:84;;18218:18;;:::i;:::-;18162:84;17983:269;17932:320;;;:::o;18258:332::-;18379:4;18417:2;18406:9;18402:18;18394:26;;18430:71;18498:1;18487:9;18483:17;18474:6;18430:71;:::i;:::-;18511:72;18579:2;18568:9;18564:18;18555:6;18511:72;:::i;:::-;18258:332;;;;;:::o;18596:137::-;18650:5;18681:6;18675:13;18666:22;;18697:30;18721:5;18697:30;:::i;:::-;18596:137;;;;:::o;18739:345::-;18806:6;18855:2;18843:9;18834:7;18830:23;18826:32;18823:119;;;18861:79;;:::i;:::-;18823:119;18981:1;19006:61;19059:7;19050:6;19039:9;19035:22;19006:61;:::i;:::-;18996:71;;18952:125;18739:345;;;;:::o;19090:160::-;19230:12;19226:1;19218:6;19214:14;19207:36;19090:160;:::o;19256:366::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:419::-;19794:4;19832:2;19821:9;19817:18;19809:26;;19881:9;19875:4;19871:20;19867:1;19856:9;19852:17;19845:47;19909:131;20035:4;19909:131;:::i;:::-;19901:139;;19628:419;;;:::o;20053:94::-;20086:8;20134:5;20130:2;20126:14;20105:35;;20053:94;;;:::o;20153:::-;20192:7;20221:20;20235:5;20221:20;:::i;:::-;20210:31;;20153:94;;;:::o;20253:100::-;20292:7;20321:26;20341:5;20321:26;:::i;:::-;20310:37;;20253:100;;;:::o;20359:157::-;20464:45;20484:24;20502:5;20484:24;:::i;:::-;20464:45;:::i;:::-;20459:3;20452:58;20359:157;;:::o;20522:256::-;20634:3;20649:75;20720:3;20711:6;20649:75;:::i;:::-;20749:2;20744:3;20740:12;20733:19;;20769:3;20762:10;;20522:256;;;;:::o;20784:180::-;20832:77;20829:1;20822:88;20929:4;20926:1;20919:15;20953:4;20950:1;20943:15;20970:79;21009:7;21038:5;21027:16;;20970:79;;;:::o;21055:157::-;21160:45;21180:24;21198:5;21180:24;:::i;:::-;21160:45;:::i;:::-;21155:3;21148:58;21055:157;;:::o;21218:397::-;21358:3;21373:75;21444:3;21435:6;21373:75;:::i;:::-;21473:2;21468:3;21464:12;21457:19;;21486:75;21557:3;21548:6;21486:75;:::i;:::-;21586:2;21581:3;21577:12;21570:19;;21606:3;21599:10;;21218:397;;;;;:::o;21621:180::-;21669:77;21666:1;21659:88;21766:4;21763:1;21756:15;21790:4;21787:1;21780:15;21807:233;21846:3;21869:24;21887:5;21869:24;:::i;:::-;21860:33;;21915:66;21908:5;21905:77;21902:103;;21985:18;;:::i;:::-;21902:103;22032:1;22025:5;22021:13;22014:20;;21807:233;;;:::o;22046:167::-;22186:19;22182:1;22174:6;22170:14;22163:43;22046:167;:::o;22219:366::-;22361:3;22382:67;22446:2;22441:3;22382:67;:::i;:::-;22375:74;;22458:93;22547:3;22458:93;:::i;:::-;22576:2;22571:3;22567:12;22560:19;;22219:366;;;:::o;22591:419::-;22757:4;22795:2;22784:9;22780:18;22772:26;;22844:9;22838:4;22834:20;22830:1;22819:9;22815:17;22808:47;22872:131;22998:4;22872:131;:::i;:::-;22864:139;;22591:419;;;:::o;23016:163::-;23156:15;23152:1;23144:6;23140:14;23133:39;23016:163;:::o;23185:366::-;23327:3;23348:67;23412:2;23407:3;23348:67;:::i;:::-;23341:74;;23424:93;23513:3;23424:93;:::i;:::-;23542:2;23537:3;23533:12;23526:19;;23185:366;;;:::o;23557:419::-;23723:4;23761:2;23750:9;23746:18;23738:26;;23810:9;23804:4;23800:20;23796:1;23785:9;23781:17;23774:47;23838:131;23964:4;23838:131;:::i;:::-;23830:139;;23557:419;;;:::o;23982:305::-;24022:3;24041:20;24059:1;24041:20;:::i;:::-;24036:25;;24075:20;24093:1;24075:20;:::i;:::-;24070:25;;24229:1;24161:66;24157:74;24154:1;24151:81;24148:107;;;24235:18;;:::i;:::-;24148:107;24279:1;24276;24272:9;24265:16;;23982:305;;;;:::o;24293:162::-;24433:14;24429:1;24421:6;24417:14;24410:38;24293:162;:::o;24461:366::-;24603:3;24624:67;24688:2;24683:3;24624:67;:::i;:::-;24617:74;;24700:93;24789:3;24700:93;:::i;:::-;24818:2;24813:3;24809:12;24802:19;;24461:366;;;:::o;24833:419::-;24999:4;25037:2;25026:9;25022:18;25014:26;;25086:9;25080:4;25076:20;25072:1;25061:9;25057:17;25050:47;25114:131;25240:4;25114:131;:::i;:::-;25106:139;;24833:419;;;:::o;25258:167::-;25398:19;25394:1;25386:6;25382:14;25375:43;25258:167;:::o;25431:366::-;25573:3;25594:67;25658:2;25653:3;25594:67;:::i;:::-;25587:74;;25670:93;25759:3;25670:93;:::i;:::-;25788:2;25783:3;25779:12;25772:19;;25431:366;;;:::o;25803:419::-;25969:4;26007:2;25996:9;25992:18;25984:26;;26056:9;26050:4;26046:20;26042:1;26031:9;26027:17;26020:47;26084:131;26210:4;26084:131;:::i;:::-;26076:139;;25803:419;;;:::o;26228:172::-;26368:24;26364:1;26356:6;26352:14;26345:48;26228:172;:::o;26406:366::-;26548:3;26569:67;26633:2;26628:3;26569:67;:::i;:::-;26562:74;;26645:93;26734:3;26645:93;:::i;:::-;26763:2;26758:3;26754:12;26747:19;;26406:366;;;:::o;26778:419::-;26944:4;26982:2;26971:9;26967:18;26959:26;;27031:9;27025:4;27021:20;27017:1;27006:9;27002:17;26995:47;27059:131;27185:4;27059:131;:::i;:::-;27051:139;;26778:419;;;:::o;27203:348::-;27243:7;27266:20;27284:1;27266:20;:::i;:::-;27261:25;;27300:20;27318:1;27300:20;:::i;:::-;27295:25;;27488:1;27420:66;27416:74;27413:1;27410:81;27405:1;27398:9;27391:17;27387:105;27384:131;;;27495:18;;:::i;:::-;27384:131;27543:1;27540;27536:9;27525:20;;27203:348;;;;:::o;27557:191::-;27597:4;27617:20;27635:1;27617:20;:::i;:::-;27612:25;;27651:20;27669:1;27651:20;:::i;:::-;27646:25;;27690:1;27687;27684:8;27681:34;;;27695:18;;:::i;:::-;27681:34;27740:1;27737;27733:9;27725:17;;27557:191;;;;:::o;27754:171::-;27894:23;27890:1;27882:6;27878:14;27871:47;27754:171;:::o;27931:366::-;28073:3;28094:67;28158:2;28153:3;28094:67;:::i;:::-;28087:74;;28170:93;28259:3;28170:93;:::i;:::-;28288:2;28283:3;28279:12;28272:19;;27931:366;;;:::o;28303:419::-;28469:4;28507:2;28496:9;28492:18;28484:26;;28556:9;28550:4;28546:20;28542:1;28531:9;28527:17;28520:47;28584:131;28710:4;28584:131;:::i;:::-;28576:139;;28303:419;;;:::o;28728:175::-;28868:27;28864:1;28856:6;28852:14;28845:51;28728:175;:::o;28909:366::-;29051:3;29072:67;29136:2;29131:3;29072:67;:::i;:::-;29065:74;;29148:93;29237:3;29148:93;:::i;:::-;29266:2;29261:3;29257:12;29250:19;;28909:366;;;:::o;29281:419::-;29447:4;29485:2;29474:9;29470:18;29462:26;;29534:9;29528:4;29524:20;29520:1;29509:9;29505:17;29498:47;29562:131;29688:4;29562:131;:::i;:::-;29554:139;;29281:419;;;:::o;29706:174::-;29846:26;29842:1;29834:6;29830:14;29823:50;29706:174;:::o;29886:366::-;30028:3;30049:67;30113:2;30108:3;30049:67;:::i;:::-;30042:74;;30125:93;30214:3;30125:93;:::i;:::-;30243:2;30238:3;30234:12;30227:19;;29886:366;;;:::o;30258:419::-;30424:4;30462:2;30451:9;30447:18;30439:26;;30511:9;30505:4;30501:20;30497:1;30486:9;30482:17;30475:47;30539:131;30665:4;30539:131;:::i;:::-;30531:139;;30258:419;;;:::o;30683:234::-;30823:34;30819:1;30811:6;30807:14;30800:58;30892:17;30887:2;30879:6;30875:15;30868:42;30683:234;:::o;30923:366::-;31065:3;31086:67;31150:2;31145:3;31086:67;:::i;:::-;31079:74;;31162:93;31251:3;31162:93;:::i;:::-;31280:2;31275:3;31271:12;31264:19;;30923:366;;;:::o;31295:419::-;31461:4;31499:2;31488:9;31484:18;31476:26;;31548:9;31542:4;31538:20;31534:1;31523:9;31519:17;31512:47;31576:131;31702:4;31576:131;:::i;:::-;31568:139;;31295:419;;;:::o;31720:148::-;31822:11;31859:3;31844:18;;31720:148;;;;:::o;31874:377::-;31980:3;32008:39;32041:5;32008:39;:::i;:::-;32063:89;32145:6;32140:3;32063:89;:::i;:::-;32056:96;;32161:52;32206:6;32201:3;32194:4;32187:5;32183:16;32161:52;:::i;:::-;32238:6;32233:3;32229:16;32222:23;;31984:267;31874:377;;;;:::o;32257:155::-;32397:7;32393:1;32385:6;32381:14;32374:31;32257:155;:::o;32418:400::-;32578:3;32599:84;32681:1;32676:3;32599:84;:::i;:::-;32592:91;;32692:93;32781:3;32692:93;:::i;:::-;32810:1;32805:3;32801:11;32794:18;;32418:400;;;:::o;32824:701::-;33105:3;33127:95;33218:3;33209:6;33127:95;:::i;:::-;33120:102;;33239:95;33330:3;33321:6;33239:95;:::i;:::-;33232:102;;33351:148;33495:3;33351:148;:::i;:::-;33344:155;;33516:3;33509:10;;32824:701;;;;;:::o;33531:180::-;33579:77;33576:1;33569:88;33676:4;33673:1;33666:15;33700:4;33697:1;33690:15;33717:185;33757:1;33774:20;33792:1;33774:20;:::i;:::-;33769:25;;33808:20;33826:1;33808:20;:::i;:::-;33803:25;;33847:1;33837:35;;33852:18;;:::i;:::-;33837:35;33894:1;33891;33887:9;33882:14;;33717:185;;;;:::o;33908:176::-;33940:1;33957:20;33975:1;33957:20;:::i;:::-;33952:25;;33991:20;34009:1;33991:20;:::i;:::-;33986:25;;34030:1;34020:35;;34035:18;;:::i;:::-;34020:35;34076:1;34073;34069:9;34064:14;;33908:176;;;;:::o;34090:98::-;34141:6;34175:5;34169:12;34159:22;;34090:98;;;:::o;34194:168::-;34277:11;34311:6;34306:3;34299:19;34351:4;34346:3;34342:14;34327:29;;34194:168;;;;:::o;34368:360::-;34454:3;34482:38;34514:5;34482:38;:::i;:::-;34536:70;34599:6;34594:3;34536:70;:::i;:::-;34529:77;;34615:52;34660:6;34655:3;34648:4;34641:5;34637:16;34615:52;:::i;:::-;34692:29;34714:6;34692:29;:::i;:::-;34687:3;34683:39;34676:46;;34458:270;34368:360;;;;:::o;34734:640::-;34929:4;34967:3;34956:9;34952:19;34944:27;;34981:71;35049:1;35038:9;35034:17;35025:6;34981:71;:::i;:::-;35062:72;35130:2;35119:9;35115:18;35106:6;35062:72;:::i;:::-;35144;35212:2;35201:9;35197:18;35188:6;35144:72;:::i;:::-;35263:9;35257:4;35253:20;35248:2;35237:9;35233:18;35226:48;35291:76;35362:4;35353:6;35291:76;:::i;:::-;35283:84;;34734:640;;;;;;;:::o;35380:141::-;35436:5;35467:6;35461:13;35452:22;;35483:32;35509:5;35483:32;:::i;:::-;35380:141;;;;:::o;35527:349::-;35596:6;35645:2;35633:9;35624:7;35620:23;35616:32;35613:119;;;35651:79;;:::i;:::-;35613:119;35771:1;35796:63;35851:7;35842:6;35831:9;35827:22;35796:63;:::i;:::-;35786:73;;35742:127;35527:349;;;;:::o

Swarm Source

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

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