ETH Price: $2,459.71 (-4.56%)
Gas: 1.4 Gwei

Bridge Girls (Bgirls)
 

Overview

TokenID

8

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BridgeGirls

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-21
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // =============================================================
    //                        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 {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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 Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;

contract BridgeGirls is ERC721A, Ownable, ReentrancyGuard {
	using Strings for uint256;

    uint256 public constant MAX_PER_PREMINT_WALLET = 6;
	uint256 public maxSupply = 5047;

    uint256 public preMintCost = 0 ether;
	uint256 public publicMintCost = 0.04 ether;
	uint256 public transferPool = 0.0125 ether;


	bool public isPublicMint = false;
    bool public isPreMint = false;
    bool public isRevealed = false;
	bool public isRefundStart = false;

    string private baseURL = "";
    string public hiddenMetadataUrl = "";

    address[] public whitelistedAddresses1;
	address[] public whitelistedAddresses2;
	address[] public whitelistedAddresses3;
	address[] public whitelistedAddresses4;
	address[] public whitelistedAddresses5;
	address[] public whitelistedAddresses6;

	uint256[] public refundList;

	mapping(address => uint256) private _preMintWalletCount;
	mapping(address => uint256) private _publicMintWalletCount;
	

	constructor(
		string memory _hiddenMetadataUrl
	)
	ERC721A("Bridge Girls", "Bgirls") {
		sethiddenMetadataUrl(_hiddenMetadataUrl);
    }

	function _baseURI() internal view override returns (string memory) {
		return baseURL;
	}

    function setBaseUri(string memory _baseURL) external onlyOwner {
	    baseURL = _baseURL;
	}

    function sethiddenMetadataUrl(string memory _hiddenMetadataUrl) public onlyOwner {
	    hiddenMetadataUrl = _hiddenMetadataUrl;
	}

    function reveal() external onlyOwner {
	    isRevealed = true;
	}

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

	function isWhitelisted1(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses1.length; i++) {
            if (whitelistedAddresses1[i] == _user) {
                return true;
            }
        }
        return false;
    }
	function isWhitelisted2(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses2.length; i++) {
            if (whitelistedAddresses2[i] == _user) {
                return true;
            }
        }
        return false;
    }
	function isWhitelisted3(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses3.length; i++) {
            if (whitelistedAddresses3[i] == _user) {
                return true;
            }
        }
        return false;
    }
	function isWhitelisted4(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses4.length; i++) {
            if (whitelistedAddresses4[i] == _user) {
                return true;
            }
        }
        return false;
    }
	function isWhitelisted5(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses5.length; i++) {
            if (whitelistedAddresses5[i] == _user) {
                return true;
            }
        }
        return false;
    }
	function isWhitelisted6(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses6.length; i++) {
            if (whitelistedAddresses6[i] == _user) {
                return true;
            }
        }
        return false;
    }

	function isRefund(uint256 _tokenid) public view returns (bool) {
        for (uint256 i = 0; i < refundList.length; i++) {
            if (refundList[i] == _tokenid) {
                return true;
            }
        }
        return false;
    }

	function publicMintStart() external onlyOwner {
	    isPublicMint = true;
	}

    function preMintStart() external onlyOwner {
	    isPreMint = true;
	}

	function RefundStart() external onlyOwner {
	    isRefundStart = true;
	}

	function RefundEnd() external onlyOwner {
	    isRefundStart = false;
	}

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

	function refund(uint256 tokenId) external {
		require(isRefundStart==true, "Not in refund period");
		require(isRefund(tokenId)==true, "That refund token doesn't exist");
        require(ownerOf(tokenId)==msg.sender,"You did not own this token");
		(bool success, ) = payable(msg.sender).call{
            value: publicMintCost
        }("");
		_burn(tokenId);
	}

	function setMaxSupply(uint256 newMaxSupply) external onlyOwner {
		maxSupply = newMaxSupply;
	}

	function tokenURI(uint256 tokenId)
		public
		view
		override
		returns (string memory)
	{
        require(_exists(tokenId), "That token doesn't exist");
        if(isRevealed == false) {
            return hiddenMetadataUrl;
        }
        return bytes(_baseURI()).length > 0 
            ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"))
            : "";
	}

	function publicMint(uint256 mintAmount) external payable {
		require(isPublicMint, "Public mint not start");
        require(_totalMinted() + mintAmount <= maxSupply,"Exceeds max supply");
        require(msg.value >= publicMintCost * mintAmount, "insufficient funds");
		_publicMintWalletCount[msg.sender] += mintAmount;
		_safeMint(msg.sender, mintAmount);
        (bool success, ) = payable(0x3948B7368FEB1728D38695a5E765aD85f62e9859).call{
            value: transferPool * mintAmount
        }("");
	}

    function PreMint(uint256 mintAmount) external payable {
		require(isPreMint, "Pre mint not start");
        require(_totalMinted() + mintAmount <= maxSupply,"Exceeds max supply");
        require(mintAmount <= MAX_PER_PREMINT_WALLET,"Exceeds max per transaction");
		if (isWhitelisted1(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 1,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
        else if (isWhitelisted2(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 2,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
        else if (isWhitelisted3(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 3,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
        else if (isWhitelisted4(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 4,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
        else if (isWhitelisted5(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 5,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
        else if (isWhitelisted6(msg.sender) == true){
			require(_preMintWalletCount[msg.sender] + mintAmount <= 6,"Exceeds max per wallet");
			require(msg.value >= preMintCost * mintAmount, "insufficient funds");
			_preMintWalletCount[msg.sender] += mintAmount;
			_safeMint(msg.sender, mintAmount);
		}
		else{
			require(false,"Not whitelistUser");
		}
		
	}

    function airDrop(address to, uint256 mintAmount) external onlyOwner {
		require(
			_totalMinted() + mintAmount <= maxSupply,
			"Exceeds max supply"
		);
		_safeMint(to, mintAmount);
	}

	function setRefundlist(uint256[] calldata _ids) public onlyOwner {
        delete refundList;
        refundList= _ids;
    }

    function whitelistUsers1(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses1= _users;
    }
	function whitelistUsers2(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses2= _users;
    }
	function whitelistUsers3(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses3= _users;
    }
	function whitelistUsers4(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses4= _users;
    }
	function whitelistUsers5(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses5= _users;
    }
	function whitelistUsers6(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses1;
        whitelistedAddresses6= _users;
    }
	function deposit() external payable onlyOwner {

	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_hiddenMetadataUrl","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_PREMINT_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"PreMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"RefundEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RefundStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"isRefund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRefundStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted5","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted6","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refundList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURL","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"setRefundlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUrl","type":"string"}],"name":"sethiddenMetadataUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526113b7600a556000600b55668e1bc9bf040000600c55662c68af0bb14000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff02191690831515021790555060405180602001604052806000815250600f9080519060200190620000b8929190620003c8565b506040518060200160405280600081525060109080519060200190620000e0929190620003c8565b50348015620000ee57600080fd5b50604051620058ea380380620058ea8339818101604052810190620001149190620004f6565b6040518060400160405280600c81526020017f427269646765204769726c7300000000000000000000000000000000000000008152506040518060400160405280600681526020017f426769726c730000000000000000000000000000000000000000000000000000815250816002908051906020019062000198929190620003c8565b508060039080519060200190620001b1929190620003c8565b50620001c26200020a60201b60201c565b6000819055505050620001ea620001de6200021360201b60201c565b6200021b60201b60201c565b60016009819055506200020381620002e160201b60201c565b506200074e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f16200030d60201b60201c565b806010908051906020019062000309929190620003c8565b5050565b6200031d6200021360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003436200039e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000393906200056e565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003d69062000636565b90600052602060002090601f016020900481019282620003fa576000855562000446565b82601f106200041557805160ff191683800117855562000446565b8280016001018555821562000446579182015b828111156200044557825182559160200191906001019062000428565b5b50905062000455919062000459565b5090565b5b80821115620004745760008160009055506001016200045a565b5090565b60006200048f6200048984620005b9565b62000590565b905082815260208101848484011115620004ae57620004ad62000705565b5b620004bb84828562000600565b509392505050565b600082601f830112620004db57620004da62000700565b5b8151620004ed84826020860162000478565b91505092915050565b6000602082840312156200050f576200050e6200070f565b5b600082015167ffffffffffffffff81111562000530576200052f6200070a565b5b6200053e84828501620004c3565b91505092915050565b600062000556602083620005ef565b9150620005638262000725565b602082019050919050565b60006020820190508181036000830152620005898162000547565b9050919050565b60006200059c620005af565b9050620005aa82826200066c565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d757620005d6620006d1565b5b620005e28262000714565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200062057808201518184015260208101905062000603565b8381111562000630576000848401525b50505050565b600060028204905060018216806200064f57607f821691505b60208210811415620006665762000665620006a2565b5b50919050565b620006778262000714565b810181811067ffffffffffffffff82111715620006995762000698620006d1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61518c806200075e6000396000f3fe6080604052600436106103ad5760003560e01c806380bd8b62116101e7578063c435c7a11161010d578063e79973a1116100a0578063eff1c98f1161006f578063eff1c98f14610e03578063f2fde38b14610e2c578063fc75b41814610e55578063fcf9327514610e6c576103ad565b8063e79973a114610d35578063e985e9c514610d60578063ed8cf2a914610d9d578063ef69f3b814610dc6576103ad565b8063d1a94943116100dc578063d1a9494314610c8b578063d4ab1db514610ca2578063d5abeb0114610ccd578063dd47b65e14610cf8576103ad565b8063c435c7a114610c04578063c87b56dd14610c1b578063cb2b1c5e14610c58578063d0e30db014610c81576103ad565b8063a0bcfc7f11610185578063b759158a11610154578063b759158a14610b69578063b88d4fde14610b94578063b912e64a14610bbd578063bdc0b28414610bd9576103ad565b8063a0bcfc7f14610ac3578063a22cb46514610aec578063a475b5dd14610b15578063b0b0540d14610b2c576103ad565b80638da5cb5b116101c15780638da5cb5b146109f35780639151e33f14610a1e57806395d89b4114610a5b578063973566c214610a86576103ad565b806380bd8b62146109745780638c770067146109b15780638cfec4c0146109dc576103ad565b8063395819b7116102d75780635c87ec771161026a57806370a082311161023957806370a08231146108a6578063715018a6146108e35780637752973d146108fa578063807d128814610937576103ad565b80635c87ec77146107ee578063619aaa11146108175780636352211e146108405780636f8b44b01461087d576103ad565b806344b088f0116102a657806344b088f0146107205780634dab517e1461075d57806354214f69146107865780635c0402f1146107b1576103ad565b8063395819b7146106785780633ccfd60b146106a3578063426a5631146106ba57806342842e0e146106f7576103ad565b806316503e611161034f57806324fecc601161031e57806324fecc60146105cb578063278ecde1146106085780632db11544146106315780633057931f1461064d576103ad565b806316503e611461051157806318160ddd1461054e5780632322afb61461057957806323b872dd146105a2576103ad565b8063081812fc1161038b578063081812fc146104435780630894cf1614610480578063095ea7b3146104bd5780631638fef0146104e6576103ad565b806301ffc9a7146103b2578063045f7850146103ef57806306fdde0314610418575b600080fd5b3480156103be57600080fd5b506103d960048036038101906103d491906143ac565b610e95565b6040516103e69190614804565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906142d2565b610f27565b005b34801561042457600080fd5b5061042d610f94565b60405161043a919061481f565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061444f565b611026565b604051610477919061479d565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a2919061444f565b6110a5565b6040516104b4919061479d565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906142d2565b6110e4565b005b3480156104f257600080fd5b506104fb611228565b604051610508919061481f565b60405180910390f35b34801561051d57600080fd5b506105386004803603810190610533919061444f565b6112b6565b60405161054591906149e1565b60405180910390f35b34801561055a57600080fd5b506105636112da565b60405161057091906149e1565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b919061435f565b6112f1565b005b3480156105ae57600080fd5b506105c960048036038101906105c491906141bc565b61131d565b005b3480156105d757600080fd5b506105f260048036038101906105ed919061414f565b611642565b6040516105ff9190614804565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061444f565b6116f1565b005b61064b6004803603810190610646919061444f565b611887565b005b34801561065957600080fd5b50610662611a6e565b60405161066f9190614804565b60405180910390f35b34801561068457600080fd5b5061068d611a81565b60405161069a91906149e1565b60405180910390f35b3480156106af57600080fd5b506106b8611a87565b005b3480156106c657600080fd5b506106e160048036038101906106dc919061414f565b611b08565b6040516106ee9190614804565b60405180910390f35b34801561070357600080fd5b5061071e600480360381019061071991906141bc565b611bb7565b005b34801561072c57600080fd5b506107476004803603810190610742919061414f565b611bd7565b6040516107549190614804565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190614312565b611c86565b005b34801561079257600080fd5b5061079b611cb2565b6040516107a89190614804565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d3919061414f565b611cc5565b6040516107e59190614804565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190614312565b611d74565b005b34801561082357600080fd5b5061083e60048036038101906108399190614312565b611da0565b005b34801561084c57600080fd5b506108676004803603810190610862919061444f565b611dcc565b604051610874919061479d565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061444f565b611dde565b005b3480156108b257600080fd5b506108cd60048036038101906108c8919061414f565b611df0565b6040516108da91906149e1565b60405180910390f35b3480156108ef57600080fd5b506108f8611ea9565b005b34801561090657600080fd5b50610921600480360381019061091c919061444f565b611ebd565b60405161092e919061479d565b60405180910390f35b34801561094357600080fd5b5061095e6004803603810190610959919061414f565b611efc565b60405161096b9190614804565b60405180910390f35b34801561098057600080fd5b5061099b6004803603810190610996919061444f565b611fab565b6040516109a8919061479d565b60405180910390f35b3480156109bd57600080fd5b506109c6611fea565b6040516109d391906149e1565b60405180910390f35b3480156109e857600080fd5b506109f1611ff0565b005b3480156109ff57600080fd5b50610a08612015565b604051610a15919061479d565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a40919061444f565b61203f565b604051610a52919061479d565b60405180910390f35b348015610a6757600080fd5b50610a7061207e565b604051610a7d919061481f565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa8919061444f565b612110565b604051610aba9190614804565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614406565b612173565b005b348015610af857600080fd5b50610b136004803603810190610b0e9190614292565b612195565b005b348015610b2157600080fd5b50610b2a61230d565b005b348015610b3857600080fd5b50610b536004803603810190610b4e919061414f565b612332565b604051610b609190614804565b60405180910390f35b348015610b7557600080fd5b50610b7e6123e1565b604051610b8b9190614804565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb6919061420f565b6123f4565b005b610bd76004803603810190610bd2919061444f565b612467565b005b348015610be557600080fd5b50610bee612dab565b604051610bfb91906149e1565b60405180910390f35b348015610c1057600080fd5b50610c19612db0565b005b348015610c2757600080fd5b50610c426004803603810190610c3d919061444f565b612dd5565b604051610c4f919061481f565b60405180910390f35b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614406565b612f2c565b005b610c89612f4e565b005b348015610c9757600080fd5b50610ca0612f58565b005b348015610cae57600080fd5b50610cb7612f7d565b604051610cc491906149e1565b60405180910390f35b348015610cd957600080fd5b50610ce2612f83565b604051610cef91906149e1565b60405180910390f35b348015610d0457600080fd5b50610d1f6004803603810190610d1a919061444f565b612f89565b604051610d2c919061479d565b60405180910390f35b348015610d4157600080fd5b50610d4a612fc8565b604051610d579190614804565b60405180910390f35b348015610d6c57600080fd5b50610d876004803603810190610d82919061417c565b612fdb565b604051610d949190614804565b60405180910390f35b348015610da957600080fd5b50610dc46004803603810190610dbf9190614312565b61306f565b005b348015610dd257600080fd5b50610ded6004803603810190610de8919061444f565b61309b565b604051610dfa919061479d565b60405180910390f35b348015610e0f57600080fd5b50610e2a6004803603810190610e259190614312565b6130da565b005b348015610e3857600080fd5b50610e536004803603810190610e4e919061414f565b613106565b005b348015610e6157600080fd5b50610e6a61318a565b005b348015610e7857600080fd5b50610e936004803603810190610e8e9190614312565b6131af565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ef057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f205750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610f2f6131db565b600a5481610f3b613259565b610f459190614ad1565b1115610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d906148c1565b60405180910390fd5b610f90828261326c565b5050565b606060028054610fa390614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf90614c9c565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b5050505050905090565b60006110318261328a565b611067576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601281815481106110b557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef82611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff166111106132e9565b73ffffffffffffffffffffffffffffffffffffffff16146111735761113c816111376132e9565b612fdb565b611172576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6010805461123590614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461126190614c9c565b80156112ae5780601f10611283576101008083540402835291602001916112ae565b820191906000526020600020905b81548152906001019060200180831161129157829003601f168201915b505050505081565b601781815481106112c657600080fd5b906000526020600020016000915090505481565b60006112e46132f1565b6001546000540303905090565b6112f96131db565b601760006113079190613d88565b818160179190611318929190613da9565b505050565b6000611328826132fa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461138f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061139b846133c8565b915091506113b181876113ac6132e9565b6133ef565b6113fd576113c6866113c16132e9565b612fdb565b6113fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611464576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114718686866001613433565b801561147c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061154a85611526888887613439565b7c020000000000000000000000000000000000000000000000000000000017613461565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156115d25760006001850190506000600460008381526020019081526020016000205414156115d05760005481146115cf578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461163a868686600161348c565b505050505050565b600080600090505b6016805490508110156116e6578273ffffffffffffffffffffffffffffffffffffffff166016828154811061168257611681614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d35760019150506116ec565b80806116de90614cff565b91505061164a565b50600090505b919050565b60011515600e60039054906101000a900460ff16151514611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90614941565b60405180910390fd5b6001151561175482612110565b151514611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614881565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166117b682611dcc565b73ffffffffffffffffffffffffffffffffffffffff161461180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390614901565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600c5460405161183490614788565b60006040518083038185875af1925050503d8060008114611871576040519150601f19603f3d011682016040523d82523d6000602084013e611876565b606091505b5050905061188382613492565b5050565b600e60009054906101000a900460ff166118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90614841565b60405180910390fd5b600a54816118e2613259565b6118ec9190614ad1565b111561192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906148c1565b60405180910390fd5b80600c5461193b9190614b58565b34101561197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490614981565b60405180910390fd5b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cc9190614ad1565b925050819055506119dd338261326c565b6000733948b7368feb1728d38695a5e765ad85f62e985973ffffffffffffffffffffffffffffffffffffffff1682600d54611a189190614b58565b604051611a2490614788565b60006040518083038185875af1925050503d8060008114611a61576040519150601f19603f3d011682016040523d82523d6000602084013e611a66565b606091505b505090505050565b600e60009054906101000a900460ff1681565b600d5481565b611a8f6131db565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611ab590614788565b60006040518083038185875af1925050503d8060008114611af2576040519150601f19603f3d011682016040523d82523d6000602084013e611af7565b606091505b5050905080611b0557600080fd5b50565b600080600090505b601380549050811015611bac578273ffffffffffffffffffffffffffffffffffffffff1660138281548110611b4857611b47614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b99576001915050611bb2565b8080611ba490614cff565b915050611b10565b50600090505b919050565b611bd2838383604051806020016040528060008152506123f4565b505050565b600080600090505b601280549050811015611c7b578273ffffffffffffffffffffffffffffffffffffffff1660128281548110611c1757611c16614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c68576001915050611c81565b8080611c7390614cff565b915050611bdf565b50600090505b919050565b611c8e6131db565b60116000611c9c9190613df6565b818160169190611cad929190613e17565b505050565b600e60029054906101000a900460ff1681565b600080600090505b601180549050811015611d69578273ffffffffffffffffffffffffffffffffffffffff1660118281548110611d0557611d04614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d56576001915050611d6f565b8080611d6190614cff565b915050611ccd565b50600090505b919050565b611d7c6131db565b60116000611d8a9190613df6565b818160139190611d9b929190613e17565b505050565b611da86131db565b60116000611db69190613df6565b818160129190611dc7929190613e17565b505050565b6000611dd7826132fa565b9050919050565b611de66131db565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e58576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611eb16131db565b611ebb60006134a0565b565b60158181548110611ecd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b601580549050811015611fa0578273ffffffffffffffffffffffffffffffffffffffff1660158281548110611f3c57611f3b614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f8d576001915050611fa6565b8080611f9890614cff565b915050611f04565b50600090505b919050565b60118181548110611fbb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611ff86131db565b6001600e60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016818154811061204f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461208d90614c9c565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990614c9c565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b5050505050905090565b600080600090505b60178054905081101561216857826017828154811061213a57612139614e06565b5b9060005260206000200154141561215557600191505061216e565b808061216090614cff565b915050612118565b50600090505b919050565b61217b6131db565b80600f9080519060200190612191929190613eb7565b5050565b61219d6132e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612202576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061220f6132e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122bc6132e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123019190614804565b60405180910390a35050565b6123156131db565b6001600e60026101000a81548160ff021916908315150217905550565b600080600090505b6014805490508110156123d6578273ffffffffffffffffffffffffffffffffffffffff166014828154811061237257612371614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123c35760019150506123dc565b80806123ce90614cff565b91505061233a565b50600090505b919050565b600e60039054906101000a900460ff1681565b6123ff84848461131d565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124615761242a84848484613566565b612460576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e60019054906101000a900460ff166124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad906149c1565b60405180910390fd5b600a54816124c2613259565b6124cc9190614ad1565b111561250d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612504906148c1565b60405180910390fd5b6006811115612551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254890614961565b60405180910390fd5b6001151561255e33611cc5565b151514156126a957600181601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125b39190614ad1565b11156125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906149a1565b60405180910390fd5b80600b546126029190614b58565b341015612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126939190614ad1565b925050819055506126a4338261326c565b612da8565b600115156126b633611bd7565b1515141561280157600281601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461270b9190614ad1565b111561274c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612743906149a1565b60405180910390fd5b80600b5461275a9190614b58565b34101561279c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127eb9190614ad1565b925050819055506127fc338261326c565b612da7565b6001151561280e33611b08565b1515141561295957600381601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128639190614ad1565b11156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b906149a1565b60405180910390fd5b80600b546128b29190614b58565b3410156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129439190614ad1565b92505081905550612954338261326c565b612da6565b6001151561296633612332565b15151415612ab157600481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129bb9190614ad1565b11156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f3906149a1565b60405180910390fd5b80600b54612a0a9190614b58565b341015612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9b9190614ad1565b92505081905550612aac338261326c565b612da5565b60011515612abe33611efc565b15151415612c0957600581601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b139190614ad1565b1115612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b906149a1565b60405180910390fd5b80600b54612b629190614b58565b341015612ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9b90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf39190614ad1565b92505081905550612c04338261326c565b612da4565b60011515612c1633611642565b15151415612d6157600681601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c6b9190614ad1565b1115612cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca3906149a1565b60405180910390fd5b80600b54612cba9190614b58565b341015612cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4b9190614ad1565b92505081905550612d5c338261326c565b612da3565b6000612da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d99906148a1565b60405180910390fd5b5b5b5b5b5b5b50565b600681565b612db86131db565b6001600e60016101000a81548160ff021916908315150217905550565b6060612de08261328a565b612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e16906148e1565b60405180910390fd5b60001515600e60029054906101000a900460ff1615151415612ecd5760108054612e4890614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7490614c9c565b8015612ec15780601f10612e9657610100808354040283529160200191612ec1565b820191906000526020600020905b815481529060010190602001808311612ea457829003601f168201915b50505050509050612f27565b6000612ed76136c6565b5111612ef25760405180602001604052806000815250612f24565b612efa6136c6565b612f0383613758565b604051602001612f14929190614759565b6040516020818303038152906040525b90505b919050565b612f346131db565b8060109080519060200190612f4a929190613eb7565b5050565b612f566131db565b565b612f606131db565b6001600e60036101000a81548160ff021916908315150217905550565b600b5481565b600a5481565b60138181548110612f9957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6130776131db565b601160006130859190613df6565b818160149190613096929190613e17565b505050565b601481815481106130ab57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6130e26131db565b601160006130f09190613df6565b818160159190613101929190613e17565b505050565b61310e6131db565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317590614861565b60405180910390fd5b613187816134a0565b50565b6131926131db565b6000600e60036101000a81548160ff021916908315150217905550565b6131b76131db565b601160006131c59190613df6565b8181601191906131d6929190613e17565b505050565b6131e36138b9565b73ffffffffffffffffffffffffffffffffffffffff16613201612015565b73ffffffffffffffffffffffffffffffffffffffff1614613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e90614921565b60405180910390fd5b565b60006132636132f1565b60005403905090565b6132868282604051806020016040528060008152506138c1565b5050565b6000816132956132f1565b111580156132a4575060005482105b80156132e2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806133096132f1565b11613391576000548110156133905760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561338e575b6000811415613384576004600083600190039350838152602001908152602001600020549050613359565b80925050506133c3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861345086868461395e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61349d816000613967565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261358c6132e9565b8786866040518563ffffffff1660e01b81526004016135ae94939291906147b8565b602060405180830381600087803b1580156135c857600080fd5b505af19250505080156135f957506040513d601f19601f820116820180604052508101906135f691906143d9565b60015b613673573d8060008114613629576040519150601f19603f3d011682016040523d82523d6000602084013e61362e565b606091505b5060008151141561366b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546136d590614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461370190614c9c565b801561374e5780601f106137235761010080835404028352916020019161374e565b820191906000526020600020905b81548152906001019060200180831161373157829003601f168201915b5050505050905090565b606060008214156137a0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138b4565b600082905060005b600082146137d25780806137bb90614cff565b915050600a826137cb9190614b27565b91506137a8565b60008167ffffffffffffffff8111156137ee576137ed614e35565b5b6040519080825280601f01601f1916602001820160405280156138205781602001600182028036833780820191505090505b5090505b600085146138ad576001826138399190614bb2565b9150600a856138489190614d48565b60306138549190614ad1565b60f81b81838151811061386a57613869614e06565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138a69190614b27565b9450613824565b8093505050505b919050565b600033905090565b6138cb8383613bbb565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461395957600080549050600083820390505b61390b6000868380600101945086613566565b613941576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138f857816000541461395657600080fd5b50505b505050565b60009392505050565b6000613972836132fa565b90506000819050600080613985866133c8565b9150915084156139ee576139a1818461399c6132e9565b6133ef565b6139ed576139b6836139b16132e9565b612fdb565b6139ec576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6139fc836000886001613433565b8015613a0757600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613aaf83613a6c85600088613439565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717613461565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613b37576000600187019050600060046000838152602001908152602001600020541415613b35576000548114613b34578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ba183600088600161348c565b600160008154809291906001019190505550505050505050565b6000805490506000821415613bfc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c096000848385613433565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613c8083613c716000866000613439565b613c7a85613d78565b17613461565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613d2157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613ce6565b506000821415613d5d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613d73600084838561348c565b505050565b60006001821460e11b9050919050565b5080546000825590600052602060002090810190613da69190613f3d565b50565b828054828255906000526020600020908101928215613de5579160200282015b82811115613de4578235825591602001919060010190613dc9565b5b509050613df29190613f3d565b5090565b5080546000825590600052602060002090810190613e149190613f3d565b50565b828054828255906000526020600020908101928215613ea6579160200282015b82811115613ea557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613e37565b5b509050613eb39190613f3d565b5090565b828054613ec390614c9c565b90600052602060002090601f016020900481019282613ee55760008555613f2c565b82601f10613efe57805160ff1916838001178555613f2c565b82800160010185558215613f2c579182015b82811115613f2b578251825591602001919060010190613f10565b5b509050613f399190613f3d565b5090565b5b80821115613f56576000816000905550600101613f3e565b5090565b6000613f6d613f6884614a21565b6149fc565b905082815260208101848484011115613f8957613f88614e73565b5b613f94848285614c5a565b509392505050565b6000613faf613faa84614a52565b6149fc565b905082815260208101848484011115613fcb57613fca614e73565b5b613fd6848285614c5a565b509392505050565b600081359050613fed816150fa565b92915050565b60008083601f84011261400957614008614e69565b5b8235905067ffffffffffffffff81111561402657614025614e64565b5b60208301915083602082028301111561404257614041614e6e565b5b9250929050565b60008083601f84011261405f5761405e614e69565b5b8235905067ffffffffffffffff81111561407c5761407b614e64565b5b60208301915083602082028301111561409857614097614e6e565b5b9250929050565b6000813590506140ae81615111565b92915050565b6000813590506140c381615128565b92915050565b6000815190506140d881615128565b92915050565b600082601f8301126140f3576140f2614e69565b5b8135614103848260208601613f5a565b91505092915050565b600082601f83011261412157614120614e69565b5b8135614131848260208601613f9c565b91505092915050565b6000813590506141498161513f565b92915050565b60006020828403121561416557614164614e7d565b5b600061417384828501613fde565b91505092915050565b6000806040838503121561419357614192614e7d565b5b60006141a185828601613fde565b92505060206141b285828601613fde565b9150509250929050565b6000806000606084860312156141d5576141d4614e7d565b5b60006141e386828701613fde565b93505060206141f486828701613fde565b92505060406142058682870161413a565b9150509250925092565b6000806000806080858703121561422957614228614e7d565b5b600061423787828801613fde565b945050602061424887828801613fde565b93505060406142598782880161413a565b925050606085013567ffffffffffffffff81111561427a57614279614e78565b5b614286878288016140de565b91505092959194509250565b600080604083850312156142a9576142a8614e7d565b5b60006142b785828601613fde565b92505060206142c88582860161409f565b9150509250929050565b600080604083850312156142e9576142e8614e7d565b5b60006142f785828601613fde565b92505060206143088582860161413a565b9150509250929050565b6000806020838503121561432957614328614e7d565b5b600083013567ffffffffffffffff81111561434757614346614e78565b5b61435385828601613ff3565b92509250509250929050565b6000806020838503121561437657614375614e7d565b5b600083013567ffffffffffffffff81111561439457614393614e78565b5b6143a085828601614049565b92509250509250929050565b6000602082840312156143c2576143c1614e7d565b5b60006143d0848285016140b4565b91505092915050565b6000602082840312156143ef576143ee614e7d565b5b60006143fd848285016140c9565b91505092915050565b60006020828403121561441c5761441b614e7d565b5b600082013567ffffffffffffffff81111561443a57614439614e78565b5b6144468482850161410c565b91505092915050565b60006020828403121561446557614464614e7d565b5b60006144738482850161413a565b91505092915050565b61448581614be6565b82525050565b61449481614bf8565b82525050565b60006144a582614a83565b6144af8185614a99565b93506144bf818560208601614c69565b6144c881614e82565b840191505092915050565b60006144de82614a8e565b6144e88185614ab5565b93506144f8818560208601614c69565b61450181614e82565b840191505092915050565b600061451782614a8e565b6145218185614ac6565b9350614531818560208601614c69565b80840191505092915050565b600061454a601583614ab5565b915061455582614e93565b602082019050919050565b600061456d602683614ab5565b915061457882614ebc565b604082019050919050565b6000614590601f83614ab5565b915061459b82614f0b565b602082019050919050565b60006145b3601183614ab5565b91506145be82614f34565b602082019050919050565b60006145d6601283614ab5565b91506145e182614f5d565b602082019050919050565b60006145f9601883614ab5565b915061460482614f86565b602082019050919050565b600061461c601a83614ab5565b915061462782614faf565b602082019050919050565b600061463f600583614ac6565b915061464a82614fd8565b600582019050919050565b6000614662602083614ab5565b915061466d82615001565b602082019050919050565b6000614685601483614ab5565b91506146908261502a565b602082019050919050565b60006146a8601b83614ab5565b91506146b382615053565b602082019050919050565b60006146cb600083614aaa565b91506146d68261507c565b600082019050919050565b60006146ee601283614ab5565b91506146f98261507f565b602082019050919050565b6000614711601683614ab5565b915061471c826150a8565b602082019050919050565b6000614734601283614ab5565b915061473f826150d1565b602082019050919050565b61475381614c50565b82525050565b6000614765828561450c565b9150614771828461450c565b915061477c82614632565b91508190509392505050565b6000614793826146be565b9150819050919050565b60006020820190506147b2600083018461447c565b92915050565b60006080820190506147cd600083018761447c565b6147da602083018661447c565b6147e7604083018561474a565b81810360608301526147f9818461449a565b905095945050505050565b6000602082019050614819600083018461448b565b92915050565b6000602082019050818103600083015261483981846144d3565b905092915050565b6000602082019050818103600083015261485a8161453d565b9050919050565b6000602082019050818103600083015261487a81614560565b9050919050565b6000602082019050818103600083015261489a81614583565b9050919050565b600060208201905081810360008301526148ba816145a6565b9050919050565b600060208201905081810360008301526148da816145c9565b9050919050565b600060208201905081810360008301526148fa816145ec565b9050919050565b6000602082019050818103600083015261491a8161460f565b9050919050565b6000602082019050818103600083015261493a81614655565b9050919050565b6000602082019050818103600083015261495a81614678565b9050919050565b6000602082019050818103600083015261497a8161469b565b9050919050565b6000602082019050818103600083015261499a816146e1565b9050919050565b600060208201905081810360008301526149ba81614704565b9050919050565b600060208201905081810360008301526149da81614727565b9050919050565b60006020820190506149f6600083018461474a565b92915050565b6000614a06614a17565b9050614a128282614cce565b919050565b6000604051905090565b600067ffffffffffffffff821115614a3c57614a3b614e35565b5b614a4582614e82565b9050602081019050919050565b600067ffffffffffffffff821115614a6d57614a6c614e35565b5b614a7682614e82565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614adc82614c50565b9150614ae783614c50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1c57614b1b614d79565b5b828201905092915050565b6000614b3282614c50565b9150614b3d83614c50565b925082614b4d57614b4c614da8565b5b828204905092915050565b6000614b6382614c50565b9150614b6e83614c50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba757614ba6614d79565b5b828202905092915050565b6000614bbd82614c50565b9150614bc883614c50565b925082821015614bdb57614bda614d79565b5b828203905092915050565b6000614bf182614c30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c87578082015181840152602081019050614c6c565b83811115614c96576000848401525b50505050565b60006002820490506001821680614cb457607f821691505b60208210811415614cc857614cc7614dd7565b5b50919050565b614cd782614e82565b810181811067ffffffffffffffff82111715614cf657614cf5614e35565b5b80604052505050565b6000614d0a82614c50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d3d57614d3c614d79565b5b600182019050919050565b6000614d5382614c50565b9150614d5e83614c50565b925082614d6e57614d6d614da8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c6963206d696e74206e6f742073746172740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468617420726566756e6420746f6b656e20646f65736e277420657869737400600082015250565b7f4e6f742077686974656c69737455736572000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f5468617420746f6b656e20646f65736e27742065786973740000000000000000600082015250565b7f596f7520646964206e6f74206f776e207468697320746f6b656e000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420696e20726566756e6420706572696f64000000000000000000000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b7f507265206d696e74206e6f742073746172740000000000000000000000000000600082015250565b61510381614be6565b811461510e57600080fd5b50565b61511a81614bf8565b811461512557600080fd5b50565b61513181614c04565b811461513c57600080fd5b50565b61514881614c50565b811461515357600080fd5b5056fea26469706673582212203801489b7fb4ecfcfeec1410c416956266873de5aff987f5bb621ee7e426dee764736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f64776172666d61737465722e6d7970696e6174612e636c6f75642f697066732f516d593770327a39507a545a4d4d5243783261354878474133386d6342626874534179363242774634395332714400000000000000000000

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c806380bd8b62116101e7578063c435c7a11161010d578063e79973a1116100a0578063eff1c98f1161006f578063eff1c98f14610e03578063f2fde38b14610e2c578063fc75b41814610e55578063fcf9327514610e6c576103ad565b8063e79973a114610d35578063e985e9c514610d60578063ed8cf2a914610d9d578063ef69f3b814610dc6576103ad565b8063d1a94943116100dc578063d1a9494314610c8b578063d4ab1db514610ca2578063d5abeb0114610ccd578063dd47b65e14610cf8576103ad565b8063c435c7a114610c04578063c87b56dd14610c1b578063cb2b1c5e14610c58578063d0e30db014610c81576103ad565b8063a0bcfc7f11610185578063b759158a11610154578063b759158a14610b69578063b88d4fde14610b94578063b912e64a14610bbd578063bdc0b28414610bd9576103ad565b8063a0bcfc7f14610ac3578063a22cb46514610aec578063a475b5dd14610b15578063b0b0540d14610b2c576103ad565b80638da5cb5b116101c15780638da5cb5b146109f35780639151e33f14610a1e57806395d89b4114610a5b578063973566c214610a86576103ad565b806380bd8b62146109745780638c770067146109b15780638cfec4c0146109dc576103ad565b8063395819b7116102d75780635c87ec771161026a57806370a082311161023957806370a08231146108a6578063715018a6146108e35780637752973d146108fa578063807d128814610937576103ad565b80635c87ec77146107ee578063619aaa11146108175780636352211e146108405780636f8b44b01461087d576103ad565b806344b088f0116102a657806344b088f0146107205780634dab517e1461075d57806354214f69146107865780635c0402f1146107b1576103ad565b8063395819b7146106785780633ccfd60b146106a3578063426a5631146106ba57806342842e0e146106f7576103ad565b806316503e611161034f57806324fecc601161031e57806324fecc60146105cb578063278ecde1146106085780632db11544146106315780633057931f1461064d576103ad565b806316503e611461051157806318160ddd1461054e5780632322afb61461057957806323b872dd146105a2576103ad565b8063081812fc1161038b578063081812fc146104435780630894cf1614610480578063095ea7b3146104bd5780631638fef0146104e6576103ad565b806301ffc9a7146103b2578063045f7850146103ef57806306fdde0314610418575b600080fd5b3480156103be57600080fd5b506103d960048036038101906103d491906143ac565b610e95565b6040516103e69190614804565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906142d2565b610f27565b005b34801561042457600080fd5b5061042d610f94565b60405161043a919061481f565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061444f565b611026565b604051610477919061479d565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a2919061444f565b6110a5565b6040516104b4919061479d565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df91906142d2565b6110e4565b005b3480156104f257600080fd5b506104fb611228565b604051610508919061481f565b60405180910390f35b34801561051d57600080fd5b506105386004803603810190610533919061444f565b6112b6565b60405161054591906149e1565b60405180910390f35b34801561055a57600080fd5b506105636112da565b60405161057091906149e1565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b919061435f565b6112f1565b005b3480156105ae57600080fd5b506105c960048036038101906105c491906141bc565b61131d565b005b3480156105d757600080fd5b506105f260048036038101906105ed919061414f565b611642565b6040516105ff9190614804565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061444f565b6116f1565b005b61064b6004803603810190610646919061444f565b611887565b005b34801561065957600080fd5b50610662611a6e565b60405161066f9190614804565b60405180910390f35b34801561068457600080fd5b5061068d611a81565b60405161069a91906149e1565b60405180910390f35b3480156106af57600080fd5b506106b8611a87565b005b3480156106c657600080fd5b506106e160048036038101906106dc919061414f565b611b08565b6040516106ee9190614804565b60405180910390f35b34801561070357600080fd5b5061071e600480360381019061071991906141bc565b611bb7565b005b34801561072c57600080fd5b506107476004803603810190610742919061414f565b611bd7565b6040516107549190614804565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190614312565b611c86565b005b34801561079257600080fd5b5061079b611cb2565b6040516107a89190614804565b60405180910390f35b3480156107bd57600080fd5b506107d860048036038101906107d3919061414f565b611cc5565b6040516107e59190614804565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190614312565b611d74565b005b34801561082357600080fd5b5061083e60048036038101906108399190614312565b611da0565b005b34801561084c57600080fd5b506108676004803603810190610862919061444f565b611dcc565b604051610874919061479d565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f919061444f565b611dde565b005b3480156108b257600080fd5b506108cd60048036038101906108c8919061414f565b611df0565b6040516108da91906149e1565b60405180910390f35b3480156108ef57600080fd5b506108f8611ea9565b005b34801561090657600080fd5b50610921600480360381019061091c919061444f565b611ebd565b60405161092e919061479d565b60405180910390f35b34801561094357600080fd5b5061095e6004803603810190610959919061414f565b611efc565b60405161096b9190614804565b60405180910390f35b34801561098057600080fd5b5061099b6004803603810190610996919061444f565b611fab565b6040516109a8919061479d565b60405180910390f35b3480156109bd57600080fd5b506109c6611fea565b6040516109d391906149e1565b60405180910390f35b3480156109e857600080fd5b506109f1611ff0565b005b3480156109ff57600080fd5b50610a08612015565b604051610a15919061479d565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a40919061444f565b61203f565b604051610a52919061479d565b60405180910390f35b348015610a6757600080fd5b50610a7061207e565b604051610a7d919061481f565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa8919061444f565b612110565b604051610aba9190614804565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614406565b612173565b005b348015610af857600080fd5b50610b136004803603810190610b0e9190614292565b612195565b005b348015610b2157600080fd5b50610b2a61230d565b005b348015610b3857600080fd5b50610b536004803603810190610b4e919061414f565b612332565b604051610b609190614804565b60405180910390f35b348015610b7557600080fd5b50610b7e6123e1565b604051610b8b9190614804565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb6919061420f565b6123f4565b005b610bd76004803603810190610bd2919061444f565b612467565b005b348015610be557600080fd5b50610bee612dab565b604051610bfb91906149e1565b60405180910390f35b348015610c1057600080fd5b50610c19612db0565b005b348015610c2757600080fd5b50610c426004803603810190610c3d919061444f565b612dd5565b604051610c4f919061481f565b60405180910390f35b348015610c6457600080fd5b50610c7f6004803603810190610c7a9190614406565b612f2c565b005b610c89612f4e565b005b348015610c9757600080fd5b50610ca0612f58565b005b348015610cae57600080fd5b50610cb7612f7d565b604051610cc491906149e1565b60405180910390f35b348015610cd957600080fd5b50610ce2612f83565b604051610cef91906149e1565b60405180910390f35b348015610d0457600080fd5b50610d1f6004803603810190610d1a919061444f565b612f89565b604051610d2c919061479d565b60405180910390f35b348015610d4157600080fd5b50610d4a612fc8565b604051610d579190614804565b60405180910390f35b348015610d6c57600080fd5b50610d876004803603810190610d82919061417c565b612fdb565b604051610d949190614804565b60405180910390f35b348015610da957600080fd5b50610dc46004803603810190610dbf9190614312565b61306f565b005b348015610dd257600080fd5b50610ded6004803603810190610de8919061444f565b61309b565b604051610dfa919061479d565b60405180910390f35b348015610e0f57600080fd5b50610e2a6004803603810190610e259190614312565b6130da565b005b348015610e3857600080fd5b50610e536004803603810190610e4e919061414f565b613106565b005b348015610e6157600080fd5b50610e6a61318a565b005b348015610e7857600080fd5b50610e936004803603810190610e8e9190614312565b6131af565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ef057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f205750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610f2f6131db565b600a5481610f3b613259565b610f459190614ad1565b1115610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d906148c1565b60405180910390fd5b610f90828261326c565b5050565b606060028054610fa390614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf90614c9c565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b5050505050905090565b60006110318261328a565b611067576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601281815481106110b557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef82611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff166111106132e9565b73ffffffffffffffffffffffffffffffffffffffff16146111735761113c816111376132e9565b612fdb565b611172576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6010805461123590614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461126190614c9c565b80156112ae5780601f10611283576101008083540402835291602001916112ae565b820191906000526020600020905b81548152906001019060200180831161129157829003601f168201915b505050505081565b601781815481106112c657600080fd5b906000526020600020016000915090505481565b60006112e46132f1565b6001546000540303905090565b6112f96131db565b601760006113079190613d88565b818160179190611318929190613da9565b505050565b6000611328826132fa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461138f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061139b846133c8565b915091506113b181876113ac6132e9565b6133ef565b6113fd576113c6866113c16132e9565b612fdb565b6113fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611464576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114718686866001613433565b801561147c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061154a85611526888887613439565b7c020000000000000000000000000000000000000000000000000000000017613461565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156115d25760006001850190506000600460008381526020019081526020016000205414156115d05760005481146115cf578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461163a868686600161348c565b505050505050565b600080600090505b6016805490508110156116e6578273ffffffffffffffffffffffffffffffffffffffff166016828154811061168257611681614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156116d35760019150506116ec565b80806116de90614cff565b91505061164a565b50600090505b919050565b60011515600e60039054906101000a900460ff16151514611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90614941565b60405180910390fd5b6001151561175482612110565b151514611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614881565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166117b682611dcc565b73ffffffffffffffffffffffffffffffffffffffff161461180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390614901565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600c5460405161183490614788565b60006040518083038185875af1925050503d8060008114611871576040519150601f19603f3d011682016040523d82523d6000602084013e611876565b606091505b5050905061188382613492565b5050565b600e60009054906101000a900460ff166118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90614841565b60405180910390fd5b600a54816118e2613259565b6118ec9190614ad1565b111561192d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611924906148c1565b60405180910390fd5b80600c5461193b9190614b58565b34101561197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490614981565b60405180910390fd5b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cc9190614ad1565b925050819055506119dd338261326c565b6000733948b7368feb1728d38695a5e765ad85f62e985973ffffffffffffffffffffffffffffffffffffffff1682600d54611a189190614b58565b604051611a2490614788565b60006040518083038185875af1925050503d8060008114611a61576040519150601f19603f3d011682016040523d82523d6000602084013e611a66565b606091505b505090505050565b600e60009054906101000a900460ff1681565b600d5481565b611a8f6131db565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611ab590614788565b60006040518083038185875af1925050503d8060008114611af2576040519150601f19603f3d011682016040523d82523d6000602084013e611af7565b606091505b5050905080611b0557600080fd5b50565b600080600090505b601380549050811015611bac578273ffffffffffffffffffffffffffffffffffffffff1660138281548110611b4857611b47614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b99576001915050611bb2565b8080611ba490614cff565b915050611b10565b50600090505b919050565b611bd2838383604051806020016040528060008152506123f4565b505050565b600080600090505b601280549050811015611c7b578273ffffffffffffffffffffffffffffffffffffffff1660128281548110611c1757611c16614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c68576001915050611c81565b8080611c7390614cff565b915050611bdf565b50600090505b919050565b611c8e6131db565b60116000611c9c9190613df6565b818160169190611cad929190613e17565b505050565b600e60029054906101000a900460ff1681565b600080600090505b601180549050811015611d69578273ffffffffffffffffffffffffffffffffffffffff1660118281548110611d0557611d04614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d56576001915050611d6f565b8080611d6190614cff565b915050611ccd565b50600090505b919050565b611d7c6131db565b60116000611d8a9190613df6565b818160139190611d9b929190613e17565b505050565b611da86131db565b60116000611db69190613df6565b818160129190611dc7929190613e17565b505050565b6000611dd7826132fa565b9050919050565b611de66131db565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e58576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611eb16131db565b611ebb60006134a0565b565b60158181548110611ecd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600090505b601580549050811015611fa0578273ffffffffffffffffffffffffffffffffffffffff1660158281548110611f3c57611f3b614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f8d576001915050611fa6565b8080611f9890614cff565b915050611f04565b50600090505b919050565b60118181548110611fbb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611ff86131db565b6001600e60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016818154811061204f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461208d90614c9c565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990614c9c565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b5050505050905090565b600080600090505b60178054905081101561216857826017828154811061213a57612139614e06565b5b9060005260206000200154141561215557600191505061216e565b808061216090614cff565b915050612118565b50600090505b919050565b61217b6131db565b80600f9080519060200190612191929190613eb7565b5050565b61219d6132e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612202576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061220f6132e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122bc6132e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123019190614804565b60405180910390a35050565b6123156131db565b6001600e60026101000a81548160ff021916908315150217905550565b600080600090505b6014805490508110156123d6578273ffffffffffffffffffffffffffffffffffffffff166014828154811061237257612371614e06565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123c35760019150506123dc565b80806123ce90614cff565b91505061233a565b50600090505b919050565b600e60039054906101000a900460ff1681565b6123ff84848461131d565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124615761242a84848484613566565b612460576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e60019054906101000a900460ff166124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad906149c1565b60405180910390fd5b600a54816124c2613259565b6124cc9190614ad1565b111561250d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612504906148c1565b60405180910390fd5b6006811115612551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254890614961565b60405180910390fd5b6001151561255e33611cc5565b151514156126a957600181601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125b39190614ad1565b11156125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb906149a1565b60405180910390fd5b80600b546126029190614b58565b341015612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126939190614ad1565b925050819055506126a4338261326c565b612da8565b600115156126b633611bd7565b1515141561280157600281601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461270b9190614ad1565b111561274c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612743906149a1565b60405180910390fd5b80600b5461275a9190614b58565b34101561279c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127eb9190614ad1565b925050819055506127fc338261326c565b612da7565b6001151561280e33611b08565b1515141561295957600381601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128639190614ad1565b11156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b906149a1565b60405180910390fd5b80600b546128b29190614b58565b3410156128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129439190614ad1565b92505081905550612954338261326c565b612da6565b6001151561296633612332565b15151415612ab157600481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129bb9190614ad1565b11156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f3906149a1565b60405180910390fd5b80600b54612a0a9190614b58565b341015612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9b9190614ad1565b92505081905550612aac338261326c565b612da5565b60011515612abe33611efc565b15151415612c0957600581601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b139190614ad1565b1115612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b906149a1565b60405180910390fd5b80600b54612b629190614b58565b341015612ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9b90614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf39190614ad1565b92505081905550612c04338261326c565b612da4565b60011515612c1633611642565b15151415612d6157600681601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c6b9190614ad1565b1115612cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca3906149a1565b60405180910390fd5b80600b54612cba9190614b58565b341015612cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf390614981565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4b9190614ad1565b92505081905550612d5c338261326c565b612da3565b6000612da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d99906148a1565b60405180910390fd5b5b5b5b5b5b5b50565b600681565b612db86131db565b6001600e60016101000a81548160ff021916908315150217905550565b6060612de08261328a565b612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e16906148e1565b60405180910390fd5b60001515600e60029054906101000a900460ff1615151415612ecd5760108054612e4890614c9c565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7490614c9c565b8015612ec15780601f10612e9657610100808354040283529160200191612ec1565b820191906000526020600020905b815481529060010190602001808311612ea457829003601f168201915b50505050509050612f27565b6000612ed76136c6565b5111612ef25760405180602001604052806000815250612f24565b612efa6136c6565b612f0383613758565b604051602001612f14929190614759565b6040516020818303038152906040525b90505b919050565b612f346131db565b8060109080519060200190612f4a929190613eb7565b5050565b612f566131db565b565b612f606131db565b6001600e60036101000a81548160ff021916908315150217905550565b600b5481565b600a5481565b60138181548110612f9957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6130776131db565b601160006130859190613df6565b818160149190613096929190613e17565b505050565b601481815481106130ab57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6130e26131db565b601160006130f09190613df6565b818160159190613101929190613e17565b505050565b61310e6131db565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561317e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317590614861565b60405180910390fd5b613187816134a0565b50565b6131926131db565b6000600e60036101000a81548160ff021916908315150217905550565b6131b76131db565b601160006131c59190613df6565b8181601191906131d6929190613e17565b505050565b6131e36138b9565b73ffffffffffffffffffffffffffffffffffffffff16613201612015565b73ffffffffffffffffffffffffffffffffffffffff1614613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e90614921565b60405180910390fd5b565b60006132636132f1565b60005403905090565b6132868282604051806020016040528060008152506138c1565b5050565b6000816132956132f1565b111580156132a4575060005482105b80156132e2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806133096132f1565b11613391576000548110156133905760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561338e575b6000811415613384576004600083600190039350838152602001908152602001600020549050613359565b80925050506133c3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861345086868461395e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61349d816000613967565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261358c6132e9565b8786866040518563ffffffff1660e01b81526004016135ae94939291906147b8565b602060405180830381600087803b1580156135c857600080fd5b505af19250505080156135f957506040513d601f19601f820116820180604052508101906135f691906143d9565b60015b613673573d8060008114613629576040519150601f19603f3d011682016040523d82523d6000602084013e61362e565b606091505b5060008151141561366b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546136d590614c9c565b80601f016020809104026020016040519081016040528092919081815260200182805461370190614c9c565b801561374e5780601f106137235761010080835404028352916020019161374e565b820191906000526020600020905b81548152906001019060200180831161373157829003601f168201915b5050505050905090565b606060008214156137a0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138b4565b600082905060005b600082146137d25780806137bb90614cff565b915050600a826137cb9190614b27565b91506137a8565b60008167ffffffffffffffff8111156137ee576137ed614e35565b5b6040519080825280601f01601f1916602001820160405280156138205781602001600182028036833780820191505090505b5090505b600085146138ad576001826138399190614bb2565b9150600a856138489190614d48565b60306138549190614ad1565b60f81b81838151811061386a57613869614e06565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138a69190614b27565b9450613824565b8093505050505b919050565b600033905090565b6138cb8383613bbb565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461395957600080549050600083820390505b61390b6000868380600101945086613566565b613941576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138f857816000541461395657600080fd5b50505b505050565b60009392505050565b6000613972836132fa565b90506000819050600080613985866133c8565b9150915084156139ee576139a1818461399c6132e9565b6133ef565b6139ed576139b6836139b16132e9565b612fdb565b6139ec576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6139fc836000886001613433565b8015613a0757600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613aaf83613a6c85600088613439565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717613461565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613b37576000600187019050600060046000838152602001908152602001600020541415613b35576000548114613b34578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ba183600088600161348c565b600160008154809291906001019190505550505050505050565b6000805490506000821415613bfc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c096000848385613433565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613c8083613c716000866000613439565b613c7a85613d78565b17613461565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613d2157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613ce6565b506000821415613d5d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613d73600084838561348c565b505050565b60006001821460e11b9050919050565b5080546000825590600052602060002090810190613da69190613f3d565b50565b828054828255906000526020600020908101928215613de5579160200282015b82811115613de4578235825591602001919060010190613dc9565b5b509050613df29190613f3d565b5090565b5080546000825590600052602060002090810190613e149190613f3d565b50565b828054828255906000526020600020908101928215613ea6579160200282015b82811115613ea557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613e37565b5b509050613eb39190613f3d565b5090565b828054613ec390614c9c565b90600052602060002090601f016020900481019282613ee55760008555613f2c565b82601f10613efe57805160ff1916838001178555613f2c565b82800160010185558215613f2c579182015b82811115613f2b578251825591602001919060010190613f10565b5b509050613f399190613f3d565b5090565b5b80821115613f56576000816000905550600101613f3e565b5090565b6000613f6d613f6884614a21565b6149fc565b905082815260208101848484011115613f8957613f88614e73565b5b613f94848285614c5a565b509392505050565b6000613faf613faa84614a52565b6149fc565b905082815260208101848484011115613fcb57613fca614e73565b5b613fd6848285614c5a565b509392505050565b600081359050613fed816150fa565b92915050565b60008083601f84011261400957614008614e69565b5b8235905067ffffffffffffffff81111561402657614025614e64565b5b60208301915083602082028301111561404257614041614e6e565b5b9250929050565b60008083601f84011261405f5761405e614e69565b5b8235905067ffffffffffffffff81111561407c5761407b614e64565b5b60208301915083602082028301111561409857614097614e6e565b5b9250929050565b6000813590506140ae81615111565b92915050565b6000813590506140c381615128565b92915050565b6000815190506140d881615128565b92915050565b600082601f8301126140f3576140f2614e69565b5b8135614103848260208601613f5a565b91505092915050565b600082601f83011261412157614120614e69565b5b8135614131848260208601613f9c565b91505092915050565b6000813590506141498161513f565b92915050565b60006020828403121561416557614164614e7d565b5b600061417384828501613fde565b91505092915050565b6000806040838503121561419357614192614e7d565b5b60006141a185828601613fde565b92505060206141b285828601613fde565b9150509250929050565b6000806000606084860312156141d5576141d4614e7d565b5b60006141e386828701613fde565b93505060206141f486828701613fde565b92505060406142058682870161413a565b9150509250925092565b6000806000806080858703121561422957614228614e7d565b5b600061423787828801613fde565b945050602061424887828801613fde565b93505060406142598782880161413a565b925050606085013567ffffffffffffffff81111561427a57614279614e78565b5b614286878288016140de565b91505092959194509250565b600080604083850312156142a9576142a8614e7d565b5b60006142b785828601613fde565b92505060206142c88582860161409f565b9150509250929050565b600080604083850312156142e9576142e8614e7d565b5b60006142f785828601613fde565b92505060206143088582860161413a565b9150509250929050565b6000806020838503121561432957614328614e7d565b5b600083013567ffffffffffffffff81111561434757614346614e78565b5b61435385828601613ff3565b92509250509250929050565b6000806020838503121561437657614375614e7d565b5b600083013567ffffffffffffffff81111561439457614393614e78565b5b6143a085828601614049565b92509250509250929050565b6000602082840312156143c2576143c1614e7d565b5b60006143d0848285016140b4565b91505092915050565b6000602082840312156143ef576143ee614e7d565b5b60006143fd848285016140c9565b91505092915050565b60006020828403121561441c5761441b614e7d565b5b600082013567ffffffffffffffff81111561443a57614439614e78565b5b6144468482850161410c565b91505092915050565b60006020828403121561446557614464614e7d565b5b60006144738482850161413a565b91505092915050565b61448581614be6565b82525050565b61449481614bf8565b82525050565b60006144a582614a83565b6144af8185614a99565b93506144bf818560208601614c69565b6144c881614e82565b840191505092915050565b60006144de82614a8e565b6144e88185614ab5565b93506144f8818560208601614c69565b61450181614e82565b840191505092915050565b600061451782614a8e565b6145218185614ac6565b9350614531818560208601614c69565b80840191505092915050565b600061454a601583614ab5565b915061455582614e93565b602082019050919050565b600061456d602683614ab5565b915061457882614ebc565b604082019050919050565b6000614590601f83614ab5565b915061459b82614f0b565b602082019050919050565b60006145b3601183614ab5565b91506145be82614f34565b602082019050919050565b60006145d6601283614ab5565b91506145e182614f5d565b602082019050919050565b60006145f9601883614ab5565b915061460482614f86565b602082019050919050565b600061461c601a83614ab5565b915061462782614faf565b602082019050919050565b600061463f600583614ac6565b915061464a82614fd8565b600582019050919050565b6000614662602083614ab5565b915061466d82615001565b602082019050919050565b6000614685601483614ab5565b91506146908261502a565b602082019050919050565b60006146a8601b83614ab5565b91506146b382615053565b602082019050919050565b60006146cb600083614aaa565b91506146d68261507c565b600082019050919050565b60006146ee601283614ab5565b91506146f98261507f565b602082019050919050565b6000614711601683614ab5565b915061471c826150a8565b602082019050919050565b6000614734601283614ab5565b915061473f826150d1565b602082019050919050565b61475381614c50565b82525050565b6000614765828561450c565b9150614771828461450c565b915061477c82614632565b91508190509392505050565b6000614793826146be565b9150819050919050565b60006020820190506147b2600083018461447c565b92915050565b60006080820190506147cd600083018761447c565b6147da602083018661447c565b6147e7604083018561474a565b81810360608301526147f9818461449a565b905095945050505050565b6000602082019050614819600083018461448b565b92915050565b6000602082019050818103600083015261483981846144d3565b905092915050565b6000602082019050818103600083015261485a8161453d565b9050919050565b6000602082019050818103600083015261487a81614560565b9050919050565b6000602082019050818103600083015261489a81614583565b9050919050565b600060208201905081810360008301526148ba816145a6565b9050919050565b600060208201905081810360008301526148da816145c9565b9050919050565b600060208201905081810360008301526148fa816145ec565b9050919050565b6000602082019050818103600083015261491a8161460f565b9050919050565b6000602082019050818103600083015261493a81614655565b9050919050565b6000602082019050818103600083015261495a81614678565b9050919050565b6000602082019050818103600083015261497a8161469b565b9050919050565b6000602082019050818103600083015261499a816146e1565b9050919050565b600060208201905081810360008301526149ba81614704565b9050919050565b600060208201905081810360008301526149da81614727565b9050919050565b60006020820190506149f6600083018461474a565b92915050565b6000614a06614a17565b9050614a128282614cce565b919050565b6000604051905090565b600067ffffffffffffffff821115614a3c57614a3b614e35565b5b614a4582614e82565b9050602081019050919050565b600067ffffffffffffffff821115614a6d57614a6c614e35565b5b614a7682614e82565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614adc82614c50565b9150614ae783614c50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1c57614b1b614d79565b5b828201905092915050565b6000614b3282614c50565b9150614b3d83614c50565b925082614b4d57614b4c614da8565b5b828204905092915050565b6000614b6382614c50565b9150614b6e83614c50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba757614ba6614d79565b5b828202905092915050565b6000614bbd82614c50565b9150614bc883614c50565b925082821015614bdb57614bda614d79565b5b828203905092915050565b6000614bf182614c30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c87578082015181840152602081019050614c6c565b83811115614c96576000848401525b50505050565b60006002820490506001821680614cb457607f821691505b60208210811415614cc857614cc7614dd7565b5b50919050565b614cd782614e82565b810181811067ffffffffffffffff82111715614cf657614cf5614e35565b5b80604052505050565b6000614d0a82614c50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d3d57614d3c614d79565b5b600182019050919050565b6000614d5382614c50565b9150614d5e83614c50565b925082614d6e57614d6d614da8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c6963206d696e74206e6f742073746172740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468617420726566756e6420746f6b656e20646f65736e277420657869737400600082015250565b7f4e6f742077686974656c69737455736572000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f5468617420746f6b656e20646f65736e27742065786973740000000000000000600082015250565b7f596f7520646964206e6f74206f776e207468697320746f6b656e000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420696e20726566756e6420706572696f64000000000000000000000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b7f507265206d696e74206e6f742073746172740000000000000000000000000000600082015250565b61510381614be6565b811461510e57600080fd5b50565b61511a81614bf8565b811461512557600080fd5b50565b61513181614c04565b811461513c57600080fd5b50565b61514881614c50565b811461515357600080fd5b5056fea26469706673582212203801489b7fb4ecfcfeec1410c416956266873de5aff987f5bb621ee7e426dee764736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f64776172666d61737465722e6d7970696e6174612e636c6f75642f697066732f516d593770327a39507a545a4d4d5243783261354878474133386d6342626874534179363242774634395332714400000000000000000000

-----Decoded View---------------
Arg [0] : _hiddenMetadataUrl (string): https://dwarfmaster.mypinata.cloud/ipfs/QmY7p2z9PzTZMMRCx2a5HxGA38mcBbhtSAy62BwF49S2qD

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [2] : 68747470733a2f2f64776172666d61737465722e6d7970696e6174612e636c6f
Arg [3] : 75642f697066732f516d593770327a39507a545a4d4d52437832613548784741
Arg [4] : 33386d6342626874534179363242774634395332714400000000000000000000


Deployed Bytecode Sourcemap

59109:9024:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18342:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66790:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19244:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25727:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59707:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25168:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59620:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59919:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14995:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66987:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29434:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62140:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63186:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64063:515;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59435:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59385:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63004:177;;;;;;;;;;;;;:::i;:::-;;61300:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32347:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61020:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67918:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59510:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60740:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67441:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20637:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63562:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16179:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55893:103;;;;;;;;;;;;;:::i;:::-;;59833:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61860:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59665:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59339:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62682:78;;;;;;;;;;;;;:::i;:::-;;55245:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59875:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19420:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62422:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60324:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26285:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60566:67;;;;;;;;;;;;;:::i;:::-;;61580:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59544:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33130:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64586:2196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59205:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62768:72;;;;;;;;;;;;;:::i;:::-;;63664:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60426:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68077:53;;;:::i;:::-;;62845:75;;;;;;;;;;;;;:::i;:::-;;59299:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59259:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59749:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59474:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26750:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67600:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59791:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67759:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56151:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62925:74;;;;;;;;;;;;;:::i;:::-;;67123:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18342:639;18427:4;18766:10;18751:25;;:11;:25;;;;:102;;;;18843:10;18828:25;;:11;:25;;;;18751:102;:179;;;;18920:10;18905:25;;:11;:25;;;;18751:179;18731:199;;18342:639;;;:::o;66790:192::-;55131:13;:11;:13::i;:::-;66907:9:::1;;66893:10;66876:14;:12;:14::i;:::-;:27;;;;:::i;:::-;:40;;66863:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;66952:25;66962:2;66966:10;66952:9;:25::i;:::-;66790:192:::0;;:::o;19244:100::-;19298:13;19331:5;19324:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19244:100;:::o;25727:218::-;25803:7;25828:16;25836:7;25828;:16::i;:::-;25823:64;;25853:34;;;;;;;;;;;;;;25823:64;25907:15;:24;25923:7;25907:24;;;;;;;;;;;:30;;;;;;;;;;;;25900:37;;25727:218;;;:::o;59707:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25168:400::-;25249:13;25265:16;25273:7;25265;:16::i;:::-;25249:32;;25321:5;25298:28;;:19;:17;:19::i;:::-;:28;;;25294:175;;25346:44;25363:5;25370:19;:17;:19::i;:::-;25346:16;:44::i;:::-;25341:128;;25418:35;;;;;;;;;;;;;;25341:128;25294:175;25514:2;25481:15;:24;25497:7;25481:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25552:7;25548:2;25532:28;;25541:5;25532:28;;;;;;;;;;;;25238:330;25168:400;;:::o;59620:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59919:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14995:323::-;15056:7;15284:15;:13;:15::i;:::-;15269:12;;15253:13;;:28;:46;15246:53;;14995:323;:::o;66987:128::-;55131:13;:11;:13::i;:::-;67070:10:::1;;67063:17;;;;:::i;:::-;67103:4;;67091:10;:16;;;;;;;:::i;:::-;;66987:128:::0;;:::o;29434:2817::-;29568:27;29598;29617:7;29598:18;:27::i;:::-;29568:57;;29683:4;29642:45;;29658:19;29642:45;;;29638:86;;29696:28;;;;;;;;;;;;;;29638:86;29738:27;29767:23;29794:35;29821:7;29794:26;:35::i;:::-;29737:92;;;;29929:68;29954:15;29971:4;29977:19;:17;:19::i;:::-;29929:24;:68::i;:::-;29924:180;;30017:43;30034:4;30040:19;:17;:19::i;:::-;30017:16;:43::i;:::-;30012:92;;30069:35;;;;;;;;;;;;;;30012:92;29924:180;30135:1;30121:16;;:2;:16;;;30117:52;;;30146:23;;;;;;;;;;;;;;30117:52;30182:43;30204:4;30210:2;30214:7;30223:1;30182:21;:43::i;:::-;30318:15;30315:160;;;30458:1;30437:19;30430:30;30315:160;30855:18;:24;30874:4;30855:24;;;;;;;;;;;;;;;;30853:26;;;;;;;;;;;;30924:18;:22;30943:2;30924:22;;;;;;;;;;;;;;;;30922:24;;;;;;;;;;;31246:146;31283:2;31332:45;31347:4;31353:2;31357:19;31332:14;:45::i;:::-;11394:8;31304:73;31246:18;:146::i;:::-;31217:17;:26;31235:7;31217:26;;;;;;;;;;;:175;;;;31563:1;11394:8;31512:19;:47;:52;31508:627;;;31585:19;31617:1;31607:7;:11;31585:33;;31774:1;31740:17;:30;31758:11;31740:30;;;;;;;;;;;;:35;31736:384;;;31878:13;;31863:11;:28;31859:242;;32058:19;32025:17;:30;32043:11;32025:30;;;;;;;;;;;:52;;;;31859:242;31736:384;31566:569;31508:627;32182:7;32178:2;32163:27;;32172:4;32163:27;;;;;;;;;;;;32201:42;32222:4;32228:2;32232:7;32241:1;32201:20;:42::i;:::-;29557:2694;;;29434:2817;;;:::o;62140:277::-;62200:4;62222:9;62234:1;62222:13;;62217:170;62241:21;:28;;;;62237:1;:32;62217:170;;;62323:5;62295:33;;:21;62317:1;62295:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;62291:85;;;62356:4;62349:11;;;;;62291:85;62271:3;;;;;:::i;:::-;;;;62217:170;;;;62404:5;62397:12;;62140:277;;;;:::o;63186:371::-;63256:4;63241:19;;:13;;;;;;;;;;;:19;;;63233:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;63317:4;63298:23;;:17;63307:7;63298:8;:17::i;:::-;:23;;;63290:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63394:10;63376:28;;:16;63384:7;63376;:16::i;:::-;:28;;;63368:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63440:12;63466:10;63458:24;;63504:14;;63458:75;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63439:94;;;63538:14;63544:7;63538:5;:14::i;:::-;63228:329;63186:371;:::o;64063:515::-;64133:12;;;;;;;;;;;64125:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;64221:9;;64207:10;64190:14;:12;:14::i;:::-;:27;;;;:::i;:::-;:40;;64182:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;64301:10;64284:14;;:27;;;;:::i;:::-;64271:9;:40;;64263:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64377:10;64339:22;:34;64362:10;64339:34;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;64392:33;64402:10;64414;64392:9;:33::i;:::-;64437:12;64463:42;64455:56;;64548:10;64533:12;;:25;;;;:::i;:::-;64455:118;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64436:137;;;64120:458;64063:515;:::o;59435:32::-;;;;;;;;;;;;;:::o;59385:42::-;;;;:::o;63004:177::-;55131:13;:11;:13::i;:::-;63049:12:::1;63075:10;63067:24;;63113:21;63067:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63048:101;;;63168:7;63160:16;;;::::0;::::1;;63043:138;63004:177::o:0;61300:277::-;61360:4;61382:9;61394:1;61382:13;;61377:170;61401:21;:28;;;;61397:1;:32;61377:170;;;61483:5;61455:33;;:21;61477:1;61455:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;61451:85;;;61516:4;61509:11;;;;;61451:85;61431:3;;;;;:::i;:::-;;;;61377:170;;;;61564:5;61557:12;;61300:277;;;;:::o;32347:185::-;32485:39;32502:4;32508:2;32512:7;32485:39;;;;;;;;;;;;:16;:39::i;:::-;32347:185;;;:::o;61020:277::-;61080:4;61102:9;61114:1;61102:13;;61097:170;61121:21;:28;;;;61117:1;:32;61097:170;;;61203:5;61175:33;;:21;61197:1;61175:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;61171:85;;;61236:4;61229:11;;;;;61171:85;61151:3;;;;;:::i;:::-;;;;61097:170;;;;61284:5;61277:12;;61020:277;;;;:::o;67918:156::-;55131:13;:11;:13::i;:::-;68005:21:::1;;67998:28;;;;:::i;:::-;68060:6;;68037:21;:29;;;;;;;:::i;:::-;;67918:156:::0;;:::o;59510:30::-;;;;;;;;;;;;;:::o;60740:277::-;60800:4;60822:9;60834:1;60822:13;;60817:170;60841:21;:28;;;;60837:1;:32;60817:170;;;60923:5;60895:33;;:21;60917:1;60895:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;60891:85;;;60956:4;60949:11;;;;;60891:85;60871:3;;;;;:::i;:::-;;;;60817:170;;;;61004:5;60997:12;;60740:277;;;;:::o;67441:156::-;55131:13;:11;:13::i;:::-;67528:21:::1;;67521:28;;;;:::i;:::-;67583:6;;67560:21;:29;;;;;;;:::i;:::-;;67441:156:::0;;:::o;67282:::-;55131:13;:11;:13::i;:::-;67369:21:::1;;67362:28;;;;:::i;:::-;67424:6;;67401:21;:29;;;;;;;:::i;:::-;;67282:156:::0;;:::o;20637:152::-;20709:7;20752:27;20771:7;20752:18;:27::i;:::-;20729:52;;20637:152;;;:::o;63562:97::-;55131:13;:11;:13::i;:::-;63642:12:::1;63630:9;:24;;;;63562:97:::0;:::o;16179:233::-;16251:7;16292:1;16275:19;;:5;:19;;;16271:60;;;16303:28;;;;;;;;;;;;;;16271:60;10338:13;16349:18;:25;16368:5;16349:25;;;;;;;;;;;;;;;;:55;16342:62;;16179:233;;;:::o;55893:103::-;55131:13;:11;:13::i;:::-;55958:30:::1;55985:1;55958:18;:30::i;:::-;55893:103::o:0;59833:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61860:277::-;61920:4;61942:9;61954:1;61942:13;;61937:170;61961:21;:28;;;;61957:1;:32;61937:170;;;62043:5;62015:33;;:21;62037:1;62015:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;62011:85;;;62076:4;62069:11;;;;;62011:85;61991:3;;;;;:::i;:::-;;;;61937:170;;;;62124:5;62117:12;;61860:277;;;;:::o;59665:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59339:42::-;;;;:::o;62682:78::-;55131:13;:11;:13::i;:::-;62751:4:::1;62736:12;;:19;;;;;;;;;;;;;;;;;;62682:78::o:0;55245:87::-;55291:7;55318:6;;;;;;;;;;;55311:13;;55245:87;:::o;59875:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19420:104::-;19476:13;19509:7;19502:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19420:104;:::o;62422:255::-;62479:4;62501:9;62513:1;62501:13;;62496:151;62520:10;:17;;;;62516:1;:21;62496:151;;;62580:8;62563:10;62574:1;62563:13;;;;;;;;:::i;:::-;;;;;;;;;;:25;62559:77;;;62616:4;62609:11;;;;;62559:77;62539:3;;;;;:::i;:::-;;;;62496:151;;;;62664:5;62657:12;;62422:255;;;;:::o;60324:94::-;55131:13;:11;:13::i;:::-;60405:8:::1;60395:7;:18;;;;;;;;;;;;:::i;:::-;;60324:94:::0;:::o;26285:308::-;26396:19;:17;:19::i;:::-;26384:31;;:8;:31;;;26380:61;;;26424:17;;;;;;;;;;;;;;26380:61;26506:8;26454:18;:39;26473:19;:17;:19::i;:::-;26454:39;;;;;;;;;;;;;;;:49;26494:8;26454:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26566:8;26530:55;;26545:19;:17;:19::i;:::-;26530:55;;;26576:8;26530:55;;;;;;:::i;:::-;;;;;;;;26285:308;;:::o;60566:67::-;55131:13;:11;:13::i;:::-;60624:4:::1;60611:10;;:17;;;;;;;;;;;;;;;;;;60566:67::o:0;61580:277::-;61640:4;61662:9;61674:1;61662:13;;61657:170;61681:21;:28;;;;61677:1;:32;61657:170;;;61763:5;61735:33;;:21;61757:1;61735:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;61731:85;;;61796:4;61789:11;;;;;61731:85;61711:3;;;;;:::i;:::-;;;;61657:170;;;;61844:5;61837:12;;61580:277;;;;:::o;59544:33::-;;;;;;;;;;;;;:::o;33130:399::-;33297:31;33310:4;33316:2;33320:7;33297:12;:31::i;:::-;33361:1;33343:2;:14;;;:19;33339:183;;33382:56;33413:4;33419:2;33423:7;33432:5;33382:30;:56::i;:::-;33377:145;;33466:40;;;;;;;;;;;;;;33377:145;33339:183;33130:399;;;;:::o;64586:2196::-;64653:9;;;;;;;;;;;64645:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;64735:9;;64721:10;64704:14;:12;:14::i;:::-;:27;;;;:::i;:::-;:40;;64696:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59254:1;64785:10;:36;;64777:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64891:4;64861:34;;:26;64876:10;64861:14;:26::i;:::-;:34;;;64857:1917;;;64958:1;64944:10;64910:19;:31;64930:10;64910:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;64902:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65026:10;65012:11;;:24;;;;:::i;:::-;64999:9;:37;;64991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65100:10;65065:19;:31;65085:10;65065:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;65116:33;65126:10;65138;65116:9;:33::i;:::-;64857:1917;;;65204:4;65174:34;;:26;65189:10;65174:14;:26::i;:::-;:34;;;65170:1604;;;65271:1;65257:10;65223:19;:31;65243:10;65223:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;65215:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65339:10;65325:11;;:24;;;;:::i;:::-;65312:9;:37;;65304:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65413:10;65378:19;:31;65398:10;65378:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;65429:33;65439:10;65451;65429:9;:33::i;:::-;65170:1604;;;65517:4;65487:34;;:26;65502:10;65487:14;:26::i;:::-;:34;;;65483:1291;;;65584:1;65570:10;65536:19;:31;65556:10;65536:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;65528:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65652:10;65638:11;;:24;;;;:::i;:::-;65625:9;:37;;65617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65726:10;65691:19;:31;65711:10;65691:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;65742:33;65752:10;65764;65742:9;:33::i;:::-;65483:1291;;;65830:4;65800:34;;:26;65815:10;65800:14;:26::i;:::-;:34;;;65796:978;;;65897:1;65883:10;65849:19;:31;65869:10;65849:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;65841:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;65965:10;65951:11;;:24;;;;:::i;:::-;65938:9;:37;;65930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66039:10;66004:19;:31;66024:10;66004:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;66055:33;66065:10;66077;66055:9;:33::i;:::-;65796:978;;;66143:4;66113:34;;:26;66128:10;66113:14;:26::i;:::-;:34;;;66109:665;;;66210:1;66196:10;66162:19;:31;66182:10;66162:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;66154:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;66278:10;66264:11;;:24;;;;:::i;:::-;66251:9;:37;;66243:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66352:10;66317:19;:31;66337:10;66317:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;66368:33;66378:10;66390;66368:9;:33::i;:::-;66109:665;;;66456:4;66426:34;;:26;66441:10;66426:14;:26::i;:::-;:34;;;66422:352;;;66523:1;66509:10;66475:19;:31;66495:10;66475:31;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:49;;66467:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;66591:10;66577:11;;:24;;;;:::i;:::-;66564:9;:37;;66556:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66665:10;66630:19;:31;66650:10;66630:31;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;66681:33;66691:10;66703;66681:9;:33::i;:::-;66422:352;;;66742:5;66734:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;66422:352;66109:665;65796:978;65483:1291;65170:1604;64857:1917;64586:2196;:::o;59205:50::-;59254:1;59205:50;:::o;62768:72::-;55131:13;:11;:13::i;:::-;62831:4:::1;62819:9;;:16;;;;;;;;;;;;;;;;;;62768:72::o:0;63664:394::-;63741:13;63777:16;63785:7;63777;:16::i;:::-;63769:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63850:5;63836:19;;:10;;;;;;;;;;;:19;;;63833:75;;;63879:17;63872:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63833:75;63952:1;63931:10;:8;:10::i;:::-;63925:24;:28;:128;;;;;;;;;;;;;;;;;63994:10;:8;:10::i;:::-;64006:18;:7;:16;:18::i;:::-;63977:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63925:128;63918:135;;63664:394;;;;:::o;60426:132::-;55131:13;:11;:13::i;:::-;60535:18:::1;60515:17;:38;;;;;;;;;;;;:::i;:::-;;60426:132:::0;:::o;68077:53::-;55131:13;:11;:13::i;:::-;68077:53::o;62845:75::-;55131:13;:11;:13::i;:::-;62911:4:::1;62895:13;;:20;;;;;;;;;;;;;;;;;;62845:75::o:0;59299:36::-;;;;:::o;59259:31::-;;;;:::o;59749:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59474:29::-;;;;;;;;;;;;;:::o;26750:164::-;26847:4;26871:18;:25;26890:5;26871:25;;;;;;;;;;;;;;;:35;26897:8;26871:35;;;;;;;;;;;;;;;;;;;;;;;;;26864:42;;26750:164;;;;:::o;67600:156::-;55131:13;:11;:13::i;:::-;67687:21:::1;;67680:28;;;;:::i;:::-;67742:6;;67719:21;:29;;;;;;;:::i;:::-;;67600:156:::0;;:::o;59791:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67759:156::-;55131:13;:11;:13::i;:::-;67846:21:::1;;67839:28;;;;:::i;:::-;67901:6;;67878:21;:29;;;;;;;:::i;:::-;;67759:156:::0;;:::o;56151:201::-;55131:13;:11;:13::i;:::-;56260:1:::1;56240:22;;:8;:22;;;;56232:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56316:28;56335:8;56316:18;:28::i;:::-;56151:201:::0;:::o;62925:74::-;55131:13;:11;:13::i;:::-;62989:5:::1;62973:13;;:21;;;;;;;;;;;;;;;;;;62925:74::o:0;67123:156::-;55131:13;:11;:13::i;:::-;67210:21:::1;;67203:28;;;;:::i;:::-;67265:6;;67242:21;:29;;;;;;;:::i;:::-;;67123:156:::0;;:::o;55410:132::-;55485:12;:10;:12::i;:::-;55474:23;;:7;:5;:7::i;:::-;:23;;;55466:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55410:132::o;15416:296::-;15471:7;15678:15;:13;:15::i;:::-;15662:13;;:31;15655:38;;15416:296;:::o;42770:112::-;42847:27;42857:2;42861:8;42847:27;;;;;;;;;;;;:9;:27::i;:::-;42770:112;;:::o;27172:282::-;27237:4;27293:7;27274:15;:13;:15::i;:::-;:26;;:66;;;;;27327:13;;27317:7;:23;27274:66;:153;;;;;27426:1;11114:8;27378:17;:26;27396:7;27378:26;;;;;;;;;;;;:44;:49;27274:153;27254:173;;27172:282;;;:::o;48938:105::-;48998:7;49025:10;49018:17;;48938:105;:::o;60638:97::-;60703:7;60727:1;60720:8;;60638:97;:::o;21792:1275::-;21859:7;21879:12;21894:7;21879:22;;21962:4;21943:15;:13;:15::i;:::-;:23;21939:1061;;21996:13;;21989:4;:20;21985:1015;;;22034:14;22051:17;:23;22069:4;22051:23;;;;;;;;;;;;22034:40;;22168:1;11114:8;22140:6;:24;:29;22136:845;;;22805:113;22822:1;22812:6;:11;22805:113;;;22865:17;:25;22883:6;;;;;;;22865:25;;;;;;;;;;;;22856:34;;22805:113;;;22951:6;22944:13;;;;;;22136:845;22011:989;21985:1015;21939:1061;23028:31;;;;;;;;;;;;;;21792:1275;;;;:::o;28335:479::-;28437:27;28466:23;28507:38;28548:15;:24;28564:7;28548:24;;;;;;;;;;;28507:65;;28719:18;28696:41;;28776:19;28770:26;28751:45;;28681:126;28335:479;;;:::o;27563:659::-;27712:11;27877:16;27870:5;27866:28;27857:37;;28037:16;28026:9;28022:32;28009:45;;28187:15;28176:9;28173:30;28165:5;28154:9;28151:20;28148:56;28138:66;;27563:659;;;;;:::o;34191:159::-;;;;;:::o;48247:311::-;48382:7;48402:16;11518:3;48428:19;:41;;48402:68;;11518:3;48496:31;48507:4;48513:2;48517:9;48496:10;:31::i;:::-;48488:40;;:62;;48481:69;;;48247:311;;;;;:::o;23615:450::-;23695:14;23863:16;23856:5;23852:28;23843:37;;24040:5;24026:11;24001:23;23997:41;23994:52;23987:5;23984:63;23974:73;;23615:450;;;;:::o;35015:158::-;;;;;:::o;43149:89::-;43209:21;43215:7;43224:5;43209;:21::i;:::-;43149:89;:::o;56512:191::-;56586:16;56605:6;;;;;;;;;;;56586:25;;56631:8;56622:6;;:17;;;;;;;;;;;;;;;;;;56686:8;56655:40;;56676:8;56655:40;;;;;;;;;;;;56575:128;56512:191;:::o;35613:716::-;35776:4;35822:2;35797:45;;;35843:19;:17;:19::i;:::-;35864:4;35870:7;35879:5;35797:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35793:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36097:1;36080:6;:13;:18;36076:235;;;36126:40;;;;;;;;;;;;;;36076:235;36269:6;36263:13;36254:6;36250:2;36246:15;36239:38;35793:529;35966:54;;;35956:64;;;:6;:64;;;;35949:71;;;35613:716;;;;;;:::o;60225:91::-;60277:13;60304:7;60297:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60225:91;:::o;57015:723::-;57071:13;57301:1;57292:5;:10;57288:53;;;57319:10;;;;;;;;;;;;;;;;;;;;;57288:53;57351:12;57366:5;57351:20;;57382:14;57407:78;57422:1;57414:4;:9;57407:78;;57440:8;;;;;:::i;:::-;;;;57471:2;57463:10;;;;;:::i;:::-;;;57407:78;;;57495:19;57527:6;57517:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57495:39;;57545:154;57561:1;57552:5;:10;57545:154;;57589:1;57579:11;;;;;:::i;:::-;;;57656:2;57648:5;:10;;;;:::i;:::-;57635:2;:24;;;;:::i;:::-;57622:39;;57605:6;57612;57605:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;57685:2;57676:11;;;;;:::i;:::-;;;57545:154;;;57723:6;57709:21;;;;;57015:723;;;;:::o;53927:98::-;53980:7;54007:10;54000:17;;53927:98;:::o;41997:689::-;42128:19;42134:2;42138:8;42128:5;:19::i;:::-;42207:1;42189:2;:14;;;:19;42185:483;;42229:11;42243:13;;42229:27;;42275:13;42297:8;42291:3;:14;42275:30;;42324:233;42355:62;42394:1;42398:2;42402:7;;;;;;42411:5;42355:30;:62::i;:::-;42350:167;;42453:40;;;;;;;;;;;;;;42350:167;42552:3;42544:5;:11;42324:233;;42639:3;42622:13;;:20;42618:34;;42644:8;;;42618:34;42210:458;;42185:483;41997:689;;;:::o;47948:147::-;48085:6;47948:147;;;;;:::o;43467:3081::-;43547:27;43577;43596:7;43577:18;:27::i;:::-;43547:57;;43617:12;43648:19;43617:52;;43683:27;43712:23;43739:35;43766:7;43739:26;:35::i;:::-;43682:92;;;;43791:13;43787:316;;;43912:68;43937:15;43954:4;43960:19;:17;:19::i;:::-;43912:24;:68::i;:::-;43907:184;;44004:43;44021:4;44027:19;:17;:19::i;:::-;44004:16;:43::i;:::-;43999:92;;44056:35;;;;;;;;;;;;;;43999:92;43907:184;43787:316;44115:51;44137:4;44151:1;44155:7;44164:1;44115:21;:51::i;:::-;44259:15;44256:160;;;44399:1;44378:19;44371:30;44256:160;45077:1;10603:3;45047:1;:26;;45046:32;45018:18;:24;45037:4;45018:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45345:176;45382:4;45453:53;45468:4;45482:1;45486:19;45453:14;:53::i;:::-;11394:8;11114;45406:43;45405:101;45345:18;:176::i;:::-;45316:17;:26;45334:7;45316:26;;;;;;;;;;;:205;;;;45692:1;11394:8;45641:19;:47;:52;45637:627;;;45714:19;45746:1;45736:7;:11;45714:33;;45903:1;45869:17;:30;45887:11;45869:30;;;;;;;;;;;;:35;45865:384;;;46007:13;;45992:11;:28;45988:242;;46187:19;46154:17;:30;46172:11;46154:30;;;;;;;;;;;:52;;;;45988:242;45865:384;45695:569;45637:627;46319:7;46315:1;46292:35;;46301:4;46292:35;;;;;;;;;;;;46338:50;46359:4;46373:1;46377:7;46386:1;46338:20;:50::i;:::-;46515:12;;:14;;;;;;;;;;;;;43536:3012;;;;43467:3081;;:::o;36791:2454::-;36864:20;36887:13;;36864:36;;36927:1;36915:8;:13;36911:44;;;36937:18;;;;;;;;;;;;;;36911:44;36968:61;36998:1;37002:2;37006:12;37020:8;36968:21;:61::i;:::-;37512:1;10476:2;37482:1;:26;;37481:32;37469:8;:45;37443:18;:22;37462:2;37443:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37791:139;37828:2;37882:33;37905:1;37909:2;37913:1;37882:14;:33::i;:::-;37849:30;37870:8;37849:20;:30::i;:::-;:66;37791:18;:139::i;:::-;37757:17;:31;37775:12;37757:31;;;;;;;;;;;:173;;;;37947:16;37978:11;38007:8;37992:12;:23;37978:37;;38262:16;38258:2;38254:25;38242:37;;38634:12;38594:8;38553:1;38491:25;38432:1;38371;38344:335;38759:1;38745:12;38741:20;38699:346;38800:3;38791:7;38788:16;38699:346;;39018:7;39008:8;39005:1;38978:25;38975:1;38972;38967:59;38853:1;38844:7;38840:15;38829:26;;38699:346;;;38703:77;39090:1;39078:8;:13;39074:45;;;39100:19;;;;;;;;;;;;;;39074:45;39152:3;39136:13;:19;;;;37217:1950;;39177:60;39206:1;39210:2;39214:12;39228:8;39177:20;:60::i;:::-;36853:2392;36791:2454;;:::o;24167:324::-;24237:14;24470:1;24460:8;24457:15;24431:24;24427:46;24417:56;;24167:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:559::-;6888:6;6896;6945:2;6933:9;6924:7;6920:23;6916:32;6913:119;;;6951:79;;:::i;:::-;6913:119;7099:1;7088:9;7084:17;7071:31;7129:18;7121:6;7118:30;7115:117;;;7151:79;;:::i;:::-;7115:117;7264:80;7336:7;7327:6;7316:9;7312:22;7264:80;:::i;:::-;7246:98;;;;7042:312;6802:559;;;;;:::o;7367:::-;7453:6;7461;7510:2;7498:9;7489:7;7485:23;7481:32;7478:119;;;7516:79;;:::i;:::-;7478:119;7664:1;7653:9;7649:17;7636:31;7694:18;7686:6;7683:30;7680:117;;;7716:79;;:::i;:::-;7680:117;7829:80;7901:7;7892:6;7881:9;7877:22;7829:80;:::i;:::-;7811:98;;;;7607:312;7367:559;;;;;:::o;7932:327::-;7990:6;8039:2;8027:9;8018:7;8014:23;8010:32;8007:119;;;8045:79;;:::i;:::-;8007:119;8165:1;8190:52;8234:7;8225:6;8214:9;8210:22;8190:52;:::i;:::-;8180:62;;8136:116;7932:327;;;;:::o;8265:349::-;8334:6;8383:2;8371:9;8362:7;8358:23;8354:32;8351:119;;;8389:79;;:::i;:::-;8351:119;8509:1;8534:63;8589:7;8580:6;8569:9;8565:22;8534:63;:::i;:::-;8524:73;;8480:127;8265:349;;;;:::o;8620:509::-;8689:6;8738:2;8726:9;8717:7;8713:23;8709:32;8706:119;;;8744:79;;:::i;:::-;8706:119;8892:1;8881:9;8877:17;8864:31;8922:18;8914:6;8911:30;8908:117;;;8944:79;;:::i;:::-;8908:117;9049:63;9104:7;9095:6;9084:9;9080:22;9049:63;:::i;:::-;9039:73;;8835:287;8620:509;;;;:::o;9135:329::-;9194:6;9243:2;9231:9;9222:7;9218:23;9214:32;9211:119;;;9249:79;;:::i;:::-;9211:119;9369:1;9394:53;9439:7;9430:6;9419:9;9415:22;9394:53;:::i;:::-;9384:63;;9340:117;9135:329;;;;:::o;9470:118::-;9557:24;9575:5;9557:24;:::i;:::-;9552:3;9545:37;9470:118;;:::o;9594:109::-;9675:21;9690:5;9675:21;:::i;:::-;9670:3;9663:34;9594:109;;:::o;9709:360::-;9795:3;9823:38;9855:5;9823:38;:::i;:::-;9877:70;9940:6;9935:3;9877:70;:::i;:::-;9870:77;;9956:52;10001:6;9996:3;9989:4;9982:5;9978:16;9956:52;:::i;:::-;10033:29;10055:6;10033:29;:::i;:::-;10028:3;10024:39;10017:46;;9799:270;9709:360;;;;:::o;10075:364::-;10163:3;10191:39;10224:5;10191:39;:::i;:::-;10246:71;10310:6;10305:3;10246:71;:::i;:::-;10239:78;;10326:52;10371:6;10366:3;10359:4;10352:5;10348:16;10326:52;:::i;:::-;10403:29;10425:6;10403:29;:::i;:::-;10398:3;10394:39;10387:46;;10167:272;10075:364;;;;:::o;10445:377::-;10551:3;10579:39;10612:5;10579:39;:::i;:::-;10634:89;10716:6;10711:3;10634:89;:::i;:::-;10627:96;;10732:52;10777:6;10772:3;10765:4;10758:5;10754:16;10732:52;:::i;:::-;10809:6;10804:3;10800:16;10793:23;;10555:267;10445:377;;;;:::o;10828:366::-;10970:3;10991:67;11055:2;11050:3;10991:67;:::i;:::-;10984:74;;11067:93;11156:3;11067:93;:::i;:::-;11185:2;11180:3;11176:12;11169:19;;10828:366;;;:::o;11200:::-;11342:3;11363:67;11427:2;11422:3;11363:67;:::i;:::-;11356:74;;11439:93;11528:3;11439:93;:::i;:::-;11557:2;11552:3;11548:12;11541:19;;11200:366;;;:::o;11572:::-;11714:3;11735:67;11799:2;11794:3;11735:67;:::i;:::-;11728:74;;11811:93;11900:3;11811:93;:::i;:::-;11929:2;11924:3;11920:12;11913:19;;11572:366;;;:::o;11944:::-;12086:3;12107:67;12171:2;12166:3;12107:67;:::i;:::-;12100:74;;12183:93;12272:3;12183:93;:::i;:::-;12301:2;12296:3;12292:12;12285:19;;11944:366;;;:::o;12316:::-;12458:3;12479:67;12543:2;12538:3;12479:67;:::i;:::-;12472:74;;12555:93;12644:3;12555:93;:::i;:::-;12673:2;12668:3;12664:12;12657:19;;12316:366;;;:::o;12688:::-;12830:3;12851:67;12915:2;12910:3;12851:67;:::i;:::-;12844:74;;12927:93;13016:3;12927:93;:::i;:::-;13045:2;13040:3;13036:12;13029:19;;12688:366;;;:::o;13060:::-;13202:3;13223:67;13287:2;13282:3;13223:67;:::i;:::-;13216:74;;13299:93;13388:3;13299:93;:::i;:::-;13417:2;13412:3;13408:12;13401:19;;13060:366;;;:::o;13432:400::-;13592:3;13613:84;13695:1;13690:3;13613:84;:::i;:::-;13606:91;;13706:93;13795:3;13706:93;:::i;:::-;13824:1;13819:3;13815:11;13808:18;;13432:400;;;:::o;13838:366::-;13980:3;14001:67;14065:2;14060:3;14001:67;:::i;:::-;13994:74;;14077:93;14166:3;14077:93;:::i;:::-;14195:2;14190:3;14186:12;14179:19;;13838:366;;;:::o;14210:::-;14352:3;14373:67;14437:2;14432:3;14373:67;:::i;:::-;14366:74;;14449:93;14538:3;14449:93;:::i;:::-;14567:2;14562:3;14558:12;14551:19;;14210:366;;;:::o;14582:::-;14724:3;14745:67;14809:2;14804:3;14745:67;:::i;:::-;14738:74;;14821:93;14910:3;14821:93;:::i;:::-;14939:2;14934:3;14930:12;14923:19;;14582:366;;;:::o;14954:398::-;15113:3;15134:83;15215:1;15210:3;15134:83;:::i;:::-;15127:90;;15226:93;15315:3;15226:93;:::i;:::-;15344:1;15339:3;15335:11;15328:18;;14954:398;;;:::o;15358:366::-;15500:3;15521:67;15585:2;15580:3;15521:67;:::i;:::-;15514:74;;15597:93;15686:3;15597:93;:::i;:::-;15715:2;15710:3;15706:12;15699:19;;15358:366;;;:::o;15730:::-;15872:3;15893:67;15957:2;15952:3;15893:67;:::i;:::-;15886:74;;15969:93;16058:3;15969:93;:::i;:::-;16087:2;16082:3;16078:12;16071:19;;15730:366;;;:::o;16102:::-;16244:3;16265:67;16329:2;16324:3;16265:67;:::i;:::-;16258:74;;16341:93;16430:3;16341:93;:::i;:::-;16459:2;16454:3;16450:12;16443:19;;16102:366;;;:::o;16474:118::-;16561:24;16579:5;16561:24;:::i;:::-;16556:3;16549:37;16474:118;;:::o;16598:701::-;16879:3;16901:95;16992:3;16983:6;16901:95;:::i;:::-;16894:102;;17013:95;17104:3;17095:6;17013:95;:::i;:::-;17006:102;;17125:148;17269:3;17125:148;:::i;:::-;17118:155;;17290:3;17283:10;;16598:701;;;;;:::o;17305:379::-;17489:3;17511:147;17654:3;17511:147;:::i;:::-;17504:154;;17675:3;17668:10;;17305:379;;;:::o;17690:222::-;17783:4;17821:2;17810:9;17806:18;17798:26;;17834:71;17902:1;17891:9;17887:17;17878:6;17834:71;:::i;:::-;17690:222;;;;:::o;17918:640::-;18113:4;18151:3;18140:9;18136:19;18128:27;;18165:71;18233:1;18222:9;18218:17;18209:6;18165:71;:::i;:::-;18246:72;18314:2;18303:9;18299:18;18290:6;18246:72;:::i;:::-;18328;18396:2;18385:9;18381:18;18372:6;18328:72;:::i;:::-;18447:9;18441:4;18437:20;18432:2;18421:9;18417:18;18410:48;18475:76;18546:4;18537:6;18475:76;:::i;:::-;18467:84;;17918:640;;;;;;;:::o;18564:210::-;18651:4;18689:2;18678:9;18674:18;18666:26;;18702:65;18764:1;18753:9;18749:17;18740:6;18702:65;:::i;:::-;18564:210;;;;:::o;18780:313::-;18893:4;18931:2;18920:9;18916:18;18908:26;;18980:9;18974:4;18970:20;18966:1;18955:9;18951:17;18944:47;19008:78;19081:4;19072:6;19008:78;:::i;:::-;19000:86;;18780:313;;;;:::o;19099:419::-;19265:4;19303:2;19292:9;19288:18;19280:26;;19352:9;19346:4;19342:20;19338:1;19327:9;19323:17;19316:47;19380:131;19506:4;19380:131;:::i;:::-;19372:139;;19099:419;;;:::o;19524:::-;19690:4;19728:2;19717:9;19713:18;19705:26;;19777:9;19771:4;19767:20;19763:1;19752:9;19748:17;19741:47;19805:131;19931:4;19805:131;:::i;:::-;19797:139;;19524:419;;;:::o;19949:::-;20115:4;20153:2;20142:9;20138:18;20130:26;;20202:9;20196:4;20192:20;20188:1;20177:9;20173:17;20166:47;20230:131;20356:4;20230:131;:::i;:::-;20222:139;;19949:419;;;:::o;20374:::-;20540:4;20578:2;20567:9;20563:18;20555:26;;20627:9;20621:4;20617:20;20613:1;20602:9;20598:17;20591:47;20655:131;20781:4;20655:131;:::i;:::-;20647:139;;20374:419;;;:::o;20799:::-;20965:4;21003:2;20992:9;20988:18;20980:26;;21052:9;21046:4;21042:20;21038:1;21027:9;21023:17;21016:47;21080:131;21206:4;21080:131;:::i;:::-;21072:139;;20799:419;;;:::o;21224:::-;21390:4;21428:2;21417:9;21413:18;21405:26;;21477:9;21471:4;21467:20;21463:1;21452:9;21448:17;21441:47;21505:131;21631:4;21505:131;:::i;:::-;21497:139;;21224:419;;;:::o;21649:::-;21815:4;21853:2;21842:9;21838:18;21830:26;;21902:9;21896:4;21892:20;21888:1;21877:9;21873:17;21866:47;21930:131;22056:4;21930:131;:::i;:::-;21922:139;;21649:419;;;:::o;22074:::-;22240:4;22278:2;22267:9;22263:18;22255:26;;22327:9;22321:4;22317:20;22313:1;22302:9;22298:17;22291:47;22355:131;22481:4;22355:131;:::i;:::-;22347:139;;22074:419;;;:::o;22499:::-;22665:4;22703:2;22692:9;22688:18;22680:26;;22752:9;22746:4;22742:20;22738:1;22727:9;22723:17;22716:47;22780:131;22906:4;22780:131;:::i;:::-;22772:139;;22499:419;;;:::o;22924:::-;23090:4;23128:2;23117:9;23113:18;23105:26;;23177:9;23171:4;23167:20;23163:1;23152:9;23148:17;23141:47;23205:131;23331:4;23205:131;:::i;:::-;23197:139;;22924:419;;;:::o;23349:::-;23515:4;23553:2;23542:9;23538:18;23530:26;;23602:9;23596:4;23592:20;23588:1;23577:9;23573:17;23566:47;23630:131;23756:4;23630:131;:::i;:::-;23622:139;;23349:419;;;:::o;23774:::-;23940:4;23978:2;23967:9;23963:18;23955:26;;24027:9;24021:4;24017:20;24013:1;24002:9;23998:17;23991:47;24055:131;24181:4;24055:131;:::i;:::-;24047:139;;23774:419;;;:::o;24199:::-;24365:4;24403:2;24392:9;24388:18;24380:26;;24452:9;24446:4;24442:20;24438:1;24427:9;24423:17;24416:47;24480:131;24606:4;24480:131;:::i;:::-;24472:139;;24199:419;;;:::o;24624:222::-;24717:4;24755:2;24744:9;24740:18;24732:26;;24768:71;24836:1;24825:9;24821:17;24812:6;24768:71;:::i;:::-;24624:222;;;;:::o;24852:129::-;24886:6;24913:20;;:::i;:::-;24903:30;;24942:33;24970:4;24962:6;24942:33;:::i;:::-;24852:129;;;:::o;24987:75::-;25020:6;25053:2;25047:9;25037:19;;24987:75;:::o;25068:307::-;25129:4;25219:18;25211:6;25208:30;25205:56;;;25241:18;;:::i;:::-;25205:56;25279:29;25301:6;25279:29;:::i;:::-;25271:37;;25363:4;25357;25353:15;25345:23;;25068:307;;;:::o;25381:308::-;25443:4;25533:18;25525:6;25522:30;25519:56;;;25555:18;;:::i;:::-;25519:56;25593:29;25615:6;25593:29;:::i;:::-;25585:37;;25677:4;25671;25667:15;25659:23;;25381:308;;;:::o;25695:98::-;25746:6;25780:5;25774:12;25764:22;;25695:98;;;:::o;25799:99::-;25851:6;25885:5;25879:12;25869:22;;25799:99;;;:::o;25904:168::-;25987:11;26021:6;26016:3;26009:19;26061:4;26056:3;26052:14;26037:29;;25904:168;;;;:::o;26078:147::-;26179:11;26216:3;26201:18;;26078:147;;;;:::o;26231:169::-;26315:11;26349:6;26344:3;26337:19;26389:4;26384:3;26380:14;26365:29;;26231:169;;;;:::o;26406:148::-;26508:11;26545:3;26530:18;;26406:148;;;;:::o;26560:305::-;26600:3;26619:20;26637:1;26619:20;:::i;:::-;26614:25;;26653:20;26671:1;26653:20;:::i;:::-;26648:25;;26807:1;26739:66;26735:74;26732:1;26729:81;26726:107;;;26813:18;;:::i;:::-;26726:107;26857:1;26854;26850:9;26843:16;;26560:305;;;;:::o;26871:185::-;26911:1;26928:20;26946:1;26928:20;:::i;:::-;26923:25;;26962:20;26980:1;26962:20;:::i;:::-;26957:25;;27001:1;26991:35;;27006:18;;:::i;:::-;26991:35;27048:1;27045;27041:9;27036:14;;26871:185;;;;:::o;27062:348::-;27102:7;27125:20;27143:1;27125:20;:::i;:::-;27120:25;;27159:20;27177:1;27159:20;:::i;:::-;27154:25;;27347:1;27279:66;27275:74;27272:1;27269:81;27264:1;27257:9;27250:17;27246:105;27243:131;;;27354:18;;:::i;:::-;27243:131;27402:1;27399;27395:9;27384:20;;27062:348;;;;:::o;27416:191::-;27456:4;27476:20;27494:1;27476:20;:::i;:::-;27471:25;;27510:20;27528:1;27510:20;:::i;:::-;27505:25;;27549:1;27546;27543:8;27540:34;;;27554:18;;:::i;:::-;27540:34;27599:1;27596;27592:9;27584:17;;27416:191;;;;:::o;27613:96::-;27650:7;27679:24;27697:5;27679:24;:::i;:::-;27668:35;;27613:96;;;:::o;27715:90::-;27749:7;27792:5;27785:13;27778:21;27767:32;;27715:90;;;:::o;27811:149::-;27847:7;27887:66;27880:5;27876:78;27865:89;;27811:149;;;:::o;27966:126::-;28003:7;28043:42;28036:5;28032:54;28021:65;;27966:126;;;:::o;28098:77::-;28135:7;28164:5;28153:16;;28098:77;;;:::o;28181:154::-;28265:6;28260:3;28255;28242:30;28327:1;28318:6;28313:3;28309:16;28302:27;28181:154;;;:::o;28341:307::-;28409:1;28419:113;28433:6;28430:1;28427:13;28419:113;;;28518:1;28513:3;28509:11;28503:18;28499:1;28494:3;28490:11;28483:39;28455:2;28452:1;28448:10;28443:15;;28419:113;;;28550:6;28547:1;28544:13;28541:101;;;28630:1;28621:6;28616:3;28612:16;28605:27;28541:101;28390:258;28341:307;;;:::o;28654:320::-;28698:6;28735:1;28729:4;28725:12;28715:22;;28782:1;28776:4;28772:12;28803:18;28793:81;;28859:4;28851:6;28847:17;28837:27;;28793:81;28921:2;28913:6;28910:14;28890:18;28887:38;28884:84;;;28940:18;;:::i;:::-;28884:84;28705:269;28654:320;;;:::o;28980:281::-;29063:27;29085:4;29063:27;:::i;:::-;29055:6;29051:40;29193:6;29181:10;29178:22;29157:18;29145:10;29142:34;29139:62;29136:88;;;29204:18;;:::i;:::-;29136:88;29244:10;29240:2;29233:22;29023:238;28980:281;;:::o;29267:233::-;29306:3;29329:24;29347:5;29329:24;:::i;:::-;29320:33;;29375:66;29368:5;29365:77;29362:103;;;29445:18;;:::i;:::-;29362:103;29492:1;29485:5;29481:13;29474:20;;29267:233;;;:::o;29506:176::-;29538:1;29555:20;29573:1;29555:20;:::i;:::-;29550:25;;29589:20;29607:1;29589:20;:::i;:::-;29584:25;;29628:1;29618:35;;29633:18;;:::i;:::-;29618:35;29674:1;29671;29667:9;29662:14;;29506:176;;;;:::o;29688:180::-;29736:77;29733:1;29726:88;29833:4;29830:1;29823:15;29857:4;29854:1;29847:15;29874:180;29922:77;29919:1;29912:88;30019:4;30016:1;30009:15;30043:4;30040:1;30033:15;30060:180;30108:77;30105:1;30098:88;30205:4;30202:1;30195:15;30229:4;30226:1;30219:15;30246:180;30294:77;30291:1;30284:88;30391:4;30388:1;30381:15;30415:4;30412:1;30405:15;30432:180;30480:77;30477:1;30470:88;30577:4;30574:1;30567:15;30601:4;30598:1;30591:15;30618:117;30727:1;30724;30717:12;30741:117;30850:1;30847;30840:12;30864:117;30973:1;30970;30963:12;30987:117;31096:1;31093;31086:12;31110:117;31219:1;31216;31209:12;31233:117;31342:1;31339;31332:12;31356:102;31397:6;31448:2;31444:7;31439:2;31432:5;31428:14;31424:28;31414:38;;31356:102;;;:::o;31464:171::-;31604:23;31600:1;31592:6;31588:14;31581:47;31464:171;:::o;31641:225::-;31781:34;31777:1;31769:6;31765:14;31758:58;31850:8;31845:2;31837:6;31833:15;31826:33;31641:225;:::o;31872:181::-;32012:33;32008:1;32000:6;31996:14;31989:57;31872:181;:::o;32059:167::-;32199:19;32195:1;32187:6;32183:14;32176:43;32059:167;:::o;32232:168::-;32372:20;32368:1;32360:6;32356:14;32349:44;32232:168;:::o;32406:174::-;32546:26;32542:1;32534:6;32530:14;32523:50;32406:174;:::o;32586:176::-;32726:28;32722:1;32714:6;32710:14;32703:52;32586:176;:::o;32768:155::-;32908:7;32904:1;32896:6;32892:14;32885:31;32768:155;:::o;32929:182::-;33069:34;33065:1;33057:6;33053:14;33046:58;32929:182;:::o;33117:170::-;33257:22;33253:1;33245:6;33241:14;33234:46;33117:170;:::o;33293:177::-;33433:29;33429:1;33421:6;33417:14;33410:53;33293:177;:::o;33476:114::-;;:::o;33596:168::-;33736:20;33732:1;33724:6;33720:14;33713:44;33596:168;:::o;33770:172::-;33910:24;33906:1;33898:6;33894:14;33887:48;33770:172;:::o;33948:168::-;34088:20;34084:1;34076:6;34072:14;34065:44;33948:168;:::o;34122:122::-;34195:24;34213:5;34195:24;:::i;:::-;34188:5;34185:35;34175:63;;34234:1;34231;34224:12;34175:63;34122:122;:::o;34250:116::-;34320:21;34335:5;34320:21;:::i;:::-;34313:5;34310:32;34300:60;;34356:1;34353;34346:12;34300:60;34250:116;:::o;34372:120::-;34444:23;34461:5;34444:23;:::i;:::-;34437:5;34434:34;34424:62;;34482:1;34479;34472:12;34424:62;34372:120;:::o;34498:122::-;34571:24;34589:5;34571:24;:::i;:::-;34564:5;34561:35;34551:63;;34610:1;34607;34600:12;34551:63;34498:122;:::o

Swarm Source

ipfs://3801489b7fb4ecfcfeec1410c416956266873de5aff987f5bb621ee7e426dee7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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