ETH Price: $3,490.58 (+2.10%)
Gas: 12 Gwei

Token

GremlinTown.WTF (GremlinTown.WTF)
 

Overview

Max Total Supply

5,650 GremlinTown.WTF

Holders

3,065

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GremlinTown.WTF
0x4b5f0eabd5e03778e3d034ca2c8ceee3301da505
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:
GremlinTown

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-07-11
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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 (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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.2;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // 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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

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

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

contract GremlinTown is ERC721A, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    constructor() ERC721A("GremlinTown.WTF", "GremlinTown.WTF") {}
    
    uint256 public constant maxSupply = 5600;
    uint256 maxMintPerCall = 2;
    uint256 presaleMaxMint = 5600;
    uint256 devMinted = 0;
    uint256 devReserve = 600;

    struct mintTracker {
        uint256 amount;
    }

    bool public SaleStatus = false;
    string private _baseTokenURI;
    address private signer = 0x4557674Ea101C7594a68263D735BacD0Ae57E569;

    mapping(address => mintTracker) private _minttracker;
    mapping(address => uint) devMintsTo;

    modifier mintChecks(uint numNFTs) {
        unchecked {
            require(tx.origin == msg.sender);
            require(numNFTs <= maxMintPerCall, "Number to mint exceeds maximum per tx");
            require(numNFTs + totalSupply() <= maxSupply, "Mint would exceed supply");
        }
        _;
    }

    // MINTING ------------------------------------------------------------------------

    function devMint(address to, uint256 numNFTs) external onlyOwner {
        require((devMinted += numNFTs) <= devReserve, "Not enough in the dev reserve, mint a smaller amount");
        devMintsTo[msg.sender] += numNFTs;
        _safeMint(to, numNFTs);
    }

    function whitelistMint(uint256 numNFTs, bytes calldata signature) public payable mintChecks(numNFTs) {
        unchecked {
            require(SaleStatus, "Sale has not started");
            require(verifySignature(abi.encodePacked(msg.sender), signature), "Invalid signature provided");
            require(totalSupply() + numNFTs - devMintsTo[msg.sender] <= presaleMaxMint, "Can't mint that many in pre-sale");
            require(_minttracker[msg.sender].amount + numNFTs <= 2, "Can't mint more than 3 NFTs.");
        }
        _minttracker[msg.sender].amount = _minttracker[msg.sender].amount + numNFTs;
        _safeMint(msg.sender, numNFTs);
    }

    function normalMint(uint256 numNFTs) public payable mintChecks(numNFTs) {
        unchecked {
            require(SaleStatus, "Sale has not started");
            require(totalSupply() + numNFTs - devMintsTo[msg.sender] <= presaleMaxMint, "Can't mint that many in pre-sale");
            require(_minttracker[msg.sender].amount + numNFTs <= 1, "Can't mint more than 1 NFT.");
        }
        _minttracker[msg.sender].amount = _minttracker[msg.sender].amount + numNFTs;
        _safeMint(msg.sender, numNFTs);
    }

    //GETS ---------------------------------------------------------------------------

    function tokenURI(uint tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json"));
    }

    function getMintedAmountForAddress(address _address) public view returns(uint256){
        return _minttracker[_address].amount;
    }

    function getMintedAmountForMyself() public view returns(uint256){
        return _minttracker[msg.sender].amount;
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function verifySignature(bytes memory data, bytes calldata signature) internal view returns(bool) {
        return (keccak256(data).toEthSignedMessageHash().recover(signature) == signer);
    }

    function getSigner() public view returns(address){
        return signer;
    }

    //SETS --------------------------------------------------------------------------
    function setBaseURI(string calldata new_baseURI) external onlyOwner {
        _baseTokenURI = new_baseURI;
    }
        
    function setSaleStates(bool new_SaleStatus) external onlyOwner{
        SaleStatus = new_SaleStatus;
    }

    function setSigner(address new_signer) external onlyOwner {
        signer = new_signer;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"SaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintedAmountForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedAmountForMyself","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"normalMint","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"new_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"new_SaleStatus","type":"bool"}],"name":"setSaleStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_signer","type":"address"}],"name":"setSigner","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"numNFTs","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000805560026008556115e06009556000600a55610258600b556000600c60006101000a81548160ff021916908315150217905550734557674ea101c7594a68263d735bacd0ae57e569600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009b57600080fd5b506040518060400160405280600f81526020017f4772656d6c696e546f776e2e57544600000000000000000000000000000000008152506040518060400160405280600f81526020017f4772656d6c696e546f776e2e575446000000000000000000000000000000000081525081600190805190602001906200012092919062000230565b5080600290805190602001906200013992919062000230565b5050506200015c620001506200016260201b60201c565b6200016a60201b60201c565b62000345565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023e90620002e0565b90600052602060002090601f016020900481019282620002625760008555620002ae565b82601f106200027d57805160ff1916838001178555620002ae565b82800160010185558215620002ae579182015b82811115620002ad57825182559160200191906001019062000290565b5b509050620002bd9190620002c1565b5090565b5b80821115620002dc576000816000905550600101620002c2565b5090565b60006002820490506001821680620002f957607f821691505b6020821081141562000310576200030f62000316565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61530a80620003556000396000f3fe6080604052600436106101d85760003560e01c80636c19e78311610102578063a22cb46511610095578063df74a99811610064578063df74a998146106d5578063e985e9c5146106fe578063eb5021f81461073b578063f2fde38b14610757576101d8565b8063a22cb4651461061b578063b88d4fde14610644578063c87b56dd1461066d578063d5abeb01146106aa576101d8565b80638da5cb5b116100d15780638da5cb5b1461056c5780639231ab2a1461059757806395d89b41146105d45780639e852f75146105ff576101d8565b80636c19e783146104c457806370a08231146104ed578063715018a61461052a5780637ac3c02f14610541576101d8565b806323b872dd1161017a57806355f804b31161014957806355f804b31461040a57806359c819d314610433578063627804af1461045e5780636352211e14610487576101d8565b806323b872dd1461033e5780632f745c591461036757806342842e0e146103a45780634f6ccce7146103cd576101d8565b8063091babec116101b6578063091babec14610282578063095ea7b3146102ad57806318160ddd146102d65780631c26c06414610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906137f2565b610780565b6040516102119190614068565b60405180910390f35b34801561022657600080fd5b5061022f6108ca565b60405161023c91906140c8565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613899565b61095c565b6040516102799190614001565b60405180910390f35b34801561028e57600080fd5b506102976109e1565b6040516102a49190614068565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190613785565b6109f4565b005b3480156102e257600080fd5b506102eb610b0d565b6040516102f891906144e5565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613602565b610b16565b60405161033591906144e5565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061366f565b610b62565b005b34801561037357600080fd5b5061038e60048036038101906103899190613785565b610b72565b60405161039b91906144e5565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061366f565b610d70565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613899565b610d90565b60405161040191906144e5565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c919061384c565b610de3565b005b34801561043f57600080fd5b50610448610e75565b60405161045591906144e5565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613785565b610ebf565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613899565b610ffb565b6040516104bb9190614001565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613602565b611011565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613602565b6110d1565b60405161052191906144e5565b60405180910390f35b34801561053657600080fd5b5061053f6111ba565b005b34801561054d57600080fd5b50610556611242565b6040516105639190614001565b60405180910390f35b34801561057857600080fd5b5061058161126c565b60405161058e9190614001565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190613899565b611296565b6040516105cb91906144ca565b60405180910390f35b3480156105e057600080fd5b506105e96112ae565b6040516105f691906140c8565b60405180910390f35b610619600480360381019061061491906138c6565b611340565b005b34801561062757600080fd5b50610642600480360381019061063d9190613745565b61167f565b005b34801561065057600080fd5b5061066b600480360381019061066691906136c2565b611800565b005b34801561067957600080fd5b50610694600480360381019061068f9190613899565b61185c565b6040516106a191906140c8565b60405180910390f35b3480156106b657600080fd5b506106bf6118d8565b6040516106cc91906144e5565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906137c5565b6118de565b005b34801561070a57600080fd5b506107256004803603810190610720919061362f565b611977565b6040516107329190614068565b60405180910390f35b61075560048036038101906107509190613899565b611a0b565b005b34801561076357600080fd5b5061077e60048036038101906107799190613602565b611cdf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c357506108c282611dd7565b5b9050919050565b6060600180546108d9906147d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610905906147d6565b80156109525780601f1061092757610100808354040283529160200191610952565b820191906000526020600020905b81548152906001019060200180831161093557829003601f168201915b5050505050905090565b600061096782611e41565b6109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d9061448a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c60009054906101000a900460ff1681565b60006109ff82610ffb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061434a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8f611e4e565b73ffffffffffffffffffffffffffffffffffffffff161480610abe5750610abd81610ab8611e4e565b611977565b5b610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061420a565b60405180910390fd5b610b08838383611e56565b505050565b60008054905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b610b6d838383611f08565b505050565b6000610b7d836110d1565b8210610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb59061410a565b60405180910390fd5b6000610bc8610b0d565b905060008060005b83811015610d2e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cc257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d1a5786841415610d0b578195505050505050610d6a565b8380610d1690614839565b9450505b508080610d2690614839565b915050610bd0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061440a565b60405180910390fd5b92915050565b610d8b83838360405180602001604052806000815250611800565b505050565b6000610d9a610b0d565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061418a565b60405180910390fd5b819050919050565b610deb611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610e0961126c565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906142aa565b60405180910390fd5b8181600d9190610e709291906133a0565b505050565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b610ec7611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610ee561126c565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f32906142aa565b60405180910390fd5b600b5481600a6000828254610f5091906145f4565b9250508190551115610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061442a565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe691906145f4565b92505081905550610ff782826124af565b5050565b6000611006826124cd565b600001519050919050565b611019611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661103761126c565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906142aa565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111399061424a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111c2611e4e565b73ffffffffffffffffffffffffffffffffffffffff166111e061126c565b73ffffffffffffffffffffffffffffffffffffffff1614611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d906142aa565b60405180910390fd5b6112406000612628565b565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61129e613426565b6112a7826124cd565b9050919050565b6060600280546112bd906147d6565b80601f01602080910402602001604051908101604052809291908181526020018280546112e9906147d6565b80156113365780601f1061130b57610100808354040283529160200191611336565b820191906000526020600020905b81548152906001019060200180831161131957829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137957600080fd5b6008548111156113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061446a565b60405180910390fd5b6115e06113c9610b0d565b8201111561140c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611403906142ea565b60405180910390fd5b600c60009054906101000a900460ff1661145b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114529061444a565b60405180910390fd5b6114853360405160200161146f9190613f91565b60405160208183030381529060405284846126ee565b6114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906143ca565b60405180910390fd5b600954601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611510610b0d565b01031115611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a906144aa565b60405180910390fd5b600284600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540111156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d29061422a565b60405180910390fd5b83600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461162991906145f4565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061167933856124af565b50505050565b611687611e4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec9061430a565b60405180910390fd5b8060066000611702611e4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117af611e4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f49190614068565b60405180910390a35050565b61180b848484611f08565b611817848484846127af565b611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061438a565b60405180910390fd5b50505050565b606061186782611e41565b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906142ca565b60405180910390fd5b600d6118b183612946565b6040516020016118c2929190613fac565b6040516020818303038152906040529050919050565b6115e081565b6118e6611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661190461126c565b73ffffffffffffffffffffffffffffffffffffffff161461195a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611951906142aa565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600854811115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a809061446a565b60405180910390fd5b6115e0611a94610b0d565b82011115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142ea565b60405180910390fd5b600c60009054906101000a900460ff16611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d9061444a565b60405180910390fd5b600954601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611b72610b0d565b01031115611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac906144aa565b60405180910390fd5b600182600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c34906141aa565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c8b91906145f4565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611cdb33836124af565b5050565b611ce7611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611d0561126c565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906142aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc29061414a565b60405180910390fd5b611dd481612628565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f13826124cd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f3a611e4e565b73ffffffffffffffffffffffffffffffffffffffff161480611f965750611f5f611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611f7e8461095c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fb25750611fb18260000151611fac611e4e565b611977565b5b905080611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb9061432a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d9061428a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906141ca565b60405180910390fd5b6120e38585856001612aa7565b6120f36000848460000151611e56565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122f991906145f4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561243f5761236f81611e41565b1561243e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a78686866001612aad565b505050505050565b6124c9828260405180602001604052806000815250612ab3565b5050565b6124d5613426565b6124de82611e41565b61251d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125149061416a565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260f578092505050612623565b50808061261b906147ac565b915050612523565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661278f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127818780519060200120612f72565b612fa290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b60006127d08473ffffffffffffffffffffffffffffffffffffffff16612fc9565b15612939578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f9611e4e565b8786866040518563ffffffff1660e01b815260040161281b949392919061401c565b602060405180830381600087803b15801561283557600080fd5b505af192505050801561286657506040513d601f19601f82011682018060405250810190612863919061381f565b60015b6128e9573d8060008114612896576040519150601f19603f3d011682016040523d82523d6000602084013e61289b565b606091505b506000815114156128e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d89061438a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061293e565b600190505b949350505050565b6060600082141561298e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aa2565b600082905060005b600082146129c05780806129a990614839565b915050600a826129b9919061464a565b9150612996565b60008167ffffffffffffffff8111156129dc576129db6149cc565b5b6040519080825280601f01601f191660200182016040528015612a0e5781602001600182028036833780820191505090505b5090505b60008514612a9b57600182612a27919061467b565b9150600a85612a3691906148b0565b6030612a4291906145f4565b60f81b818381518110612a5857612a5761499d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a94919061464a565b9450612a12565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b20906143ea565b60405180910390fd5b612b3281611e41565b15612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b69906143aa565b60405180910390fd5b60008311612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac9061436a565b60405180910390fd5b612bc26000858386612aa7565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612cbf91906145ae565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ce691906145ae565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612f5557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ef560008884886127af565b612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b9061438a565b60405180910390fd5b8180612f3f90614839565b9250508080612f4d90614839565b915050612e84565b5080600081905550612f6a6000878588612aad565b505050505050565b600081604051602001612f859190613fdb565b604051602081830303815290604052805190602001209050919050565b6000806000612fb18585612fdc565b91509150612fbe8161305f565b819250505092915050565b600080823b905060008111915050919050565b60008060418351141561301e5760008060006020860151925060408601519150606086015160001a905061301287828585613234565b94509450505050613058565b60408351141561304f576000806020850151915060408501519050613044868383613341565b935093505050613058565b60006002915091505b9250929050565b600060048111156130735761307261493f565b5b8160048111156130865761308561493f565b5b141561309157613231565b600160048111156130a5576130a461493f565b5b8160048111156130b8576130b761493f565b5b14156130f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f0906140ea565b60405180910390fd5b6002600481111561310d5761310c61493f565b5b8160048111156131205761311f61493f565b5b1415613161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131589061412a565b60405180910390fd5b600360048111156131755761317461493f565b5b8160048111156131885761318761493f565b5b14156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c0906141ea565b60405180910390fd5b6004808111156131dc576131db61493f565b5b8160048111156131ef576131ee61493f565b5b1415613230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132279061426a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561326f576000600391509150613338565b601b8560ff16141580156132875750601c8560ff1614155b15613299576000600491509150613338565b6000600187878787604051600081526020016040526040516132be9493929190614083565b6020604051602081039080840390855afa1580156132e0573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561332f57600060019250925050613338565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61338491906145f4565b905061339287828885613234565b935093505050935093915050565b8280546133ac906147d6565b90600052602060002090601f0160209004810192826133ce5760008555613415565b82601f106133e757803560ff1916838001178555613415565b82800160010185558215613415579182015b828111156134145782358255916020019190600101906133f9565b5b5090506134229190613460565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613479576000816000905550600101613461565b5090565b600061349061348b84614525565b614500565b9050828152602081018484840111156134ac576134ab614a0a565b5b6134b784828561476a565b509392505050565b6000813590506134ce81615278565b92915050565b6000813590506134e38161528f565b92915050565b6000813590506134f8816152a6565b92915050565b60008151905061350d816152a6565b92915050565b60008083601f84011261352957613528614a00565b5b8235905067ffffffffffffffff811115613546576135456149fb565b5b60208301915083600182028301111561356257613561614a05565b5b9250929050565b600082601f83011261357e5761357d614a00565b5b813561358e84826020860161347d565b91505092915050565b60008083601f8401126135ad576135ac614a00565b5b8235905067ffffffffffffffff8111156135ca576135c96149fb565b5b6020830191508360018202830111156135e6576135e5614a05565b5b9250929050565b6000813590506135fc816152bd565b92915050565b60006020828403121561361857613617614a14565b5b6000613626848285016134bf565b91505092915050565b6000806040838503121561364657613645614a14565b5b6000613654858286016134bf565b9250506020613665858286016134bf565b9150509250929050565b60008060006060848603121561368857613687614a14565b5b6000613696868287016134bf565b93505060206136a7868287016134bf565b92505060406136b8868287016135ed565b9150509250925092565b600080600080608085870312156136dc576136db614a14565b5b60006136ea878288016134bf565b94505060206136fb878288016134bf565b935050604061370c878288016135ed565b925050606085013567ffffffffffffffff81111561372d5761372c614a0f565b5b61373987828801613569565b91505092959194509250565b6000806040838503121561375c5761375b614a14565b5b600061376a858286016134bf565b925050602061377b858286016134d4565b9150509250929050565b6000806040838503121561379c5761379b614a14565b5b60006137aa858286016134bf565b92505060206137bb858286016135ed565b9150509250929050565b6000602082840312156137db576137da614a14565b5b60006137e9848285016134d4565b91505092915050565b60006020828403121561380857613807614a14565b5b6000613816848285016134e9565b91505092915050565b60006020828403121561383557613834614a14565b5b6000613843848285016134fe565b91505092915050565b6000806020838503121561386357613862614a14565b5b600083013567ffffffffffffffff81111561388157613880614a0f565b5b61388d85828601613597565b92509250509250929050565b6000602082840312156138af576138ae614a14565b5b60006138bd848285016135ed565b91505092915050565b6000806000604084860312156138df576138de614a14565b5b60006138ed868287016135ed565b935050602084013567ffffffffffffffff81111561390e5761390d614a0f565b5b61391a86828701613513565b92509250509250925092565b61392f816146af565b82525050565b61393e816146af565b82525050565b613955613950826146af565b614882565b82525050565b613964816146c1565b82525050565b613973816146cd565b82525050565b61398a613985826146cd565b614894565b82525050565b600061399b8261456b565b6139a58185614581565b93506139b5818560208601614779565b6139be81614a19565b840191505092915050565b60006139d482614576565b6139de8185614592565b93506139ee818560208601614779565b6139f781614a19565b840191505092915050565b6000613a0d82614576565b613a1781856145a3565b9350613a27818560208601614779565b80840191505092915050565b60008154613a40816147d6565b613a4a81866145a3565b94506001821660008114613a655760018114613a7657613aa9565b60ff19831686528186019350613aa9565b613a7f85614556565b60005b83811015613aa157815481890152600182019150602081019050613a82565b838801955050505b50505092915050565b6000613abf601883614592565b9150613aca82614a37565b602082019050919050565b6000613ae2602283614592565b9150613aed82614a60565b604082019050919050565b6000613b05601f83614592565b9150613b1082614aaf565b602082019050919050565b6000613b28601c836145a3565b9150613b3382614ad8565b601c82019050919050565b6000613b4b602683614592565b9150613b5682614b01565b604082019050919050565b6000613b6e602a83614592565b9150613b7982614b50565b604082019050919050565b6000613b91602383614592565b9150613b9c82614b9f565b604082019050919050565b6000613bb4601b83614592565b9150613bbf82614bee565b602082019050919050565b6000613bd7602583614592565b9150613be282614c17565b604082019050919050565b6000613bfa602283614592565b9150613c0582614c66565b604082019050919050565b6000613c1d603983614592565b9150613c2882614cb5565b604082019050919050565b6000613c40601c83614592565b9150613c4b82614d04565b602082019050919050565b6000613c63602b83614592565b9150613c6e82614d2d565b604082019050919050565b6000613c86602283614592565b9150613c9182614d7c565b604082019050919050565b6000613ca9602683614592565b9150613cb482614dcb565b604082019050919050565b6000613ccc6005836145a3565b9150613cd782614e1a565b600582019050919050565b6000613cef602083614592565b9150613cfa82614e43565b602082019050919050565b6000613d12602f83614592565b9150613d1d82614e6c565b604082019050919050565b6000613d35601883614592565b9150613d4082614ebb565b602082019050919050565b6000613d58601a83614592565b9150613d6382614ee4565b602082019050919050565b6000613d7b603283614592565b9150613d8682614f0d565b604082019050919050565b6000613d9e602283614592565b9150613da982614f5c565b604082019050919050565b6000613dc1602383614592565b9150613dcc82614fab565b604082019050919050565b6000613de4603383614592565b9150613def82614ffa565b604082019050919050565b6000613e07601d83614592565b9150613e1282615049565b602082019050919050565b6000613e2a601a83614592565b9150613e3582615072565b602082019050919050565b6000613e4d602183614592565b9150613e588261509b565b604082019050919050565b6000613e70602e83614592565b9150613e7b826150ea565b604082019050919050565b6000613e93603483614592565b9150613e9e82615139565b604082019050919050565b6000613eb6601483614592565b9150613ec182615188565b602082019050919050565b6000613ed9602583614592565b9150613ee4826151b1565b604082019050919050565b6000613efc602d83614592565b9150613f0782615200565b604082019050919050565b6000613f1f602083614592565b9150613f2a8261524f565b602082019050919050565b604082016000820151613f4b6000850182613926565b506020820151613f5e6020850182613f73565b50505050565b613f6d8161473f565b82525050565b613f7c81614749565b82525050565b613f8b8161475d565b82525050565b6000613f9d8284613944565b60148201915081905092915050565b6000613fb88285613a33565b9150613fc48284613a02565b9150613fcf82613cbf565b91508190509392505050565b6000613fe682613b1b565b9150613ff28284613979565b60208201915081905092915050565b60006020820190506140166000830184613935565b92915050565b60006080820190506140316000830187613935565b61403e6020830186613935565b61404b6040830185613f64565b818103606083015261405d8184613990565b905095945050505050565b600060208201905061407d600083018461395b565b92915050565b6000608082019050614098600083018761396a565b6140a56020830186613f82565b6140b2604083018561396a565b6140bf606083018461396a565b95945050505050565b600060208201905081810360008301526140e281846139c9565b905092915050565b6000602082019050818103600083015261410381613ab2565b9050919050565b6000602082019050818103600083015261412381613ad5565b9050919050565b6000602082019050818103600083015261414381613af8565b9050919050565b6000602082019050818103600083015261416381613b3e565b9050919050565b6000602082019050818103600083015261418381613b61565b9050919050565b600060208201905081810360008301526141a381613b84565b9050919050565b600060208201905081810360008301526141c381613ba7565b9050919050565b600060208201905081810360008301526141e381613bca565b9050919050565b6000602082019050818103600083015261420381613bed565b9050919050565b6000602082019050818103600083015261422381613c10565b9050919050565b6000602082019050818103600083015261424381613c33565b9050919050565b6000602082019050818103600083015261426381613c56565b9050919050565b6000602082019050818103600083015261428381613c79565b9050919050565b600060208201905081810360008301526142a381613c9c565b9050919050565b600060208201905081810360008301526142c381613ce2565b9050919050565b600060208201905081810360008301526142e381613d05565b9050919050565b6000602082019050818103600083015261430381613d28565b9050919050565b6000602082019050818103600083015261432381613d4b565b9050919050565b6000602082019050818103600083015261434381613d6e565b9050919050565b6000602082019050818103600083015261436381613d91565b9050919050565b6000602082019050818103600083015261438381613db4565b9050919050565b600060208201905081810360008301526143a381613dd7565b9050919050565b600060208201905081810360008301526143c381613dfa565b9050919050565b600060208201905081810360008301526143e381613e1d565b9050919050565b6000602082019050818103600083015261440381613e40565b9050919050565b6000602082019050818103600083015261442381613e63565b9050919050565b6000602082019050818103600083015261444381613e86565b9050919050565b6000602082019050818103600083015261446381613ea9565b9050919050565b6000602082019050818103600083015261448381613ecc565b9050919050565b600060208201905081810360008301526144a381613eef565b9050919050565b600060208201905081810360008301526144c381613f12565b9050919050565b60006040820190506144df6000830184613f35565b92915050565b60006020820190506144fa6000830184613f64565b92915050565b600061450a61451b565b90506145168282614808565b919050565b6000604051905090565b600067ffffffffffffffff8211156145405761453f6149cc565b5b61454982614a19565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145b982614703565b91506145c483614703565b9250826fffffffffffffffffffffffffffffffff038211156145e9576145e86148e1565b5b828201905092915050565b60006145ff8261473f565b915061460a8361473f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561463f5761463e6148e1565b5b828201905092915050565b60006146558261473f565b91506146608361473f565b9250826146705761466f614910565b5b828204905092915050565b60006146868261473f565b91506146918361473f565b9250828210156146a4576146a36148e1565b5b828203905092915050565b60006146ba8261471f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561479757808201518184015260208101905061477c565b838111156147a6576000848401525b50505050565b60006147b78261473f565b915060008214156147cb576147ca6148e1565b5b600182039050919050565b600060028204905060018216806147ee57607f821691505b602082108114156148025761480161496e565b5b50919050565b61481182614a19565b810181811067ffffffffffffffff821117156148305761482f6149cc565b5b80604052505050565b60006148448261473f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614877576148766148e1565b5b600182019050919050565b600061488d8261489e565b9050919050565b6000819050919050565b60006148a982614a2a565b9050919050565b60006148bb8261473f565b91506148c68361473f565b9250826148d6576148d5614910565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2031204e46542e0000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2033204e4654732e00000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820696e207468652064657620726573657276652c206d60008201527f696e74206120736d616c6c657220616d6f756e74000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b615281816146af565b811461528c57600080fd5b50565b615298816146c1565b81146152a357600080fd5b50565b6152af816146d7565b81146152ba57600080fd5b50565b6152c68161473f565b81146152d157600080fd5b5056fea2646970667358221220e0eaf1b33a3e140d1973cadfc1fc8d4aaaa8d720d823a994f26cc74331a2e37964736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636c19e78311610102578063a22cb46511610095578063df74a99811610064578063df74a998146106d5578063e985e9c5146106fe578063eb5021f81461073b578063f2fde38b14610757576101d8565b8063a22cb4651461061b578063b88d4fde14610644578063c87b56dd1461066d578063d5abeb01146106aa576101d8565b80638da5cb5b116100d15780638da5cb5b1461056c5780639231ab2a1461059757806395d89b41146105d45780639e852f75146105ff576101d8565b80636c19e783146104c457806370a08231146104ed578063715018a61461052a5780637ac3c02f14610541576101d8565b806323b872dd1161017a57806355f804b31161014957806355f804b31461040a57806359c819d314610433578063627804af1461045e5780636352211e14610487576101d8565b806323b872dd1461033e5780632f745c591461036757806342842e0e146103a45780634f6ccce7146103cd576101d8565b8063091babec116101b6578063091babec14610282578063095ea7b3146102ad57806318160ddd146102d65780631c26c06414610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906137f2565b610780565b6040516102119190614068565b60405180910390f35b34801561022657600080fd5b5061022f6108ca565b60405161023c91906140c8565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613899565b61095c565b6040516102799190614001565b60405180910390f35b34801561028e57600080fd5b506102976109e1565b6040516102a49190614068565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190613785565b6109f4565b005b3480156102e257600080fd5b506102eb610b0d565b6040516102f891906144e5565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613602565b610b16565b60405161033591906144e5565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061366f565b610b62565b005b34801561037357600080fd5b5061038e60048036038101906103899190613785565b610b72565b60405161039b91906144e5565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061366f565b610d70565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190613899565b610d90565b60405161040191906144e5565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c919061384c565b610de3565b005b34801561043f57600080fd5b50610448610e75565b60405161045591906144e5565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613785565b610ebf565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613899565b610ffb565b6040516104bb9190614001565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613602565b611011565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613602565b6110d1565b60405161052191906144e5565b60405180910390f35b34801561053657600080fd5b5061053f6111ba565b005b34801561054d57600080fd5b50610556611242565b6040516105639190614001565b60405180910390f35b34801561057857600080fd5b5061058161126c565b60405161058e9190614001565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190613899565b611296565b6040516105cb91906144ca565b60405180910390f35b3480156105e057600080fd5b506105e96112ae565b6040516105f691906140c8565b60405180910390f35b610619600480360381019061061491906138c6565b611340565b005b34801561062757600080fd5b50610642600480360381019061063d9190613745565b61167f565b005b34801561065057600080fd5b5061066b600480360381019061066691906136c2565b611800565b005b34801561067957600080fd5b50610694600480360381019061068f9190613899565b61185c565b6040516106a191906140c8565b60405180910390f35b3480156106b657600080fd5b506106bf6118d8565b6040516106cc91906144e5565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906137c5565b6118de565b005b34801561070a57600080fd5b506107256004803603810190610720919061362f565b611977565b6040516107329190614068565b60405180910390f35b61075560048036038101906107509190613899565b611a0b565b005b34801561076357600080fd5b5061077e60048036038101906107799190613602565b611cdf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c357506108c282611dd7565b5b9050919050565b6060600180546108d9906147d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610905906147d6565b80156109525780601f1061092757610100808354040283529160200191610952565b820191906000526020600020905b81548152906001019060200180831161093557829003601f168201915b5050505050905090565b600061096782611e41565b6109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d9061448a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c60009054906101000a900460ff1681565b60006109ff82610ffb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679061434a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8f611e4e565b73ffffffffffffffffffffffffffffffffffffffff161480610abe5750610abd81610ab8611e4e565b611977565b5b610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061420a565b60405180910390fd5b610b08838383611e56565b505050565b60008054905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b610b6d838383611f08565b505050565b6000610b7d836110d1565b8210610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb59061410a565b60405180910390fd5b6000610bc8610b0d565b905060008060005b83811015610d2e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cc257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d1a5786841415610d0b578195505050505050610d6a565b8380610d1690614839565b9450505b508080610d2690614839565b915050610bd0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061440a565b60405180910390fd5b92915050565b610d8b83838360405180602001604052806000815250611800565b505050565b6000610d9a610b0d565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061418a565b60405180910390fd5b819050919050565b610deb611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610e0961126c565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906142aa565b60405180910390fd5b8181600d9190610e709291906133a0565b505050565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b610ec7611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610ee561126c565b73ffffffffffffffffffffffffffffffffffffffff1614610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f32906142aa565b60405180910390fd5b600b5481600a6000828254610f5091906145f4565b9250508190551115610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061442a565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fe691906145f4565b92505081905550610ff782826124af565b5050565b6000611006826124cd565b600001519050919050565b611019611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661103761126c565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906142aa565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111399061424a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111c2611e4e565b73ffffffffffffffffffffffffffffffffffffffff166111e061126c565b73ffffffffffffffffffffffffffffffffffffffff1614611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d906142aa565b60405180910390fd5b6112406000612628565b565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61129e613426565b6112a7826124cd565b9050919050565b6060600280546112bd906147d6565b80601f01602080910402602001604051908101604052809291908181526020018280546112e9906147d6565b80156113365780601f1061130b57610100808354040283529160200191611336565b820191906000526020600020905b81548152906001019060200180831161131957829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461137957600080fd5b6008548111156113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061446a565b60405180910390fd5b6115e06113c9610b0d565b8201111561140c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611403906142ea565b60405180910390fd5b600c60009054906101000a900460ff1661145b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114529061444a565b60405180910390fd5b6114853360405160200161146f9190613f91565b60405160208183030381529060405284846126ee565b6114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906143ca565b60405180910390fd5b600954601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611510610b0d565b01031115611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a906144aa565b60405180910390fd5b600284600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540111156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d29061422a565b60405180910390fd5b83600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461162991906145f4565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061167933856124af565b50505050565b611687611e4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec9061430a565b60405180910390fd5b8060066000611702611e4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117af611e4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f49190614068565b60405180910390a35050565b61180b848484611f08565b611817848484846127af565b611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061438a565b60405180910390fd5b50505050565b606061186782611e41565b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d906142ca565b60405180910390fd5b600d6118b183612946565b6040516020016118c2929190613fac565b6040516020818303038152906040529050919050565b6115e081565b6118e6611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661190461126c565b73ffffffffffffffffffffffffffffffffffffffff161461195a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611951906142aa565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600854811115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a809061446a565b60405180910390fd5b6115e0611a94610b0d565b82011115611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace906142ea565b60405180910390fd5b600c60009054906101000a900460ff16611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d9061444a565b60405180910390fd5b600954601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611b72610b0d565b01031115611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac906144aa565b60405180910390fd5b600182600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c34906141aa565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c8b91906145f4565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611cdb33836124af565b5050565b611ce7611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611d0561126c565b73ffffffffffffffffffffffffffffffffffffffff1614611d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d52906142aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc29061414a565b60405180910390fd5b611dd481612628565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f13826124cd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f3a611e4e565b73ffffffffffffffffffffffffffffffffffffffff161480611f965750611f5f611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611f7e8461095c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fb25750611fb18260000151611fac611e4e565b611977565b5b905080611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb9061432a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d9061428a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906141ca565b60405180910390fd5b6120e38585856001612aa7565b6120f36000848460000151611e56565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122f991906145f4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561243f5761236f81611e41565b1561243e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a78686866001612aad565b505050505050565b6124c9828260405180602001604052806000815250612ab3565b5050565b6124d5613426565b6124de82611e41565b61251d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125149061416a565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260f578092505050612623565b50808061261b906147ac565b915050612523565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661278f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127818780519060200120612f72565b612fa290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b60006127d08473ffffffffffffffffffffffffffffffffffffffff16612fc9565b15612939578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f9611e4e565b8786866040518563ffffffff1660e01b815260040161281b949392919061401c565b602060405180830381600087803b15801561283557600080fd5b505af192505050801561286657506040513d601f19601f82011682018060405250810190612863919061381f565b60015b6128e9573d8060008114612896576040519150601f19603f3d011682016040523d82523d6000602084013e61289b565b606091505b506000815114156128e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d89061438a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061293e565b600190505b949350505050565b6060600082141561298e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aa2565b600082905060005b600082146129c05780806129a990614839565b915050600a826129b9919061464a565b9150612996565b60008167ffffffffffffffff8111156129dc576129db6149cc565b5b6040519080825280601f01601f191660200182016040528015612a0e5781602001600182028036833780820191505090505b5090505b60008514612a9b57600182612a27919061467b565b9150600a85612a3691906148b0565b6030612a4291906145f4565b60f81b818381518110612a5857612a5761499d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a94919061464a565b9450612a12565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b20906143ea565b60405180910390fd5b612b3281611e41565b15612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b69906143aa565b60405180910390fd5b60008311612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac9061436a565b60405180910390fd5b612bc26000858386612aa7565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612cbf91906145ae565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ce691906145ae565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612f5557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ef560008884886127af565b612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b9061438a565b60405180910390fd5b8180612f3f90614839565b9250508080612f4d90614839565b915050612e84565b5080600081905550612f6a6000878588612aad565b505050505050565b600081604051602001612f859190613fdb565b604051602081830303815290604052805190602001209050919050565b6000806000612fb18585612fdc565b91509150612fbe8161305f565b819250505092915050565b600080823b905060008111915050919050565b60008060418351141561301e5760008060006020860151925060408601519150606086015160001a905061301287828585613234565b94509450505050613058565b60408351141561304f576000806020850151915060408501519050613044868383613341565b935093505050613058565b60006002915091505b9250929050565b600060048111156130735761307261493f565b5b8160048111156130865761308561493f565b5b141561309157613231565b600160048111156130a5576130a461493f565b5b8160048111156130b8576130b761493f565b5b14156130f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f0906140ea565b60405180910390fd5b6002600481111561310d5761310c61493f565b5b8160048111156131205761311f61493f565b5b1415613161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131589061412a565b60405180910390fd5b600360048111156131755761317461493f565b5b8160048111156131885761318761493f565b5b14156131c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c0906141ea565b60405180910390fd5b6004808111156131dc576131db61493f565b5b8160048111156131ef576131ee61493f565b5b1415613230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132279061426a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561326f576000600391509150613338565b601b8560ff16141580156132875750601c8560ff1614155b15613299576000600491509150613338565b6000600187878787604051600081526020016040526040516132be9493929190614083565b6020604051602081039080840390855afa1580156132e0573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561332f57600060019250925050613338565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61338491906145f4565b905061339287828885613234565b935093505050935093915050565b8280546133ac906147d6565b90600052602060002090601f0160209004810192826133ce5760008555613415565b82601f106133e757803560ff1916838001178555613415565b82800160010185558215613415579182015b828111156134145782358255916020019190600101906133f9565b5b5090506134229190613460565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613479576000816000905550600101613461565b5090565b600061349061348b84614525565b614500565b9050828152602081018484840111156134ac576134ab614a0a565b5b6134b784828561476a565b509392505050565b6000813590506134ce81615278565b92915050565b6000813590506134e38161528f565b92915050565b6000813590506134f8816152a6565b92915050565b60008151905061350d816152a6565b92915050565b60008083601f84011261352957613528614a00565b5b8235905067ffffffffffffffff811115613546576135456149fb565b5b60208301915083600182028301111561356257613561614a05565b5b9250929050565b600082601f83011261357e5761357d614a00565b5b813561358e84826020860161347d565b91505092915050565b60008083601f8401126135ad576135ac614a00565b5b8235905067ffffffffffffffff8111156135ca576135c96149fb565b5b6020830191508360018202830111156135e6576135e5614a05565b5b9250929050565b6000813590506135fc816152bd565b92915050565b60006020828403121561361857613617614a14565b5b6000613626848285016134bf565b91505092915050565b6000806040838503121561364657613645614a14565b5b6000613654858286016134bf565b9250506020613665858286016134bf565b9150509250929050565b60008060006060848603121561368857613687614a14565b5b6000613696868287016134bf565b93505060206136a7868287016134bf565b92505060406136b8868287016135ed565b9150509250925092565b600080600080608085870312156136dc576136db614a14565b5b60006136ea878288016134bf565b94505060206136fb878288016134bf565b935050604061370c878288016135ed565b925050606085013567ffffffffffffffff81111561372d5761372c614a0f565b5b61373987828801613569565b91505092959194509250565b6000806040838503121561375c5761375b614a14565b5b600061376a858286016134bf565b925050602061377b858286016134d4565b9150509250929050565b6000806040838503121561379c5761379b614a14565b5b60006137aa858286016134bf565b92505060206137bb858286016135ed565b9150509250929050565b6000602082840312156137db576137da614a14565b5b60006137e9848285016134d4565b91505092915050565b60006020828403121561380857613807614a14565b5b6000613816848285016134e9565b91505092915050565b60006020828403121561383557613834614a14565b5b6000613843848285016134fe565b91505092915050565b6000806020838503121561386357613862614a14565b5b600083013567ffffffffffffffff81111561388157613880614a0f565b5b61388d85828601613597565b92509250509250929050565b6000602082840312156138af576138ae614a14565b5b60006138bd848285016135ed565b91505092915050565b6000806000604084860312156138df576138de614a14565b5b60006138ed868287016135ed565b935050602084013567ffffffffffffffff81111561390e5761390d614a0f565b5b61391a86828701613513565b92509250509250925092565b61392f816146af565b82525050565b61393e816146af565b82525050565b613955613950826146af565b614882565b82525050565b613964816146c1565b82525050565b613973816146cd565b82525050565b61398a613985826146cd565b614894565b82525050565b600061399b8261456b565b6139a58185614581565b93506139b5818560208601614779565b6139be81614a19565b840191505092915050565b60006139d482614576565b6139de8185614592565b93506139ee818560208601614779565b6139f781614a19565b840191505092915050565b6000613a0d82614576565b613a1781856145a3565b9350613a27818560208601614779565b80840191505092915050565b60008154613a40816147d6565b613a4a81866145a3565b94506001821660008114613a655760018114613a7657613aa9565b60ff19831686528186019350613aa9565b613a7f85614556565b60005b83811015613aa157815481890152600182019150602081019050613a82565b838801955050505b50505092915050565b6000613abf601883614592565b9150613aca82614a37565b602082019050919050565b6000613ae2602283614592565b9150613aed82614a60565b604082019050919050565b6000613b05601f83614592565b9150613b1082614aaf565b602082019050919050565b6000613b28601c836145a3565b9150613b3382614ad8565b601c82019050919050565b6000613b4b602683614592565b9150613b5682614b01565b604082019050919050565b6000613b6e602a83614592565b9150613b7982614b50565b604082019050919050565b6000613b91602383614592565b9150613b9c82614b9f565b604082019050919050565b6000613bb4601b83614592565b9150613bbf82614bee565b602082019050919050565b6000613bd7602583614592565b9150613be282614c17565b604082019050919050565b6000613bfa602283614592565b9150613c0582614c66565b604082019050919050565b6000613c1d603983614592565b9150613c2882614cb5565b604082019050919050565b6000613c40601c83614592565b9150613c4b82614d04565b602082019050919050565b6000613c63602b83614592565b9150613c6e82614d2d565b604082019050919050565b6000613c86602283614592565b9150613c9182614d7c565b604082019050919050565b6000613ca9602683614592565b9150613cb482614dcb565b604082019050919050565b6000613ccc6005836145a3565b9150613cd782614e1a565b600582019050919050565b6000613cef602083614592565b9150613cfa82614e43565b602082019050919050565b6000613d12602f83614592565b9150613d1d82614e6c565b604082019050919050565b6000613d35601883614592565b9150613d4082614ebb565b602082019050919050565b6000613d58601a83614592565b9150613d6382614ee4565b602082019050919050565b6000613d7b603283614592565b9150613d8682614f0d565b604082019050919050565b6000613d9e602283614592565b9150613da982614f5c565b604082019050919050565b6000613dc1602383614592565b9150613dcc82614fab565b604082019050919050565b6000613de4603383614592565b9150613def82614ffa565b604082019050919050565b6000613e07601d83614592565b9150613e1282615049565b602082019050919050565b6000613e2a601a83614592565b9150613e3582615072565b602082019050919050565b6000613e4d602183614592565b9150613e588261509b565b604082019050919050565b6000613e70602e83614592565b9150613e7b826150ea565b604082019050919050565b6000613e93603483614592565b9150613e9e82615139565b604082019050919050565b6000613eb6601483614592565b9150613ec182615188565b602082019050919050565b6000613ed9602583614592565b9150613ee4826151b1565b604082019050919050565b6000613efc602d83614592565b9150613f0782615200565b604082019050919050565b6000613f1f602083614592565b9150613f2a8261524f565b602082019050919050565b604082016000820151613f4b6000850182613926565b506020820151613f5e6020850182613f73565b50505050565b613f6d8161473f565b82525050565b613f7c81614749565b82525050565b613f8b8161475d565b82525050565b6000613f9d8284613944565b60148201915081905092915050565b6000613fb88285613a33565b9150613fc48284613a02565b9150613fcf82613cbf565b91508190509392505050565b6000613fe682613b1b565b9150613ff28284613979565b60208201915081905092915050565b60006020820190506140166000830184613935565b92915050565b60006080820190506140316000830187613935565b61403e6020830186613935565b61404b6040830185613f64565b818103606083015261405d8184613990565b905095945050505050565b600060208201905061407d600083018461395b565b92915050565b6000608082019050614098600083018761396a565b6140a56020830186613f82565b6140b2604083018561396a565b6140bf606083018461396a565b95945050505050565b600060208201905081810360008301526140e281846139c9565b905092915050565b6000602082019050818103600083015261410381613ab2565b9050919050565b6000602082019050818103600083015261412381613ad5565b9050919050565b6000602082019050818103600083015261414381613af8565b9050919050565b6000602082019050818103600083015261416381613b3e565b9050919050565b6000602082019050818103600083015261418381613b61565b9050919050565b600060208201905081810360008301526141a381613b84565b9050919050565b600060208201905081810360008301526141c381613ba7565b9050919050565b600060208201905081810360008301526141e381613bca565b9050919050565b6000602082019050818103600083015261420381613bed565b9050919050565b6000602082019050818103600083015261422381613c10565b9050919050565b6000602082019050818103600083015261424381613c33565b9050919050565b6000602082019050818103600083015261426381613c56565b9050919050565b6000602082019050818103600083015261428381613c79565b9050919050565b600060208201905081810360008301526142a381613c9c565b9050919050565b600060208201905081810360008301526142c381613ce2565b9050919050565b600060208201905081810360008301526142e381613d05565b9050919050565b6000602082019050818103600083015261430381613d28565b9050919050565b6000602082019050818103600083015261432381613d4b565b9050919050565b6000602082019050818103600083015261434381613d6e565b9050919050565b6000602082019050818103600083015261436381613d91565b9050919050565b6000602082019050818103600083015261438381613db4565b9050919050565b600060208201905081810360008301526143a381613dd7565b9050919050565b600060208201905081810360008301526143c381613dfa565b9050919050565b600060208201905081810360008301526143e381613e1d565b9050919050565b6000602082019050818103600083015261440381613e40565b9050919050565b6000602082019050818103600083015261442381613e63565b9050919050565b6000602082019050818103600083015261444381613e86565b9050919050565b6000602082019050818103600083015261446381613ea9565b9050919050565b6000602082019050818103600083015261448381613ecc565b9050919050565b600060208201905081810360008301526144a381613eef565b9050919050565b600060208201905081810360008301526144c381613f12565b9050919050565b60006040820190506144df6000830184613f35565b92915050565b60006020820190506144fa6000830184613f64565b92915050565b600061450a61451b565b90506145168282614808565b919050565b6000604051905090565b600067ffffffffffffffff8211156145405761453f6149cc565b5b61454982614a19565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145b982614703565b91506145c483614703565b9250826fffffffffffffffffffffffffffffffff038211156145e9576145e86148e1565b5b828201905092915050565b60006145ff8261473f565b915061460a8361473f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561463f5761463e6148e1565b5b828201905092915050565b60006146558261473f565b91506146608361473f565b9250826146705761466f614910565b5b828204905092915050565b60006146868261473f565b91506146918361473f565b9250828210156146a4576146a36148e1565b5b828203905092915050565b60006146ba8261471f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561479757808201518184015260208101905061477c565b838111156147a6576000848401525b50505050565b60006147b78261473f565b915060008214156147cb576147ca6148e1565b5b600182039050919050565b600060028204905060018216806147ee57607f821691505b602082108114156148025761480161496e565b5b50919050565b61481182614a19565b810181811067ffffffffffffffff821117156148305761482f6149cc565b5b80604052505050565b60006148448261473f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614877576148766148e1565b5b600182019050919050565b600061488d8261489e565b9050919050565b6000819050919050565b60006148a982614a2a565b9050919050565b60006148bb8261473f565b91506148c68361473f565b9250826148d6576148d5614910565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2031204e46542e0000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2033204e4654732e00000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820696e207468652064657620726573657276652c206d60008201527f696e74206120736d616c6c657220616d6f756e74000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b615281816146af565b811461528c57600080fd5b50565b615298816146c1565b81146152a357600080fd5b50565b6152af816146d7565b81146152ba57600080fd5b50565b6152c68161473f565b81146152d157600080fd5b5056fea2646970667358221220e0eaf1b33a3e140d1973cadfc1fc8d4aaaa8d720d823a994f26cc74331a2e37964736f6c63430008070033

Deployed Bytecode Sourcemap

66702:4050:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45331:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46958:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48519:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67122:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48040:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43772:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69612:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49395:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44436:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49628:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43949:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70407:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69756:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67783:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46767:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70653:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45767:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41222:103;;;;;;;;;;;;;:::i;:::-;;70231:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69885:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47127:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68053:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48805:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49876:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69347:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66885:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70537:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49164:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68725:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41480:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45331:372;45433:4;45485:25;45470:40;;;:11;:40;;;;:105;;;;45542:33;45527:48;;;:11;:48;;;;45470:105;:172;;;;45607:35;45592:50;;;:11;:50;;;;45470:172;:225;;;;45659:36;45683:11;45659:23;:36::i;:::-;45470:225;45450:245;;45331:372;;;:::o;46958:100::-;47012:13;47045:5;47038:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46958:100;:::o;48519:214::-;48587:7;48615:16;48623:7;48615;:16::i;:::-;48607:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48701:15;:24;48717:7;48701:24;;;;;;;;;;;;;;;;;;;;;48694:31;;48519:214;;;:::o;67122:30::-;;;;;;;;;;;;;:::o;48040:413::-;48113:13;48129:24;48145:7;48129:15;:24::i;:::-;48113:40;;48178:5;48172:11;;:2;:11;;;;48164:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48273:5;48257:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48282:37;48299:5;48306:12;:10;:12::i;:::-;48282:16;:37::i;:::-;48257:62;48235:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;48417:28;48426:2;48430:7;48439:5;48417:8;:28::i;:::-;48102:351;48040:413;;:::o;43772:100::-;43825:7;43852:12;;43845:19;;43772:100;:::o;69612:136::-;69685:7;69711:12;:22;69724:8;69711:22;;;;;;;;;;;;;;;:29;;;69704:36;;69612:136;;;:::o;49395:162::-;49521:28;49531:4;49537:2;49541:7;49521:9;:28::i;:::-;49395:162;;;:::o;44436:823::-;44525:7;44561:16;44571:5;44561:9;:16::i;:::-;44553:5;:24;44545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44627:22;44652:13;:11;:13::i;:::-;44627:38;;44676:19;44710:25;44764:9;44759:426;44783:14;44779:1;:18;44759:426;;;44819:31;44853:11;:14;44865:1;44853:14;;;;;;;;;;;44819:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44912:1;44886:28;;:9;:14;;;:28;;;44882:103;;44955:9;:14;;;44935:34;;44882:103;45024:5;45003:26;;:17;:26;;;44999:175;;;45069:5;45054:11;:20;45050:77;;;45106:1;45099:8;;;;;;;;;45050:77;45145:13;;;;;:::i;:::-;;;;44999:175;44804:381;44799:3;;;;;:::i;:::-;;;;44759:426;;;;45195:56;;;;;;;;;;:::i;:::-;;;;;;;;44436:823;;;;;:::o;49628:177::-;49758:39;49775:4;49781:2;49785:7;49758:39;;;;;;;;;;;;:16;:39::i;:::-;49628:177;;;:::o;43949:187::-;44016:7;44052:13;:11;:13::i;:::-;44044:5;:21;44036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44123:5;44116:12;;43949:187;;;:::o;70407:114::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70502:11:::1;;70486:13;:27;;;;;;;:::i;:::-;;70407:114:::0;;:::o;69756:121::-;69812:7;69838:12;:24;69851:10;69838:24;;;;;;;;;;;;;;;:31;;;69831:38;;69756:121;:::o;67783:262::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67893:10:::1;;67881:7;67868:9;;:20;;;;;;;:::i;:::-;;;;;;;67867:36;;67859:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;67997:7;67971:10;:22;67982:10;67971:22;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;68015:22;68025:2;68029:7;68015:9;:22::i;:::-;67783:262:::0;;:::o;46767:124::-;46831:7;46858:20;46870:7;46858:11;:20::i;:::-;:25;;;46851:32;;46767:124;;;:::o;70653:96::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70731:10:::1;70722:6;;:19;;;;;;;;;;;;;;;;;;70653:96:::0;:::o;45767:221::-;45831:7;45876:1;45859:19;;:5;:19;;;;45851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45952:12;:19;45965:5;45952:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;45944:36;;45937:43;;45767:221;;;:::o;41222:103::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41287:30:::1;41314:1;41287:18;:30::i;:::-;41222:103::o:0;70231:81::-;70272:7;70298:6;;;;;;;;;;;70291:13;;70231:81;:::o;40571:87::-;40617:7;40644:6;;;;;;;;;;;40637:13;;40571:87;:::o;69885:135::-;69951:21;;:::i;:::-;69992:20;70004:7;69992:11;:20::i;:::-;69985:27;;69885:135;;;:::o;47127:104::-;47183:13;47216:7;47209:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47127:104;:::o;68053:664::-;68145:7;67464:10;67451:23;;:9;:23;;;67443:32;;;;;;67509:14;;67498:7;:25;;67490:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66921:4;67598:13;:11;:13::i;:::-;67588:7;:23;:36;;67580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68198:10:::1;;;;;;;;;;;68190:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;68256:56;68289:10;68272:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;68302:9;;68256:15;:56::i;:::-;68248:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68418:14;;68392:10;:22;68403:10;68392:22;;;;;;;;;;;;;;;;68382:7;68366:13;:11;:13::i;:::-;:23;:48;:66;;68358:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;68537:1;68526:7;68492:12;:24;68505:10;68492:24;;;;;;;;;;;;;;;:31;;;:41;:46;;68484:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;68661:7;68627:12;:24;68640:10;68627:24;;;;;;;;;;;;;;;:31;;;:41;;;;:::i;:::-;68593:12;:24;68606:10;68593:24;;;;;;;;;;;;;;;:31;;:75;;;;68679:30;68689:10;68701:7;68679:9;:30::i;:::-;68053:664:::0;;;;:::o;48805:288::-;48912:12;:10;:12::i;:::-;48900:24;;:8;:24;;;;48892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49013:8;48968:18;:32;48987:12;:10;:12::i;:::-;48968:32;;;;;;;;;;;;;;;:42;49001:8;48968:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49066:8;49037:48;;49052:12;:10;:12::i;:::-;49037:48;;;49076:8;49037:48;;;;;;:::i;:::-;;;;;;;;48805:288;;:::o;49876:355::-;50035:28;50045:4;50051:2;50055:7;50035:9;:28::i;:::-;50096:48;50119:4;50125:2;50129:7;50138:5;50096:22;:48::i;:::-;50074:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;49876:355;;;;:::o;69347:257::-;69408:13;69442:16;69450:7;69442;:16::i;:::-;69434:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;69552:13;69567:18;:7;:16;:18::i;:::-;69535:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69521:75;;69347:257;;;:::o;66885:40::-;66921:4;66885:40;:::o;70537:108::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70623:14:::1;70610:10;;:27;;;;;;;;;;;;;;;;;;70537:108:::0;:::o;49164:164::-;49261:4;49285:18;:25;49304:5;49285:25;;;;;;;;;;;;;;;:35;49311:8;49285:35;;;;;;;;;;;;;;;;;;;;;;;;;49278:42;;49164:164;;;;:::o;68725:524::-;68788:7;67464:10;67451:23;;:9;:23;;;67443:32;;;;;;67509:14;;67498:7;:25;;67490:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66921:4;67598:13;:11;:13::i;:::-;67588:7;:23;:36;;67580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68841:10:::1;;;;;;;;;;;68833:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;68951:14;;68925:10;:22;68936:10;68925:22;;;;;;;;;;;;;;;;68915:7;68899:13;:11;:13::i;:::-;:23;:48;:66;;68891:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;69070:1;69059:7;69025:12;:24;69038:10;69025:24;;;;;;;;;;;;;;;:31;;;:41;:46;;69017:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;69193:7;69159:12;:24;69172:10;69159:24;;;;;;;;;;;;;;;:31;;;:41;;;;:::i;:::-;69125:12;:24;69138:10;69125:24;;;;;;;;;;;;;;;:31;;:75;;;;69211:30;69221:10;69233:7;69211:9;:30::i;:::-;68725:524:::0;;:::o;41480:201::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41589:1:::1;41569:22;;:8;:22;;;;41561:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41645:28;41664:8;41645:18;:28::i;:::-;41480:201:::0;:::o;918:157::-;1003:4;1042:25;1027:40;;;:11;:40;;;;1020:47;;918:157;;;:::o;50486:111::-;50543:4;50577:12;;50567:7;:22;50560:29;;50486:111;;;:::o;1648:98::-;1701:7;1728:10;1721:17;;1648:98;:::o;54530:196::-;54672:2;54645:15;:24;54661:7;54645:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54710:7;54706:2;54690:28;;54699:5;54690:28;;;;;;;;;;;;54530:196;;;:::o;52629:1783::-;52744:35;52782:20;52794:7;52782:11;:20::i;:::-;52744:58;;52815:22;52857:13;:18;;;52841:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52916:12;:10;:12::i;:::-;52892:36;;:20;52904:7;52892:11;:20::i;:::-;:36;;;52841:87;:154;;;;52945:50;52962:13;:18;;;52982:12;:10;:12::i;:::-;52945:16;:50::i;:::-;52841:154;52815:181;;53017:17;53009:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53132:4;53110:26;;:13;:18;;;:26;;;53102:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53212:1;53198:16;;:2;:16;;;;53190:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53269:43;53291:4;53297:2;53301:7;53310:1;53269:21;:43::i;:::-;53377:49;53394:1;53398:7;53407:13;:18;;;53377:8;:49::i;:::-;53661:1;53631:12;:18;53644:4;53631:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53705:1;53677:12;:16;53690:2;53677:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53753:43;;;;;;;;53768:2;53753:43;;;;;;53779:15;53753:43;;;;;53730:11;:20;53742:7;53730:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54036:19;54068:1;54058:7;:11;;;;:::i;:::-;54036:33;;54125:1;54084:43;;:11;:24;54096:11;54084:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;54080:227;;;54148:20;54156:11;54148:7;:20::i;:::-;54144:152;;;54216:64;;;;;;;;54231:13;:18;;;54216:64;;;;;;54251:13;:28;;;54216:64;;;;;54189:11;:24;54201:11;54189:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54144:152;54080:227;54343:7;54339:2;54324:27;;54333:4;54324:27;;;;;;;;;;;;54362:42;54383:4;54389:2;54393:7;54402:1;54362:20;:42::i;:::-;52733:1679;;;52629:1783;;;:::o;50605:104::-;50674:27;50684:2;50688:8;50674:27;;;;;;;;;;;;:9;:27::i;:::-;50605:104;;:::o;46233:472::-;46294:21;;:::i;:::-;46336:16;46344:7;46336;:16::i;:::-;46328:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46417:12;46432:7;46417:22;;46412:216;46466:31;46500:11;:17;46512:4;46500:17;;;;;;;;;;;46466:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46562:1;46536:28;;:9;:14;;;:28;;;46532:85;;46592:9;46585:16;;;;;;46532:85;46451:177;46443:6;;;;;:::i;:::-;;;;46412:216;;46233:472;;;;:::o;41841:191::-;41915:16;41934:6;;;;;;;;;;;41915:25;;41960:8;41951:6;;:17;;;;;;;;;;;;;;;;;;42015:8;41984:40;;42005:8;41984:40;;;;;;;;;;;;41904:128;41841:191;:::o;70028:195::-;70120:4;70208:6;;;;;;;;;;;70145:69;;:59;70194:9;;70145:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;70155:4;70145:15;;;;;;:38;:40::i;:::-;:48;;:59;;;;:::i;:::-;:69;;;70137:78;;70028:195;;;;;:::o;55291:804::-;55446:4;55467:15;:2;:13;;;:15::i;:::-;55463:625;;;55519:2;55503:36;;;55540:12;:10;:12::i;:::-;55554:4;55560:7;55569:5;55503:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55499:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55766:1;55749:6;:13;:18;55745:273;;;55792:61;;;;;;;;;;:::i;:::-;;;;;;;;55745:273;55968:6;55962:13;55953:6;55949:2;55945:15;55938:38;55499:534;55636:45;;;55626:55;;;:6;:55;;;;55619:62;;;;;55463:625;56072:4;56065:11;;55291:804;;;;;;;:::o;7933:723::-;7989:13;8219:1;8210:5;:10;8206:53;;;8237:10;;;;;;;;;;;;;;;;;;;;;8206:53;8269:12;8284:5;8269:20;;8300:14;8325:78;8340:1;8332:4;:9;8325:78;;8358:8;;;;;:::i;:::-;;;;8389:2;8381:10;;;;;:::i;:::-;;;8325:78;;;8413:19;8445:6;8435:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:39;;8463:154;8479:1;8470:5;:10;8463:154;;8507:1;8497:11;;;;;:::i;:::-;;;8574:2;8566:5;:10;;;;:::i;:::-;8553:2;:24;;;;:::i;:::-;8540:39;;8523:6;8530;8523:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8603:2;8594:11;;;;;:::i;:::-;;;8463:154;;;8641:6;8627:21;;;;;7933:723;;;;:::o;56583:159::-;;;;;:::o;57154:158::-;;;;;:::o;50986:1389::-;51109:20;51132:12;;51109:35;;51177:1;51163:16;;:2;:16;;;;51155:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51362:21;51370:12;51362:7;:21::i;:::-;51361:22;51353:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51447:1;51436:8;:12;51428:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51501:61;51531:1;51535:2;51539:12;51553:8;51501:21;:61::i;:::-;51575:30;51608:12;:16;51621:2;51608:16;;;;;;;;;;;;;;;51575:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51654:135;;;;;;;;51710:8;51680:11;:19;;;:39;;;;:::i;:::-;51654:135;;;;;;51769:8;51734:11;:24;;;:44;;;;:::i;:::-;51654:135;;;;;51635:12;:16;51648:2;51635:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51828:43;;;;;;;;51843:2;51828:43;;;;;;51854:15;51828:43;;;;;51800:11;:25;51812:12;51800:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51884:20;51907:12;51884:35;;51937:9;51932:325;51956:8;51952:1;:12;51932:325;;;52016:12;52012:2;51991:38;;52008:1;51991:38;;;;;;;;;;;;52070:59;52101:1;52105:2;52109:12;52123:5;52070:22;:59::i;:::-;52044:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;52231:14;;;;;:::i;:::-;;;;51966:3;;;;;:::i;:::-;;;;51932:325;;;;52284:12;52269;:27;;;;52307:60;52336:1;52340:2;52344:12;52358:8;52307:20;:60::i;:::-;51098:1277;;;50986:1389;;;:::o;65387:269::-;65456:7;65642:4;65589:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;65579:69;;;;;;65572:76;;65387:269;;;:::o;61585:231::-;61663:7;61684:17;61703:18;61725:27;61736:4;61742:9;61725:10;:27::i;:::-;61683:69;;;;61763:18;61775:5;61763:11;:18::i;:::-;61799:9;61792:16;;;;61585:231;;;;:::o;31542:387::-;31602:4;31810:12;31877:7;31865:20;31857:28;;31920:1;31913:4;:8;31906:15;;;31542:387;;;:::o;59475:1308::-;59556:7;59565:12;59810:2;59790:9;:16;:22;59786:990;;;59829:9;59853;59877:7;60086:4;60075:9;60071:20;60065:27;60060:32;;60136:4;60125:9;60121:20;60115:27;60110:32;;60194:4;60183:9;60179:20;60173:27;60170:1;60165:36;60160:41;;60237:25;60248:4;60254:1;60257;60260;60237:10;:25::i;:::-;60230:32;;;;;;;;;59786:990;60304:2;60284:9;:16;:22;60280:496;;;60323:9;60347:10;60559:4;60548:9;60544:20;60538:27;60533:32;;60610:4;60599:9;60595:20;60589:27;60583:33;;60652:23;60663:4;60669:1;60672:2;60652:10;:23::i;:::-;60645:30;;;;;;;;60280:496;60724:1;60728:35;60708:56;;;;59475:1308;;;;;;:::o;57746:643::-;57824:20;57815:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;57811:571;;;57861:7;;57811:571;57922:29;57913:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;57909:473;;;57968:34;;;;;;;;;;:::i;:::-;;;;;;;;57909:473;58033:35;58024:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;58020:362;;;58085:41;;;;;;;;;;:::i;:::-;;;;;;;;58020:362;58157:30;58148:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;58144:238;;;58204:44;;;;;;;;;;:::i;:::-;;;;;;;;58144:238;58279:30;58270:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;58266:116;;;58326:44;;;;;;;;;;:::i;:::-;;;;;;;;58266:116;57746:643;;:::o;63037:1632::-;63168:7;63177:12;64102:66;64097:1;64089:10;;:79;64085:163;;;64201:1;64205:30;64185:51;;;;;;64085:163;64267:2;64262:1;:7;;;;:18;;;;;64278:2;64273:1;:7;;;;64262:18;64258:102;;;64313:1;64317:30;64297:51;;;;;;64258:102;64457:14;64474:24;64484:4;64490:1;64493;64496;64474:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64457:41;;64531:1;64513:20;;:6;:20;;;64509:103;;;64566:1;64570:29;64550:50;;;;;;;64509:103;64632:6;64640:20;64624:37;;;;;63037:1632;;;;;;;;:::o;62079:344::-;62193:7;62202:12;62227:9;62252:66;62244:75;;62239:2;:80;62227:92;;62330:7;62369:2;62362:3;62355:2;62347:11;;:18;;62346:25;;;;:::i;:::-;62330:42;;62390:25;62401:4;62407:1;62410;62413;62390:10;:25::i;:::-;62383:32;;;;;;62079:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:552::-;1067:8;1077:6;1127:3;1120:4;1112:6;1108:17;1104:27;1094:122;;1135:79;;:::i;:::-;1094:122;1248:6;1235:20;1225:30;;1278:18;1270:6;1267:30;1264:117;;;1300:79;;:::i;:::-;1264:117;1414:4;1406:6;1402:17;1390:29;;1468:3;1460:4;1452:6;1448:17;1438:8;1434:32;1431:41;1428:128;;;1475:79;;:::i;:::-;1428:128;1010:552;;;;;:::o;1581:338::-;1636:5;1685:3;1678:4;1670:6;1666:17;1662:27;1652:122;;1693:79;;:::i;:::-;1652:122;1810:6;1797:20;1835:78;1909:3;1901:6;1894:4;1886:6;1882:17;1835:78;:::i;:::-;1826:87;;1642:277;1581:338;;;;:::o;1939:553::-;1997:8;2007:6;2057:3;2050:4;2042:6;2038:17;2034:27;2024:122;;2065:79;;:::i;:::-;2024:122;2178:6;2165:20;2155:30;;2208:18;2200:6;2197:30;2194:117;;;2230:79;;:::i;:::-;2194:117;2344:4;2336:6;2332:17;2320:29;;2398:3;2390:4;2382:6;2378:17;2368:8;2364:32;2361:41;2358:128;;;2405:79;;:::i;:::-;2358:128;1939:553;;;;;:::o;2498:139::-;2544:5;2582:6;2569:20;2560:29;;2598:33;2625:5;2598:33;:::i;:::-;2498:139;;;;:::o;2643:329::-;2702:6;2751:2;2739:9;2730:7;2726:23;2722:32;2719:119;;;2757:79;;:::i;:::-;2719:119;2877:1;2902:53;2947:7;2938:6;2927:9;2923:22;2902:53;:::i;:::-;2892:63;;2848:117;2643:329;;;;:::o;2978:474::-;3046:6;3054;3103:2;3091:9;3082:7;3078:23;3074:32;3071:119;;;3109:79;;:::i;:::-;3071:119;3229:1;3254:53;3299:7;3290:6;3279:9;3275:22;3254:53;:::i;:::-;3244:63;;3200:117;3356:2;3382:53;3427:7;3418:6;3407:9;3403:22;3382:53;:::i;:::-;3372:63;;3327:118;2978:474;;;;;:::o;3458:619::-;3535:6;3543;3551;3600:2;3588:9;3579:7;3575:23;3571:32;3568:119;;;3606:79;;:::i;:::-;3568:119;3726:1;3751:53;3796:7;3787:6;3776:9;3772:22;3751:53;:::i;:::-;3741:63;;3697:117;3853:2;3879:53;3924:7;3915:6;3904:9;3900:22;3879:53;:::i;:::-;3869:63;;3824:118;3981:2;4007:53;4052:7;4043:6;4032:9;4028:22;4007:53;:::i;:::-;3997:63;;3952:118;3458:619;;;;;:::o;4083:943::-;4178:6;4186;4194;4202;4251:3;4239:9;4230:7;4226:23;4222:33;4219:120;;;4258:79;;:::i;:::-;4219:120;4378:1;4403:53;4448:7;4439:6;4428:9;4424:22;4403:53;:::i;:::-;4393:63;;4349:117;4505:2;4531:53;4576:7;4567:6;4556:9;4552:22;4531:53;:::i;:::-;4521:63;;4476:118;4633:2;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4604:118;4789:2;4778:9;4774:18;4761:32;4820:18;4812:6;4809:30;4806:117;;;4842:79;;:::i;:::-;4806:117;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4732:287;4083:943;;;;;;;:::o;5032:468::-;5097:6;5105;5154:2;5142:9;5133:7;5129:23;5125:32;5122:119;;;5160:79;;:::i;:::-;5122:119;5280:1;5305:53;5350:7;5341:6;5330:9;5326:22;5305:53;:::i;:::-;5295:63;;5251:117;5407:2;5433:50;5475:7;5466:6;5455:9;5451:22;5433:50;:::i;:::-;5423:60;;5378:115;5032:468;;;;;:::o;5506:474::-;5574:6;5582;5631:2;5619:9;5610:7;5606:23;5602:32;5599:119;;;5637:79;;:::i;:::-;5599:119;5757:1;5782:53;5827:7;5818:6;5807:9;5803:22;5782:53;:::i;:::-;5772:63;;5728:117;5884:2;5910:53;5955:7;5946:6;5935:9;5931:22;5910:53;:::i;:::-;5900:63;;5855:118;5506:474;;;;;:::o;5986:323::-;6042:6;6091:2;6079:9;6070:7;6066:23;6062:32;6059:119;;;6097:79;;:::i;:::-;6059:119;6217:1;6242:50;6284:7;6275:6;6264:9;6260:22;6242:50;:::i;:::-;6232:60;;6188:114;5986:323;;;;:::o;6315:327::-;6373:6;6422:2;6410:9;6401:7;6397:23;6393:32;6390:119;;;6428:79;;:::i;:::-;6390:119;6548:1;6573:52;6617:7;6608:6;6597:9;6593:22;6573:52;:::i;:::-;6563:62;;6519:116;6315:327;;;;:::o;6648:349::-;6717:6;6766:2;6754:9;6745:7;6741:23;6737:32;6734:119;;;6772:79;;:::i;:::-;6734:119;6892:1;6917:63;6972:7;6963:6;6952:9;6948:22;6917:63;:::i;:::-;6907:73;;6863:127;6648:349;;;;:::o;7003:529::-;7074:6;7082;7131:2;7119:9;7110:7;7106:23;7102:32;7099:119;;;7137:79;;:::i;:::-;7099:119;7285:1;7274:9;7270:17;7257:31;7315:18;7307:6;7304:30;7301:117;;;7337:79;;:::i;:::-;7301:117;7450:65;7507:7;7498:6;7487:9;7483:22;7450:65;:::i;:::-;7432:83;;;;7228:297;7003:529;;;;;:::o;7538:329::-;7597:6;7646:2;7634:9;7625:7;7621:23;7617:32;7614:119;;;7652:79;;:::i;:::-;7614:119;7772:1;7797:53;7842:7;7833:6;7822:9;7818:22;7797:53;:::i;:::-;7787:63;;7743:117;7538:329;;;;:::o;7873:672::-;7952:6;7960;7968;8017:2;8005:9;7996:7;7992:23;7988:32;7985:119;;;8023:79;;:::i;:::-;7985:119;8143:1;8168:53;8213:7;8204:6;8193:9;8189:22;8168:53;:::i;:::-;8158:63;;8114:117;8298:2;8287:9;8283:18;8270:32;8329:18;8321:6;8318:30;8315:117;;;8351:79;;:::i;:::-;8315:117;8464:64;8520:7;8511:6;8500:9;8496:22;8464:64;:::i;:::-;8446:82;;;;8241:297;7873:672;;;;;:::o;8551:108::-;8628:24;8646:5;8628:24;:::i;:::-;8623:3;8616:37;8551:108;;:::o;8665:118::-;8752:24;8770:5;8752:24;:::i;:::-;8747:3;8740:37;8665:118;;:::o;8789:157::-;8894:45;8914:24;8932:5;8914:24;:::i;:::-;8894:45;:::i;:::-;8889:3;8882:58;8789:157;;:::o;8952:109::-;9033:21;9048:5;9033:21;:::i;:::-;9028:3;9021:34;8952:109;;:::o;9067:118::-;9154:24;9172:5;9154:24;:::i;:::-;9149:3;9142:37;9067:118;;:::o;9191:157::-;9296:45;9316:24;9334:5;9316:24;:::i;:::-;9296:45;:::i;:::-;9291:3;9284:58;9191:157;;:::o;9354:360::-;9440:3;9468:38;9500:5;9468:38;:::i;:::-;9522:70;9585:6;9580:3;9522:70;:::i;:::-;9515:77;;9601:52;9646:6;9641:3;9634:4;9627:5;9623:16;9601:52;:::i;:::-;9678:29;9700:6;9678:29;:::i;:::-;9673:3;9669:39;9662:46;;9444:270;9354:360;;;;:::o;9720:364::-;9808:3;9836:39;9869:5;9836:39;:::i;:::-;9891:71;9955:6;9950:3;9891:71;:::i;:::-;9884:78;;9971:52;10016:6;10011:3;10004:4;9997:5;9993:16;9971:52;:::i;:::-;10048:29;10070:6;10048:29;:::i;:::-;10043:3;10039:39;10032:46;;9812:272;9720:364;;;;:::o;10090:377::-;10196:3;10224:39;10257:5;10224:39;:::i;:::-;10279:89;10361:6;10356:3;10279:89;:::i;:::-;10272:96;;10377:52;10422:6;10417:3;10410:4;10403:5;10399:16;10377:52;:::i;:::-;10454:6;10449:3;10445:16;10438:23;;10200:267;10090:377;;;;:::o;10497:845::-;10600:3;10637:5;10631:12;10666:36;10692:9;10666:36;:::i;:::-;10718:89;10800:6;10795:3;10718:89;:::i;:::-;10711:96;;10838:1;10827:9;10823:17;10854:1;10849:137;;;;11000:1;10995:341;;;;10816:520;;10849:137;10933:4;10929:9;10918;10914:25;10909:3;10902:38;10969:6;10964:3;10960:16;10953:23;;10849:137;;10995:341;11062:38;11094:5;11062:38;:::i;:::-;11122:1;11136:154;11150:6;11147:1;11144:13;11136:154;;;11224:7;11218:14;11214:1;11209:3;11205:11;11198:35;11274:1;11265:7;11261:15;11250:26;;11172:4;11169:1;11165:12;11160:17;;11136:154;;;11319:6;11314:3;11310:16;11303:23;;11002:334;;10816:520;;10604:738;;10497:845;;;;:::o;11348:366::-;11490:3;11511:67;11575:2;11570:3;11511:67;:::i;:::-;11504:74;;11587:93;11676:3;11587:93;:::i;:::-;11705:2;11700:3;11696:12;11689:19;;11348:366;;;:::o;11720:::-;11862:3;11883:67;11947:2;11942:3;11883:67;:::i;:::-;11876:74;;11959:93;12048:3;11959:93;:::i;:::-;12077:2;12072:3;12068:12;12061:19;;11720:366;;;:::o;12092:::-;12234:3;12255:67;12319:2;12314:3;12255:67;:::i;:::-;12248:74;;12331:93;12420:3;12331:93;:::i;:::-;12449:2;12444:3;12440:12;12433:19;;12092:366;;;:::o;12464:402::-;12624:3;12645:85;12727:2;12722:3;12645:85;:::i;:::-;12638:92;;12739:93;12828:3;12739:93;:::i;:::-;12857:2;12852:3;12848:12;12841:19;;12464:402;;;:::o;12872:366::-;13014:3;13035:67;13099:2;13094:3;13035:67;:::i;:::-;13028:74;;13111:93;13200:3;13111:93;:::i;:::-;13229:2;13224:3;13220:12;13213:19;;12872:366;;;:::o;13244:::-;13386:3;13407:67;13471:2;13466:3;13407:67;:::i;:::-;13400:74;;13483:93;13572:3;13483:93;:::i;:::-;13601:2;13596:3;13592:12;13585:19;;13244:366;;;:::o;13616:::-;13758:3;13779:67;13843:2;13838:3;13779:67;:::i;:::-;13772:74;;13855:93;13944:3;13855:93;:::i;:::-;13973:2;13968:3;13964:12;13957:19;;13616:366;;;:::o;13988:::-;14130:3;14151:67;14215:2;14210:3;14151:67;:::i;:::-;14144:74;;14227:93;14316:3;14227:93;:::i;:::-;14345:2;14340:3;14336:12;14329:19;;13988:366;;;:::o;14360:::-;14502:3;14523:67;14587:2;14582:3;14523:67;:::i;:::-;14516:74;;14599:93;14688:3;14599:93;:::i;:::-;14717:2;14712:3;14708:12;14701:19;;14360:366;;;:::o;14732:::-;14874:3;14895:67;14959:2;14954:3;14895:67;:::i;:::-;14888:74;;14971:93;15060:3;14971:93;:::i;:::-;15089:2;15084:3;15080:12;15073:19;;14732:366;;;:::o;15104:::-;15246:3;15267:67;15331:2;15326:3;15267:67;:::i;:::-;15260:74;;15343:93;15432:3;15343:93;:::i;:::-;15461:2;15456:3;15452:12;15445:19;;15104:366;;;:::o;15476:::-;15618:3;15639:67;15703:2;15698:3;15639:67;:::i;:::-;15632:74;;15715:93;15804:3;15715:93;:::i;:::-;15833:2;15828:3;15824:12;15817:19;;15476:366;;;:::o;15848:::-;15990:3;16011:67;16075:2;16070:3;16011:67;:::i;:::-;16004:74;;16087:93;16176:3;16087:93;:::i;:::-;16205:2;16200:3;16196:12;16189:19;;15848:366;;;:::o;16220:::-;16362:3;16383:67;16447:2;16442:3;16383:67;:::i;:::-;16376:74;;16459:93;16548:3;16459:93;:::i;:::-;16577:2;16572:3;16568:12;16561:19;;16220:366;;;:::o;16592:::-;16734:3;16755:67;16819:2;16814:3;16755:67;:::i;:::-;16748:74;;16831:93;16920:3;16831:93;:::i;:::-;16949:2;16944:3;16940:12;16933:19;;16592:366;;;:::o;16964:400::-;17124:3;17145:84;17227:1;17222:3;17145:84;:::i;:::-;17138:91;;17238:93;17327:3;17238:93;:::i;:::-;17356:1;17351:3;17347:11;17340:18;;16964:400;;;:::o;17370:366::-;17512:3;17533:67;17597:2;17592:3;17533:67;:::i;:::-;17526:74;;17609:93;17698:3;17609:93;:::i;:::-;17727:2;17722:3;17718:12;17711:19;;17370:366;;;:::o;17742:::-;17884:3;17905:67;17969:2;17964:3;17905:67;:::i;:::-;17898:74;;17981:93;18070:3;17981:93;:::i;:::-;18099:2;18094:3;18090:12;18083:19;;17742:366;;;:::o;18114:::-;18256:3;18277:67;18341:2;18336:3;18277:67;:::i;:::-;18270:74;;18353:93;18442:3;18353:93;:::i;:::-;18471:2;18466:3;18462:12;18455:19;;18114:366;;;:::o;18486:::-;18628:3;18649:67;18713:2;18708:3;18649:67;:::i;:::-;18642:74;;18725:93;18814:3;18725:93;:::i;:::-;18843:2;18838:3;18834:12;18827:19;;18486:366;;;:::o;18858:::-;19000:3;19021:67;19085:2;19080:3;19021:67;:::i;:::-;19014:74;;19097:93;19186:3;19097:93;:::i;:::-;19215:2;19210:3;19206:12;19199:19;;18858:366;;;:::o;19230:::-;19372:3;19393:67;19457:2;19452:3;19393:67;:::i;:::-;19386:74;;19469:93;19558:3;19469:93;:::i;:::-;19587:2;19582:3;19578:12;19571:19;;19230:366;;;:::o;19602:::-;19744:3;19765:67;19829:2;19824:3;19765:67;:::i;:::-;19758:74;;19841:93;19930:3;19841:93;:::i;:::-;19959:2;19954:3;19950:12;19943:19;;19602:366;;;:::o;19974:::-;20116:3;20137:67;20201:2;20196:3;20137:67;:::i;:::-;20130:74;;20213:93;20302:3;20213:93;:::i;:::-;20331:2;20326:3;20322:12;20315:19;;19974:366;;;:::o;20346:::-;20488:3;20509:67;20573:2;20568:3;20509:67;:::i;:::-;20502:74;;20585:93;20674:3;20585:93;:::i;:::-;20703:2;20698:3;20694:12;20687:19;;20346:366;;;:::o;20718:::-;20860:3;20881:67;20945:2;20940:3;20881:67;:::i;:::-;20874:74;;20957:93;21046:3;20957:93;:::i;:::-;21075:2;21070:3;21066:12;21059:19;;20718:366;;;:::o;21090:::-;21232:3;21253:67;21317:2;21312:3;21253:67;:::i;:::-;21246:74;;21329:93;21418:3;21329:93;:::i;:::-;21447:2;21442:3;21438:12;21431:19;;21090:366;;;:::o;21462:::-;21604:3;21625:67;21689:2;21684:3;21625:67;:::i;:::-;21618:74;;21701:93;21790:3;21701:93;:::i;:::-;21819:2;21814:3;21810:12;21803:19;;21462:366;;;:::o;21834:::-;21976:3;21997:67;22061:2;22056:3;21997:67;:::i;:::-;21990:74;;22073:93;22162:3;22073:93;:::i;:::-;22191:2;22186:3;22182:12;22175:19;;21834:366;;;:::o;22206:::-;22348:3;22369:67;22433:2;22428:3;22369:67;:::i;:::-;22362:74;;22445:93;22534:3;22445:93;:::i;:::-;22563:2;22558:3;22554:12;22547:19;;22206:366;;;:::o;22950:::-;23092:3;23113:67;23177:2;23172:3;23113:67;:::i;:::-;23106:74;;23189:93;23278:3;23189:93;:::i;:::-;23307:2;23302:3;23298:12;23291:19;;22950:366;;;:::o;23322:::-;23464:3;23485:67;23549:2;23544:3;23485:67;:::i;:::-;23478:74;;23561:93;23650:3;23561:93;:::i;:::-;23679:2;23674:3;23670:12;23663:19;;23322:366;;;:::o;23694:::-;23836:3;23857:67;23921:2;23916:3;23857:67;:::i;:::-;23850:74;;23933:93;24022:3;23933:93;:::i;:::-;24051:2;24046:3;24042:12;24035:19;;23694:366;;;:::o;24136:529::-;24297:4;24292:3;24288:14;24384:4;24377:5;24373:16;24367:23;24403:63;24460:4;24455:3;24451:14;24437:12;24403:63;:::i;:::-;24312:164;24568:4;24561:5;24557:16;24551:23;24587:61;24642:4;24637:3;24633:14;24619:12;24587:61;:::i;:::-;24486:172;24266:399;24136:529;;:::o;24671:118::-;24758:24;24776:5;24758:24;:::i;:::-;24753:3;24746:37;24671:118;;:::o;24795:105::-;24870:23;24887:5;24870:23;:::i;:::-;24865:3;24858:36;24795:105;;:::o;24906:112::-;24989:22;25005:5;24989:22;:::i;:::-;24984:3;24977:35;24906:112;;:::o;25024:256::-;25136:3;25151:75;25222:3;25213:6;25151:75;:::i;:::-;25251:2;25246:3;25242:12;25235:19;;25271:3;25264:10;;25024:256;;;;:::o;25286:695::-;25564:3;25586:92;25674:3;25665:6;25586:92;:::i;:::-;25579:99;;25695:95;25786:3;25777:6;25695:95;:::i;:::-;25688:102;;25807:148;25951:3;25807:148;:::i;:::-;25800:155;;25972:3;25965:10;;25286:695;;;;;:::o;25987:522::-;26200:3;26222:148;26366:3;26222:148;:::i;:::-;26215:155;;26380:75;26451:3;26442:6;26380:75;:::i;:::-;26480:2;26475:3;26471:12;26464:19;;26500:3;26493:10;;25987:522;;;;:::o;26515:222::-;26608:4;26646:2;26635:9;26631:18;26623:26;;26659:71;26727:1;26716:9;26712:17;26703:6;26659:71;:::i;:::-;26515:222;;;;:::o;26743:640::-;26938:4;26976:3;26965:9;26961:19;26953:27;;26990:71;27058:1;27047:9;27043:17;27034:6;26990:71;:::i;:::-;27071:72;27139:2;27128:9;27124:18;27115:6;27071:72;:::i;:::-;27153;27221:2;27210:9;27206:18;27197:6;27153:72;:::i;:::-;27272:9;27266:4;27262:20;27257:2;27246:9;27242:18;27235:48;27300:76;27371:4;27362:6;27300:76;:::i;:::-;27292:84;;26743:640;;;;;;;:::o;27389:210::-;27476:4;27514:2;27503:9;27499:18;27491:26;;27527:65;27589:1;27578:9;27574:17;27565:6;27527:65;:::i;:::-;27389:210;;;;:::o;27605:545::-;27778:4;27816:3;27805:9;27801:19;27793:27;;27830:71;27898:1;27887:9;27883:17;27874:6;27830:71;:::i;:::-;27911:68;27975:2;27964:9;27960:18;27951:6;27911:68;:::i;:::-;27989:72;28057:2;28046:9;28042:18;28033:6;27989:72;:::i;:::-;28071;28139:2;28128:9;28124:18;28115:6;28071:72;:::i;:::-;27605:545;;;;;;;:::o;28156:313::-;28269:4;28307:2;28296:9;28292:18;28284:26;;28356:9;28350:4;28346:20;28342:1;28331:9;28327:17;28320:47;28384:78;28457:4;28448:6;28384:78;:::i;:::-;28376:86;;28156:313;;;;:::o;28475:419::-;28641:4;28679:2;28668:9;28664:18;28656:26;;28728:9;28722:4;28718:20;28714:1;28703:9;28699:17;28692:47;28756:131;28882:4;28756:131;:::i;:::-;28748:139;;28475:419;;;:::o;28900:::-;29066:4;29104:2;29093:9;29089:18;29081:26;;29153:9;29147:4;29143:20;29139:1;29128:9;29124:17;29117:47;29181:131;29307:4;29181:131;:::i;:::-;29173:139;;28900:419;;;:::o;29325:::-;29491:4;29529:2;29518:9;29514:18;29506:26;;29578:9;29572:4;29568:20;29564:1;29553:9;29549:17;29542:47;29606:131;29732:4;29606:131;:::i;:::-;29598:139;;29325:419;;;:::o;29750:::-;29916:4;29954:2;29943:9;29939:18;29931:26;;30003:9;29997:4;29993:20;29989:1;29978:9;29974:17;29967:47;30031:131;30157:4;30031:131;:::i;:::-;30023:139;;29750:419;;;:::o;30175:::-;30341:4;30379:2;30368:9;30364:18;30356:26;;30428:9;30422:4;30418:20;30414:1;30403:9;30399:17;30392:47;30456:131;30582:4;30456:131;:::i;:::-;30448:139;;30175:419;;;:::o;30600:::-;30766:4;30804:2;30793:9;30789:18;30781:26;;30853:9;30847:4;30843:20;30839:1;30828:9;30824:17;30817:47;30881:131;31007:4;30881:131;:::i;:::-;30873:139;;30600:419;;;:::o;31025:::-;31191:4;31229:2;31218:9;31214:18;31206:26;;31278:9;31272:4;31268:20;31264:1;31253:9;31249:17;31242:47;31306:131;31432:4;31306:131;:::i;:::-;31298:139;;31025:419;;;:::o;31450:::-;31616:4;31654:2;31643:9;31639:18;31631:26;;31703:9;31697:4;31693:20;31689:1;31678:9;31674:17;31667:47;31731:131;31857:4;31731:131;:::i;:::-;31723:139;;31450:419;;;:::o;31875:::-;32041:4;32079:2;32068:9;32064:18;32056:26;;32128:9;32122:4;32118:20;32114:1;32103:9;32099:17;32092:47;32156:131;32282:4;32156:131;:::i;:::-;32148:139;;31875:419;;;:::o;32300:::-;32466:4;32504:2;32493:9;32489:18;32481:26;;32553:9;32547:4;32543:20;32539:1;32528:9;32524:17;32517:47;32581:131;32707:4;32581:131;:::i;:::-;32573:139;;32300:419;;;:::o;32725:::-;32891:4;32929:2;32918:9;32914:18;32906:26;;32978:9;32972:4;32968:20;32964:1;32953:9;32949:17;32942:47;33006:131;33132:4;33006:131;:::i;:::-;32998:139;;32725:419;;;:::o;33150:::-;33316:4;33354:2;33343:9;33339:18;33331:26;;33403:9;33397:4;33393:20;33389:1;33378:9;33374:17;33367:47;33431:131;33557:4;33431:131;:::i;:::-;33423:139;;33150:419;;;:::o;33575:::-;33741:4;33779:2;33768:9;33764:18;33756:26;;33828:9;33822:4;33818:20;33814:1;33803:9;33799:17;33792:47;33856:131;33982:4;33856:131;:::i;:::-;33848:139;;33575:419;;;:::o;34000:::-;34166:4;34204:2;34193:9;34189:18;34181:26;;34253:9;34247:4;34243:20;34239:1;34228:9;34224:17;34217:47;34281:131;34407:4;34281:131;:::i;:::-;34273:139;;34000:419;;;:::o;34425:::-;34591:4;34629:2;34618:9;34614:18;34606:26;;34678:9;34672:4;34668:20;34664:1;34653:9;34649:17;34642:47;34706:131;34832:4;34706:131;:::i;:::-;34698:139;;34425:419;;;:::o;34850:::-;35016:4;35054:2;35043:9;35039:18;35031:26;;35103:9;35097:4;35093:20;35089:1;35078:9;35074:17;35067:47;35131:131;35257:4;35131:131;:::i;:::-;35123:139;;34850:419;;;:::o;35275:::-;35441:4;35479:2;35468:9;35464:18;35456:26;;35528:9;35522:4;35518:20;35514:1;35503:9;35499:17;35492:47;35556:131;35682:4;35556:131;:::i;:::-;35548:139;;35275:419;;;:::o;35700:::-;35866:4;35904:2;35893:9;35889:18;35881:26;;35953:9;35947:4;35943:20;35939:1;35928:9;35924:17;35917:47;35981:131;36107:4;35981:131;:::i;:::-;35973:139;;35700:419;;;:::o;36125:::-;36291:4;36329:2;36318:9;36314:18;36306:26;;36378:9;36372:4;36368:20;36364:1;36353:9;36349:17;36342:47;36406:131;36532:4;36406:131;:::i;:::-;36398:139;;36125:419;;;:::o;36550:::-;36716:4;36754:2;36743:9;36739:18;36731:26;;36803:9;36797:4;36793:20;36789:1;36778:9;36774:17;36767:47;36831:131;36957:4;36831:131;:::i;:::-;36823:139;;36550:419;;;:::o;36975:::-;37141:4;37179:2;37168:9;37164:18;37156:26;;37228:9;37222:4;37218:20;37214:1;37203:9;37199:17;37192:47;37256:131;37382:4;37256:131;:::i;:::-;37248:139;;36975:419;;;:::o;37400:::-;37566:4;37604:2;37593:9;37589:18;37581:26;;37653:9;37647:4;37643:20;37639:1;37628:9;37624:17;37617:47;37681:131;37807:4;37681:131;:::i;:::-;37673:139;;37400:419;;;:::o;37825:::-;37991:4;38029:2;38018:9;38014:18;38006:26;;38078:9;38072:4;38068:20;38064:1;38053:9;38049:17;38042:47;38106:131;38232:4;38106:131;:::i;:::-;38098:139;;37825:419;;;:::o;38250:::-;38416:4;38454:2;38443:9;38439:18;38431:26;;38503:9;38497:4;38493:20;38489:1;38478:9;38474:17;38467:47;38531:131;38657:4;38531:131;:::i;:::-;38523:139;;38250:419;;;:::o;38675:::-;38841:4;38879:2;38868:9;38864:18;38856:26;;38928:9;38922:4;38918:20;38914:1;38903:9;38899:17;38892:47;38956:131;39082:4;38956:131;:::i;:::-;38948:139;;38675:419;;;:::o;39100:::-;39266:4;39304:2;39293:9;39289:18;39281:26;;39353:9;39347:4;39343:20;39339:1;39328:9;39324:17;39317:47;39381:131;39507:4;39381:131;:::i;:::-;39373:139;;39100:419;;;:::o;39525:::-;39691:4;39729:2;39718:9;39714:18;39706:26;;39778:9;39772:4;39768:20;39764:1;39753:9;39749:17;39742:47;39806:131;39932:4;39806:131;:::i;:::-;39798:139;;39525:419;;;:::o;39950:::-;40116:4;40154:2;40143:9;40139:18;40131:26;;40203:9;40197:4;40193:20;40189:1;40178:9;40174:17;40167:47;40231:131;40357:4;40231:131;:::i;:::-;40223:139;;39950:419;;;:::o;40800:::-;40966:4;41004:2;40993:9;40989:18;40981:26;;41053:9;41047:4;41043:20;41039:1;41028:9;41024:17;41017:47;41081:131;41207:4;41081:131;:::i;:::-;41073:139;;40800:419;;;:::o;41225:::-;41391:4;41429:2;41418:9;41414:18;41406:26;;41478:9;41472:4;41468:20;41464:1;41453:9;41449:17;41442:47;41506:131;41632:4;41506:131;:::i;:::-;41498:139;;41225:419;;;:::o;41650:::-;41816:4;41854:2;41843:9;41839:18;41831:26;;41903:9;41897:4;41893:20;41889:1;41878:9;41874:17;41867:47;41931:131;42057:4;41931:131;:::i;:::-;41923:139;;41650:419;;;:::o;42075:350::-;42232:4;42270:2;42259:9;42255:18;42247:26;;42283:135;42415:1;42404:9;42400:17;42391:6;42283:135;:::i;:::-;42075:350;;;;:::o;42431:222::-;42524:4;42562:2;42551:9;42547:18;42539:26;;42575:71;42643:1;42632:9;42628:17;42619:6;42575:71;:::i;:::-;42431:222;;;;:::o;42659:129::-;42693:6;42720:20;;:::i;:::-;42710:30;;42749:33;42777:4;42769:6;42749:33;:::i;:::-;42659:129;;;:::o;42794:75::-;42827:6;42860:2;42854:9;42844:19;;42794:75;:::o;42875:307::-;42936:4;43026:18;43018:6;43015:30;43012:56;;;43048:18;;:::i;:::-;43012:56;43086:29;43108:6;43086:29;:::i;:::-;43078:37;;43170:4;43164;43160:15;43152:23;;42875:307;;;:::o;43188:141::-;43237:4;43260:3;43252:11;;43283:3;43280:1;43273:14;43317:4;43314:1;43304:18;43296:26;;43188:141;;;:::o;43335:98::-;43386:6;43420:5;43414:12;43404:22;;43335:98;;;:::o;43439:99::-;43491:6;43525:5;43519:12;43509:22;;43439:99;;;:::o;43544:168::-;43627:11;43661:6;43656:3;43649:19;43701:4;43696:3;43692:14;43677:29;;43544:168;;;;:::o;43718:169::-;43802:11;43836:6;43831:3;43824:19;43876:4;43871:3;43867:14;43852:29;;43718:169;;;;:::o;43893:148::-;43995:11;44032:3;44017:18;;43893:148;;;;:::o;44047:273::-;44087:3;44106:20;44124:1;44106:20;:::i;:::-;44101:25;;44140:20;44158:1;44140:20;:::i;:::-;44135:25;;44262:1;44226:34;44222:42;44219:1;44216:49;44213:75;;;44268:18;;:::i;:::-;44213:75;44312:1;44309;44305:9;44298:16;;44047:273;;;;:::o;44326:305::-;44366:3;44385:20;44403:1;44385:20;:::i;:::-;44380:25;;44419:20;44437:1;44419:20;:::i;:::-;44414:25;;44573:1;44505:66;44501:74;44498:1;44495:81;44492:107;;;44579:18;;:::i;:::-;44492:107;44623:1;44620;44616:9;44609:16;;44326:305;;;;:::o;44637:185::-;44677:1;44694:20;44712:1;44694:20;:::i;:::-;44689:25;;44728:20;44746:1;44728:20;:::i;:::-;44723:25;;44767:1;44757:35;;44772:18;;:::i;:::-;44757:35;44814:1;44811;44807:9;44802:14;;44637:185;;;;:::o;44828:191::-;44868:4;44888:20;44906:1;44888:20;:::i;:::-;44883:25;;44922:20;44940:1;44922:20;:::i;:::-;44917:25;;44961:1;44958;44955:8;44952:34;;;44966:18;;:::i;:::-;44952:34;45011:1;45008;45004:9;44996:17;;44828:191;;;;:::o;45025:96::-;45062:7;45091:24;45109:5;45091:24;:::i;:::-;45080:35;;45025:96;;;:::o;45127:90::-;45161:7;45204:5;45197:13;45190:21;45179:32;;45127:90;;;:::o;45223:77::-;45260:7;45289:5;45278:16;;45223:77;;;:::o;45306:149::-;45342:7;45382:66;45375:5;45371:78;45360:89;;45306:149;;;:::o;45461:118::-;45498:7;45538:34;45531:5;45527:46;45516:57;;45461:118;;;:::o;45585:126::-;45622:7;45662:42;45655:5;45651:54;45640:65;;45585:126;;;:::o;45717:77::-;45754:7;45783:5;45772:16;;45717:77;;;:::o;45800:101::-;45836:7;45876:18;45869:5;45865:30;45854:41;;45800:101;;;:::o;45907:86::-;45942:7;45982:4;45975:5;45971:16;45960:27;;45907:86;;;:::o;45999:154::-;46083:6;46078:3;46073;46060:30;46145:1;46136:6;46131:3;46127:16;46120:27;45999:154;;;:::o;46159:307::-;46227:1;46237:113;46251:6;46248:1;46245:13;46237:113;;;46336:1;46331:3;46327:11;46321:18;46317:1;46312:3;46308:11;46301:39;46273:2;46270:1;46266:10;46261:15;;46237:113;;;46368:6;46365:1;46362:13;46359:101;;;46448:1;46439:6;46434:3;46430:16;46423:27;46359:101;46208:258;46159:307;;;:::o;46472:171::-;46511:3;46534:24;46552:5;46534:24;:::i;:::-;46525:33;;46580:4;46573:5;46570:15;46567:41;;;46588:18;;:::i;:::-;46567:41;46635:1;46628:5;46624:13;46617:20;;46472:171;;;:::o;46649:320::-;46693:6;46730:1;46724:4;46720:12;46710:22;;46777:1;46771:4;46767:12;46798:18;46788:81;;46854:4;46846:6;46842:17;46832:27;;46788:81;46916:2;46908:6;46905:14;46885:18;46882:38;46879:84;;;46935:18;;:::i;:::-;46879:84;46700:269;46649:320;;;:::o;46975:281::-;47058:27;47080:4;47058:27;:::i;:::-;47050:6;47046:40;47188:6;47176:10;47173:22;47152:18;47140:10;47137:34;47134:62;47131:88;;;47199:18;;:::i;:::-;47131:88;47239:10;47235:2;47228:22;47018:238;46975:281;;:::o;47262:233::-;47301:3;47324:24;47342:5;47324:24;:::i;:::-;47315:33;;47370:66;47363:5;47360:77;47357:103;;;47440:18;;:::i;:::-;47357:103;47487:1;47480:5;47476:13;47469:20;;47262:233;;;:::o;47501:100::-;47540:7;47569:26;47589:5;47569:26;:::i;:::-;47558:37;;47501:100;;;:::o;47607:79::-;47646:7;47675:5;47664:16;;47607:79;;;:::o;47692:94::-;47731:7;47760:20;47774:5;47760:20;:::i;:::-;47749:31;;47692:94;;;:::o;47792:176::-;47824:1;47841:20;47859:1;47841:20;:::i;:::-;47836:25;;47875:20;47893:1;47875:20;:::i;:::-;47870:25;;47914:1;47904:35;;47919:18;;:::i;:::-;47904:35;47960:1;47957;47953:9;47948:14;;47792:176;;;;:::o;47974:180::-;48022:77;48019:1;48012:88;48119:4;48116:1;48109:15;48143:4;48140:1;48133:15;48160:180;48208:77;48205:1;48198:88;48305:4;48302:1;48295:15;48329:4;48326:1;48319:15;48346:180;48394:77;48391:1;48384:88;48491:4;48488:1;48481:15;48515:4;48512:1;48505:15;48532:180;48580:77;48577:1;48570:88;48677:4;48674:1;48667:15;48701:4;48698:1;48691:15;48718:180;48766:77;48763:1;48756:88;48863:4;48860:1;48853:15;48887:4;48884:1;48877:15;48904:180;48952:77;48949:1;48942:88;49049:4;49046:1;49039:15;49073:4;49070:1;49063:15;49090:117;49199:1;49196;49189:12;49213:117;49322:1;49319;49312:12;49336:117;49445:1;49442;49435:12;49459:117;49568:1;49565;49558:12;49582:117;49691:1;49688;49681:12;49705:117;49814:1;49811;49804:12;49828:102;49869:6;49920:2;49916:7;49911:2;49904:5;49900:14;49896:28;49886:38;;49828:102;;;:::o;49936:94::-;49969:8;50017:5;50013:2;50009:14;49988:35;;49936:94;;;:::o;50036:174::-;50176:26;50172:1;50164:6;50160:14;50153:50;50036:174;:::o;50216:221::-;50356:34;50352:1;50344:6;50340:14;50333:58;50425:4;50420:2;50412:6;50408:15;50401:29;50216:221;:::o;50443:181::-;50583:33;50579:1;50571:6;50567:14;50560:57;50443:181;:::o;50630:214::-;50770:66;50766:1;50758:6;50754:14;50747:90;50630:214;:::o;50850:225::-;50990:34;50986:1;50978:6;50974:14;50967:58;51059:8;51054:2;51046:6;51042:15;51035:33;50850:225;:::o;51081:229::-;51221:34;51217:1;51209:6;51205:14;51198:58;51290:12;51285:2;51277:6;51273:15;51266:37;51081:229;:::o;51316:222::-;51456:34;51452:1;51444:6;51440:14;51433:58;51525:5;51520:2;51512:6;51508:15;51501:30;51316:222;:::o;51544:177::-;51684:29;51680:1;51672:6;51668:14;51661:53;51544:177;:::o;51727:224::-;51867:34;51863:1;51855:6;51851:14;51844:58;51936:7;51931:2;51923:6;51919:15;51912:32;51727:224;:::o;51957:221::-;52097:34;52093:1;52085:6;52081:14;52074:58;52166:4;52161:2;52153:6;52149:15;52142:29;51957:221;:::o;52184:244::-;52324:34;52320:1;52312:6;52308:14;52301:58;52393:27;52388:2;52380:6;52376:15;52369:52;52184:244;:::o;52434:178::-;52574:30;52570:1;52562:6;52558:14;52551:54;52434:178;:::o;52618:230::-;52758:34;52754:1;52746:6;52742:14;52735:58;52827:13;52822:2;52814:6;52810:15;52803:38;52618:230;:::o;52854:221::-;52994:34;52990:1;52982:6;52978:14;52971:58;53063:4;53058:2;53050:6;53046:15;53039:29;52854:221;:::o;53081:225::-;53221:34;53217:1;53209:6;53205:14;53198:58;53290:8;53285:2;53277:6;53273:15;53266:33;53081:225;:::o;53312:155::-;53452:7;53448:1;53440:6;53436:14;53429:31;53312:155;:::o;53473:182::-;53613:34;53609:1;53601:6;53597:14;53590:58;53473:182;:::o;53661:234::-;53801:34;53797:1;53789:6;53785:14;53778:58;53870:17;53865:2;53857:6;53853:15;53846:42;53661:234;:::o;53901:174::-;54041:26;54037:1;54029:6;54025:14;54018:50;53901:174;:::o;54081:176::-;54221:28;54217:1;54209:6;54205:14;54198:52;54081:176;:::o;54263:237::-;54403:34;54399:1;54391:6;54387:14;54380:58;54472:20;54467:2;54459:6;54455:15;54448:45;54263:237;:::o;54506:221::-;54646:34;54642:1;54634:6;54630:14;54623:58;54715:4;54710:2;54702:6;54698:15;54691:29;54506:221;:::o;54733:222::-;54873:34;54869:1;54861:6;54857:14;54850:58;54942:5;54937:2;54929:6;54925:15;54918:30;54733:222;:::o;54961:238::-;55101:34;55097:1;55089:6;55085:14;55078:58;55170:21;55165:2;55157:6;55153:15;55146:46;54961:238;:::o;55205:179::-;55345:31;55341:1;55333:6;55329:14;55322:55;55205:179;:::o;55390:176::-;55530:28;55526:1;55518:6;55514:14;55507:52;55390:176;:::o;55572:220::-;55712:34;55708:1;55700:6;55696:14;55689:58;55781:3;55776:2;55768:6;55764:15;55757:28;55572:220;:::o;55798:233::-;55938:34;55934:1;55926:6;55922:14;55915:58;56007:16;56002:2;55994:6;55990:15;55983:41;55798:233;:::o;56037:239::-;56177:34;56173:1;56165:6;56161:14;56154:58;56246:22;56241:2;56233:6;56229:15;56222:47;56037:239;:::o;56282:170::-;56422:22;56418:1;56410:6;56406:14;56399:46;56282:170;:::o;56698:224::-;56838:34;56834:1;56826:6;56822:14;56815:58;56907:7;56902:2;56894:6;56890:15;56883:32;56698:224;:::o;56928:232::-;57068:34;57064:1;57056:6;57052:14;57045:58;57137:15;57132:2;57124:6;57120:15;57113:40;56928:232;:::o;57166:182::-;57306:34;57302:1;57294:6;57290:14;57283:58;57166:182;:::o;57354:122::-;57427:24;57445:5;57427:24;:::i;:::-;57420:5;57417:35;57407:63;;57466:1;57463;57456:12;57407:63;57354:122;:::o;57482:116::-;57552:21;57567:5;57552:21;:::i;:::-;57545:5;57542:32;57532:60;;57588:1;57585;57578:12;57532:60;57482:116;:::o;57604:120::-;57676:23;57693:5;57676:23;:::i;:::-;57669:5;57666:34;57656:62;;57714:1;57711;57704:12;57656:62;57604:120;:::o;57730:122::-;57803:24;57821:5;57803:24;:::i;:::-;57796:5;57793:35;57783:63;;57842:1;57839;57832:12;57783:63;57730:122;:::o

Swarm Source

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

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