ETH Price: $3,336.18 (-3.32%)

Token

Txers (TX)
 

Overview

Max Total Supply

4,444 TX

Holders

2,415

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TX
0xa4aaea5164643420f128f34d4fdc7519567f8440
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:
Txers

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-07
*/

// 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;
    bytes32 internal _merkleRoot2;
    function _setMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _merkleRoot = merkleRoot_;
    }

    function _setMerkleRoot2(bytes32 merkleRoot_) internal virtual {
        _merkleRoot2 = merkleRoot_;
    }

    function isWhitelisted(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;
    }

    function isWhitelisted2(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 == _merkleRoot2;
    }
}

/*
txers mfers
*/

contract Txers is ERC721A, Ownable, OperatorFilterer, MerkleProof {

    uint256 public maxToken = 4444;
    uint256 public mintMax = 5; 
    uint256 public txlistMintMax = 3; 

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

    uint256 public txlistMintPrice = 0.008 ether;
    uint256 public pbmintPrice = 0.009 ether;

    bool public revealed;

    string private revealURI;
    string private baseTokenURI;
    string private baseTokenURI_EXT;

    mapping(address => uint256) private txlistMinted;
    mapping(address => uint256) private pbMinted;

    constructor() ERC721A("Txers", "TX") OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {
        sethiddenBaseURI("https://bafkreihwebmbfkbkwhlpqcqyrq3iwkicy2t4b3iydh5ryt4muu4rbvnhba.ipfs.nftstorage.link");
    }

    //mint function

    function ownerMint(uint256 _amount, address _address) public onlyOwner { 
        require(_amount + totalSupply() <= maxToken, "No more NFTs");

        _safeMint(_address, _amount);
    }

    function txlistMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(txlistMintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(txlistMintMax >= _amount, "You've reached max per tx");
        require(txlistMintMax >= txlistMinted[msg.sender] + _amount, "You've reached max per address");
        require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");

        if (txlistMinted[msg.sender] == 0) {
            require(msg.value >= ((_amount * txlistMintPrice) - txlistMintPrice), "Not enough ether sent");
        } else {
            require(msg.value >= txlistMintPrice * _amount, "Value sent is not correct");
        }
        
        payable(owner).transfer(msg.value);
        txlistMinted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }


    function pbMint(uint256 _amount) public payable onlySender { 
        require(publicMintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax >= _amount, "Exceed max per tx");
        require(mintMax >= pbMinted[msg.sender] + _amount, "Exceed max per address");
        require(msg.value >= pbmintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);

        pbMinted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    function teamMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(isWhitelisted2(msg.sender, proof_), "You are not whitelisted!");
        require(msg.value >= pbmintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);

        _safeMint(msg.sender, _amount);
    }
    //owner function

    function togglePublicMint() external onlyOwner {
        publicMintEnabled = !publicMintEnabled;
    }

    function toggletxlistMint() external onlyOwner {
        txlistMintEnabled = !txlistMintEnabled;
    }

    function goHard(bool offMint) external onlyOwner {
        txlistMintEnabled = offMint;
        publicMintEnabled = offMint;
    }

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

    function cutSupply(uint256 newMaxToken) external onlyOwner {
        maxToken = newMaxToken;
    }

    function setPbPrice(uint256 newPrice) external onlyOwner {
        pbmintPrice = newPrice;
    }

    function setWlPrice(uint256 newWlPrice) external onlyOwner {
        txlistMintPrice = newWlPrice;
    }

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

    function setMerkleRoot2(bytes32 merkleRoot2_) external onlyOwner {
        _setMerkleRoot2(merkleRoot2_);
    }

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

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

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

    function setBaseTokenURI_EXT(string memory ext_) public onlyOwner {
        baseTokenURI_EXT = ext_;
    }

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address aa = payable(0x1d7f10a635Ae70977ade214E8e9C6f829A180140);

        bool success;

        (success, ) = aa.call{value: (sendAmount * 1000/1000)}("");
        require(success, "Failed to withdraw Ether");
    }

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

    //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":"newMaxToken","type":"uint256"}],"name":"cutSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"offMint","type":"bool"}],"name":"goHard","outputs":[],"stateMutability":"nonpayable","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":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMax","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":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pbMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pbmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"ext_","type":"string"}],"name":"setBaseTokenURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","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":"bytes32","name":"merkleRoot2_","type":"bytes32"}],"name":"setMerkleRoot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPbPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWlPrice","type":"uint256"}],"name":"setWlPrice","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":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggletxlistMint","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"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"txlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"txlistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txlistMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txlistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261115c600b556005600c556003600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff021916908315150217905550661c6bf526340000600f55661ff973cafa80006010553480156200006d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600581526020017f54786572730000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f54580000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001099291906200045b565b508060039080519060200190620001229291906200045b565b5062000133620003a360201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037157801562000237576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001fd92919062000550565b600060405180830381600087803b1580156200021857600080fd5b505af11580156200022d573d6000803e3d6000fd5b5050505062000370565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002f1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002b792919062000550565b600060405180830381600087803b158015620002d257600080fd5b505af1158015620002e7573d6000803e3d6000fd5b505050506200036f565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200033a91906200057d565b600060405180830381600087803b1580156200035557600080fd5b505af11580156200036a573d6000803e3d6000fd5b505050505b5b5b50506200039d604051806080016040528060588152602001620056f160589139620003ac60201b60201c565b62000681565b60006001905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200043f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043690620005fb565b60405180910390fd5b8060129080519060200190620004579291906200045b565b5050565b82805462000469906200064c565b90600052602060002090601f0160209004810192826200048d5760008555620004d9565b82601f10620004a857805160ff1916838001178555620004d9565b82800160010185558215620004d9579182015b82811115620004d8578251825591602001919060010190620004bb565b5b509050620004e89190620004ec565b5090565b5b8082111562000507576000816000905550600101620004ed565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000538826200050b565b9050919050565b6200054a816200052b565b82525050565b60006040820190506200056760008301856200053f565b6200057660208301846200053f565b9392505050565b60006020820190506200059460008301846200053f565b92915050565b600082825260208201905092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000620005e3600a836200059a565b9150620005f082620005ab565b602082019050919050565b600060208201905081810360008301526200061681620005d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200066557607f821691505b6020821081036200067b576200067a6200061d565b5b50919050565b61506080620006916000396000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063b88d4fde116100c1578063dc0f58bd1161007a578063dc0f58bd146108b1578063e6621c67146108dc578063e985e9c514610907578063f254d14e14610944578063f2fde38b1461096f578063f4c445691461099857610272565b8063b88d4fde146107bf578063bc9817f4146107db578063c87b56dd14610804578063ca69e32314610841578063d22b78d61461086c578063d52c57e01461088857610272565b80638dd07d0f116101135780638dd07d0f146106d257806395d89b41146106fb578063a08c008b14610726578063a22cb4651461074f578063a9e0d03914610778578063b0ee9f76146107a357610272565b806370a0823114610601578063766453151461063e5780637ba5b5fb146106555780637cb647591461067e5780638da5cb5b146106a757610272565b80633ccfd60b116101e857806351830227116101ac57806351830227146104cd57806353c2a239146104f8578063547520fe1461053557806355f804b31461055e5780635a23dd99146105875780636352211e146105c457610272565b80633ccfd60b1461043c5780634047638d1461045357806342842e0e1461046a5780634d155561146104865780634f8f0a74146104b157610272565b806308ee987e1161023a57806308ee987e1461035c578063095ea7b3146103855780630f4161aa146103a157806314295774146103cc57806318160ddd146103f557806323b872dd1461042057610272565b806301ffc9a71461027757806302ffaed1146102b457806306fdde03146102dd578063081812fc1461030857806308c9f9bc14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613b2b565b6109c1565b6040516102ab9190613b73565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613cd4565b610a53565b005b3480156102e957600080fd5b506102f2610afd565b6040516102ff9190613da5565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613dfd565b610b8f565b60405161033c9190613e6b565b60405180910390f35b34801561035157600080fd5b5061035a610c0e565b005b34801561036857600080fd5b50610383600480360381019061037e9190613eb2565b610cca565b005b61039f600480360381019061039a9190613f0b565b610d91565b005b3480156103ad57600080fd5b506103b6610da1565b6040516103c39190613b73565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190613f81565b610db4565b005b34801561040157600080fd5b5061040a610e50565b6040516104179190613fbd565b60405180910390f35b61043a60048036038101906104359190613fd8565b610e67565b005b34801561044857600080fd5b50610451611049565b005b34801561045f57600080fd5b506104686111c2565b005b610484600480360381019061047f9190613fd8565b61127e565b005b34801561049257600080fd5b5061049b611460565b6040516104a89190613fbd565b60405180910390f35b6104cb60048036038101906104c691906140f3565b611466565b005b3480156104d957600080fd5b506104e2611865565b6040516104ef9190613b73565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a919061414f565b611878565b60405161052c9190613b73565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613dfd565b611981565b005b34801561056a57600080fd5b5061058560048036038101906105809190613cd4565b611a1b565b005b34801561059357600080fd5b506105ae60048036038101906105a9919061414f565b611ac5565b6040516105bb9190613b73565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613dfd565b611bce565b6040516105f89190613e6b565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906141ab565b611be0565b6040516106359190613fbd565b60405180910390f35b34801561064a57600080fd5b50610653611c98565b005b34801561066157600080fd5b5061067c6004803603810190610677919061429b565b611d54565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613f81565b611e2c565b005b3480156106b357600080fd5b506106bc611ec8565b6040516106c99190613e6b565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190613dfd565b611eee565b005b34801561070757600080fd5b50610710611f88565b60405161071d9190613da5565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613cd4565b61201a565b005b34801561075b57600080fd5b50610776600480360381019061077191906142e4565b6120c4565b005b34801561078457600080fd5b5061078d6121cf565b60405161079a9190613fbd565b60405180910390f35b6107bd60048036038101906107b891906140f3565b6121d5565b005b6107d960048036038101906107d491906143c5565b612353565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613dfd565b612538565b005b34801561081057600080fd5b5061082b60048036038101906108269190613dfd565b6125d2565b6040516108389190613da5565b60405180910390f35b34801561084d57600080fd5b50610856612705565b6040516108639190613fbd565b60405180910390f35b61088660048036038101906108819190613dfd565b61270b565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614448565b612a16565b005b3480156108bd57600080fd5b506108c6612b0b565b6040516108d39190613b73565b60405180910390f35b3480156108e857600080fd5b506108f1612b1e565b6040516108fe9190613fbd565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190614488565b612b24565b60405161093b9190613b73565b60405180910390f35b34801561095057600080fd5b50610959612bb8565b6040516109669190613fbd565b60405180910390f35b34801561097b57600080fd5b50610996600480360381019061099191906141ab565b612bbe565b005b3480156109a457600080fd5b506109bf60048036038101906109ba9190613dfd565b612c92565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90614514565b60405180910390fd5b8060149080519060200190610af9929190613a1c565b5050565b606060028054610b0c90614563565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3890614563565b8015610b855780601f10610b5a57610100808354040283529160200191610b85565b820191906000526020600020905b815481529060010190602001808311610b6857829003601f168201915b5050505050905090565b6000610b9a82612d2c565b610bd0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590614514565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614514565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff02191690831515021790555050565b610d9d82826001612d8b565b5050565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90614514565b60405180910390fd5b610e4d81612edb565b50565b6000610e5a612ee5565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed957610ed4848484612eee565b611043565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f22929190614594565b602060405180830381865afa158015610f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6391906145d2565b8015610ff557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fb3929190614594565b602060405180830381865afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff491906145d2565b5b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d9190613e6b565b60405180910390fd5b5b611042848484612eee565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090614514565b60405180910390fd5b60004790506000731d7f10a635ae70977ade214e8e9c6f829a180140905060008173ffffffffffffffffffffffffffffffffffffffff166103e8808561111f919061462e565b61112991906146b7565b60405161113590614719565b60006040518083038185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b505080915050806111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b49061477a565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614514565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561144e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112f0576112eb848484613210565b61145a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611339929190614594565b602060405180830381865afa158015611356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137a91906145d2565b801561140c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113ca929190614594565b602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906145d2565b5b61144d57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114449190613e6b565b60405180910390fd5b5b611459848484613210565b5b50505050565b600c5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906147e6565b60405180910390fd5b60011515600e60019054906101000a900460ff1615151461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614852565b60405180910390fd5b600b54611535610e50565b836115409190614872565b1115611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890614914565b60405180910390fd5b81600d5410156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90614980565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116119190614872565b600d541015611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906149ec565b60405180910390fd5b61165f3382611ac5565b61169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590614a58565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361174757600f54600f54836116f6919061462e565b6117009190614a78565b341015611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614af8565b60405180910390fd5b611798565b81600f54611755919061462e565b341015611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614b64565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611800573d6000803e3d6000fd5b5081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118509190614872565b925050819055506118613383613230565b5050565b601160009054906101000a900460ff1681565b6000808360405160200161188c9190614bcc565b60405160208183030381529060405280519060200120905060005b8351811015611972578381815181106118c3576118c2614be7565b5b60200260200101518210611919578381815181106118e4576118e3614be7565b5b6020026020010151826040516020016118fe929190614c37565b6040516020818303038152906040528051906020012061195d565b8184828151811061192d5761192c614be7565b5b6020026020010151604051602001611946929190614c37565b604051602081830303815290604052805190602001205b9150808061196a90614c63565b9150506118a7565b50600a54811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890614514565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614514565b60405180910390fd5b8060139080519060200190611ac1929190613a1c565b5050565b60008083604051602001611ad99190614bcc565b60405160208183030381529060405280519060200120905060005b8351811015611bbf57838181518110611b1057611b0f614be7565b5b60200260200101518210611b6657838181518110611b3157611b30614be7565b5b602002602001015182604051602001611b4b929190614c37565b60405160208183030381529060405280519060200120611baa565b81848281518110611b7a57611b79614be7565b5b6020026020010151604051602001611b93929190614c37565b604051602081830303815290604052805190602001205b91508080611bb790614c63565b915050611af4565b50600954811491505092915050565b6000611bd98261324e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614514565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614514565b60405180910390fd5b60005b8151811015611e2857611e15828281518110611e0657611e05614be7565b5b60200260200101516001613230565b8080611e2090614c63565b915050611de7565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb390614514565b60405180910390fd5b611ec58161331a565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590614514565b60405180910390fd5b80600f8190555050565b606060038054611f9790614563565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc390614563565b80156120105780601f10611fe557610100808354040283529160200191612010565b820191906000526020600020905b815481529060010190602001808311611ff357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614514565b60405180910390fd5b80601290805190602001906120c0929190613a1c565b5050565b80600760006120d1613324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661217e613324565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c39190613b73565b60405180910390a35050565b60105481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906147e6565b60405180910390fd5b61224d3382611878565b61228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614a58565b60405180910390fd5b8160105461229a919061462e565b3410156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d390614b64565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612344573d6000803e3d6000fd5b5061234f3383613230565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612524573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123c6576123c18585858561332c565b612531565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161240f929190614594565b602060405180830381865afa15801561242c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245091906145d2565b80156124e257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016124a0929190614594565b602060405180830381865afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e191906145d2565b5b61252357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161251a9190613e6b565b60405180910390fd5b5b6125308585858561332c565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf90614514565b60405180910390fd5b8060108190555050565b60606125dd82612d2c565b61261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614d1d565b60405180910390fd5b60001515601160009054906101000a900460ff161515036126c9576012805461264490614563565b80601f016020809104026020016040519081016040528092919081815260200182805461267090614563565b80156126bd5780601f10612692576101008083540402835291602001916126bd565b820191906000526020600020905b8154815290600101906020018083116126a057829003601f168201915b50505050509050612700565b6126d161339f565b6126da83613431565b60146040516020016126ee93929190614e0d565b60405160208183030381529060405290505b919050565b600b5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612770906147e6565b60405180910390fd5b60011515600e60009054906101000a900460ff161515146127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614852565b60405180910390fd5b600b546127da610e50565b826127e59190614872565b1115612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d90614914565b60405180910390fd5b80600c54101561286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290614e8a565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128b69190614872565b600c5410156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614ef6565b60405180910390fd5b80601054612908919061462e565b34101561294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614b64565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156129b2573d6000803e3d6000fd5b5080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a029190614872565b92505081905550612a133382613230565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90614514565b60405180910390fd5b600b54612ab1610e50565b83612abc9190614872565b1115612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614914565b60405180910390fd5b612b078183613230565b5050565b600e60019054906101000a900460ff1681565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4590614514565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990614514565b60405180910390fd5b80600b8190555050565b600081612d37612ee5565b11158015612d46575060005482105b8015612d84575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612d9683611bce565b9050818015612dd857508073ffffffffffffffffffffffffffffffffffffffff16612dbf613324565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612e2557612dee81612de9613324565b612b24565b612e24576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b80600a8190555050565b60006001905090565b6000612ef98261324e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f60576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612f6c84613591565b91509150612f828187612f7d613324565b6135b8565b612fce57612f9786612f92613324565b612b24565b612fcd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613034576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304186868660016135fc565b801561304c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061311a856130f6888887613602565b7c02000000000000000000000000000000000000000000000000000000001761362a565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036131a0576000600185019050600060046000838152602001908152602001600020540361319e57600054811461319d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132088686866001613655565b505050505050565b61322b83838360405180602001604052806000815250612353565b505050565b61324a82826040518060200160405280600081525061365b565b5050565b6000808290508061325d612ee5565b116132e3576000548110156132e25760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036132e0575b600081036132d65760046000836001900393508381526020019081526020016000205490506132ac565b8092505050613315565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060098190555050565b600033905090565b613337848484610e67565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461339957613362848484846136f8565b613398576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060601380546133ae90614563565b80601f01602080910402602001604051908101604052809291908181526020018280546133da90614563565b80156134275780601f106133fc57610100808354040283529160200191613427565b820191906000526020600020905b81548152906001019060200180831161340a57829003601f168201915b5050505050905090565b606060008203613478576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061358c565b600082905060005b600082146134aa57808061349390614c63565b915050600a826134a391906146b7565b9150613480565b60008167ffffffffffffffff8111156134c6576134c5613ba9565b5b6040519080825280601f01601f1916602001820160405280156134f85781602001600182028036833780820191505090505b5090505b60008514613585576001826135119190614a78565b9150600a856135209190614f16565b603061352c9190614872565b60f81b81838151811061354257613541614be7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357e91906146b7565b94506134fc565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613619868684613848565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6136658383613851565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136f357600080549050600083820390505b6136a560008683806001019450866136f8565b6136db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136925781600054146136f057600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371e613324565b8786866040518563ffffffff1660e01b81526004016137409493929190614f9c565b6020604051808303816000875af192505050801561377c57506040513d601f19601f820116820180604052508101906137799190614ffd565b60015b6137f5573d80600081146137ac576040519150601f19603f3d011682016040523d82523d6000602084013e6137b1565b606091505b5060008151036137ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613891576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61389e60008483856135fc565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613915836139066000866000613602565b61390f85613a0c565b1761362a565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146139b657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061397b565b50600082036139f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613a076000848385613655565b505050565b60006001821460e11b9050919050565b828054613a2890614563565b90600052602060002090601f016020900481019282613a4a5760008555613a91565b82601f10613a6357805160ff1916838001178555613a91565b82800160010185558215613a91579182015b82811115613a90578251825591602001919060010190613a75565b5b509050613a9e9190613aa2565b5090565b5b80821115613abb576000816000905550600101613aa3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b0881613ad3565b8114613b1357600080fd5b50565b600081359050613b2581613aff565b92915050565b600060208284031215613b4157613b40613ac9565b5b6000613b4f84828501613b16565b91505092915050565b60008115159050919050565b613b6d81613b58565b82525050565b6000602082019050613b886000830184613b64565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613be182613b98565b810181811067ffffffffffffffff82111715613c0057613bff613ba9565b5b80604052505050565b6000613c13613abf565b9050613c1f8282613bd8565b919050565b600067ffffffffffffffff821115613c3f57613c3e613ba9565b5b613c4882613b98565b9050602081019050919050565b82818337600083830152505050565b6000613c77613c7284613c24565b613c09565b905082815260208101848484011115613c9357613c92613b93565b5b613c9e848285613c55565b509392505050565b600082601f830112613cbb57613cba613b8e565b5b8135613ccb848260208601613c64565b91505092915050565b600060208284031215613cea57613ce9613ac9565b5b600082013567ffffffffffffffff811115613d0857613d07613ace565b5b613d1484828501613ca6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d57578082015181840152602081019050613d3c565b83811115613d66576000848401525b50505050565b6000613d7782613d1d565b613d818185613d28565b9350613d91818560208601613d39565b613d9a81613b98565b840191505092915050565b60006020820190508181036000830152613dbf8184613d6c565b905092915050565b6000819050919050565b613dda81613dc7565b8114613de557600080fd5b50565b600081359050613df781613dd1565b92915050565b600060208284031215613e1357613e12613ac9565b5b6000613e2184828501613de8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5582613e2a565b9050919050565b613e6581613e4a565b82525050565b6000602082019050613e806000830184613e5c565b92915050565b613e8f81613b58565b8114613e9a57600080fd5b50565b600081359050613eac81613e86565b92915050565b600060208284031215613ec857613ec7613ac9565b5b6000613ed684828501613e9d565b91505092915050565b613ee881613e4a565b8114613ef357600080fd5b50565b600081359050613f0581613edf565b92915050565b60008060408385031215613f2257613f21613ac9565b5b6000613f3085828601613ef6565b9250506020613f4185828601613de8565b9150509250929050565b6000819050919050565b613f5e81613f4b565b8114613f6957600080fd5b50565b600081359050613f7b81613f55565b92915050565b600060208284031215613f9757613f96613ac9565b5b6000613fa584828501613f6c565b91505092915050565b613fb781613dc7565b82525050565b6000602082019050613fd26000830184613fae565b92915050565b600080600060608486031215613ff157613ff0613ac9565b5b6000613fff86828701613ef6565b935050602061401086828701613ef6565b925050604061402186828701613de8565b9150509250925092565b600067ffffffffffffffff82111561404657614045613ba9565b5b602082029050602081019050919050565b600080fd5b600061406f61406a8461402b565b613c09565b9050808382526020820190506020840283018581111561409257614091614057565b5b835b818110156140bb57806140a78882613f6c565b845260208401935050602081019050614094565b5050509392505050565b600082601f8301126140da576140d9613b8e565b5b81356140ea84826020860161405c565b91505092915050565b6000806040838503121561410a57614109613ac9565b5b600061411885828601613de8565b925050602083013567ffffffffffffffff81111561413957614138613ace565b5b614145858286016140c5565b9150509250929050565b6000806040838503121561416657614165613ac9565b5b600061417485828601613ef6565b925050602083013567ffffffffffffffff81111561419557614194613ace565b5b6141a1858286016140c5565b9150509250929050565b6000602082840312156141c1576141c0613ac9565b5b60006141cf84828501613ef6565b91505092915050565b600067ffffffffffffffff8211156141f3576141f2613ba9565b5b602082029050602081019050919050565b6000614217614212846141d8565b613c09565b9050808382526020820190506020840283018581111561423a57614239614057565b5b835b81811015614263578061424f8882613ef6565b84526020840193505060208101905061423c565b5050509392505050565b600082601f83011261428257614281613b8e565b5b8135614292848260208601614204565b91505092915050565b6000602082840312156142b1576142b0613ac9565b5b600082013567ffffffffffffffff8111156142cf576142ce613ace565b5b6142db8482850161426d565b91505092915050565b600080604083850312156142fb576142fa613ac9565b5b600061430985828601613ef6565b925050602061431a85828601613e9d565b9150509250929050565b600067ffffffffffffffff82111561433f5761433e613ba9565b5b61434882613b98565b9050602081019050919050565b600061436861436384614324565b613c09565b90508281526020810184848401111561438457614383613b93565b5b61438f848285613c55565b509392505050565b600082601f8301126143ac576143ab613b8e565b5b81356143bc848260208601614355565b91505092915050565b600080600080608085870312156143df576143de613ac9565b5b60006143ed87828801613ef6565b94505060206143fe87828801613ef6565b935050604061440f87828801613de8565b925050606085013567ffffffffffffffff8111156144305761442f613ace565b5b61443c87828801614397565b91505092959194509250565b6000806040838503121561445f5761445e613ac9565b5b600061446d85828601613de8565b925050602061447e85828601613ef6565b9150509250929050565b6000806040838503121561449f5761449e613ac9565b5b60006144ad85828601613ef6565b92505060206144be85828601613ef6565b9150509250929050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b60006144fe600a83613d28565b9150614509826144c8565b602082019050919050565b6000602082019050818103600083015261452d816144f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061457b57607f821691505b60208210810361458e5761458d614534565b5b50919050565b60006040820190506145a96000830185613e5c565b6145b66020830184613e5c565b9392505050565b6000815190506145cc81613e86565b92915050565b6000602082840312156145e8576145e7613ac9565b5b60006145f6848285016145bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061463982613dc7565b915061464483613dc7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467d5761467c6145ff565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146c282613dc7565b91506146cd83613dc7565b9250826146dd576146dc614688565b5b828204905092915050565b600081905092915050565b50565b60006147036000836146e8565b915061470e826146f3565b600082019050919050565b6000614724826146f6565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b6000614764601883613d28565b915061476f8261472e565b602082019050919050565b6000602082019050818103600083015261479381614757565b9050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b60006147d0601183613d28565b91506147db8261479a565b602082019050919050565b600060208201905081810360008301526147ff816147c3565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b600061483c600d83613d28565b915061484782614806565b602082019050919050565b6000602082019050818103600083015261486b8161482f565b9050919050565b600061487d82613dc7565b915061488883613dc7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148bd576148bc6145ff565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b60006148fe600c83613d28565b9150614909826148c8565b602082019050919050565b6000602082019050818103600083015261492d816148f1565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061496a601983613d28565b915061497582614934565b602082019050919050565b600060208201905081810360008301526149998161495d565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b60006149d6601e83613d28565b91506149e1826149a0565b602082019050919050565b60006020820190508181036000830152614a05816149c9565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b6000614a42601883613d28565b9150614a4d82614a0c565b602082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b6000614a8382613dc7565b9150614a8e83613dc7565b925082821015614aa157614aa06145ff565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000614ae2601583613d28565b9150614aed82614aac565b602082019050919050565b60006020820190508181036000830152614b1181614ad5565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000614b4e601983613d28565b9150614b5982614b18565b602082019050919050565b60006020820190508181036000830152614b7d81614b41565b9050919050565b60008160601b9050919050565b6000614b9c82614b84565b9050919050565b6000614bae82614b91565b9050919050565b614bc6614bc182613e4a565b614ba3565b82525050565b6000614bd88284614bb5565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b614c31614c2c82613f4b565b614c16565b82525050565b6000614c438285614c20565b602082019150614c538284614c20565b6020820191508190509392505050565b6000614c6e82613dc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ca057614c9f6145ff565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d07602f83613d28565b9150614d1282614cab565b604082019050919050565b60006020820190508181036000830152614d3681614cfa565b9050919050565b600081905092915050565b6000614d5382613d1d565b614d5d8185614d3d565b9350614d6d818560208601613d39565b80840191505092915050565b60008190508160005260206000209050919050565b60008154614d9b81614563565b614da58186614d3d565b94506001821660008114614dc05760018114614dd157614e04565b60ff19831686528186019350614e04565b614dda85614d79565b60005b83811015614dfc57815481890152600182019150602081019050614ddd565b838801955050505b50505092915050565b6000614e198286614d48565b9150614e258285614d48565b9150614e318284614d8e565b9150819050949350505050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000614e74601183613d28565b9150614e7f82614e3e565b602082019050919050565b60006020820190508181036000830152614ea381614e67565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000614ee0601683613d28565b9150614eeb82614eaa565b602082019050919050565b60006020820190508181036000830152614f0f81614ed3565b9050919050565b6000614f2182613dc7565b9150614f2c83613dc7565b925082614f3c57614f3b614688565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f6e82614f47565b614f788185614f52565b9350614f88818560208601613d39565b614f9181613b98565b840191505092915050565b6000608082019050614fb16000830187613e5c565b614fbe6020830186613e5c565b614fcb6040830185613fae565b8181036060830152614fdd8184614f63565b905095945050505050565b600081519050614ff781613aff565b92915050565b60006020828403121561501357615012613ac9565b5b600061502184828501614fe8565b9150509291505056fea2646970667358221220bd821c122194558efdc5b217ce276d2057f1905102cd29b7f6de76c41a61893164736f6c634300080d003368747470733a2f2f6261666b726569687765626d62666b626b77686c707163717972713369776b69637932743462336979646835727974346d7575347262766e6862612e697066732e6e667473746f726167652e6c696e6b

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063b88d4fde116100c1578063dc0f58bd1161007a578063dc0f58bd146108b1578063e6621c67146108dc578063e985e9c514610907578063f254d14e14610944578063f2fde38b1461096f578063f4c445691461099857610272565b8063b88d4fde146107bf578063bc9817f4146107db578063c87b56dd14610804578063ca69e32314610841578063d22b78d61461086c578063d52c57e01461088857610272565b80638dd07d0f116101135780638dd07d0f146106d257806395d89b41146106fb578063a08c008b14610726578063a22cb4651461074f578063a9e0d03914610778578063b0ee9f76146107a357610272565b806370a0823114610601578063766453151461063e5780637ba5b5fb146106555780637cb647591461067e5780638da5cb5b146106a757610272565b80633ccfd60b116101e857806351830227116101ac57806351830227146104cd57806353c2a239146104f8578063547520fe1461053557806355f804b31461055e5780635a23dd99146105875780636352211e146105c457610272565b80633ccfd60b1461043c5780634047638d1461045357806342842e0e1461046a5780634d155561146104865780634f8f0a74146104b157610272565b806308ee987e1161023a57806308ee987e1461035c578063095ea7b3146103855780630f4161aa146103a157806314295774146103cc57806318160ddd146103f557806323b872dd1461042057610272565b806301ffc9a71461027757806302ffaed1146102b457806306fdde03146102dd578063081812fc1461030857806308c9f9bc14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613b2b565b6109c1565b6040516102ab9190613b73565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613cd4565b610a53565b005b3480156102e957600080fd5b506102f2610afd565b6040516102ff9190613da5565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613dfd565b610b8f565b60405161033c9190613e6b565b60405180910390f35b34801561035157600080fd5b5061035a610c0e565b005b34801561036857600080fd5b50610383600480360381019061037e9190613eb2565b610cca565b005b61039f600480360381019061039a9190613f0b565b610d91565b005b3480156103ad57600080fd5b506103b6610da1565b6040516103c39190613b73565b60405180910390f35b3480156103d857600080fd5b506103f360048036038101906103ee9190613f81565b610db4565b005b34801561040157600080fd5b5061040a610e50565b6040516104179190613fbd565b60405180910390f35b61043a60048036038101906104359190613fd8565b610e67565b005b34801561044857600080fd5b50610451611049565b005b34801561045f57600080fd5b506104686111c2565b005b610484600480360381019061047f9190613fd8565b61127e565b005b34801561049257600080fd5b5061049b611460565b6040516104a89190613fbd565b60405180910390f35b6104cb60048036038101906104c691906140f3565b611466565b005b3480156104d957600080fd5b506104e2611865565b6040516104ef9190613b73565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a919061414f565b611878565b60405161052c9190613b73565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190613dfd565b611981565b005b34801561056a57600080fd5b5061058560048036038101906105809190613cd4565b611a1b565b005b34801561059357600080fd5b506105ae60048036038101906105a9919061414f565b611ac5565b6040516105bb9190613b73565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190613dfd565b611bce565b6040516105f89190613e6b565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906141ab565b611be0565b6040516106359190613fbd565b60405180910390f35b34801561064a57600080fd5b50610653611c98565b005b34801561066157600080fd5b5061067c6004803603810190610677919061429b565b611d54565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613f81565b611e2c565b005b3480156106b357600080fd5b506106bc611ec8565b6040516106c99190613e6b565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190613dfd565b611eee565b005b34801561070757600080fd5b50610710611f88565b60405161071d9190613da5565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613cd4565b61201a565b005b34801561075b57600080fd5b50610776600480360381019061077191906142e4565b6120c4565b005b34801561078457600080fd5b5061078d6121cf565b60405161079a9190613fbd565b60405180910390f35b6107bd60048036038101906107b891906140f3565b6121d5565b005b6107d960048036038101906107d491906143c5565b612353565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613dfd565b612538565b005b34801561081057600080fd5b5061082b60048036038101906108269190613dfd565b6125d2565b6040516108389190613da5565b60405180910390f35b34801561084d57600080fd5b50610856612705565b6040516108639190613fbd565b60405180910390f35b61088660048036038101906108819190613dfd565b61270b565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614448565b612a16565b005b3480156108bd57600080fd5b506108c6612b0b565b6040516108d39190613b73565b60405180910390f35b3480156108e857600080fd5b506108f1612b1e565b6040516108fe9190613fbd565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190614488565b612b24565b60405161093b9190613b73565b60405180910390f35b34801561095057600080fd5b50610959612bb8565b6040516109669190613fbd565b60405180910390f35b34801561097b57600080fd5b50610996600480360381019061099191906141ab565b612bbe565b005b3480156109a457600080fd5b506109bf60048036038101906109ba9190613dfd565b612c92565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90614514565b60405180910390fd5b8060149080519060200190610af9929190613a1c565b5050565b606060028054610b0c90614563565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3890614563565b8015610b855780601f10610b5a57610100808354040283529160200191610b85565b820191906000526020600020905b815481529060010190602001808311610b6857829003601f168201915b5050505050905090565b6000610b9a82612d2c565b610bd0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590614514565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614514565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff02191690831515021790555050565b610d9d82826001612d8b565b5050565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90614514565b60405180910390fd5b610e4d81612edb565b50565b6000610e5a612ee5565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed957610ed4848484612eee565b611043565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f22929190614594565b602060405180830381865afa158015610f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6391906145d2565b8015610ff557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fb3929190614594565b602060405180830381865afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff491906145d2565b5b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d9190613e6b565b60405180910390fd5b5b611042848484612eee565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090614514565b60405180910390fd5b60004790506000731d7f10a635ae70977ade214e8e9c6f829a180140905060008173ffffffffffffffffffffffffffffffffffffffff166103e8808561111f919061462e565b61112991906146b7565b60405161113590614719565b60006040518083038185875af1925050503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b505080915050806111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b49061477a565b60405180910390fd5b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614514565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561144e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112f0576112eb848484613210565b61145a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611339929190614594565b602060405180830381865afa158015611356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137a91906145d2565b801561140c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113ca929190614594565b602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906145d2565b5b61144d57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114449190613e6b565b60405180910390fd5b5b611459848484613210565b5b50505050565b600c5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906147e6565b60405180910390fd5b60011515600e60019054906101000a900460ff1615151461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614852565b60405180910390fd5b600b54611535610e50565b836115409190614872565b1115611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890614914565b60405180910390fd5b81600d5410156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90614980565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116119190614872565b600d541015611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906149ec565b60405180910390fd5b61165f3382611ac5565b61169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590614a58565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361174757600f54600f54836116f6919061462e565b6117009190614a78565b341015611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614af8565b60405180910390fd5b611798565b81600f54611755919061462e565b341015611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614b64565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611800573d6000803e3d6000fd5b5081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118509190614872565b925050819055506118613383613230565b5050565b601160009054906101000a900460ff1681565b6000808360405160200161188c9190614bcc565b60405160208183030381529060405280519060200120905060005b8351811015611972578381815181106118c3576118c2614be7565b5b60200260200101518210611919578381815181106118e4576118e3614be7565b5b6020026020010151826040516020016118fe929190614c37565b6040516020818303038152906040528051906020012061195d565b8184828151811061192d5761192c614be7565b5b6020026020010151604051602001611946929190614c37565b604051602081830303815290604052805190602001205b9150808061196a90614c63565b9150506118a7565b50600a54811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890614514565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614514565b60405180910390fd5b8060139080519060200190611ac1929190613a1c565b5050565b60008083604051602001611ad99190614bcc565b60405160208183030381529060405280519060200120905060005b8351811015611bbf57838181518110611b1057611b0f614be7565b5b60200260200101518210611b6657838181518110611b3157611b30614be7565b5b602002602001015182604051602001611b4b929190614c37565b60405160208183030381529060405280519060200120611baa565b81848281518110611b7a57611b79614be7565b5b6020026020010151604051602001611b93929190614c37565b604051602081830303815290604052805190602001205b91508080611bb790614c63565b915050611af4565b50600954811491505092915050565b6000611bd98261324e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c47576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614514565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614514565b60405180910390fd5b60005b8151811015611e2857611e15828281518110611e0657611e05614be7565b5b60200260200101516001613230565b8080611e2090614c63565b915050611de7565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb390614514565b60405180910390fd5b611ec58161331a565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590614514565b60405180910390fd5b80600f8190555050565b606060038054611f9790614563565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc390614563565b80156120105780601f10611fe557610100808354040283529160200191612010565b820191906000526020600020905b815481529060010190602001808311611ff357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614514565b60405180910390fd5b80601290805190602001906120c0929190613a1c565b5050565b80600760006120d1613324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661217e613324565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c39190613b73565b60405180910390a35050565b60105481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a906147e6565b60405180910390fd5b61224d3382611878565b61228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228390614a58565b60405180910390fd5b8160105461229a919061462e565b3410156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d390614b64565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612344573d6000803e3d6000fd5b5061234f3383613230565b5050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612524573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123c6576123c18585858561332c565b612531565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161240f929190614594565b602060405180830381865afa15801561242c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245091906145d2565b80156124e257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016124a0929190614594565b602060405180830381865afa1580156124bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e191906145d2565b5b61252357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161251a9190613e6b565b60405180910390fd5b5b6125308585858561332c565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf90614514565b60405180910390fd5b8060108190555050565b60606125dd82612d2c565b61261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614d1d565b60405180910390fd5b60001515601160009054906101000a900460ff161515036126c9576012805461264490614563565b80601f016020809104026020016040519081016040528092919081815260200182805461267090614563565b80156126bd5780601f10612692576101008083540402835291602001916126bd565b820191906000526020600020905b8154815290600101906020018083116126a057829003601f168201915b50505050509050612700565b6126d161339f565b6126da83613431565b60146040516020016126ee93929190614e0d565b60405160208183030381529060405290505b919050565b600b5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612770906147e6565b60405180910390fd5b60011515600e60009054906101000a900460ff161515146127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614852565b60405180910390fd5b600b546127da610e50565b826127e59190614872565b1115612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d90614914565b60405180910390fd5b80600c54101561286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290614e8a565b60405180910390fd5b80601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128b69190614872565b600c5410156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614ef6565b60405180910390fd5b80601054612908919061462e565b34101561294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614b64565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156129b2573d6000803e3d6000fd5b5080601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a029190614872565b92505081905550612a133382613230565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90614514565b60405180910390fd5b600b54612ab1610e50565b83612abc9190614872565b1115612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614914565b60405180910390fd5b612b078183613230565b5050565b600e60019054906101000a900460ff1681565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4590614514565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990614514565b60405180910390fd5b80600b8190555050565b600081612d37612ee5565b11158015612d46575060005482105b8015612d84575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612d9683611bce565b9050818015612dd857508073ffffffffffffffffffffffffffffffffffffffff16612dbf613324565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612e2557612dee81612de9613324565b612b24565b612e24576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b80600a8190555050565b60006001905090565b6000612ef98261324e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f60576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612f6c84613591565b91509150612f828187612f7d613324565b6135b8565b612fce57612f9786612f92613324565b612b24565b612fcd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613034576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304186868660016135fc565b801561304c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061311a856130f6888887613602565b7c02000000000000000000000000000000000000000000000000000000001761362a565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036131a0576000600185019050600060046000838152602001908152602001600020540361319e57600054811461319d578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132088686866001613655565b505050505050565b61322b83838360405180602001604052806000815250612353565b505050565b61324a82826040518060200160405280600081525061365b565b5050565b6000808290508061325d612ee5565b116132e3576000548110156132e25760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036132e0575b600081036132d65760046000836001900393508381526020019081526020016000205490506132ac565b8092505050613315565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060098190555050565b600033905090565b613337848484610e67565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461339957613362848484846136f8565b613398576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060601380546133ae90614563565b80601f01602080910402602001604051908101604052809291908181526020018280546133da90614563565b80156134275780601f106133fc57610100808354040283529160200191613427565b820191906000526020600020905b81548152906001019060200180831161340a57829003601f168201915b5050505050905090565b606060008203613478576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061358c565b600082905060005b600082146134aa57808061349390614c63565b915050600a826134a391906146b7565b9150613480565b60008167ffffffffffffffff8111156134c6576134c5613ba9565b5b6040519080825280601f01601f1916602001820160405280156134f85781602001600182028036833780820191505090505b5090505b60008514613585576001826135119190614a78565b9150600a856135209190614f16565b603061352c9190614872565b60f81b81838151811061354257613541614be7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357e91906146b7565b94506134fc565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613619868684613848565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6136658383613851565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136f357600080549050600083820390505b6136a560008683806001019450866136f8565b6136db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136925781600054146136f057600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371e613324565b8786866040518563ffffffff1660e01b81526004016137409493929190614f9c565b6020604051808303816000875af192505050801561377c57506040513d601f19601f820116820180604052508101906137799190614ffd565b60015b6137f5573d80600081146137ac576040519150601f19603f3d011682016040523d82523d6000602084013e6137b1565b606091505b5060008151036137ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613891576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61389e60008483856135fc565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613915836139066000866000613602565b61390f85613a0c565b1761362a565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146139b657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061397b565b50600082036139f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613a076000848385613655565b505050565b60006001821460e11b9050919050565b828054613a2890614563565b90600052602060002090601f016020900481019282613a4a5760008555613a91565b82601f10613a6357805160ff1916838001178555613a91565b82800160010185558215613a91579182015b82811115613a90578251825591602001919060010190613a75565b5b509050613a9e9190613aa2565b5090565b5b80821115613abb576000816000905550600101613aa3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b0881613ad3565b8114613b1357600080fd5b50565b600081359050613b2581613aff565b92915050565b600060208284031215613b4157613b40613ac9565b5b6000613b4f84828501613b16565b91505092915050565b60008115159050919050565b613b6d81613b58565b82525050565b6000602082019050613b886000830184613b64565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613be182613b98565b810181811067ffffffffffffffff82111715613c0057613bff613ba9565b5b80604052505050565b6000613c13613abf565b9050613c1f8282613bd8565b919050565b600067ffffffffffffffff821115613c3f57613c3e613ba9565b5b613c4882613b98565b9050602081019050919050565b82818337600083830152505050565b6000613c77613c7284613c24565b613c09565b905082815260208101848484011115613c9357613c92613b93565b5b613c9e848285613c55565b509392505050565b600082601f830112613cbb57613cba613b8e565b5b8135613ccb848260208601613c64565b91505092915050565b600060208284031215613cea57613ce9613ac9565b5b600082013567ffffffffffffffff811115613d0857613d07613ace565b5b613d1484828501613ca6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d57578082015181840152602081019050613d3c565b83811115613d66576000848401525b50505050565b6000613d7782613d1d565b613d818185613d28565b9350613d91818560208601613d39565b613d9a81613b98565b840191505092915050565b60006020820190508181036000830152613dbf8184613d6c565b905092915050565b6000819050919050565b613dda81613dc7565b8114613de557600080fd5b50565b600081359050613df781613dd1565b92915050565b600060208284031215613e1357613e12613ac9565b5b6000613e2184828501613de8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5582613e2a565b9050919050565b613e6581613e4a565b82525050565b6000602082019050613e806000830184613e5c565b92915050565b613e8f81613b58565b8114613e9a57600080fd5b50565b600081359050613eac81613e86565b92915050565b600060208284031215613ec857613ec7613ac9565b5b6000613ed684828501613e9d565b91505092915050565b613ee881613e4a565b8114613ef357600080fd5b50565b600081359050613f0581613edf565b92915050565b60008060408385031215613f2257613f21613ac9565b5b6000613f3085828601613ef6565b9250506020613f4185828601613de8565b9150509250929050565b6000819050919050565b613f5e81613f4b565b8114613f6957600080fd5b50565b600081359050613f7b81613f55565b92915050565b600060208284031215613f9757613f96613ac9565b5b6000613fa584828501613f6c565b91505092915050565b613fb781613dc7565b82525050565b6000602082019050613fd26000830184613fae565b92915050565b600080600060608486031215613ff157613ff0613ac9565b5b6000613fff86828701613ef6565b935050602061401086828701613ef6565b925050604061402186828701613de8565b9150509250925092565b600067ffffffffffffffff82111561404657614045613ba9565b5b602082029050602081019050919050565b600080fd5b600061406f61406a8461402b565b613c09565b9050808382526020820190506020840283018581111561409257614091614057565b5b835b818110156140bb57806140a78882613f6c565b845260208401935050602081019050614094565b5050509392505050565b600082601f8301126140da576140d9613b8e565b5b81356140ea84826020860161405c565b91505092915050565b6000806040838503121561410a57614109613ac9565b5b600061411885828601613de8565b925050602083013567ffffffffffffffff81111561413957614138613ace565b5b614145858286016140c5565b9150509250929050565b6000806040838503121561416657614165613ac9565b5b600061417485828601613ef6565b925050602083013567ffffffffffffffff81111561419557614194613ace565b5b6141a1858286016140c5565b9150509250929050565b6000602082840312156141c1576141c0613ac9565b5b60006141cf84828501613ef6565b91505092915050565b600067ffffffffffffffff8211156141f3576141f2613ba9565b5b602082029050602081019050919050565b6000614217614212846141d8565b613c09565b9050808382526020820190506020840283018581111561423a57614239614057565b5b835b81811015614263578061424f8882613ef6565b84526020840193505060208101905061423c565b5050509392505050565b600082601f83011261428257614281613b8e565b5b8135614292848260208601614204565b91505092915050565b6000602082840312156142b1576142b0613ac9565b5b600082013567ffffffffffffffff8111156142cf576142ce613ace565b5b6142db8482850161426d565b91505092915050565b600080604083850312156142fb576142fa613ac9565b5b600061430985828601613ef6565b925050602061431a85828601613e9d565b9150509250929050565b600067ffffffffffffffff82111561433f5761433e613ba9565b5b61434882613b98565b9050602081019050919050565b600061436861436384614324565b613c09565b90508281526020810184848401111561438457614383613b93565b5b61438f848285613c55565b509392505050565b600082601f8301126143ac576143ab613b8e565b5b81356143bc848260208601614355565b91505092915050565b600080600080608085870312156143df576143de613ac9565b5b60006143ed87828801613ef6565b94505060206143fe87828801613ef6565b935050604061440f87828801613de8565b925050606085013567ffffffffffffffff8111156144305761442f613ace565b5b61443c87828801614397565b91505092959194509250565b6000806040838503121561445f5761445e613ac9565b5b600061446d85828601613de8565b925050602061447e85828601613ef6565b9150509250929050565b6000806040838503121561449f5761449e613ac9565b5b60006144ad85828601613ef6565b92505060206144be85828601613ef6565b9150509250929050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b60006144fe600a83613d28565b9150614509826144c8565b602082019050919050565b6000602082019050818103600083015261452d816144f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061457b57607f821691505b60208210810361458e5761458d614534565b5b50919050565b60006040820190506145a96000830185613e5c565b6145b66020830184613e5c565b9392505050565b6000815190506145cc81613e86565b92915050565b6000602082840312156145e8576145e7613ac9565b5b60006145f6848285016145bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061463982613dc7565b915061464483613dc7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467d5761467c6145ff565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146c282613dc7565b91506146cd83613dc7565b9250826146dd576146dc614688565b5b828204905092915050565b600081905092915050565b50565b60006147036000836146e8565b915061470e826146f3565b600082019050919050565b6000614724826146f6565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b6000614764601883613d28565b915061476f8261472e565b602082019050919050565b6000602082019050818103600083015261479381614757565b9050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b60006147d0601183613d28565b91506147db8261479a565b602082019050919050565b600060208201905081810360008301526147ff816147c3565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b600061483c600d83613d28565b915061484782614806565b602082019050919050565b6000602082019050818103600083015261486b8161482f565b9050919050565b600061487d82613dc7565b915061488883613dc7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148bd576148bc6145ff565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b60006148fe600c83613d28565b9150614909826148c8565b602082019050919050565b6000602082019050818103600083015261492d816148f1565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061496a601983613d28565b915061497582614934565b602082019050919050565b600060208201905081810360008301526149998161495d565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b60006149d6601e83613d28565b91506149e1826149a0565b602082019050919050565b60006020820190508181036000830152614a05816149c9565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b6000614a42601883613d28565b9150614a4d82614a0c565b602082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b6000614a8382613dc7565b9150614a8e83613dc7565b925082821015614aa157614aa06145ff565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000614ae2601583613d28565b9150614aed82614aac565b602082019050919050565b60006020820190508181036000830152614b1181614ad5565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000614b4e601983613d28565b9150614b5982614b18565b602082019050919050565b60006020820190508181036000830152614b7d81614b41565b9050919050565b60008160601b9050919050565b6000614b9c82614b84565b9050919050565b6000614bae82614b91565b9050919050565b614bc6614bc182613e4a565b614ba3565b82525050565b6000614bd88284614bb5565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b614c31614c2c82613f4b565b614c16565b82525050565b6000614c438285614c20565b602082019150614c538284614c20565b6020820191508190509392505050565b6000614c6e82613dc7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ca057614c9f6145ff565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d07602f83613d28565b9150614d1282614cab565b604082019050919050565b60006020820190508181036000830152614d3681614cfa565b9050919050565b600081905092915050565b6000614d5382613d1d565b614d5d8185614d3d565b9350614d6d818560208601613d39565b80840191505092915050565b60008190508160005260206000209050919050565b60008154614d9b81614563565b614da58186614d3d565b94506001821660008114614dc05760018114614dd157614e04565b60ff19831686528186019350614e04565b614dda85614d79565b60005b83811015614dfc57815481890152600182019150602081019050614ddd565b838801955050505b50505092915050565b6000614e198286614d48565b9150614e258285614d48565b9150614e318284614d8e565b9150819050949350505050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000614e74601183613d28565b9150614e7f82614e3e565b602082019050919050565b60006020820190508181036000830152614ea381614e67565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000614ee0601683613d28565b9150614eeb82614eaa565b602082019050919050565b60006020820190508181036000830152614f0f81614ed3565b9050919050565b6000614f2182613dc7565b9150614f2c83613dc7565b925082614f3c57614f3b614688565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f6e82614f47565b614f788185614f52565b9350614f88818560208601613d39565b614f9181613b98565b840191505092915050565b6000608082019050614fb16000830187613e5c565b614fbe6020830186613e5c565b614fcb6040830185613fae565b8181036060830152614fdd8184614f63565b905095945050505050565b600081519050614ff781613aff565b92915050565b60006020828403121561501357615012613ac9565b5b600061502184828501614fe8565b9150509291505056fea2646970667358221220bd821c122194558efdc5b217ce276d2057f1905102cd29b7f6de76c41a61893164736f6c634300080d0033

Deployed Bytecode Sourcemap

59547:6390:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20193:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63865:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21095:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27058:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62654:104;;;;;;;;;;;;;:::i;:::-;;62766:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26775:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59775:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63450:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16846:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65072:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63981:326;;;;;;;;;;;;;:::i;:::-;;62542:104;;;;;;;;;;;;;:::i;:::-;;65461:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59659:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60678:908;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59965:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59110:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62907:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63762:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58697:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22488:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63571:77;;;;;;;;;;;;;:::i;:::-;;65292:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63333:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53968:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63219:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63656:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27616:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59916:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62164:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65689:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63113:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64555:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59622:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61596:560;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60478:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59819:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59693:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59865:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54114:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63005:100;;;;;;;;;;;;;;;;;;;;;;;:::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;63865:108::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63961:4:::1;63942:16;:23;;;;;;;;;;;;:::i;:::-;;63865:108:::0;:::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;62654:104::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62733:17:::1;;;;;;;;;;;62732:18;62712:17;;:38;;;;;;;;;;;;;;;;;;62654:104::o:0;62766:133::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62846:7:::1;62826:17;;:27;;;;;;;;;;;;;;;;;;62884:7;62864:17;;:27;;;;;;;;;;;;;;;;;;62766:133:::0;:::o;26775:124::-;26864:27;26873:2;26877:7;26886:4;26864:8;:27::i;:::-;26775:124;;:::o;59775:37::-;;;;;;;;;;;;;:::o;63450:113::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63526:29:::1;63542:12;63526:15;:29::i;:::-;63450:113:::0;:::o;16846:323::-;16907:7;17135:15;:13;:15::i;:::-;17120:12;;17104:13;;:28;:46;17097:53;;16846:323;:::o;65072:212::-;65217:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;65239:37:::1;65258:4;65264:2;65268:7;65239: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;65239:37:::1;65258:4;65264:2;65268:7;65239:18;:37::i;:::-;65072:212:::0;;;;;:::o;63981:326::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;64029:18:::1;64050:21;64029:42;;64084:10;64105:42;64084:64;;64161:12;64200:2;:7;;64234:4;64229::::0;64216:10:::1;:17;;;;:::i;:::-;:22;;;;:::i;:::-;64200:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64186:58;;;;;64263:7;64255:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;64018:289;;;63981:326::o:0;62542:104::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62621:17:::1;;;;;;;;;;;62620:18;62600:17;;:38;;;;;;;;;;;;;;;;;;62542:104::o:0;65461:220::-;65610:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;65632:41:::1;65655:4;65661:2;65665:7;65632: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;65632:41:::1;65655:4;65661:2;65665:7;65632:22;:41::i;:::-;65461:220:::0;;;;;:::o;59659:26::-;;;;:::o;60678:908::-;64995:9;64981:23;;:10;:23;;;64973:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60807:4:::1;60786:25;;:17;;;;;;;;;;;:25;;;60778:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;60875:8;;60858:13;:11;:13::i;:::-;60848:7;:23;;;;:::i;:::-;:35;;60840:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60936:7;60919:13;;:24;;60911:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61036:7;61009:12;:24;61022:10;61009:24;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;60992:13;;:51;;60984:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;61097:33;61111:10;61123:6;61097:13;:33::i;:::-;61089:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;61204:1;61176:12;:24;61189:10;61176:24;;;;;;;;;;;;;;;;:29:::0;61172:265:::1;;61274:15;;61255;;61245:7;:25;;;;:::i;:::-;61244:45;;;;:::i;:::-;61230:9;:60;;61222:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;61172:265;;;61388:7;61370:15;;:25;;;;:::i;:::-;61357:9;:38;;61349:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61172:265;61465:5;;;;;;;;;;;61457:23;;:34;61481:9;61457:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61530:7;61502:12;:24;61515:10;61502:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;61548:30;61558:10;61570:7;61548:9;:30::i;:::-;60678:908:::0;;:::o;59965:20::-;;;;;;;;;;;;;:::o;59110:407::-;59198:4;59215:13;59258:8;59241:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;59231:37;;;;;;59215:53;;59284:9;59279:192;59303:6;:13;59299:1;:17;59279:192;;;59354:6;59361:1;59354:9;;;;;;;;:::i;:::-;;;;;;;;59346:5;:17;:113;;59441:6;59448:1;59441:9;;;;;;;;:::i;:::-;;;;;;;;59452:5;59424:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59414:45;;;;;;59346:113;;;59393:5;59400:6;59407:1;59400:9;;;;;;;;:::i;:::-;;;;;;;;59376:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59366:45;;;;;;59346:113;59338:121;;59318:3;;;;;:::i;:::-;;;;59279:192;;;;59497:12;;59488:5;:21;59481:28;;;59110:407;;;;:::o;62907:90::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62983:6:::1;62973:7;:16;;;;62907:90:::0;:::o;63762:95::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63845:4:::1;63830:12;:19;;;;;;;;;;;;:::i;:::-;;63762:95:::0;:::o;58697:405::-;58784:4;58801:13;58844:8;58827:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;58817:37;;;;;;58801:53;;58870:9;58865:192;58889:6;:13;58885:1;:17;58865:192;;;58940:6;58947:1;58940:9;;;;;;;;:::i;:::-;;;;;;;;58932:5;:17;:113;;59027:6;59034:1;59027:9;;;;;;;;:::i;:::-;;;;;;;;59038:5;59010:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59000:45;;;;;;58932:113;;;58979:5;58986:6;58993:1;58986:9;;;;;;;;:::i;:::-;;;;;;;;58962:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58952:45;;;;;;58932:113;58924:121;;58904:3;;;;;:::i;:::-;;;;58865:192;;;;59083:11;;59074:5;:20;59067:27;;;58697:405;;;;:::o;22488:152::-;22560:7;22603:27;22622:7;22603:18;:27::i;:::-;22580:52;;22488:152;;;:::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;63571:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63632:8:::1;;;;;;;;;;;63631:9;63620:8;;:20;;;;;;;;;;;;;;;;;;63571:77::o:0;65292:161::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;65369:6:::1;65364:82;65385:2;:9;65381:1;:13;65364:82;;;65415:19;65425:2;65428:1;65425:5;;;;;;;;:::i;:::-;;;;;;;;65432:1;65415:9;:19::i;:::-;65395:3;;;;;:::i;:::-;;;;65364:82;;;;65292:161:::0;:::o;63333:109::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63407:27:::1;63422:11;63407:14;:27::i;:::-;63333:109:::0;:::o;53968:20::-;;;;;;;;;;;;;:::o;63219:106::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63307:10:::1;63289:15;:28;;;;63219:106:::0;:::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21271:104;:::o;63656:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63742:4:::1;63730:9;:16;;;;;;;;;;;;:::i;:::-;;63656: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;59916:40::-;;;;:::o;62164:348::-;64995:9;64981:23;;:10;:23;;;64973:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;62270:34:::1;62285:10;62297:6;62270:14;:34::i;:::-;62262:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62379:7;62365:11;;:21;;;;:::i;:::-;62352:9;:34;;62344:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62435:5;;;;;;;;;;;62427:23;;:34;62451:9;62427:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62474:30;62484:10;62496:7;62474:9;:30::i;:::-;62164:348:::0;;:::o;65689:245::-;65857:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;65879:47:::1;65902:4;65908:2;65912:7;65921:4;65879: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;65879:47:::1;65902:4;65908:2;65912:7;65921:4;65879:22;:47::i;:::-;65689:245:::0;;;;;;:::o;63113:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63195:8:::1;63181:11;:22;;;;63113:98:::0;:::o;64555:359::-;64628:13;64662:16;64670:7;64662;:16::i;:::-;64654:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64756:5;64744:17;;:8;;;;;;;;;;;:17;;;64741:61;;64781:9;64774:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64741:61;64843:16;:14;:16::i;:::-;64861:25;64878:7;64861:16;:25::i;:::-;64888:16;64826:79;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64812:94;;64555:359;;;;:::o;59622:30::-;;;;:::o;61596:560::-;64995:9;64981:23;;:10;:23;;;64973:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61696:4:::1;61675:25;;:17;;;;;;;;;;;:25;;;61667:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;61764:8;;61747:13;:11;:13::i;:::-;61737:7;:23;;;;:::i;:::-;:35;;61729:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61819:7;61808;;:18;;61800:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;61901:7;61878:8;:20;61887:10;61878:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;61867:7;;:41;;61859:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61981:7;61967:11;;:21;;;;:::i;:::-;61954:9;:34;;61946:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;62037:5;;;;;;;;;;;62029:23;;:34;62053:9;62029:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62100:7;62076:8;:20;62085:10;62076:20;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;62118:30;62128:10;62140:7;62118:9;:30::i;:::-;61596:560:::0;:::o;60478:192::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60596:8:::1;;60579:13;:11;:13::i;:::-;60569:7;:23;;;;:::i;:::-;:35;;60561:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60634:28;60644:8;60654:7;60634:9;:28::i;:::-;60478:192:::0;;:::o;59819:37::-;;;;;;;;;;;;;:::o;59693:32::-;;;;:::o;28007:164::-;28104:4;28128:18;:25;28147:5;28128:25;;;;;;;;;;;;;;;:35;28154:8;28128:35;;;;;;;;;;;;;;;;;;;;;;;;;28121:42;;28007:164;;;;:::o;59865:44::-;;;;:::o;54114:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54184:4:::1;54176:5;;:12;;;;;;;;;;;;;;;;;;54114:77:::0;:::o;63005:100::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63086:11:::1;63075:8;:22;;;;63005:100:::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;58581:108::-;58670:11;58655:12;:26;;;;58581:108;:::o;64338:101::-;64403:7;64430:1;64423:8;;64338: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;44569:112::-;44646:27;44656:2;44660:8;44646:27;;;;;;;;;;;;:9;:27::i;:::-;44569:112;;:::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;58467:106::-;58554:11;58540;:25;;;;58467: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;64447:100::-;64495:13;64527:12;64520:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64447: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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:116::-;6876:21;6891:5;6876:21;:::i;:::-;6869:5;6866:32;6856:60;;6912:1;6909;6902:12;6856:60;6806:116;:::o;6928:133::-;6971:5;7009:6;6996:20;6987:29;;7025:30;7049:5;7025:30;:::i;:::-;6928:133;;;;:::o;7067:323::-;7123:6;7172:2;7160:9;7151:7;7147:23;7143:32;7140:119;;;7178:79;;:::i;:::-;7140:119;7298:1;7323:50;7365:7;7356:6;7345:9;7341:22;7323:50;:::i;:::-;7313:60;;7269:114;7067:323;;;;:::o;7396:122::-;7469:24;7487:5;7469:24;:::i;:::-;7462:5;7459:35;7449:63;;7508:1;7505;7498:12;7449:63;7396:122;:::o;7524:139::-;7570:5;7608:6;7595:20;7586:29;;7624:33;7651:5;7624:33;:::i;:::-;7524:139;;;;:::o;7669:474::-;7737:6;7745;7794:2;7782:9;7773:7;7769:23;7765:32;7762:119;;;7800:79;;:::i;:::-;7762:119;7920:1;7945:53;7990:7;7981:6;7970:9;7966:22;7945:53;:::i;:::-;7935:63;;7891:117;8047:2;8073:53;8118:7;8109:6;8098:9;8094:22;8073:53;:::i;:::-;8063:63;;8018:118;7669:474;;;;;:::o;8149:77::-;8186:7;8215:5;8204:16;;8149:77;;;:::o;8232:122::-;8305:24;8323:5;8305:24;:::i;:::-;8298:5;8295:35;8285:63;;8344:1;8341;8334:12;8285:63;8232:122;:::o;8360:139::-;8406:5;8444:6;8431:20;8422:29;;8460:33;8487:5;8460:33;:::i;:::-;8360:139;;;;:::o;8505:329::-;8564:6;8613:2;8601:9;8592:7;8588:23;8584:32;8581:119;;;8619:79;;:::i;:::-;8581:119;8739:1;8764:53;8809:7;8800:6;8789:9;8785:22;8764:53;:::i;:::-;8754:63;;8710:117;8505:329;;;;:::o;8840:118::-;8927:24;8945:5;8927:24;:::i;:::-;8922:3;8915:37;8840:118;;:::o;8964:222::-;9057:4;9095:2;9084:9;9080:18;9072:26;;9108:71;9176:1;9165:9;9161:17;9152:6;9108:71;:::i;:::-;8964:222;;;;:::o;9192:619::-;9269:6;9277;9285;9334:2;9322:9;9313:7;9309:23;9305:32;9302:119;;;9340:79;;:::i;:::-;9302:119;9460:1;9485:53;9530:7;9521:6;9510:9;9506:22;9485:53;:::i;:::-;9475:63;;9431:117;9587:2;9613:53;9658:7;9649:6;9638:9;9634:22;9613:53;:::i;:::-;9603:63;;9558:118;9715:2;9741:53;9786:7;9777:6;9766:9;9762:22;9741:53;:::i;:::-;9731:63;;9686:118;9192:619;;;;;:::o;9817:311::-;9894:4;9984:18;9976:6;9973:30;9970:56;;;10006:18;;:::i;:::-;9970:56;10056:4;10048:6;10044:17;10036:25;;10116:4;10110;10106:15;10098:23;;9817:311;;;:::o;10134:117::-;10243:1;10240;10233:12;10274:710;10370:5;10395:81;10411:64;10468:6;10411:64;:::i;:::-;10395:81;:::i;:::-;10386:90;;10496:5;10525:6;10518:5;10511:21;10559:4;10552:5;10548:16;10541:23;;10612:4;10604:6;10600:17;10592:6;10588:30;10641:3;10633:6;10630:15;10627:122;;;10660:79;;:::i;:::-;10627:122;10775:6;10758:220;10792:6;10787:3;10784:15;10758:220;;;10867:3;10896:37;10929:3;10917:10;10896:37;:::i;:::-;10891:3;10884:50;10963:4;10958:3;10954:14;10947:21;;10834:144;10818:4;10813:3;10809:14;10802:21;;10758:220;;;10762:21;10376:608;;10274:710;;;;;:::o;11007:370::-;11078:5;11127:3;11120:4;11112:6;11108:17;11104:27;11094:122;;11135:79;;:::i;:::-;11094:122;11252:6;11239:20;11277:94;11367:3;11359:6;11352:4;11344:6;11340:17;11277:94;:::i;:::-;11268:103;;11084:293;11007:370;;;;:::o;11383:684::-;11476:6;11484;11533:2;11521:9;11512:7;11508:23;11504:32;11501:119;;;11539:79;;:::i;:::-;11501:119;11659:1;11684:53;11729:7;11720:6;11709:9;11705:22;11684:53;:::i;:::-;11674:63;;11630:117;11814:2;11803:9;11799:18;11786:32;11845:18;11837:6;11834:30;11831:117;;;11867:79;;:::i;:::-;11831:117;11972:78;12042:7;12033:6;12022:9;12018:22;11972:78;:::i;:::-;11962:88;;11757:303;11383:684;;;;;:::o;12073:::-;12166:6;12174;12223:2;12211:9;12202:7;12198:23;12194:32;12191:119;;;12229:79;;:::i;:::-;12191:119;12349:1;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12320:117;12504:2;12493:9;12489:18;12476:32;12535:18;12527:6;12524:30;12521:117;;;12557:79;;:::i;:::-;12521:117;12662:78;12732:7;12723:6;12712:9;12708:22;12662:78;:::i;:::-;12652:88;;12447:303;12073:684;;;;;:::o;12763:329::-;12822:6;12871:2;12859:9;12850:7;12846:23;12842:32;12839:119;;;12877:79;;:::i;:::-;12839:119;12997:1;13022:53;13067:7;13058:6;13047:9;13043:22;13022:53;:::i;:::-;13012:63;;12968:117;12763:329;;;;:::o;13098:311::-;13175:4;13265:18;13257:6;13254:30;13251:56;;;13287:18;;:::i;:::-;13251:56;13337:4;13329:6;13325:17;13317:25;;13397:4;13391;13387:15;13379:23;;13098:311;;;:::o;13432:710::-;13528:5;13553:81;13569:64;13626:6;13569:64;:::i;:::-;13553:81;:::i;:::-;13544:90;;13654:5;13683:6;13676:5;13669:21;13717:4;13710:5;13706:16;13699:23;;13770:4;13762:6;13758:17;13750:6;13746:30;13799:3;13791:6;13788:15;13785:122;;;13818:79;;:::i;:::-;13785:122;13933:6;13916:220;13950:6;13945:3;13942:15;13916:220;;;14025:3;14054:37;14087:3;14075:10;14054:37;:::i;:::-;14049:3;14042:50;14121:4;14116:3;14112:14;14105:21;;13992:144;13976:4;13971:3;13967:14;13960:21;;13916:220;;;13920:21;13534:608;;13432:710;;;;;:::o;14165:370::-;14236:5;14285:3;14278:4;14270:6;14266:17;14262:27;14252:122;;14293:79;;:::i;:::-;14252:122;14410:6;14397:20;14435:94;14525:3;14517:6;14510:4;14502:6;14498:17;14435:94;:::i;:::-;14426:103;;14242:293;14165:370;;;;:::o;14541:539::-;14625:6;14674:2;14662:9;14653:7;14649:23;14645:32;14642:119;;;14680:79;;:::i;:::-;14642:119;14828:1;14817:9;14813:17;14800:31;14858:18;14850:6;14847:30;14844:117;;;14880:79;;:::i;:::-;14844:117;14985:78;15055:7;15046:6;15035:9;15031:22;14985:78;:::i;:::-;14975:88;;14771:302;14541:539;;;;:::o;15086:468::-;15151:6;15159;15208:2;15196:9;15187:7;15183:23;15179:32;15176:119;;;15214:79;;:::i;:::-;15176:119;15334:1;15359:53;15404:7;15395:6;15384:9;15380:22;15359:53;:::i;:::-;15349:63;;15305:117;15461:2;15487:50;15529:7;15520:6;15509:9;15505:22;15487:50;:::i;:::-;15477:60;;15432:115;15086:468;;;;;:::o;15560:307::-;15621:4;15711:18;15703:6;15700:30;15697:56;;;15733:18;;:::i;:::-;15697:56;15771:29;15793:6;15771:29;:::i;:::-;15763:37;;15855:4;15849;15845:15;15837:23;;15560:307;;;:::o;15873:410::-;15950:5;15975:65;15991:48;16032:6;15991:48;:::i;:::-;15975:65;:::i;:::-;15966:74;;16063:6;16056:5;16049:21;16101:4;16094:5;16090:16;16139:3;16130:6;16125:3;16121:16;16118:25;16115:112;;;16146:79;;:::i;:::-;16115:112;16236:41;16270:6;16265:3;16260;16236:41;:::i;:::-;15956:327;15873:410;;;;;:::o;16302:338::-;16357:5;16406:3;16399:4;16391:6;16387:17;16383:27;16373:122;;16414:79;;:::i;:::-;16373:122;16531:6;16518:20;16556:78;16630:3;16622:6;16615:4;16607:6;16603:17;16556:78;:::i;:::-;16547:87;;16363:277;16302:338;;;;:::o;16646:943::-;16741:6;16749;16757;16765;16814:3;16802:9;16793:7;16789:23;16785:33;16782:120;;;16821:79;;:::i;:::-;16782:120;16941:1;16966:53;17011:7;17002:6;16991:9;16987:22;16966:53;:::i;:::-;16956:63;;16912:117;17068:2;17094:53;17139:7;17130:6;17119:9;17115:22;17094:53;:::i;:::-;17084:63;;17039:118;17196:2;17222:53;17267:7;17258:6;17247:9;17243:22;17222:53;:::i;:::-;17212:63;;17167:118;17352:2;17341:9;17337:18;17324:32;17383:18;17375:6;17372:30;17369:117;;;17405:79;;:::i;:::-;17369:117;17510:62;17564:7;17555:6;17544:9;17540:22;17510:62;:::i;:::-;17500:72;;17295:287;16646:943;;;;;;;:::o;17595:474::-;17663:6;17671;17720:2;17708:9;17699:7;17695:23;17691:32;17688:119;;;17726:79;;:::i;:::-;17688:119;17846:1;17871:53;17916:7;17907:6;17896:9;17892:22;17871:53;:::i;:::-;17861:63;;17817:117;17973:2;17999:53;18044:7;18035:6;18024:9;18020:22;17999:53;:::i;:::-;17989:63;;17944:118;17595:474;;;;;:::o;18075:::-;18143:6;18151;18200:2;18188:9;18179:7;18175:23;18171:32;18168:119;;;18206:79;;:::i;:::-;18168:119;18326:1;18351:53;18396:7;18387:6;18376:9;18372:22;18351:53;:::i;:::-;18341:63;;18297:117;18453:2;18479:53;18524:7;18515:6;18504:9;18500:22;18479:53;:::i;:::-;18469:63;;18424:118;18075:474;;;;;:::o;18555:160::-;18695:12;18691:1;18683:6;18679:14;18672:36;18555:160;:::o;18721:366::-;18863:3;18884:67;18948:2;18943:3;18884:67;:::i;:::-;18877:74;;18960:93;19049:3;18960:93;:::i;:::-;19078:2;19073:3;19069:12;19062:19;;18721:366;;;:::o;19093:419::-;19259:4;19297:2;19286:9;19282:18;19274:26;;19346:9;19340:4;19336:20;19332:1;19321:9;19317:17;19310:47;19374:131;19500:4;19374:131;:::i;:::-;19366:139;;19093:419;;;:::o;19518:180::-;19566:77;19563:1;19556:88;19663:4;19660:1;19653:15;19687:4;19684:1;19677:15;19704:320;19748:6;19785:1;19779:4;19775:12;19765:22;;19832:1;19826:4;19822:12;19853:18;19843:81;;19909:4;19901:6;19897:17;19887:27;;19843:81;19971:2;19963:6;19960:14;19940:18;19937:38;19934:84;;19990:18;;:::i;:::-;19934:84;19755:269;19704:320;;;:::o;20030:332::-;20151:4;20189:2;20178:9;20174:18;20166:26;;20202:71;20270:1;20259:9;20255:17;20246:6;20202:71;:::i;:::-;20283:72;20351:2;20340:9;20336:18;20327:6;20283:72;:::i;:::-;20030:332;;;;;:::o;20368:137::-;20422:5;20453:6;20447:13;20438:22;;20469:30;20493:5;20469:30;:::i;:::-;20368:137;;;;:::o;20511:345::-;20578:6;20627:2;20615:9;20606:7;20602:23;20598:32;20595:119;;;20633:79;;:::i;:::-;20595:119;20753:1;20778:61;20831:7;20822:6;20811:9;20807:22;20778:61;:::i;:::-;20768:71;;20724:125;20511:345;;;;:::o;20862:180::-;20910:77;20907:1;20900:88;21007:4;21004:1;20997:15;21031:4;21028:1;21021:15;21048:348;21088:7;21111:20;21129:1;21111:20;:::i;:::-;21106:25;;21145:20;21163:1;21145:20;:::i;:::-;21140:25;;21333:1;21265:66;21261:74;21258:1;21255:81;21250:1;21243:9;21236:17;21232:105;21229:131;;;21340:18;;:::i;:::-;21229:131;21388:1;21385;21381:9;21370:20;;21048:348;;;;:::o;21402:180::-;21450:77;21447:1;21440:88;21547:4;21544:1;21537:15;21571:4;21568:1;21561:15;21588:185;21628:1;21645:20;21663:1;21645:20;:::i;:::-;21640:25;;21679:20;21697:1;21679:20;:::i;:::-;21674:25;;21718:1;21708:35;;21723:18;;:::i;:::-;21708:35;21765:1;21762;21758:9;21753:14;;21588:185;;;;:::o;21779:147::-;21880:11;21917:3;21902:18;;21779:147;;;;:::o;21932:114::-;;:::o;22052:398::-;22211:3;22232:83;22313:1;22308:3;22232:83;:::i;:::-;22225:90;;22324:93;22413:3;22324:93;:::i;:::-;22442:1;22437:3;22433:11;22426:18;;22052:398;;;:::o;22456:379::-;22640:3;22662:147;22805:3;22662:147;:::i;:::-;22655:154;;22826:3;22819:10;;22456:379;;;:::o;22841:174::-;22981:26;22977:1;22969:6;22965:14;22958:50;22841:174;:::o;23021:366::-;23163:3;23184:67;23248:2;23243:3;23184:67;:::i;:::-;23177:74;;23260:93;23349:3;23260:93;:::i;:::-;23378:2;23373:3;23369:12;23362:19;;23021:366;;;:::o;23393:419::-;23559:4;23597:2;23586:9;23582:18;23574:26;;23646:9;23640:4;23636:20;23632:1;23621:9;23617:17;23610:47;23674:131;23800:4;23674:131;:::i;:::-;23666:139;;23393:419;;;:::o;23818:167::-;23958:19;23954:1;23946:6;23942:14;23935:43;23818:167;:::o;23991:366::-;24133:3;24154:67;24218:2;24213:3;24154:67;:::i;:::-;24147:74;;24230:93;24319:3;24230:93;:::i;:::-;24348:2;24343:3;24339:12;24332:19;;23991:366;;;:::o;24363:419::-;24529:4;24567:2;24556:9;24552:18;24544:26;;24616:9;24610:4;24606:20;24602:1;24591:9;24587:17;24580:47;24644:131;24770:4;24644:131;:::i;:::-;24636:139;;24363:419;;;:::o;24788:163::-;24928:15;24924:1;24916:6;24912:14;24905:39;24788:163;:::o;24957:366::-;25099:3;25120:67;25184:2;25179:3;25120:67;:::i;:::-;25113:74;;25196:93;25285:3;25196:93;:::i;:::-;25314:2;25309:3;25305:12;25298:19;;24957:366;;;:::o;25329:419::-;25495:4;25533:2;25522:9;25518:18;25510:26;;25582:9;25576:4;25572:20;25568:1;25557:9;25553:17;25546:47;25610:131;25736:4;25610:131;:::i;:::-;25602:139;;25329:419;;;:::o;25754:305::-;25794:3;25813:20;25831:1;25813:20;:::i;:::-;25808:25;;25847:20;25865:1;25847:20;:::i;:::-;25842:25;;26001:1;25933:66;25929:74;25926:1;25923:81;25920:107;;;26007:18;;:::i;:::-;25920:107;26051:1;26048;26044:9;26037:16;;25754:305;;;;:::o;26065:162::-;26205:14;26201:1;26193:6;26189:14;26182:38;26065:162;:::o;26233:366::-;26375:3;26396:67;26460:2;26455:3;26396:67;:::i;:::-;26389:74;;26472:93;26561:3;26472:93;:::i;:::-;26590:2;26585:3;26581:12;26574:19;;26233:366;;;:::o;26605:419::-;26771:4;26809:2;26798:9;26794:18;26786:26;;26858:9;26852:4;26848:20;26844:1;26833:9;26829:17;26822:47;26886:131;27012:4;26886:131;:::i;:::-;26878:139;;26605:419;;;:::o;27030:175::-;27170:27;27166:1;27158:6;27154:14;27147:51;27030:175;:::o;27211:366::-;27353:3;27374:67;27438:2;27433:3;27374:67;:::i;:::-;27367:74;;27450:93;27539:3;27450:93;:::i;:::-;27568:2;27563:3;27559:12;27552:19;;27211:366;;;:::o;27583:419::-;27749:4;27787:2;27776:9;27772:18;27764:26;;27836:9;27830:4;27826:20;27822:1;27811:9;27807:17;27800:47;27864:131;27990:4;27864:131;:::i;:::-;27856:139;;27583:419;;;:::o;28008:180::-;28148:32;28144:1;28136:6;28132:14;28125:56;28008:180;:::o;28194:366::-;28336:3;28357:67;28421:2;28416:3;28357:67;:::i;:::-;28350:74;;28433:93;28522:3;28433:93;:::i;:::-;28551:2;28546:3;28542:12;28535:19;;28194:366;;;:::o;28566:419::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:174::-;29131:26;29127:1;29119:6;29115:14;29108:50;28991:174;:::o;29171:366::-;29313:3;29334:67;29398:2;29393:3;29334:67;:::i;:::-;29327:74;;29410:93;29499:3;29410:93;:::i;:::-;29528:2;29523:3;29519:12;29512:19;;29171:366;;;:::o;29543:419::-;29709:4;29747:2;29736:9;29732:18;29724:26;;29796:9;29790:4;29786:20;29782:1;29771:9;29767:17;29760:47;29824:131;29950:4;29824:131;:::i;:::-;29816:139;;29543:419;;;:::o;29968:191::-;30008:4;30028:20;30046:1;30028:20;:::i;:::-;30023:25;;30062:20;30080:1;30062:20;:::i;:::-;30057:25;;30101:1;30098;30095:8;30092:34;;;30106:18;;:::i;:::-;30092:34;30151:1;30148;30144:9;30136:17;;29968:191;;;;:::o;30165:171::-;30305:23;30301:1;30293:6;30289:14;30282:47;30165:171;:::o;30342:366::-;30484:3;30505:67;30569:2;30564:3;30505:67;:::i;:::-;30498:74;;30581:93;30670:3;30581:93;:::i;:::-;30699:2;30694:3;30690:12;30683:19;;30342:366;;;:::o;30714:419::-;30880:4;30918:2;30907:9;30903:18;30895:26;;30967:9;30961:4;30957:20;30953:1;30942:9;30938:17;30931:47;30995:131;31121:4;30995:131;:::i;:::-;30987:139;;30714:419;;;:::o;31139:175::-;31279:27;31275:1;31267:6;31263:14;31256:51;31139:175;:::o;31320:366::-;31462:3;31483:67;31547:2;31542:3;31483:67;:::i;:::-;31476:74;;31559:93;31648:3;31559:93;:::i;:::-;31677:2;31672:3;31668:12;31661:19;;31320:366;;;:::o;31692:419::-;31858:4;31896:2;31885:9;31881:18;31873:26;;31945:9;31939:4;31935:20;31931:1;31920:9;31916:17;31909:47;31973:131;32099:4;31973:131;:::i;:::-;31965:139;;31692:419;;;:::o;32117:94::-;32150:8;32198:5;32194:2;32190:14;32169:35;;32117:94;;;:::o;32217:::-;32256:7;32285:20;32299:5;32285:20;:::i;:::-;32274:31;;32217:94;;;:::o;32317:100::-;32356:7;32385:26;32405:5;32385:26;:::i;:::-;32374:37;;32317:100;;;:::o;32423:157::-;32528:45;32548:24;32566:5;32548:24;:::i;:::-;32528:45;:::i;:::-;32523:3;32516:58;32423:157;;:::o;32586:256::-;32698:3;32713:75;32784:3;32775:6;32713:75;:::i;:::-;32813:2;32808:3;32804:12;32797:19;;32833:3;32826:10;;32586:256;;;;:::o;32848:180::-;32896:77;32893:1;32886:88;32993:4;32990:1;32983:15;33017:4;33014:1;33007:15;33034:79;33073:7;33102:5;33091:16;;33034:79;;;:::o;33119:157::-;33224:45;33244:24;33262:5;33244:24;:::i;:::-;33224:45;:::i;:::-;33219:3;33212:58;33119:157;;:::o;33282:397::-;33422:3;33437:75;33508:3;33499:6;33437:75;:::i;:::-;33537:2;33532:3;33528:12;33521:19;;33550:75;33621:3;33612:6;33550:75;:::i;:::-;33650:2;33645:3;33641:12;33634:19;;33670:3;33663:10;;33282:397;;;;;:::o;33685:233::-;33724:3;33747:24;33765:5;33747:24;:::i;:::-;33738:33;;33793:66;33786:5;33783:77;33780:103;;33863:18;;:::i;:::-;33780:103;33910:1;33903:5;33899:13;33892:20;;33685:233;;;:::o;33924:234::-;34064:34;34060:1;34052:6;34048:14;34041:58;34133:17;34128:2;34120:6;34116:15;34109:42;33924:234;:::o;34164:366::-;34306:3;34327:67;34391:2;34386:3;34327:67;:::i;:::-;34320:74;;34403:93;34492:3;34403:93;:::i;:::-;34521:2;34516:3;34512:12;34505:19;;34164:366;;;:::o;34536:419::-;34702:4;34740:2;34729:9;34725:18;34717:26;;34789:9;34783:4;34779:20;34775:1;34764:9;34760:17;34753:47;34817:131;34943:4;34817:131;:::i;:::-;34809:139;;34536:419;;;:::o;34961:148::-;35063:11;35100:3;35085:18;;34961:148;;;;:::o;35115:377::-;35221:3;35249:39;35282:5;35249:39;:::i;:::-;35304:89;35386:6;35381:3;35304:89;:::i;:::-;35297:96;;35402:52;35447:6;35442:3;35435:4;35428:5;35424:16;35402:52;:::i;:::-;35479:6;35474:3;35470:16;35463:23;;35225:267;35115:377;;;;:::o;35498:141::-;35547:4;35570:3;35562:11;;35593:3;35590:1;35583:14;35627:4;35624:1;35614:18;35606:26;;35498:141;;;:::o;35669:845::-;35772:3;35809:5;35803:12;35838:36;35864:9;35838:36;:::i;:::-;35890:89;35972:6;35967:3;35890:89;:::i;:::-;35883:96;;36010:1;35999:9;35995:17;36026:1;36021:137;;;;36172:1;36167:341;;;;35988:520;;36021:137;36105:4;36101:9;36090;36086:25;36081:3;36074:38;36141:6;36136:3;36132:16;36125:23;;36021:137;;36167:341;36234:38;36266:5;36234:38;:::i;:::-;36294:1;36308:154;36322:6;36319:1;36316:13;36308:154;;;36396:7;36390:14;36386:1;36381:3;36377:11;36370:35;36446:1;36437:7;36433:15;36422:26;;36344:4;36341:1;36337:12;36332:17;;36308:154;;;36491:6;36486:3;36482:16;36475:23;;36174:334;;35988:520;;35776:738;;35669:845;;;;:::o;36520:589::-;36745:3;36767:95;36858:3;36849:6;36767:95;:::i;:::-;36760:102;;36879:95;36970:3;36961:6;36879:95;:::i;:::-;36872:102;;36991:92;37079:3;37070:6;36991:92;:::i;:::-;36984:99;;37100:3;37093:10;;36520:589;;;;;;:::o;37115:167::-;37255:19;37251:1;37243:6;37239:14;37232:43;37115:167;:::o;37288:366::-;37430:3;37451:67;37515:2;37510:3;37451:67;:::i;:::-;37444:74;;37527:93;37616:3;37527:93;:::i;:::-;37645:2;37640:3;37636:12;37629:19;;37288:366;;;:::o;37660:419::-;37826:4;37864:2;37853:9;37849:18;37841:26;;37913:9;37907:4;37903:20;37899:1;37888:9;37884:17;37877:47;37941:131;38067:4;37941:131;:::i;:::-;37933:139;;37660:419;;;:::o;38085:172::-;38225:24;38221:1;38213:6;38209:14;38202:48;38085:172;:::o;38263:366::-;38405:3;38426:67;38490:2;38485:3;38426:67;:::i;:::-;38419:74;;38502:93;38591:3;38502:93;:::i;:::-;38620:2;38615:3;38611:12;38604:19;;38263:366;;;:::o;38635:419::-;38801:4;38839:2;38828:9;38824:18;38816:26;;38888:9;38882:4;38878:20;38874:1;38863:9;38859:17;38852:47;38916:131;39042:4;38916:131;:::i;:::-;38908:139;;38635:419;;;:::o;39060:176::-;39092:1;39109:20;39127:1;39109:20;:::i;:::-;39104:25;;39143:20;39161:1;39143:20;:::i;:::-;39138:25;;39182:1;39172:35;;39187:18;;:::i;:::-;39172:35;39228:1;39225;39221:9;39216:14;;39060:176;;;;:::o;39242:98::-;39293:6;39327:5;39321:12;39311:22;;39242:98;;;:::o;39346:168::-;39429:11;39463:6;39458:3;39451:19;39503:4;39498:3;39494:14;39479:29;;39346:168;;;;:::o;39520:360::-;39606:3;39634:38;39666:5;39634:38;:::i;:::-;39688:70;39751:6;39746:3;39688:70;:::i;:::-;39681:77;;39767:52;39812:6;39807:3;39800:4;39793:5;39789:16;39767:52;:::i;:::-;39844:29;39866:6;39844:29;:::i;:::-;39839:3;39835:39;39828:46;;39610:270;39520:360;;;;:::o;39886:640::-;40081:4;40119:3;40108:9;40104:19;40096:27;;40133:71;40201:1;40190:9;40186:17;40177:6;40133:71;:::i;:::-;40214:72;40282:2;40271:9;40267:18;40258:6;40214:72;:::i;:::-;40296;40364:2;40353:9;40349:18;40340:6;40296:72;:::i;:::-;40415:9;40409:4;40405:20;40400:2;40389:9;40385:18;40378:48;40443:76;40514:4;40505:6;40443:76;:::i;:::-;40435:84;;39886:640;;;;;;;:::o;40532:141::-;40588:5;40619:6;40613:13;40604:22;;40635:32;40661:5;40635:32;:::i;:::-;40532:141;;;;:::o;40679:349::-;40748:6;40797:2;40785:9;40776:7;40772:23;40768:32;40765:119;;;40803:79;;:::i;:::-;40765:119;40923:1;40948:63;41003:7;40994:6;40983:9;40979:22;40948:63;:::i;:::-;40938:73;;40894:127;40679:349;;;;:::o

Swarm Source

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