ETH Price: $2,061.70 (-5.40%)
 

Overview

TokenID

26

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 8: MOUSAI.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "./ERC721A.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./Pausable.sol";
import "./Strings.sol";

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

    struct SalePlan {
        uint256 price;
        uint256 amount;
        uint256 mintedAmount;
    }

    uint256 private maxSupply = 10000;
    uint8 private maxAmount = 10;

    string private metadataUri;

    bool private isMinting = false;
    bool private isRevealed = false;
    bool private isPublic = false;

    mapping(address => mapping(uint8 => uint8)) public allowedAmounts;
    mapping(address => uint8) public publicMintedAmounts;

    uint8 private saleCount = 0;
    SalePlan public salePlan;

    constructor(
    ) ERC721A("MOUSAI", "MOUSAI") {
        salePlan.price = 50000000000000000; //0.05 ETH
        salePlan.amount = 500;
        salePlan.mintedAmount = 0;
    }

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

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(metadataUri, Strings.toString(_tokenId)));
    }

    function mint(uint8 amount) external payable nonReentrant whenNotPaused isNotContract {

        //phase is on check
        require(isMinting, "Minting is off");

        //value == price check
        uint256 _price = salePlan.price * amount;
        require(msg.value == _price, "Invalid ETH balance");

        //allowed amount check
        require(amount <= allowedAmounts[msg.sender][saleCount], "No allowed amount");

        //amount check
        require(salePlan.mintedAmount + amount <= salePlan.amount, "Exceeding sale amount");
        require(_totalMinted() + amount <= maxSupply, "Exceeding max supply amount");

        allowedAmounts[msg.sender][saleCount] -= amount;
        salePlan.mintedAmount += amount;

        if(salePlan.mintedAmount == salePlan.amount) isMinting = false;

        _mint(msg.sender, amount);
        emit Minted(msg.sender, amount);
    }
    //team mint amount ; no mint phase check, only total amount check

    function mintForTeamReserve(uint8 amount) external onlyOwner {
        require(_totalMinted() + amount <= maxSupply, "Exceeding max supply amount");
        _mint(msg.sender, amount);
        emit Minted(msg.sender, amount);
    }

    function publicMint(uint8 amount) external payable nonReentrant whenNotPaused isNotContract {
        require(isMinting, "Minting is off");
        require(isPublic, "Minting is not public");

        uint256 _price = salePlan.price * amount;
        require(msg.value == _price, "Invalid ETH balance");

        require(amount <= maxAmount - publicMintedAmounts[msg.sender], "No public allowed amount");

        require(salePlan.mintedAmount + amount <= salePlan.amount, "Exceeding sale amount");
        require(_totalMinted() + amount <= maxSupply, "Exceeding max supply amount"); 

        publicMintedAmounts[msg.sender] += amount;
        salePlan.mintedAmount += amount;

        if(salePlan.mintedAmount == salePlan.amount) isMinting = false;

        _mint(msg.sender, amount);
        emit Minted(msg.sender, amount);
    }

    function burn(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
        emit Burn(tokenId);
    }

    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        if (!success) {
            revert("Ether transfer failed");
        }
    }

    function setMetadataUri(string calldata _metadataUri) external onlyOwner {
        metadataUri = _metadataUri;
    }

    function setIsReveal(bool _isReveal) external onlyOwner {
        isRevealed = _isReveal;
    }

    function setIsPublic(bool _isPublic) external onlyOwner {
        isPublic = _isPublic;
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        require(_totalMinted() <= _maxSupply, "Less than total minted amount");
        maxSupply = _maxSupply;
    }

    function setMaxAmount(uint8 _maxAmount) external onlyOwner {
        maxAmount = _maxAmount;
    }

    function setMintRound(uint256 price, uint8 amount) external onlyOwner {
        require(!isMinting, "Minting is now live");
        require(_totalMinted() + amount <= maxSupply, "Exceeding max supply");
        salePlan.price = price;
        salePlan.amount = amount;
        salePlan.mintedAmount = 0;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function mintStop() external onlyOwner {
        require(isMinting, "Minting is off");
        isMinting = false;
    }

    function mintStart() external onlyOwner {
        require(!isMinting, "Minting is on");
        isMinting = true;
    }

    function setAllowedAmounts(uint8 _saleCount, address[] calldata _addresses, uint8[] calldata _amounts) external onlyOwner {
        require(_addresses.length == _amounts.length, "Length is different");

        saleCount = _saleCount;

        for(uint8 i = 0; i < _addresses.length; i++) {
            allowedAmounts[_addresses[i]][saleCount] = _amounts[i];
        }
    }
    
    function getAllowedAmounts(address _address) public view returns (uint8) {
        require(_address != address(0), "address can't be 0");
        return allowedAmounts[_address][saleCount];
    }

    function mintedAmount() public view returns (uint256) {
        return _totalMinted();
    }

    function isSoldOut() public view returns (bool) {
        return _totalMinted() == maxSupply;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return ERC721A.supportsInterface(interfaceId);
    }

    modifier isNotContract() {
        require(msg.sender == tx.origin, "Sender is not EOA");
        _;
    }

    event Minted(address indexed receiver, uint256 quantity);
    event Burn(uint256 tokenId);

}

File 1 of 8: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 2 of 8: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

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

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 3 of 8: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

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

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 5 of 8: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

File 6 of 8: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 7 of 8: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 8 of 8: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Minted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"allowedAmounts","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAllowedAmounts","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSoldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintForTeamReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintedAmounts","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"salePlan","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mintedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_saleCount","type":"uint8"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8[]","name":"_amounts","type":"uint8[]"}],"name":"setAllowedAmounts","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":"bool","name":"_isPublic","type":"bool"}],"name":"setIsPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isReveal","type":"bool"}],"name":"setIsReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxAmount","type":"uint8"}],"name":"setMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataUri","type":"string"}],"name":"setMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"setMintRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600a55600a600b60006101000a81548160ff021916908360ff1602179055506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055506000601060006101000a81548160ff021916908360ff160217905550348015620000a057600080fd5b506040518060400160405280600681526020017f4d4f5553414900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d4f55534149000000000000000000000000000000000000000000000000000081525081600290816200011e91906200050b565b5080600390816200013091906200050b565b5062000141620001ba60201b60201c565b6000819055505050620001696200015d620001c360201b60201c565b620001cb60201b60201c565b6000600860146101000a81548160ff021916908315150217905550600160098190555066b1a2bc2ec500006011600001819055506101f46011600101819055506000601160020181905550620005f2565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200031357607f821691505b602082108103620003295762000328620002cb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000354565b6200039f868362000354565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ec620003e6620003e084620003b7565b620003c1565b620003b7565b9050919050565b6000819050919050565b6200040883620003cb565b620004206200041782620003f3565b84845462000361565b825550505050565b600090565b6200043762000428565b62000444818484620003fd565b505050565b5b818110156200046c57620004606000826200042d565b6001810190506200044a565b5050565b601f821115620004bb5762000485816200032f565b620004908462000344565b81016020851015620004a0578190505b620004b8620004af8562000344565b83018262000449565b50505b505050565b600082821c905092915050565b6000620004e060001984600802620004c0565b1980831691505092915050565b6000620004fb8383620004cd565b9150826002028217905092915050565b620005168262000291565b67ffffffffffffffff8111156200053257620005316200029c565b5b6200053e8254620002fa565b6200054b82828562000470565b600060209050601f8311600181146200058357600084156200056e578287015190505b6200057a8582620004ed565b865550620005ea565b601f19841662000593866200032f565b60005b82811015620005bd5784890151825560018201915060208501945060208101905062000596565b86831015620005dd5784890151620005d9601f891682620004cd565b8355505b6001600288020188555050505b505050505050565b614a1180620006026000396000f3fe60806040526004361061023b5760003560e01c80636868c1e71161012e5780639b363025116100ab578063d2c2edc61161006f578063d2c2edc6146107f3578063e985e9c514610830578063ebb39db21461086d578063f2fde38b14610896578063fdab3b3f146108bf5761023b565b80639b363025146106fa578063a22cb46514610727578063b88d4fde14610750578063bbe92dd314610779578063c87b56dd146107b65761023b565b80638456cb59116100f25780638456cb5914610634578063858e83b51461064b5780638da5cb5b146106675780639509e6071461069257806395d89b41146106cf5761023b565b80636868c1e7146105725780636ecd23061461059b5780636f8b44b0146105b757806370a08231146105e0578063715018a61461061d5761023b565b80632da5ea17116101bc57806342966c681161018057806342966c681461048f5780634784f893146104b857806352349f52146104e15780635c975abb1461050a5780636352211e146105355761023b565b80632da5ea17146103f657806339d64bce146104215780633ccfd60b146104385780633f4ba83a1461044f57806342842e0e146104665761023b565b80631130630c116102035780631130630c1461033757806318160ddd1461036057806323b872dd1461038b578063255e4685146103b45780632d380242146103cb5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630ee87ea81461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613050565b6108e8565b6040516102749190613098565b60405180910390f35b34801561028957600080fd5b506102926108fa565b60405161029f9190613143565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061319b565b61098c565b6040516102dc9190613209565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613250565b610a0b565b005b34801561031a57600080fd5b5061033560048036038101906103309190613384565b610b4f565b005b34801561034357600080fd5b5061035e6004803603810190610359919061346f565b610cb8565b005b34801561036c57600080fd5b50610375610cd6565b60405161038291906134cb565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906134e6565b610ced565b005b3480156103c057600080fd5b506103c961100f565b005b3480156103d757600080fd5b506103e0611084565b6040516103ed91906134cb565b60405180910390f35b34801561040257600080fd5b5061040b611093565b6040516104189190613098565b60405180910390f35b34801561042d57600080fd5b506104366110a6565b005b34801561044457600080fd5b5061044d61111a565b005b34801561045b57600080fd5b506104646111d1565b005b34801561047257600080fd5b5061048d600480360381019061048891906134e6565b6111e3565b005b34801561049b57600080fd5b506104b660048036038101906104b1919061319b565b611203565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613539565b61124e565b005b3480156104ed57600080fd5b50610508600480360381019061050391906135a5565b611326565b005b34801561051657600080fd5b5061051f61134b565b60405161052c9190613098565b60405180910390f35b34801561054157600080fd5b5061055c6004803603810190610557919061319b565b611362565b6040516105699190613209565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906135d2565b611374565b005b6105b560048036038101906105b091906135d2565b61139a565b005b3480156105c357600080fd5b506105de60048036038101906105d9919061319b565b6117c2565b005b3480156105ec57600080fd5b50610607600480360381019061060291906135ff565b61181e565b60405161061491906134cb565b60405180910390f35b34801561062957600080fd5b506106326118d6565b005b34801561064057600080fd5b506106496118ea565b005b610665600480360381019061066091906135d2565b6118fc565b005b34801561067357600080fd5b5061067c611d41565b6040516106899190613209565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b491906135ff565b611d6b565b6040516106c6919061363b565b60405180910390f35b3480156106db57600080fd5b506106e4611e55565b6040516106f19190613143565b60405180910390f35b34801561070657600080fd5b5061070f611ee7565b60405161071e93929190613656565b60405180910390f35b34801561073357600080fd5b5061074e6004803603810190610749919061368d565b611eff565b005b34801561075c57600080fd5b50610777600480360381019061077291906137fd565b612076565b005b34801561078557600080fd5b506107a0600480360381019061079b91906135ff565b6120e9565b6040516107ad919061363b565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061319b565b612109565b6040516107ea9190613143565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613880565b612185565b604051610827919061363b565b60405180910390f35b34801561083c57600080fd5b50610857600480360381019061085291906138c0565b6121b4565b6040516108649190613098565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f91906135d2565b612248565b005b3480156108a257600080fd5b506108bd60048036038101906108b891906135ff565b612308565b005b3480156108cb57600080fd5b506108e660048036038101906108e191906135a5565b61238b565b005b60006108f3826123b0565b9050919050565b6060600280546109099061392f565b80601f01602080910402602001604051908101604052809291908181526020018280546109359061392f565b80156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b5050505050905090565b600061099782612442565b6109cd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1682611362565b90508073ffffffffffffffffffffffffffffffffffffffff16610a376124a1565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a57610a6381610a5e6124a1565b6121b4565b610a99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b576124a9565b818190508484905014610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b96906139ac565b60405180910390fd5b84601060006101000a81548160ff021916908360ff16021790555060005b848490508160ff161015610cb05782828260ff16818110610be157610be06139cc565b5b9050602002016020810190610bf691906135d2565b600e600087878560ff16818110610c1057610c0f6139cc565b5b9050602002016020810190610c2591906135ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610ca890613a2a565b915050610bbd565b505050505050565b610cc06124a9565b8181600c9182610cd1929190613c0a565b505050565b6000610ce0612527565b6001546000540303905090565b6000610cf882612530565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d6b846125fc565b91509150610d818187610d7c6124a1565b612623565b610dcd57610d9686610d916124a1565b6121b4565b610dcc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e408686866001612667565b8015610e4b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1985610ef588888761266d565b7c020000000000000000000000000000000000000000000000000000000017612695565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f9f5760006001850190506000600460008381526020019081526020016000205403610f9d576000548114610f9c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100786868660016126c0565b505050505050565b6110176124a9565b600d60009054906101000a900460ff1615611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90613d26565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b600061108e6126c6565b905090565b6000600a546110a06126c6565b14905090565b6110ae6124a9565b600d60009054906101000a900460ff166110fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f490613d92565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b6111226124a9565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114890613de3565b60006040518083038185875af1925050503d8060008114611185576040519150601f19603f3d011682016040523d82523d6000602084013e61118a565b606091505b50509050806111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590613e44565b60405180910390fd5b50565b6111d96124a9565b6111e16126d9565b565b6111fe83838360405180602001604052806000815250612076565b505050565b61120b6124a9565b6112148161273c565b7fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb8160405161124391906134cb565b60405180910390a150565b6112566124a9565b600d60009054906101000a900460ff16156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613eb0565b60405180910390fd5b600a548160ff166112b56126c6565b6112bf9190613ed0565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613f50565b60405180910390fd5b816011600001819055508060ff1660116001018190555060006011600201819055505050565b61132e6124a9565b80600d60016101000a81548160ff02191690831515021790555050565b6000600860149054906101000a900460ff16905090565b600061136d82612530565b9050919050565b61137c6124a9565b80600b60006101000a81548160ff021916908360ff16021790555050565b6002600954036113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613fbc565b60405180910390fd5b60026009819055506113ef61274a565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614028565b60405180910390fd5b600d60009054906101000a900460ff166114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390613d92565b60405180910390fd5b60008160ff166011600001546114c29190614048565b9050803414611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd906140d6565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff1611156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890614142565b60405180910390fd5b6011600101548260ff166011600201546115db9190613ed0565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906141ae565b60405180910390fd5b600a548260ff1661162b6126c6565b6116359190613ed0565b1115611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d9061421a565b60405180910390fd5b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060008282829054906101000a900460ff166116f7919061423a565b92506101000a81548160ff021916908360ff1602179055508160ff16601160020160008282546117279190613ed0565b925050819055506011600101546011600201540361175b576000600d60006101000a81548160ff0219169083151502179055505b611768338360ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040516117ae91906142a0565b60405180910390a250600160098190555050565b6117ca6124a9565b806117d36126c6565b1115611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614307565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611885576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118de6124a9565b6118e8600061294f565b565b6118f26124a9565b6118fa612a15565b565b600260095403611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890613fbc565b60405180910390fd5b600260098190555061195161274a565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690614028565b60405180910390fd5b600d60009054906101000a900460ff16611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590613d92565b60405180910390fd5b600d60029054906101000a900460ff16611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614373565b60405180910390fd5b60008160ff16601160000154611a739190614048565b9050803414611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906140d6565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600b60009054906101000a900460ff16611b1e919061423a565b60ff168260ff161115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906143df565b60405180910390fd5b6011600101548260ff16601160020154611b809190613ed0565b1115611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906141ae565b60405180910390fd5b600a548260ff16611bd06126c6565b611bda9190613ed0565b1115611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c129061421a565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611c7691906143ff565b92506101000a81548160ff021916908360ff1602179055508160ff1660116002016000828254611ca69190613ed0565b9250508190555060116001015460116002015403611cda576000600d60006101000a81548160ff0219169083151502179055505b611ce7338360ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe83604051611d2d91906142a0565b60405180910390a250600160098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614480565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060009054906101000a900460ff169050919050565b606060038054611e649061392f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e909061392f565b8015611edd5780601f10611eb257610100808354040283529160200191611edd565b820191906000526020600020905b815481529060010190602001808311611ec057829003601f168201915b5050505050905090565b60118060000154908060010154908060020154905083565b611f076124a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f6b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f786124a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120256124a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206a9190613098565b60405180910390a35050565b612081848484610ced565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120e3576120ac84848484612a78565b6120e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061211482612442565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90614512565b60405180910390fd5b600c61215e83612bc8565b60405160200161216f9291906145f1565b6040516020818303038152906040529050919050565b600e6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122506124a9565b600a548160ff1661225f6126c6565b6122699190613ed0565b11156122aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a19061421a565b60405180910390fd5b6122b7338260ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe826040516122fd91906142a0565b60405180910390a250565b6123106124a9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614687565b60405180910390fd5b6123888161294f565b50565b6123936124a9565b80600d60026101000a81548160ff02191690831515021790555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061243b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008161244d612527565b1115801561245c575060005482105b801561249a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6124b1612d28565b73ffffffffffffffffffffffffffffffffffffffff166124cf611d41565b73ffffffffffffffffffffffffffffffffffffffff1614612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c906146f3565b60405180910390fd5b565b60006001905090565b6000808290508061253f612527565b116125c5576000548110156125c45760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036125c2575b600081036125b857600460008360019003935083815260200190815260200160002054905061258e565b80925050506125f7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612684868684612d30565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006126d0612527565b60005403905090565b6126e1612d39565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612725612d28565b6040516127329190613209565b60405180910390a1565b612747816000612d82565b50565b61275261134b565b15612792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127899061475f565b60405180910390fd5b565b600080549050600082036127d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e16000848385612667565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061285883612849600086600061266d565b61285285612fd4565b17612695565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146128f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506128be565b5060008203612934576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061294a60008483856126c0565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1d61274a565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a61612d28565b604051612a6e9190613209565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9e6124a1565b8786866040518563ffffffff1660e01b8152600401612ac094939291906147d4565b6020604051808303816000875af1925050508015612afc57506040513d601f19601f82011682018060405250810190612af99190614835565b60015b612b75573d8060008114612b2c576040519150601f19603f3d011682016040523d82523d6000602084013e612b31565b606091505b506000815103612b6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612c0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d23565b600082905060005b60008214612c41578080612c2a90614862565b915050600a82612c3a91906148d9565b9150612c17565b60008167ffffffffffffffff811115612c5d57612c5c6136d2565b5b6040519080825280601f01601f191660200182016040528015612c8f5781602001600182028036833780820191505090505b5090505b60008514612d1c57600182612ca8919061490a565b9150600a85612cb7919061493e565b6030612cc39190613ed0565b60f81b818381518110612cd957612cd86139cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d1591906148d9565b9450612c93565b8093505050505b919050565b600033905090565b60009392505050565b612d4161134b565b612d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d77906149bb565b60405180910390fd5b565b6000612d8d83612530565b90506000819050600080612da0866125fc565b915091508415612e0957612dbc8184612db76124a1565b612623565b612e0857612dd183612dcc6124a1565b6121b4565b612e07576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612e17836000886001612667565b8015612e2257600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612eca83612e878560008861266d565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612695565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612f505760006001870190506000600460008381526020019081526020016000205403612f4e576000548114612f4d578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fba8360008860016126c0565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61302d81612ff8565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60006020828403121561306657613065612fee565b5b60006130748482850161303b565b91505092915050565b60008115159050919050565b6130928161307d565b82525050565b60006020820190506130ad6000830184613089565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ed5780820151818401526020810190506130d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613115826130b3565b61311f81856130be565b935061312f8185602086016130cf565b613138816130f9565b840191505092915050565b6000602082019050818103600083015261315d818461310a565b905092915050565b6000819050919050565b61317881613165565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b6000602082840312156131b1576131b0612fee565b5b60006131bf84828501613186565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f3826131c8565b9050919050565b613203816131e8565b82525050565b600060208201905061321e60008301846131fa565b92915050565b61322d816131e8565b811461323857600080fd5b50565b60008135905061324a81613224565b92915050565b6000806040838503121561326757613266612fee565b5b60006132758582860161323b565b925050602061328685828601613186565b9150509250929050565b600060ff82169050919050565b6132a681613290565b81146132b157600080fd5b50565b6000813590506132c38161329d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132ee576132ed6132c9565b5b8235905067ffffffffffffffff81111561330b5761330a6132ce565b5b602083019150836020820283011115613327576133266132d3565b5b9250929050565b60008083601f840112613344576133436132c9565b5b8235905067ffffffffffffffff811115613361576133606132ce565b5b60208301915083602082028301111561337d5761337c6132d3565b5b9250929050565b6000806000806000606086880312156133a05761339f612fee565b5b60006133ae888289016132b4565b955050602086013567ffffffffffffffff8111156133cf576133ce612ff3565b5b6133db888289016132d8565b9450945050604086013567ffffffffffffffff8111156133fe576133fd612ff3565b5b61340a8882890161332e565b92509250509295509295909350565b60008083601f84011261342f5761342e6132c9565b5b8235905067ffffffffffffffff81111561344c5761344b6132ce565b5b602083019150836001820283011115613468576134676132d3565b5b9250929050565b6000806020838503121561348657613485612fee565b5b600083013567ffffffffffffffff8111156134a4576134a3612ff3565b5b6134b085828601613419565b92509250509250929050565b6134c581613165565b82525050565b60006020820190506134e060008301846134bc565b92915050565b6000806000606084860312156134ff576134fe612fee565b5b600061350d8682870161323b565b935050602061351e8682870161323b565b925050604061352f86828701613186565b9150509250925092565b600080604083850312156135505761354f612fee565b5b600061355e85828601613186565b925050602061356f858286016132b4565b9150509250929050565b6135828161307d565b811461358d57600080fd5b50565b60008135905061359f81613579565b92915050565b6000602082840312156135bb576135ba612fee565b5b60006135c984828501613590565b91505092915050565b6000602082840312156135e8576135e7612fee565b5b60006135f6848285016132b4565b91505092915050565b60006020828403121561361557613614612fee565b5b60006136238482850161323b565b91505092915050565b61363581613290565b82525050565b6000602082019050613650600083018461362c565b92915050565b600060608201905061366b60008301866134bc565b61367860208301856134bc565b61368560408301846134bc565b949350505050565b600080604083850312156136a4576136a3612fee565b5b60006136b28582860161323b565b92505060206136c385828601613590565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61370a826130f9565b810181811067ffffffffffffffff82111715613729576137286136d2565b5b80604052505050565b600061373c612fe4565b90506137488282613701565b919050565b600067ffffffffffffffff821115613768576137676136d2565b5b613771826130f9565b9050602081019050919050565b82818337600083830152505050565b60006137a061379b8461374d565b613732565b9050828152602081018484840111156137bc576137bb6136cd565b5b6137c784828561377e565b509392505050565b600082601f8301126137e4576137e36132c9565b5b81356137f484826020860161378d565b91505092915050565b6000806000806080858703121561381757613816612fee565b5b60006138258782880161323b565b94505060206138368782880161323b565b935050604061384787828801613186565b925050606085013567ffffffffffffffff81111561386857613867612ff3565b5b613874878288016137cf565b91505092959194509250565b6000806040838503121561389757613896612fee565b5b60006138a58582860161323b565b92505060206138b6858286016132b4565b9150509250929050565b600080604083850312156138d7576138d6612fee565b5b60006138e58582860161323b565b92505060206138f68582860161323b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061394757607f821691505b60208210810361395a57613959613900565b5b50919050565b7f4c656e67746820697320646966666572656e7400000000000000000000000000600082015250565b60006139966013836130be565b91506139a182613960565b602082019050919050565b600060208201905081810360008301526139c581613989565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3582613290565b915060ff8203613a4857613a476139fb565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ac07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a83565b613aca8683613a83565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b07613b02613afd84613165565b613ae2565b613165565b9050919050565b6000819050919050565b613b2183613aec565b613b35613b2d82613b0e565b848454613a90565b825550505050565b600090565b613b4a613b3d565b613b55818484613b18565b505050565b5b81811015613b7957613b6e600082613b42565b600181019050613b5b565b5050565b601f821115613bbe57613b8f81613a5e565b613b9884613a73565b81016020851015613ba7578190505b613bbb613bb385613a73565b830182613b5a565b50505b505050565b600082821c905092915050565b6000613be160001984600802613bc3565b1980831691505092915050565b6000613bfa8383613bd0565b9150826002028217905092915050565b613c148383613a53565b67ffffffffffffffff811115613c2d57613c2c6136d2565b5b613c37825461392f565b613c42828285613b7d565b6000601f831160018114613c715760008415613c5f578287013590505b613c698582613bee565b865550613cd1565b601f198416613c7f86613a5e565b60005b82811015613ca757848901358255600182019150602085019450602081019050613c82565b86831015613cc45784890135613cc0601f891682613bd0565b8355505b6001600288020188555050505b50505050505050565b7f4d696e74696e67206973206f6e00000000000000000000000000000000000000600082015250565b6000613d10600d836130be565b9150613d1b82613cda565b602082019050919050565b60006020820190508181036000830152613d3f81613d03565b9050919050565b7f4d696e74696e67206973206f6666000000000000000000000000000000000000600082015250565b6000613d7c600e836130be565b9150613d8782613d46565b602082019050919050565b60006020820190508181036000830152613dab81613d6f565b9050919050565b600081905092915050565b50565b6000613dcd600083613db2565b9150613dd882613dbd565b600082019050919050565b6000613dee82613dc0565b9150819050919050565b7f4574686572207472616e73666572206661696c65640000000000000000000000600082015250565b6000613e2e6015836130be565b9150613e3982613df8565b602082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f4d696e74696e67206973206e6f77206c69766500000000000000000000000000600082015250565b6000613e9a6013836130be565b9150613ea582613e64565b602082019050919050565b60006020820190508181036000830152613ec981613e8d565b9050919050565b6000613edb82613165565b9150613ee683613165565b9250828201905080821115613efe57613efd6139fb565b5b92915050565b7f457863656564696e67206d617820737570706c79000000000000000000000000600082015250565b6000613f3a6014836130be565b9150613f4582613f04565b602082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fa6601f836130be565b9150613fb182613f70565b602082019050919050565b60006020820190508181036000830152613fd581613f99565b9050919050565b7f53656e646572206973206e6f7420454f41000000000000000000000000000000600082015250565b60006140126011836130be565b915061401d82613fdc565b602082019050919050565b6000602082019050818103600083015261404181614005565b9050919050565b600061405382613165565b915061405e83613165565b925082820261406c81613165565b91508282048414831517614083576140826139fb565b5b5092915050565b7f496e76616c6964204554482062616c616e636500000000000000000000000000600082015250565b60006140c06013836130be565b91506140cb8261408a565b602082019050919050565b600060208201905081810360008301526140ef816140b3565b9050919050565b7f4e6f20616c6c6f77656420616d6f756e74000000000000000000000000000000600082015250565b600061412c6011836130be565b9150614137826140f6565b602082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f457863656564696e672073616c6520616d6f756e740000000000000000000000600082015250565b60006141986015836130be565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f457863656564696e67206d617820737570706c7920616d6f756e740000000000600082015250565b6000614204601b836130be565b915061420f826141ce565b602082019050919050565b60006020820190508181036000830152614233816141f7565b9050919050565b600061424582613290565b915061425083613290565b9250828203905060ff811115614269576142686139fb565b5b92915050565b600061428a61428561428084613290565b613ae2565b613165565b9050919050565b61429a8161426f565b82525050565b60006020820190506142b56000830184614291565b92915050565b7f4c657373207468616e20746f74616c206d696e74656420616d6f756e74000000600082015250565b60006142f1601d836130be565b91506142fc826142bb565b602082019050919050565b60006020820190508181036000830152614320816142e4565b9050919050565b7f4d696e74696e67206973206e6f74207075626c69630000000000000000000000600082015250565b600061435d6015836130be565b915061436882614327565b602082019050919050565b6000602082019050818103600083015261438c81614350565b9050919050565b7f4e6f207075626c696320616c6c6f77656420616d6f756e740000000000000000600082015250565b60006143c96018836130be565b91506143d482614393565b602082019050919050565b600060208201905081810360008301526143f8816143bc565b9050919050565b600061440a82613290565b915061441583613290565b9250828201905060ff81111561442e5761442d6139fb565b5b92915050565b7f616464726573732063616e277420626520300000000000000000000000000000600082015250565b600061446a6012836130be565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144fc602f836130be565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b600081905092915050565b6000815461454a8161392f565b6145548186614532565b9450600182166000811461456f5760018114614584576145b7565b60ff19831686528115158202860193506145b7565b61458d85613a5e565b60005b838110156145af57815481890152600182019150602081019050614590565b838801955050505b50505092915050565b60006145cb826130b3565b6145d58185614532565b93506145e58185602086016130cf565b80840191505092915050565b60006145fd828561453d565b915061460982846145c0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146716026836130be565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146dd6020836130be565b91506146e8826146a7565b602082019050919050565b6000602082019050818103600083015261470c816146d0565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006147496010836130be565b915061475482614713565b602082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147a68261477f565b6147b0818561478a565b93506147c08185602086016130cf565b6147c9816130f9565b840191505092915050565b60006080820190506147e960008301876131fa565b6147f660208301866131fa565b61480360408301856134bc565b8181036060830152614815818461479b565b905095945050505050565b60008151905061482f81613024565b92915050565b60006020828403121561484b5761484a612fee565b5b600061485984828501614820565b91505092915050565b600061486d82613165565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489f5761489e6139fb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148e482613165565b91506148ef83613165565b9250826148ff576148fe6148aa565b5b828204905092915050565b600061491582613165565b915061492083613165565b9250828203905081811115614938576149376139fb565b5b92915050565b600061494982613165565b915061495483613165565b925082614964576149636148aa565b5b828206905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006149a56014836130be565b91506149b08261496f565b602082019050919050565b600060208201905081810360008301526149d481614998565b905091905056fea2646970667358221220947f07ad14ae5cb3a24f0214ccd22afc00ba5f9d7f1e2a32e47fbc8df14dc0e364736f6c63430008110033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636868c1e71161012e5780639b363025116100ab578063d2c2edc61161006f578063d2c2edc6146107f3578063e985e9c514610830578063ebb39db21461086d578063f2fde38b14610896578063fdab3b3f146108bf5761023b565b80639b363025146106fa578063a22cb46514610727578063b88d4fde14610750578063bbe92dd314610779578063c87b56dd146107b65761023b565b80638456cb59116100f25780638456cb5914610634578063858e83b51461064b5780638da5cb5b146106675780639509e6071461069257806395d89b41146106cf5761023b565b80636868c1e7146105725780636ecd23061461059b5780636f8b44b0146105b757806370a08231146105e0578063715018a61461061d5761023b565b80632da5ea17116101bc57806342966c681161018057806342966c681461048f5780634784f893146104b857806352349f52146104e15780635c975abb1461050a5780636352211e146105355761023b565b80632da5ea17146103f657806339d64bce146104215780633ccfd60b146104385780633f4ba83a1461044f57806342842e0e146104665761023b565b80631130630c116102035780631130630c1461033757806318160ddd1461036057806323b872dd1461038b578063255e4685146103b45780632d380242146103cb5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630ee87ea81461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613050565b6108e8565b6040516102749190613098565b60405180910390f35b34801561028957600080fd5b506102926108fa565b60405161029f9190613143565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061319b565b61098c565b6040516102dc9190613209565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613250565b610a0b565b005b34801561031a57600080fd5b5061033560048036038101906103309190613384565b610b4f565b005b34801561034357600080fd5b5061035e6004803603810190610359919061346f565b610cb8565b005b34801561036c57600080fd5b50610375610cd6565b60405161038291906134cb565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906134e6565b610ced565b005b3480156103c057600080fd5b506103c961100f565b005b3480156103d757600080fd5b506103e0611084565b6040516103ed91906134cb565b60405180910390f35b34801561040257600080fd5b5061040b611093565b6040516104189190613098565b60405180910390f35b34801561042d57600080fd5b506104366110a6565b005b34801561044457600080fd5b5061044d61111a565b005b34801561045b57600080fd5b506104646111d1565b005b34801561047257600080fd5b5061048d600480360381019061048891906134e6565b6111e3565b005b34801561049b57600080fd5b506104b660048036038101906104b1919061319b565b611203565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613539565b61124e565b005b3480156104ed57600080fd5b50610508600480360381019061050391906135a5565b611326565b005b34801561051657600080fd5b5061051f61134b565b60405161052c9190613098565b60405180910390f35b34801561054157600080fd5b5061055c6004803603810190610557919061319b565b611362565b6040516105699190613209565b60405180910390f35b34801561057e57600080fd5b50610599600480360381019061059491906135d2565b611374565b005b6105b560048036038101906105b091906135d2565b61139a565b005b3480156105c357600080fd5b506105de60048036038101906105d9919061319b565b6117c2565b005b3480156105ec57600080fd5b50610607600480360381019061060291906135ff565b61181e565b60405161061491906134cb565b60405180910390f35b34801561062957600080fd5b506106326118d6565b005b34801561064057600080fd5b506106496118ea565b005b610665600480360381019061066091906135d2565b6118fc565b005b34801561067357600080fd5b5061067c611d41565b6040516106899190613209565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b491906135ff565b611d6b565b6040516106c6919061363b565b60405180910390f35b3480156106db57600080fd5b506106e4611e55565b6040516106f19190613143565b60405180910390f35b34801561070657600080fd5b5061070f611ee7565b60405161071e93929190613656565b60405180910390f35b34801561073357600080fd5b5061074e6004803603810190610749919061368d565b611eff565b005b34801561075c57600080fd5b50610777600480360381019061077291906137fd565b612076565b005b34801561078557600080fd5b506107a0600480360381019061079b91906135ff565b6120e9565b6040516107ad919061363b565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061319b565b612109565b6040516107ea9190613143565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613880565b612185565b604051610827919061363b565b60405180910390f35b34801561083c57600080fd5b50610857600480360381019061085291906138c0565b6121b4565b6040516108649190613098565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f91906135d2565b612248565b005b3480156108a257600080fd5b506108bd60048036038101906108b891906135ff565b612308565b005b3480156108cb57600080fd5b506108e660048036038101906108e191906135a5565b61238b565b005b60006108f3826123b0565b9050919050565b6060600280546109099061392f565b80601f01602080910402602001604051908101604052809291908181526020018280546109359061392f565b80156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b5050505050905090565b600061099782612442565b6109cd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1682611362565b90508073ffffffffffffffffffffffffffffffffffffffff16610a376124a1565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a57610a6381610a5e6124a1565b6121b4565b610a99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b576124a9565b818190508484905014610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b96906139ac565b60405180910390fd5b84601060006101000a81548160ff021916908360ff16021790555060005b848490508160ff161015610cb05782828260ff16818110610be157610be06139cc565b5b9050602002016020810190610bf691906135d2565b600e600087878560ff16818110610c1057610c0f6139cc565b5b9050602002016020810190610c2591906135ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610ca890613a2a565b915050610bbd565b505050505050565b610cc06124a9565b8181600c9182610cd1929190613c0a565b505050565b6000610ce0612527565b6001546000540303905090565b6000610cf882612530565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d6b846125fc565b91509150610d818187610d7c6124a1565b612623565b610dcd57610d9686610d916124a1565b6121b4565b610dcc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e408686866001612667565b8015610e4b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1985610ef588888761266d565b7c020000000000000000000000000000000000000000000000000000000017612695565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f9f5760006001850190506000600460008381526020019081526020016000205403610f9d576000548114610f9c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100786868660016126c0565b505050505050565b6110176124a9565b600d60009054906101000a900460ff1615611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90613d26565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b600061108e6126c6565b905090565b6000600a546110a06126c6565b14905090565b6110ae6124a9565b600d60009054906101000a900460ff166110fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f490613d92565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b6111226124a9565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114890613de3565b60006040518083038185875af1925050503d8060008114611185576040519150601f19603f3d011682016040523d82523d6000602084013e61118a565b606091505b50509050806111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c590613e44565b60405180910390fd5b50565b6111d96124a9565b6111e16126d9565b565b6111fe83838360405180602001604052806000815250612076565b505050565b61120b6124a9565b6112148161273c565b7fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb8160405161124391906134cb565b60405180910390a150565b6112566124a9565b600d60009054906101000a900460ff16156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613eb0565b60405180910390fd5b600a548160ff166112b56126c6565b6112bf9190613ed0565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613f50565b60405180910390fd5b816011600001819055508060ff1660116001018190555060006011600201819055505050565b61132e6124a9565b80600d60016101000a81548160ff02191690831515021790555050565b6000600860149054906101000a900460ff16905090565b600061136d82612530565b9050919050565b61137c6124a9565b80600b60006101000a81548160ff021916908360ff16021790555050565b6002600954036113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613fbc565b60405180910390fd5b60026009819055506113ef61274a565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614028565b60405180910390fd5b600d60009054906101000a900460ff166114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390613d92565b60405180910390fd5b60008160ff166011600001546114c29190614048565b9050803414611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd906140d6565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff1611156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890614142565b60405180910390fd5b6011600101548260ff166011600201546115db9190613ed0565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906141ae565b60405180910390fd5b600a548260ff1661162b6126c6565b6116359190613ed0565b1115611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d9061421a565b60405180910390fd5b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060008282829054906101000a900460ff166116f7919061423a565b92506101000a81548160ff021916908360ff1602179055508160ff16601160020160008282546117279190613ed0565b925050819055506011600101546011600201540361175b576000600d60006101000a81548160ff0219169083151502179055505b611768338360ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040516117ae91906142a0565b60405180910390a250600160098190555050565b6117ca6124a9565b806117d36126c6565b1115611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614307565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611885576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118de6124a9565b6118e8600061294f565b565b6118f26124a9565b6118fa612a15565b565b600260095403611941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193890613fbc565b60405180910390fd5b600260098190555061195161274a565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690614028565b60405180910390fd5b600d60009054906101000a900460ff16611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590613d92565b60405180910390fd5b600d60029054906101000a900460ff16611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614373565b60405180910390fd5b60008160ff16601160000154611a739190614048565b9050803414611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae906140d6565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600b60009054906101000a900460ff16611b1e919061423a565b60ff168260ff161115611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906143df565b60405180910390fd5b6011600101548260ff16601160020154611b809190613ed0565b1115611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb8906141ae565b60405180910390fd5b600a548260ff16611bd06126c6565b611bda9190613ed0565b1115611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c129061421a565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff16611c7691906143ff565b92506101000a81548160ff021916908360ff1602179055508160ff1660116002016000828254611ca69190613ed0565b9250508190555060116001015460116002015403611cda576000600d60006101000a81548160ff0219169083151502179055505b611ce7338360ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe83604051611d2d91906142a0565b60405180910390a250600160098190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614480565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601060009054906101000a900460ff1660ff1660ff16815260200190815260200160002060009054906101000a900460ff169050919050565b606060038054611e649061392f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e909061392f565b8015611edd5780601f10611eb257610100808354040283529160200191611edd565b820191906000526020600020905b815481529060010190602001808311611ec057829003601f168201915b5050505050905090565b60118060000154908060010154908060020154905083565b611f076124a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f6b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f786124a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120256124a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161206a9190613098565b60405180910390a35050565b612081848484610ced565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120e3576120ac84848484612a78565b6120e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061211482612442565b612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a90614512565b60405180910390fd5b600c61215e83612bc8565b60405160200161216f9291906145f1565b6040516020818303038152906040529050919050565b600e6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122506124a9565b600a548160ff1661225f6126c6565b6122699190613ed0565b11156122aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a19061421a565b60405180910390fd5b6122b7338260ff16612794565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe826040516122fd91906142a0565b60405180910390a250565b6123106124a9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690614687565b60405180910390fd5b6123888161294f565b50565b6123936124a9565b80600d60026101000a81548160ff02191690831515021790555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061243b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008161244d612527565b1115801561245c575060005482105b801561249a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6124b1612d28565b73ffffffffffffffffffffffffffffffffffffffff166124cf611d41565b73ffffffffffffffffffffffffffffffffffffffff1614612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c906146f3565b60405180910390fd5b565b60006001905090565b6000808290508061253f612527565b116125c5576000548110156125c45760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036125c2575b600081036125b857600460008360019003935083815260200190815260200160002054905061258e565b80925050506125f7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612684868684612d30565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006126d0612527565b60005403905090565b6126e1612d39565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612725612d28565b6040516127329190613209565b60405180910390a1565b612747816000612d82565b50565b61275261134b565b15612792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127899061475f565b60405180910390fd5b565b600080549050600082036127d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e16000848385612667565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061285883612849600086600061266d565b61285285612fd4565b17612695565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146128f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506128be565b5060008203612934576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061294a60008483856126c0565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1d61274a565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a61612d28565b604051612a6e9190613209565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9e6124a1565b8786866040518563ffffffff1660e01b8152600401612ac094939291906147d4565b6020604051808303816000875af1925050508015612afc57506040513d601f19601f82011682018060405250810190612af99190614835565b60015b612b75573d8060008114612b2c576040519150601f19603f3d011682016040523d82523d6000602084013e612b31565b606091505b506000815103612b6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612c0f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d23565b600082905060005b60008214612c41578080612c2a90614862565b915050600a82612c3a91906148d9565b9150612c17565b60008167ffffffffffffffff811115612c5d57612c5c6136d2565b5b6040519080825280601f01601f191660200182016040528015612c8f5781602001600182028036833780820191505090505b5090505b60008514612d1c57600182612ca8919061490a565b9150600a85612cb7919061493e565b6030612cc39190613ed0565b60f81b818381518110612cd957612cd86139cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d1591906148d9565b9450612c93565b8093505050505b919050565b600033905090565b60009392505050565b612d4161134b565b612d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d77906149bb565b60405180910390fd5b565b6000612d8d83612530565b90506000819050600080612da0866125fc565b915091508415612e0957612dbc8184612db76124a1565b612623565b612e0857612dd183612dcc6124a1565b6121b4565b612e07576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612e17836000886001612667565b8015612e2257600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612eca83612e878560008861266d565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612695565b600460008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612f505760006001870190506000600460008381526020019081526020016000205403612f4e576000548114612f4d578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fba8360008860016126c0565b600160008154809291906001019190505550505050505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61302d81612ff8565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60006020828403121561306657613065612fee565b5b60006130748482850161303b565b91505092915050565b60008115159050919050565b6130928161307d565b82525050565b60006020820190506130ad6000830184613089565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ed5780820151818401526020810190506130d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613115826130b3565b61311f81856130be565b935061312f8185602086016130cf565b613138816130f9565b840191505092915050565b6000602082019050818103600083015261315d818461310a565b905092915050565b6000819050919050565b61317881613165565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b6000602082840312156131b1576131b0612fee565b5b60006131bf84828501613186565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f3826131c8565b9050919050565b613203816131e8565b82525050565b600060208201905061321e60008301846131fa565b92915050565b61322d816131e8565b811461323857600080fd5b50565b60008135905061324a81613224565b92915050565b6000806040838503121561326757613266612fee565b5b60006132758582860161323b565b925050602061328685828601613186565b9150509250929050565b600060ff82169050919050565b6132a681613290565b81146132b157600080fd5b50565b6000813590506132c38161329d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132ee576132ed6132c9565b5b8235905067ffffffffffffffff81111561330b5761330a6132ce565b5b602083019150836020820283011115613327576133266132d3565b5b9250929050565b60008083601f840112613344576133436132c9565b5b8235905067ffffffffffffffff811115613361576133606132ce565b5b60208301915083602082028301111561337d5761337c6132d3565b5b9250929050565b6000806000806000606086880312156133a05761339f612fee565b5b60006133ae888289016132b4565b955050602086013567ffffffffffffffff8111156133cf576133ce612ff3565b5b6133db888289016132d8565b9450945050604086013567ffffffffffffffff8111156133fe576133fd612ff3565b5b61340a8882890161332e565b92509250509295509295909350565b60008083601f84011261342f5761342e6132c9565b5b8235905067ffffffffffffffff81111561344c5761344b6132ce565b5b602083019150836001820283011115613468576134676132d3565b5b9250929050565b6000806020838503121561348657613485612fee565b5b600083013567ffffffffffffffff8111156134a4576134a3612ff3565b5b6134b085828601613419565b92509250509250929050565b6134c581613165565b82525050565b60006020820190506134e060008301846134bc565b92915050565b6000806000606084860312156134ff576134fe612fee565b5b600061350d8682870161323b565b935050602061351e8682870161323b565b925050604061352f86828701613186565b9150509250925092565b600080604083850312156135505761354f612fee565b5b600061355e85828601613186565b925050602061356f858286016132b4565b9150509250929050565b6135828161307d565b811461358d57600080fd5b50565b60008135905061359f81613579565b92915050565b6000602082840312156135bb576135ba612fee565b5b60006135c984828501613590565b91505092915050565b6000602082840312156135e8576135e7612fee565b5b60006135f6848285016132b4565b91505092915050565b60006020828403121561361557613614612fee565b5b60006136238482850161323b565b91505092915050565b61363581613290565b82525050565b6000602082019050613650600083018461362c565b92915050565b600060608201905061366b60008301866134bc565b61367860208301856134bc565b61368560408301846134bc565b949350505050565b600080604083850312156136a4576136a3612fee565b5b60006136b28582860161323b565b92505060206136c385828601613590565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61370a826130f9565b810181811067ffffffffffffffff82111715613729576137286136d2565b5b80604052505050565b600061373c612fe4565b90506137488282613701565b919050565b600067ffffffffffffffff821115613768576137676136d2565b5b613771826130f9565b9050602081019050919050565b82818337600083830152505050565b60006137a061379b8461374d565b613732565b9050828152602081018484840111156137bc576137bb6136cd565b5b6137c784828561377e565b509392505050565b600082601f8301126137e4576137e36132c9565b5b81356137f484826020860161378d565b91505092915050565b6000806000806080858703121561381757613816612fee565b5b60006138258782880161323b565b94505060206138368782880161323b565b935050604061384787828801613186565b925050606085013567ffffffffffffffff81111561386857613867612ff3565b5b613874878288016137cf565b91505092959194509250565b6000806040838503121561389757613896612fee565b5b60006138a58582860161323b565b92505060206138b6858286016132b4565b9150509250929050565b600080604083850312156138d7576138d6612fee565b5b60006138e58582860161323b565b92505060206138f68582860161323b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061394757607f821691505b60208210810361395a57613959613900565b5b50919050565b7f4c656e67746820697320646966666572656e7400000000000000000000000000600082015250565b60006139966013836130be565b91506139a182613960565b602082019050919050565b600060208201905081810360008301526139c581613989565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3582613290565b915060ff8203613a4857613a476139fb565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ac07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a83565b613aca8683613a83565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b07613b02613afd84613165565b613ae2565b613165565b9050919050565b6000819050919050565b613b2183613aec565b613b35613b2d82613b0e565b848454613a90565b825550505050565b600090565b613b4a613b3d565b613b55818484613b18565b505050565b5b81811015613b7957613b6e600082613b42565b600181019050613b5b565b5050565b601f821115613bbe57613b8f81613a5e565b613b9884613a73565b81016020851015613ba7578190505b613bbb613bb385613a73565b830182613b5a565b50505b505050565b600082821c905092915050565b6000613be160001984600802613bc3565b1980831691505092915050565b6000613bfa8383613bd0565b9150826002028217905092915050565b613c148383613a53565b67ffffffffffffffff811115613c2d57613c2c6136d2565b5b613c37825461392f565b613c42828285613b7d565b6000601f831160018114613c715760008415613c5f578287013590505b613c698582613bee565b865550613cd1565b601f198416613c7f86613a5e565b60005b82811015613ca757848901358255600182019150602085019450602081019050613c82565b86831015613cc45784890135613cc0601f891682613bd0565b8355505b6001600288020188555050505b50505050505050565b7f4d696e74696e67206973206f6e00000000000000000000000000000000000000600082015250565b6000613d10600d836130be565b9150613d1b82613cda565b602082019050919050565b60006020820190508181036000830152613d3f81613d03565b9050919050565b7f4d696e74696e67206973206f6666000000000000000000000000000000000000600082015250565b6000613d7c600e836130be565b9150613d8782613d46565b602082019050919050565b60006020820190508181036000830152613dab81613d6f565b9050919050565b600081905092915050565b50565b6000613dcd600083613db2565b9150613dd882613dbd565b600082019050919050565b6000613dee82613dc0565b9150819050919050565b7f4574686572207472616e73666572206661696c65640000000000000000000000600082015250565b6000613e2e6015836130be565b9150613e3982613df8565b602082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f4d696e74696e67206973206e6f77206c69766500000000000000000000000000600082015250565b6000613e9a6013836130be565b9150613ea582613e64565b602082019050919050565b60006020820190508181036000830152613ec981613e8d565b9050919050565b6000613edb82613165565b9150613ee683613165565b9250828201905080821115613efe57613efd6139fb565b5b92915050565b7f457863656564696e67206d617820737570706c79000000000000000000000000600082015250565b6000613f3a6014836130be565b9150613f4582613f04565b602082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fa6601f836130be565b9150613fb182613f70565b602082019050919050565b60006020820190508181036000830152613fd581613f99565b9050919050565b7f53656e646572206973206e6f7420454f41000000000000000000000000000000600082015250565b60006140126011836130be565b915061401d82613fdc565b602082019050919050565b6000602082019050818103600083015261404181614005565b9050919050565b600061405382613165565b915061405e83613165565b925082820261406c81613165565b91508282048414831517614083576140826139fb565b5b5092915050565b7f496e76616c6964204554482062616c616e636500000000000000000000000000600082015250565b60006140c06013836130be565b91506140cb8261408a565b602082019050919050565b600060208201905081810360008301526140ef816140b3565b9050919050565b7f4e6f20616c6c6f77656420616d6f756e74000000000000000000000000000000600082015250565b600061412c6011836130be565b9150614137826140f6565b602082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f457863656564696e672073616c6520616d6f756e740000000000000000000000600082015250565b60006141986015836130be565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f457863656564696e67206d617820737570706c7920616d6f756e740000000000600082015250565b6000614204601b836130be565b915061420f826141ce565b602082019050919050565b60006020820190508181036000830152614233816141f7565b9050919050565b600061424582613290565b915061425083613290565b9250828203905060ff811115614269576142686139fb565b5b92915050565b600061428a61428561428084613290565b613ae2565b613165565b9050919050565b61429a8161426f565b82525050565b60006020820190506142b56000830184614291565b92915050565b7f4c657373207468616e20746f74616c206d696e74656420616d6f756e74000000600082015250565b60006142f1601d836130be565b91506142fc826142bb565b602082019050919050565b60006020820190508181036000830152614320816142e4565b9050919050565b7f4d696e74696e67206973206e6f74207075626c69630000000000000000000000600082015250565b600061435d6015836130be565b915061436882614327565b602082019050919050565b6000602082019050818103600083015261438c81614350565b9050919050565b7f4e6f207075626c696320616c6c6f77656420616d6f756e740000000000000000600082015250565b60006143c96018836130be565b91506143d482614393565b602082019050919050565b600060208201905081810360008301526143f8816143bc565b9050919050565b600061440a82613290565b915061441583613290565b9250828201905060ff81111561442e5761442d6139fb565b5b92915050565b7f616464726573732063616e277420626520300000000000000000000000000000600082015250565b600061446a6012836130be565b915061447582614434565b602082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144fc602f836130be565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b9050919050565b600081905092915050565b6000815461454a8161392f565b6145548186614532565b9450600182166000811461456f5760018114614584576145b7565b60ff19831686528115158202860193506145b7565b61458d85613a5e565b60005b838110156145af57815481890152600182019150602081019050614590565b838801955050505b50505092915050565b60006145cb826130b3565b6145d58185614532565b93506145e58185602086016130cf565b80840191505092915050565b60006145fd828561453d565b915061460982846145c0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146716026836130be565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146dd6020836130be565b91506146e8826146a7565b602082019050919050565b6000602082019050818103600083015261470c816146d0565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006147496010836130be565b915061475482614713565b602082019050919050565b600060208201905081810360008301526147788161473c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147a68261477f565b6147b0818561478a565b93506147c08185602086016130cf565b6147c9816130f9565b840191505092915050565b60006080820190506147e960008301876131fa565b6147f660208301866131fa565b61480360408301856134bc565b8181036060830152614815818461479b565b905095945050505050565b60008151905061482f81613024565b92915050565b60006020828403121561484b5761484a612fee565b5b600061485984828501614820565b91505092915050565b600061486d82613165565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361489f5761489e6139fb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148e482613165565b91506148ef83613165565b9250826148ff576148fe6148aa565b5b828204905092915050565b600061491582613165565b915061492083613165565b9250828203905081811115614938576149376139fb565b5b92915050565b600061494982613165565b915061495483613165565b925082614964576149636148aa565b5b828206905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006149a56014836130be565b91506149b08261496f565b602082019050919050565b600060208201905081810360008301526149d481614998565b905091905056fea2646970667358221220947f07ad14ae5cb3a24f0214ccd22afc00ba5f9d7f1e2a32e47fbc8df14dc0e364736f6c63430008110033

Deployed Bytecode Sourcemap

188:5992:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5807:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5019:374:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3704:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5851:317:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:2756;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4894:119:3;;;;;;;;;;;;;:::i;:::-;;5604:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5702:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4769:119;;;;;;;;;;;;;:::i;:::-;;3495:203;;;;;;;;;;;;;:::i;:::-;;4698:65;;;;;;;;;;;;;:::i;:::-;;22765:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3380:109:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4316:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3826:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1608:84:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11348:150:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4212:98:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1346:882;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4026:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7002:230:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:4;;;;;;;;;;;;;:::i;:::-;;4631:61:3;;;;;;;;;;;;;:::i;:::-;;2540:834;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5403:195:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;774:24:3;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16850:303:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23525:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;682:52:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1083:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;611:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2304:230:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3927:93:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5807:162;5901:4;5924:38;5950:11;5924:25;:38::i;:::-;5917:45;;5807:162;;;:::o;9996:98:1:-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;5019:374:3:-;1087:13:4;:11;:13::i;:::-;5180:8:3::1;;:15;;5159:10;;:17;;:36;5151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5242:10;5230:9;;:22;;;;;;;;;;;;;;;;;;5267:7;5263:124;5284:10;;:17;;5280:1;:21;;;5263:124;;;5365:8;;5374:1;5365:11;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5322:14;:29;5337:10;;5348:1;5337:13;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5322:29;;;;;;;;;;;;;;;:40;5352:9;;;;;;;;;;;5322:40;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;5303:3;;;;;:::i;:::-;;;;5263:124;;;;5019:374:::0;;;;;:::o;3704:116::-;1087:13:4;:11;:13::i;:::-;3801:12:3::1;;3787:11;:26;;;;;;;:::i;:::-;;3704:116:::0;;:::o;5851:317:1:-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;19918:2756::-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;4894:119:3:-;1087:13:4;:11;:13::i;:::-;4953:9:3::1;;;;;;;;;;;4952:10;4944:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;5002:4;4990:9;;:16;;;;;;;;;;;;;;;;;;4894:119::o:0;5604:92::-;5649:7;5675:14;:12;:14::i;:::-;5668:21;;5604:92;:::o;5702:99::-;5744:4;5785:9;;5767:14;:12;:14::i;:::-;:27;5760:34;;5702:99;:::o;4769:119::-;1087:13:4;:11;:13::i;:::-;4826:9:3::1;;;;;;;;;;;4818:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4876:5;4864:9;;:17;;;;;;;;;;;;;;;;;;4769:119::o:0;3495:203::-;1087:13:4;:11;:13::i;:::-;3545:12:3::1;3563:10;:15;;3586:21;3563:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3544:68;;;3627:7;3622:70;;3650:31;;;;;;;;;;:::i;:::-;;;;;;;;3622:70;3534:164;3495:203::o:0;4698:65::-;1087:13:4;:11;:13::i;:::-;4746:10:3::1;:8;:10::i;:::-;4698:65::o:0;22765:179:1:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;3380:109:3:-;1087:13:4;:11;:13::i;:::-;3440:14:3::1;3446:7;3440:5;:14::i;:::-;3469:13;3474:7;3469:13;;;;;;:::i;:::-;;;;;;;;3380:109:::0;:::o;4316:309::-;1087:13:4;:11;:13::i;:::-;4405:9:3::1;;;;;;;;;;;4404:10;4396:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4483:9;;4473:6;4456:23;;:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:36;;4448:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4544:5;4527:8;:14;;:22;;;;4577:6;4559:24;;:8;:15;;:24;;;;4617:1;4593:8;:21;;:25;;;;4316:309:::0;;:::o;3826:95::-;1087:13:4;:11;:13::i;:::-;3905:9:3::1;3892:10;;:22;;;;;;;;;;;;;;;;;;3826:95:::0;:::o;1608:84:5:-;1655:4;1678:7;;;;;;;;;;;1671:14;;1608:84;:::o;11348:150:1:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;4212:98:3:-;1087:13:4;:11;:13::i;:::-;4293:10:3::1;4281:9;;:22;;;;;;;;;;;;;;;;;;4212:98:::0;:::o;1346:882::-;1744:1:6;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1232:19:5::1;:17;:19::i;:::-;6032:9:3::2;6018:23;;:10;:23;;;6010:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1479:9:::3;;;;;;;;;;;1471:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1549:14;1583:6;1566:23;;:8;:14;;;:23;;;;:::i;:::-;1549:40;;1620:6;1607:9;:19;1599:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1710:14;:26;1725:10;1710:26;;;;;;;;;;;;;;;:37;1737:9;;;;;;;;;;;1710:37;;;;;;;;;;;;;;;;;;;;;;;;;1700:47;;:6;:47;;;;1692:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:8;:15;;;1835:6;1811:30;;:8;:21;;;:30;;;;:::i;:::-;:49;;1803:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:9;;1921:6;1904:23;;:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:36;;1896:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2024:6;1983:14;:26;1998:10;1983:26;;;;;;;;;;;;;;;:37;2010:9;;;;;;;;;;;1983:37;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2065:6;2040:31;;:8;:21;;;:31;;;;;;;:::i;:::-;;;;;;;;2110:8;:15;;;2085:8;:21;;;:40:::0;2082:62:::3;;2139:5;2127:9;;:17;;;;;;;;;;;;;;;;;;2082:62;2155:25;2161:10;2173:6;2155:25;;:5;:25::i;:::-;2202:10;2195:26;;;2214:6;2195:26;;;;;;:::i;:::-;;;;;;;;1432:796;1701:1:6::0;2628:7;:22;;;;1346:882:3;:::o;4026:180::-;1087:13:4;:11;:13::i;:::-;4123:10:3::1;4105:14;:12;:14::i;:::-;:28;;4097:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;4189:10;4177:9;:22;;;;4026:180:::0;:::o;7002:230:1:-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1824:101:4:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;4631:61:3:-;1087:13:4;:11;:13::i;:::-;4677:8:3::1;:6;:8::i;:::-;4631:61::o:0;2540:834::-;1744:1:6;2325:7;;:19;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1232:19:5::1;:17;:19::i;:::-;6032:9:3::2;6018:23;;:10;:23;;;6010:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2650:9:::3;;;;;;;;;;;2642:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2696:8;;;;;;;;;;;2688:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;2741:14;2775:6;2758:23;;:8;:14;;;:23;;;;:::i;:::-;2741:40;;2812:6;2799:9;:19;2791:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2883:19;:31;2903:10;2883:31;;;;;;;;;;;;;;;;;;;;;;;;;2871:9;;;;;;;;;;;:43;;;;:::i;:::-;2861:53;;:6;:53;;;;2853:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;2996:8;:15;;;2986:6;2962:30;;:8;:21;;;:30;;;;:::i;:::-;:49;;2954:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;3082:9;;3072:6;3055:23;;:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:36;;3047:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3170:6;3135:19;:31;3155:10;3135:31;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3211:6;3186:31;;:8;:21;;;:31;;;;;;;:::i;:::-;;;;;;;;3256:8;:15;;;3231:8;:21;;;:40:::0;3228:62:::3;;3285:5;3273:9;;:17;;;;;;;;;;;;;;;;;;3228:62;3301:25;3307:10;3319:6;3301:25;;:5;:25::i;:::-;3348:10;3341:26;;;3360:6;3341:26;;;;;;:::i;:::-;;;;;;;;2632:742;1701:1:6::0;2628:7;:22;;;;2540:834:3;:::o;1194:85:4:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;5403:195:3:-;5469:5;5514:1;5494:22;;:8;:22;;;5486:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5556:14;:24;5571:8;5556:24;;;;;;;;;;;;;;;:35;5581:9;;;;;;;;;;;5556:35;;;;;;;;;;;;;;;;;;;;;;;;;5549:42;;5403:195;;;:::o;10165:102:1:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;774:24:3:-;;;;;;;;;;;;;;;;;;;:::o;16850:303:1:-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;23525:388::-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;682:52:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;1083:257::-;1149:13;1182:17;1190:8;1182:7;:17::i;:::-;1174:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1292:11;1305:26;1322:8;1305:16;:26::i;:::-;1275:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1261:72;;1083:257;;;:::o;611:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17303:162:1:-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;2304:230:3:-;1087:13:4;:11;:13::i;:::-;2410:9:3::1;;2400:6;2383:23;;:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:36;;2375:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2461:25;2467:10;2479:6;2461:25;;:5;:25::i;:::-;2508:10;2501:26;;;2520:6;2501:26;;;;;;:::i;:::-;;;;;;;;2304:230:::0;:::o;2074:198:4:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;3927:93:3:-;1087:13:4;:11;:13::i;:::-;4004:9:3::1;3993:8;;:20;;;;;;;;;;;;;;;;;;3927:93:::0;:::o;9112:630:1:-;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;17714:277::-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;1352:130:4:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;986:91:3:-;1043:7;1069:1;1062:8;;986:91;:::o;12472:1249:1:-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;13467:111;13484:1;13474:6;:11;13467:111;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::o;6261:290::-;6316:7;6519:15;:13;:15::i;:::-;6503:13;;:31;6496:38;;6261:290;:::o;2426:117:5:-;1479:16;:14;:16::i;:::-;2494:5:::1;2484:7;;:15;;;;;;;;;;;;;;;;;;2514:22;2523:12;:10;:12::i;:::-;2514:22;;;;;;:::i;:::-;;;;;;;;2426:117::o:0;33276:87:1:-;33335:21;33341:7;33350:5;33335;:21::i;:::-;33276:87;:::o;1760:106:5:-;1830:8;:6;:8::i;:::-;1829:9;1821:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1760:106::o;27082:2396:1:-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;2426:187:4:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;2179:115:5:-;1232:19;:17;:19::i;:::-;2248:4:::1;2238:7;;:14;;;;;;;;;;;;;;;;;;2267:20;2274:12;:10;:12::i;:::-;2267:20;;;;;;:::i;:::-;;;;;;;;2179:115::o:0;25939:697:1:-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;392:703:7:-;448:13;674:1;665:5;:10;661:51;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;37960:143:1:-;38093:6;37960:143;;;;;:::o;1938:106:5:-;2004:8;:6;:8::i;:::-;1996:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1938:106::o;33580:3015:1:-;33659:27;33689;33708:7;33689:18;:27::i;:::-;33659:57;;33727:12;33758:19;33727:52;;33791:27;33820:23;33847:35;33874:7;33847:26;:35::i;:::-;33790:92;;;;33897:13;33893:312;;;34016:68;34041:15;34058:4;34064:19;:17;:19::i;:::-;34016:24;:68::i;:::-;34011:183;;34107:43;34124:4;34130:19;:17;:19::i;:::-;34107:16;:43::i;:::-;34102:92;;34159:35;;;;;;;;;;;;;;34102:92;34011:183;33893:312;34215:51;34237:4;34251:1;34255:7;34264:1;34215:21;:51::i;:::-;34355:15;34352:157;;;34493:1;34472:19;34465:30;34352:157;35157:1;1576:3;35127:1;:26;;35126:32;35098:18;:24;35117:4;35098:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;35418:173;35454:4;35524:53;35539:4;35553:1;35557:19;35524:14;:53::i;:::-;2349:8;2075;35477:43;35476:101;35418:18;:173::i;:::-;35389:17;:26;35407:7;35389:26;;;;;;;;;;;:202;;;;35759:1;2349:8;35708:19;:47;:52;35704:617;;35780:19;35812:1;35802:7;:11;35780:33;;35967:1;35933:17;:30;35951:11;35933:30;;;;;;;;;;;;:35;35929:378;;36069:13;;36054:11;:28;36050:239;;36247:19;36214:17;:30;36232:11;36214:30;;;;;;;;;;;:52;;;;36050:239;35929:378;35762:559;35704:617;36373:7;36369:1;36346:35;;36355:4;36346:35;;;;;;;;;;;;36391:50;36412:4;36426:1;36430:7;36439:1;36391:20;:50::i;:::-;36564:12;;:14;;;;;;;;;;;;;33649:2946;;;;33580:3015;;:::o;14794:318::-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;7:75:8:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:86::-;4925:7;4965:4;4958:5;4954:16;4943:27;;4890:86;;;:::o;4982:118::-;5053:22;5069:5;5053:22;:::i;:::-;5046:5;5043:33;5033:61;;5090:1;5087;5080:12;5033:61;4982:118;:::o;5106:135::-;5150:5;5188:6;5175:20;5166:29;;5204:31;5229:5;5204:31;:::i;:::-;5106:135;;;;:::o;5247:117::-;5356:1;5353;5346:12;5370:117;5479:1;5476;5469:12;5493:117;5602:1;5599;5592:12;5633:568;5706:8;5716:6;5766:3;5759:4;5751:6;5747:17;5743:27;5733:122;;5774:79;;:::i;:::-;5733:122;5887:6;5874:20;5864:30;;5917:18;5909:6;5906:30;5903:117;;;5939:79;;:::i;:::-;5903:117;6053:4;6045:6;6041:17;6029:29;;6107:3;6099:4;6091:6;6087:17;6077:8;6073:32;6070:41;6067:128;;;6114:79;;:::i;:::-;6067:128;5633:568;;;;;:::o;6222:566::-;6293:8;6303:6;6353:3;6346:4;6338:6;6334:17;6330:27;6320:122;;6361:79;;:::i;:::-;6320:122;6474:6;6461:20;6451:30;;6504:18;6496:6;6493:30;6490:117;;;6526:79;;:::i;:::-;6490:117;6640:4;6632:6;6628:17;6616:29;;6694:3;6686:4;6678:6;6674:17;6664:8;6660:32;6657:41;6654:128;;;6701:79;;:::i;:::-;6654:128;6222:566;;;;;:::o;6794:1071::-;6921:6;6929;6937;6945;6953;7002:2;6990:9;6981:7;6977:23;6973:32;6970:119;;;7008:79;;:::i;:::-;6970:119;7128:1;7153:51;7196:7;7187:6;7176:9;7172:22;7153:51;:::i;:::-;7143:61;;7099:115;7281:2;7270:9;7266:18;7253:32;7312:18;7304:6;7301:30;7298:117;;;7334:79;;:::i;:::-;7298:117;7447:80;7519:7;7510:6;7499:9;7495:22;7447:80;:::i;:::-;7429:98;;;;7224:313;7604:2;7593:9;7589:18;7576:32;7635:18;7627:6;7624:30;7621:117;;;7657:79;;:::i;:::-;7621:117;7770:78;7840:7;7831:6;7820:9;7816:22;7770:78;:::i;:::-;7752:96;;;;7547:311;6794:1071;;;;;;;;:::o;7885:553::-;7943:8;7953:6;8003:3;7996:4;7988:6;7984:17;7980:27;7970:122;;8011:79;;:::i;:::-;7970:122;8124:6;8111:20;8101:30;;8154:18;8146:6;8143:30;8140:117;;;8176:79;;:::i;:::-;8140:117;8290:4;8282:6;8278:17;8266:29;;8344:3;8336:4;8328:6;8324:17;8314:8;8310:32;8307:41;8304:128;;;8351:79;;:::i;:::-;8304:128;7885:553;;;;;:::o;8444:529::-;8515:6;8523;8572:2;8560:9;8551:7;8547:23;8543:32;8540:119;;;8578:79;;:::i;:::-;8540:119;8726:1;8715:9;8711:17;8698:31;8756:18;8748:6;8745:30;8742:117;;;8778:79;;:::i;:::-;8742:117;8891:65;8948:7;8939:6;8928:9;8924:22;8891:65;:::i;:::-;8873:83;;;;8669:297;8444:529;;;;;:::o;8979:118::-;9066:24;9084:5;9066:24;:::i;:::-;9061:3;9054:37;8979:118;;:::o;9103:222::-;9196:4;9234:2;9223:9;9219:18;9211:26;;9247:71;9315:1;9304:9;9300:17;9291:6;9247:71;:::i;:::-;9103:222;;;;:::o;9331:619::-;9408:6;9416;9424;9473:2;9461:9;9452:7;9448:23;9444:32;9441:119;;;9479:79;;:::i;:::-;9441:119;9599:1;9624:53;9669:7;9660:6;9649:9;9645:22;9624:53;:::i;:::-;9614:63;;9570:117;9726:2;9752:53;9797:7;9788:6;9777:9;9773:22;9752:53;:::i;:::-;9742:63;;9697:118;9854:2;9880:53;9925:7;9916:6;9905:9;9901:22;9880:53;:::i;:::-;9870:63;;9825:118;9331:619;;;;;:::o;9956:470::-;10022:6;10030;10079:2;10067:9;10058:7;10054:23;10050:32;10047:119;;;10085:79;;:::i;:::-;10047:119;10205:1;10230:53;10275:7;10266:6;10255:9;10251:22;10230:53;:::i;:::-;10220:63;;10176:117;10332:2;10358:51;10401:7;10392:6;10381:9;10377:22;10358:51;:::i;:::-;10348:61;;10303:116;9956:470;;;;;:::o;10432:116::-;10502:21;10517:5;10502:21;:::i;:::-;10495:5;10492:32;10482:60;;10538:1;10535;10528:12;10482:60;10432:116;:::o;10554:133::-;10597:5;10635:6;10622:20;10613:29;;10651:30;10675:5;10651:30;:::i;:::-;10554:133;;;;:::o;10693:323::-;10749:6;10798:2;10786:9;10777:7;10773:23;10769:32;10766:119;;;10804:79;;:::i;:::-;10766:119;10924:1;10949:50;10991:7;10982:6;10971:9;10967:22;10949:50;:::i;:::-;10939:60;;10895:114;10693:323;;;;:::o;11022:325::-;11079:6;11128:2;11116:9;11107:7;11103:23;11099:32;11096:119;;;11134:79;;:::i;:::-;11096:119;11254:1;11279:51;11322:7;11313:6;11302:9;11298:22;11279:51;:::i;:::-;11269:61;;11225:115;11022:325;;;;:::o;11353:329::-;11412:6;11461:2;11449:9;11440:7;11436:23;11432:32;11429:119;;;11467:79;;:::i;:::-;11429:119;11587:1;11612:53;11657:7;11648:6;11637:9;11633:22;11612:53;:::i;:::-;11602:63;;11558:117;11353:329;;;;:::o;11688:112::-;11771:22;11787:5;11771:22;:::i;:::-;11766:3;11759:35;11688:112;;:::o;11806:214::-;11895:4;11933:2;11922:9;11918:18;11910:26;;11946:67;12010:1;11999:9;11995:17;11986:6;11946:67;:::i;:::-;11806:214;;;;:::o;12026:442::-;12175:4;12213:2;12202:9;12198:18;12190:26;;12226:71;12294:1;12283:9;12279:17;12270:6;12226:71;:::i;:::-;12307:72;12375:2;12364:9;12360:18;12351:6;12307:72;:::i;:::-;12389;12457:2;12446:9;12442:18;12433:6;12389:72;:::i;:::-;12026:442;;;;;;:::o;12474:468::-;12539:6;12547;12596:2;12584:9;12575:7;12571:23;12567:32;12564:119;;;12602:79;;:::i;:::-;12564:119;12722:1;12747:53;12792:7;12783:6;12772:9;12768:22;12747:53;:::i;:::-;12737:63;;12693:117;12849:2;12875:50;12917:7;12908:6;12897:9;12893:22;12875:50;:::i;:::-;12865:60;;12820:115;12474:468;;;;;:::o;12948:117::-;13057:1;13054;13047:12;13071:180;13119:77;13116:1;13109:88;13216:4;13213:1;13206:15;13240:4;13237:1;13230:15;13257:281;13340:27;13362:4;13340:27;:::i;:::-;13332:6;13328:40;13470:6;13458:10;13455:22;13434:18;13422:10;13419:34;13416:62;13413:88;;;13481:18;;:::i;:::-;13413:88;13521:10;13517:2;13510:22;13300:238;13257:281;;:::o;13544:129::-;13578:6;13605:20;;:::i;:::-;13595:30;;13634:33;13662:4;13654:6;13634:33;:::i;:::-;13544:129;;;:::o;13679:307::-;13740:4;13830:18;13822:6;13819:30;13816:56;;;13852:18;;:::i;:::-;13816:56;13890:29;13912:6;13890:29;:::i;:::-;13882:37;;13974:4;13968;13964:15;13956:23;;13679:307;;;:::o;13992:146::-;14089:6;14084:3;14079;14066:30;14130:1;14121:6;14116:3;14112:16;14105:27;13992:146;;;:::o;14144:423::-;14221:5;14246:65;14262:48;14303:6;14262:48;:::i;:::-;14246:65;:::i;:::-;14237:74;;14334:6;14327:5;14320:21;14372:4;14365:5;14361:16;14410:3;14401:6;14396:3;14392:16;14389:25;14386:112;;;14417:79;;:::i;:::-;14386:112;14507:54;14554:6;14549:3;14544;14507:54;:::i;:::-;14227:340;14144:423;;;;;:::o;14586:338::-;14641:5;14690:3;14683:4;14675:6;14671:17;14667:27;14657:122;;14698:79;;:::i;:::-;14657:122;14815:6;14802:20;14840:78;14914:3;14906:6;14899:4;14891:6;14887:17;14840:78;:::i;:::-;14831:87;;14647:277;14586:338;;;;:::o;14930:943::-;15025:6;15033;15041;15049;15098:3;15086:9;15077:7;15073:23;15069:33;15066:120;;;15105:79;;:::i;:::-;15066:120;15225:1;15250:53;15295:7;15286:6;15275:9;15271:22;15250:53;:::i;:::-;15240:63;;15196:117;15352:2;15378:53;15423:7;15414:6;15403:9;15399:22;15378:53;:::i;:::-;15368:63;;15323:118;15480:2;15506:53;15551:7;15542:6;15531:9;15527:22;15506:53;:::i;:::-;15496:63;;15451:118;15636:2;15625:9;15621:18;15608:32;15667:18;15659:6;15656:30;15653:117;;;15689:79;;:::i;:::-;15653:117;15794:62;15848:7;15839:6;15828:9;15824:22;15794:62;:::i;:::-;15784:72;;15579:287;14930:943;;;;;;;:::o;15879:470::-;15945:6;15953;16002:2;15990:9;15981:7;15977:23;15973:32;15970:119;;;16008:79;;:::i;:::-;15970:119;16128:1;16153:53;16198:7;16189:6;16178:9;16174:22;16153:53;:::i;:::-;16143:63;;16099:117;16255:2;16281:51;16324:7;16315:6;16304:9;16300:22;16281:51;:::i;:::-;16271:61;;16226:116;15879:470;;;;;:::o;16355:474::-;16423:6;16431;16480:2;16468:9;16459:7;16455:23;16451:32;16448:119;;;16486:79;;:::i;:::-;16448:119;16606:1;16631:53;16676:7;16667:6;16656:9;16652:22;16631:53;:::i;:::-;16621:63;;16577:117;16733:2;16759:53;16804:7;16795:6;16784:9;16780:22;16759:53;:::i;:::-;16749:63;;16704:118;16355:474;;;;;:::o;16835:180::-;16883:77;16880:1;16873:88;16980:4;16977:1;16970:15;17004:4;17001:1;16994:15;17021:320;17065:6;17102:1;17096:4;17092:12;17082:22;;17149:1;17143:4;17139:12;17170:18;17160:81;;17226:4;17218:6;17214:17;17204:27;;17160:81;17288:2;17280:6;17277:14;17257:18;17254:38;17251:84;;17307:18;;:::i;:::-;17251:84;17072:269;17021:320;;;:::o;17347:169::-;17487:21;17483:1;17475:6;17471:14;17464:45;17347:169;:::o;17522:366::-;17664:3;17685:67;17749:2;17744:3;17685:67;:::i;:::-;17678:74;;17761:93;17850:3;17761:93;:::i;:::-;17879:2;17874:3;17870:12;17863:19;;17522:366;;;:::o;17894:419::-;18060:4;18098:2;18087:9;18083:18;18075:26;;18147:9;18141:4;18137:20;18133:1;18122:9;18118:17;18111:47;18175:131;18301:4;18175:131;:::i;:::-;18167:139;;17894:419;;;:::o;18319:180::-;18367:77;18364:1;18357:88;18464:4;18461:1;18454:15;18488:4;18485:1;18478:15;18505:180;18553:77;18550:1;18543:88;18650:4;18647:1;18640:15;18674:4;18671:1;18664:15;18691:167;18728:3;18751:22;18767:5;18751:22;:::i;:::-;18742:31;;18795:4;18788:5;18785:15;18782:41;;18803:18;;:::i;:::-;18782:41;18850:1;18843:5;18839:13;18832:20;;18691:167;;;:::o;18864:97::-;18923:6;18951:3;18941:13;;18864:97;;;;:::o;18967:141::-;19016:4;19039:3;19031:11;;19062:3;19059:1;19052:14;19096:4;19093:1;19083:18;19075:26;;18967:141;;;:::o;19114:93::-;19151:6;19198:2;19193;19186:5;19182:14;19178:23;19168:33;;19114:93;;;:::o;19213:107::-;19257:8;19307:5;19301:4;19297:16;19276:37;;19213:107;;;;:::o;19326:393::-;19395:6;19445:1;19433:10;19429:18;19468:97;19498:66;19487:9;19468:97;:::i;:::-;19586:39;19616:8;19605:9;19586:39;:::i;:::-;19574:51;;19658:4;19654:9;19647:5;19643:21;19634:30;;19707:4;19697:8;19693:19;19686:5;19683:30;19673:40;;19402:317;;19326:393;;;;;:::o;19725:60::-;19753:3;19774:5;19767:12;;19725:60;;;:::o;19791:142::-;19841:9;19874:53;19892:34;19901:24;19919:5;19901:24;:::i;:::-;19892:34;:::i;:::-;19874:53;:::i;:::-;19861:66;;19791:142;;;:::o;19939:75::-;19982:3;20003:5;19996:12;;19939:75;;;:::o;20020:269::-;20130:39;20161:7;20130:39;:::i;:::-;20191:91;20240:41;20264:16;20240:41;:::i;:::-;20232:6;20225:4;20219:11;20191:91;:::i;:::-;20185:4;20178:105;20096:193;20020:269;;;:::o;20295:73::-;20340:3;20295:73;:::o;20374:189::-;20451:32;;:::i;:::-;20492:65;20550:6;20542;20536:4;20492:65;:::i;:::-;20427:136;20374:189;;:::o;20569:186::-;20629:120;20646:3;20639:5;20636:14;20629:120;;;20700:39;20737:1;20730:5;20700:39;:::i;:::-;20673:1;20666:5;20662:13;20653:22;;20629:120;;;20569:186;;:::o;20761:543::-;20862:2;20857:3;20854:11;20851:446;;;20896:38;20928:5;20896:38;:::i;:::-;20980:29;20998:10;20980:29;:::i;:::-;20970:8;20966:44;21163:2;21151:10;21148:18;21145:49;;;21184:8;21169:23;;21145:49;21207:80;21263:22;21281:3;21263:22;:::i;:::-;21253:8;21249:37;21236:11;21207:80;:::i;:::-;20866:431;;20851:446;20761:543;;;:::o;21310:117::-;21364:8;21414:5;21408:4;21404:16;21383:37;;21310:117;;;;:::o;21433:169::-;21477:6;21510:51;21558:1;21554:6;21546:5;21543:1;21539:13;21510:51;:::i;:::-;21506:56;21591:4;21585;21581:15;21571:25;;21484:118;21433:169;;;;:::o;21607:295::-;21683:4;21829:29;21854:3;21848:4;21829:29;:::i;:::-;21821:37;;21891:3;21888:1;21884:11;21878:4;21875:21;21867:29;;21607:295;;;;:::o;21907:1403::-;22031:44;22071:3;22066;22031:44;:::i;:::-;22140:18;22132:6;22129:30;22126:56;;;22162:18;;:::i;:::-;22126:56;22206:38;22238:4;22232:11;22206:38;:::i;:::-;22291:67;22351:6;22343;22337:4;22291:67;:::i;:::-;22385:1;22414:2;22406:6;22403:14;22431:1;22426:632;;;;23102:1;23119:6;23116:84;;;23175:9;23170:3;23166:19;23153:33;23144:42;;23116:84;23226:67;23286:6;23279:5;23226:67;:::i;:::-;23220:4;23213:81;23075:229;22396:908;;22426:632;22478:4;22474:9;22466:6;22462:22;22512:37;22544:4;22512:37;:::i;:::-;22571:1;22585:215;22599:7;22596:1;22593:14;22585:215;;;22685:9;22680:3;22676:19;22663:33;22655:6;22648:49;22736:1;22728:6;22724:14;22714:24;;22783:2;22772:9;22768:18;22755:31;;22622:4;22619:1;22615:12;22610:17;;22585:215;;;22828:6;22819:7;22816:19;22813:186;;;22893:9;22888:3;22884:19;22871:33;22936:48;22978:4;22970:6;22966:17;22955:9;22936:48;:::i;:::-;22928:6;22921:64;22836:163;22813:186;23045:1;23041;23033:6;23029:14;23025:22;23019:4;23012:36;22433:625;;;22396:908;;22006:1304;;;21907:1403;;;:::o;23316:163::-;23456:15;23452:1;23444:6;23440:14;23433:39;23316:163;:::o;23485:366::-;23627:3;23648:67;23712:2;23707:3;23648:67;:::i;:::-;23641:74;;23724:93;23813:3;23724:93;:::i;:::-;23842:2;23837:3;23833:12;23826:19;;23485:366;;;:::o;23857:419::-;24023:4;24061:2;24050:9;24046:18;24038:26;;24110:9;24104:4;24100:20;24096:1;24085:9;24081:17;24074:47;24138:131;24264:4;24138:131;:::i;:::-;24130:139;;23857:419;;;:::o;24282:164::-;24422:16;24418:1;24410:6;24406:14;24399:40;24282:164;:::o;24452:366::-;24594:3;24615:67;24679:2;24674:3;24615:67;:::i;:::-;24608:74;;24691:93;24780:3;24691:93;:::i;:::-;24809:2;24804:3;24800:12;24793:19;;24452:366;;;:::o;24824:419::-;24990:4;25028:2;25017:9;25013:18;25005:26;;25077:9;25071:4;25067:20;25063:1;25052:9;25048:17;25041:47;25105:131;25231:4;25105:131;:::i;:::-;25097:139;;24824:419;;;:::o;25249:147::-;25350:11;25387:3;25372:18;;25249:147;;;;:::o;25402:114::-;;:::o;25522:398::-;25681:3;25702:83;25783:1;25778:3;25702:83;:::i;:::-;25695:90;;25794:93;25883:3;25794:93;:::i;:::-;25912:1;25907:3;25903:11;25896:18;;25522:398;;;:::o;25926:379::-;26110:3;26132:147;26275:3;26132:147;:::i;:::-;26125:154;;26296:3;26289:10;;25926:379;;;:::o;26311:171::-;26451:23;26447:1;26439:6;26435:14;26428:47;26311:171;:::o;26488:366::-;26630:3;26651:67;26715:2;26710:3;26651:67;:::i;:::-;26644:74;;26727:93;26816:3;26727:93;:::i;:::-;26845:2;26840:3;26836:12;26829:19;;26488:366;;;:::o;26860:419::-;27026:4;27064:2;27053:9;27049:18;27041:26;;27113:9;27107:4;27103:20;27099:1;27088:9;27084:17;27077:47;27141:131;27267:4;27141:131;:::i;:::-;27133:139;;26860:419;;;:::o;27285:169::-;27425:21;27421:1;27413:6;27409:14;27402:45;27285:169;:::o;27460:366::-;27602:3;27623:67;27687:2;27682:3;27623:67;:::i;:::-;27616:74;;27699:93;27788:3;27699:93;:::i;:::-;27817:2;27812:3;27808:12;27801:19;;27460:366;;;:::o;27832:419::-;27998:4;28036:2;28025:9;28021:18;28013:26;;28085:9;28079:4;28075:20;28071:1;28060:9;28056:17;28049:47;28113:131;28239:4;28113:131;:::i;:::-;28105:139;;27832:419;;;:::o;28257:191::-;28297:3;28316:20;28334:1;28316:20;:::i;:::-;28311:25;;28350:20;28368:1;28350:20;:::i;:::-;28345:25;;28393:1;28390;28386:9;28379:16;;28414:3;28411:1;28408:10;28405:36;;;28421:18;;:::i;:::-;28405:36;28257:191;;;;:::o;28454:170::-;28594:22;28590:1;28582:6;28578:14;28571:46;28454:170;:::o;28630:366::-;28772:3;28793:67;28857:2;28852:3;28793:67;:::i;:::-;28786:74;;28869:93;28958:3;28869:93;:::i;:::-;28987:2;28982:3;28978:12;28971:19;;28630:366;;;:::o;29002:419::-;29168:4;29206:2;29195:9;29191:18;29183:26;;29255:9;29249:4;29245:20;29241:1;29230:9;29226:17;29219:47;29283:131;29409:4;29283:131;:::i;:::-;29275:139;;29002:419;;;:::o;29427:181::-;29567:33;29563:1;29555:6;29551:14;29544:57;29427:181;:::o;29614:366::-;29756:3;29777:67;29841:2;29836:3;29777:67;:::i;:::-;29770:74;;29853:93;29942:3;29853:93;:::i;:::-;29971:2;29966:3;29962:12;29955:19;;29614:366;;;:::o;29986:419::-;30152:4;30190:2;30179:9;30175:18;30167:26;;30239:9;30233:4;30229:20;30225:1;30214:9;30210:17;30203:47;30267:131;30393:4;30267:131;:::i;:::-;30259:139;;29986:419;;;:::o;30411:167::-;30551:19;30547:1;30539:6;30535:14;30528:43;30411:167;:::o;30584:366::-;30726:3;30747:67;30811:2;30806:3;30747:67;:::i;:::-;30740:74;;30823:93;30912:3;30823:93;:::i;:::-;30941:2;30936:3;30932:12;30925:19;;30584:366;;;:::o;30956:419::-;31122:4;31160:2;31149:9;31145:18;31137:26;;31209:9;31203:4;31199:20;31195:1;31184:9;31180:17;31173:47;31237:131;31363:4;31237:131;:::i;:::-;31229:139;;30956:419;;;:::o;31381:410::-;31421:7;31444:20;31462:1;31444:20;:::i;:::-;31439:25;;31478:20;31496:1;31478:20;:::i;:::-;31473:25;;31533:1;31530;31526:9;31555:30;31573:11;31555:30;:::i;:::-;31544:41;;31734:1;31725:7;31721:15;31718:1;31715:22;31695:1;31688:9;31668:83;31645:139;;31764:18;;:::i;:::-;31645:139;31429:362;31381:410;;;;:::o;31797:169::-;31937:21;31933:1;31925:6;31921:14;31914:45;31797:169;:::o;31972:366::-;32114:3;32135:67;32199:2;32194:3;32135:67;:::i;:::-;32128:74;;32211:93;32300:3;32211:93;:::i;:::-;32329:2;32324:3;32320:12;32313:19;;31972:366;;;:::o;32344:419::-;32510:4;32548:2;32537:9;32533:18;32525:26;;32597:9;32591:4;32587:20;32583:1;32572:9;32568:17;32561:47;32625:131;32751:4;32625:131;:::i;:::-;32617:139;;32344:419;;;:::o;32769:167::-;32909:19;32905:1;32897:6;32893:14;32886:43;32769:167;:::o;32942:366::-;33084:3;33105:67;33169:2;33164:3;33105:67;:::i;:::-;33098:74;;33181:93;33270:3;33181:93;:::i;:::-;33299:2;33294:3;33290:12;33283:19;;32942:366;;;:::o;33314:419::-;33480:4;33518:2;33507:9;33503:18;33495:26;;33567:9;33561:4;33557:20;33553:1;33542:9;33538:17;33531:47;33595:131;33721:4;33595:131;:::i;:::-;33587:139;;33314:419;;;:::o;33739:171::-;33879:23;33875:1;33867:6;33863:14;33856:47;33739:171;:::o;33916:366::-;34058:3;34079:67;34143:2;34138:3;34079:67;:::i;:::-;34072:74;;34155:93;34244:3;34155:93;:::i;:::-;34273:2;34268:3;34264:12;34257:19;;33916:366;;;:::o;34288:419::-;34454:4;34492:2;34481:9;34477:18;34469:26;;34541:9;34535:4;34531:20;34527:1;34516:9;34512:17;34505:47;34569:131;34695:4;34569:131;:::i;:::-;34561:139;;34288:419;;;:::o;34713:177::-;34853:29;34849:1;34841:6;34837:14;34830:53;34713:177;:::o;34896:366::-;35038:3;35059:67;35123:2;35118:3;35059:67;:::i;:::-;35052:74;;35135:93;35224:3;35135:93;:::i;:::-;35253:2;35248:3;35244:12;35237:19;;34896:366;;;:::o;35268:419::-;35434:4;35472:2;35461:9;35457:18;35449:26;;35521:9;35515:4;35511:20;35507:1;35496:9;35492:17;35485:47;35549:131;35675:4;35549:131;:::i;:::-;35541:139;;35268:419;;;:::o;35693:191::-;35731:4;35751:18;35767:1;35751:18;:::i;:::-;35746:23;;35783:18;35799:1;35783:18;:::i;:::-;35778:23;;35825:1;35822;35818:9;35810:17;;35849:4;35843;35840:14;35837:40;;;35857:18;;:::i;:::-;35837:40;35693:191;;;;:::o;35890:138::-;35938:9;35971:51;35989:32;35998:22;36014:5;35998:22;:::i;:::-;35989:32;:::i;:::-;35971:51;:::i;:::-;35958:64;;35890:138;;;:::o;36034:127::-;36119:35;36148:5;36119:35;:::i;:::-;36114:3;36107:48;36034:127;;:::o;36167:218::-;36258:4;36296:2;36285:9;36281:18;36273:26;;36309:69;36375:1;36364:9;36360:17;36351:6;36309:69;:::i;:::-;36167:218;;;;:::o;36391:179::-;36531:31;36527:1;36519:6;36515:14;36508:55;36391:179;:::o;36576:366::-;36718:3;36739:67;36803:2;36798:3;36739:67;:::i;:::-;36732:74;;36815:93;36904:3;36815:93;:::i;:::-;36933:2;36928:3;36924:12;36917:19;;36576:366;;;:::o;36948:419::-;37114:4;37152:2;37141:9;37137:18;37129:26;;37201:9;37195:4;37191:20;37187:1;37176:9;37172:17;37165:47;37229:131;37355:4;37229:131;:::i;:::-;37221:139;;36948:419;;;:::o;37373:171::-;37513:23;37509:1;37501:6;37497:14;37490:47;37373:171;:::o;37550:366::-;37692:3;37713:67;37777:2;37772:3;37713:67;:::i;:::-;37706:74;;37789:93;37878:3;37789:93;:::i;:::-;37907:2;37902:3;37898:12;37891:19;;37550:366;;;:::o;37922:419::-;38088:4;38126:2;38115:9;38111:18;38103:26;;38175:9;38169:4;38165:20;38161:1;38150:9;38146:17;38139:47;38203:131;38329:4;38203:131;:::i;:::-;38195:139;;37922:419;;;:::o;38347:174::-;38487:26;38483:1;38475:6;38471:14;38464:50;38347:174;:::o;38527:366::-;38669:3;38690:67;38754:2;38749:3;38690:67;:::i;:::-;38683:74;;38766:93;38855:3;38766:93;:::i;:::-;38884:2;38879:3;38875:12;38868:19;;38527:366;;;:::o;38899:419::-;39065:4;39103:2;39092:9;39088:18;39080:26;;39152:9;39146:4;39142:20;39138:1;39127:9;39123:17;39116:47;39180:131;39306:4;39180:131;:::i;:::-;39172:139;;38899:419;;;:::o;39324:188::-;39362:3;39381:18;39397:1;39381:18;:::i;:::-;39376:23;;39413:18;39429:1;39413:18;:::i;:::-;39408:23;;39454:1;39451;39447:9;39440:16;;39477:4;39472:3;39469:13;39466:39;;;39485:18;;:::i;:::-;39466:39;39324:188;;;;:::o;39518:168::-;39658:20;39654:1;39646:6;39642:14;39635:44;39518:168;:::o;39692:366::-;39834:3;39855:67;39919:2;39914:3;39855:67;:::i;:::-;39848:74;;39931:93;40020:3;39931:93;:::i;:::-;40049:2;40044:3;40040:12;40033:19;;39692:366;;;:::o;40064:419::-;40230:4;40268:2;40257:9;40253:18;40245:26;;40317:9;40311:4;40307:20;40303:1;40292:9;40288:17;40281:47;40345:131;40471:4;40345:131;:::i;:::-;40337:139;;40064:419;;;:::o;40489:234::-;40629:34;40625:1;40617:6;40613:14;40606:58;40698:17;40693:2;40685:6;40681:15;40674:42;40489:234;:::o;40729:366::-;40871:3;40892:67;40956:2;40951:3;40892:67;:::i;:::-;40885:74;;40968:93;41057:3;40968:93;:::i;:::-;41086:2;41081:3;41077:12;41070:19;;40729:366;;;:::o;41101:419::-;41267:4;41305:2;41294:9;41290:18;41282:26;;41354:9;41348:4;41344:20;41340:1;41329:9;41325:17;41318:47;41382:131;41508:4;41382:131;:::i;:::-;41374:139;;41101:419;;;:::o;41526:148::-;41628:11;41665:3;41650:18;;41526:148;;;;:::o;41704:874::-;41807:3;41844:5;41838:12;41873:36;41899:9;41873:36;:::i;:::-;41925:89;42007:6;42002:3;41925:89;:::i;:::-;41918:96;;42045:1;42034:9;42030:17;42061:1;42056:166;;;;42236:1;42231:341;;;;42023:549;;42056:166;42140:4;42136:9;42125;42121:25;42116:3;42109:38;42202:6;42195:14;42188:22;42180:6;42176:35;42171:3;42167:45;42160:52;;42056:166;;42231:341;42298:38;42330:5;42298:38;:::i;:::-;42358:1;42372:154;42386:6;42383:1;42380:13;42372:154;;;42460:7;42454:14;42450:1;42445:3;42441:11;42434:35;42510:1;42501:7;42497:15;42486:26;;42408:4;42405:1;42401:12;42396:17;;42372:154;;;42555:6;42550:3;42546:16;42539:23;;42238:334;;42023:549;;41811:767;;41704:874;;;;:::o;42584:390::-;42690:3;42718:39;42751:5;42718:39;:::i;:::-;42773:89;42855:6;42850:3;42773:89;:::i;:::-;42766:96;;42871:65;42929:6;42924:3;42917:4;42910:5;42906:16;42871:65;:::i;:::-;42961:6;42956:3;42952:16;42945:23;;42694:280;42584:390;;;;:::o;42980:429::-;43157:3;43179:92;43267:3;43258:6;43179:92;:::i;:::-;43172:99;;43288:95;43379:3;43370:6;43288:95;:::i;:::-;43281:102;;43400:3;43393:10;;42980:429;;;;;:::o;43415:225::-;43555:34;43551:1;43543:6;43539:14;43532:58;43624:8;43619:2;43611:6;43607:15;43600:33;43415:225;:::o;43646:366::-;43788:3;43809:67;43873:2;43868:3;43809:67;:::i;:::-;43802:74;;43885:93;43974:3;43885:93;:::i;:::-;44003:2;43998:3;43994:12;43987:19;;43646:366;;;:::o;44018:419::-;44184:4;44222:2;44211:9;44207:18;44199:26;;44271:9;44265:4;44261:20;44257:1;44246:9;44242:17;44235:47;44299:131;44425:4;44299:131;:::i;:::-;44291:139;;44018:419;;;:::o;44443:182::-;44583:34;44579:1;44571:6;44567:14;44560:58;44443:182;:::o;44631:366::-;44773:3;44794:67;44858:2;44853:3;44794:67;:::i;:::-;44787:74;;44870:93;44959:3;44870:93;:::i;:::-;44988:2;44983:3;44979:12;44972:19;;44631:366;;;:::o;45003:419::-;45169:4;45207:2;45196:9;45192:18;45184:26;;45256:9;45250:4;45246:20;45242:1;45231:9;45227:17;45220:47;45284:131;45410:4;45284:131;:::i;:::-;45276:139;;45003:419;;;:::o;45428:166::-;45568:18;45564:1;45556:6;45552:14;45545:42;45428:166;:::o;45600:366::-;45742:3;45763:67;45827:2;45822:3;45763:67;:::i;:::-;45756:74;;45839:93;45928:3;45839:93;:::i;:::-;45957:2;45952:3;45948:12;45941:19;;45600:366;;;:::o;45972:419::-;46138:4;46176:2;46165:9;46161:18;46153:26;;46225:9;46219:4;46215:20;46211:1;46200:9;46196:17;46189:47;46253:131;46379:4;46253:131;:::i;:::-;46245:139;;45972:419;;;:::o;46397:98::-;46448:6;46482:5;46476:12;46466:22;;46397:98;;;:::o;46501:168::-;46584:11;46618:6;46613:3;46606:19;46658:4;46653:3;46649:14;46634:29;;46501:168;;;;:::o;46675:373::-;46761:3;46789:38;46821:5;46789:38;:::i;:::-;46843:70;46906:6;46901:3;46843:70;:::i;:::-;46836:77;;46922:65;46980:6;46975:3;46968:4;46961:5;46957:16;46922:65;:::i;:::-;47012:29;47034:6;47012:29;:::i;:::-;47007:3;47003:39;46996:46;;46765:283;46675:373;;;;:::o;47054:640::-;47249:4;47287:3;47276:9;47272:19;47264:27;;47301:71;47369:1;47358:9;47354:17;47345:6;47301:71;:::i;:::-;47382:72;47450:2;47439:9;47435:18;47426:6;47382:72;:::i;:::-;47464;47532:2;47521:9;47517:18;47508:6;47464:72;:::i;:::-;47583:9;47577:4;47573:20;47568:2;47557:9;47553:18;47546:48;47611:76;47682:4;47673:6;47611:76;:::i;:::-;47603:84;;47054:640;;;;;;;:::o;47700:141::-;47756:5;47787:6;47781:13;47772:22;;47803:32;47829:5;47803:32;:::i;:::-;47700:141;;;;:::o;47847:349::-;47916:6;47965:2;47953:9;47944:7;47940:23;47936:32;47933:119;;;47971:79;;:::i;:::-;47933:119;48091:1;48116:63;48171:7;48162:6;48151:9;48147:22;48116:63;:::i;:::-;48106:73;;48062:127;47847:349;;;;:::o;48202:233::-;48241:3;48264:24;48282:5;48264:24;:::i;:::-;48255:33;;48310:66;48303:5;48300:77;48297:103;;48380:18;;:::i;:::-;48297:103;48427:1;48420:5;48416:13;48409:20;;48202:233;;;:::o;48441:180::-;48489:77;48486:1;48479:88;48586:4;48583:1;48576:15;48610:4;48607:1;48600:15;48627:185;48667:1;48684:20;48702:1;48684:20;:::i;:::-;48679:25;;48718:20;48736:1;48718:20;:::i;:::-;48713:25;;48757:1;48747:35;;48762:18;;:::i;:::-;48747:35;48804:1;48801;48797:9;48792:14;;48627:185;;;;:::o;48818:194::-;48858:4;48878:20;48896:1;48878:20;:::i;:::-;48873:25;;48912:20;48930:1;48912:20;:::i;:::-;48907:25;;48956:1;48953;48949:9;48941:17;;48980:1;48974:4;48971:11;48968:37;;;48985:18;;:::i;:::-;48968:37;48818:194;;;;:::o;49018:176::-;49050:1;49067:20;49085:1;49067:20;:::i;:::-;49062:25;;49101:20;49119:1;49101:20;:::i;:::-;49096:25;;49140:1;49130:35;;49145:18;;:::i;:::-;49130:35;49186:1;49183;49179:9;49174:14;;49018:176;;;;:::o;49200:170::-;49340:22;49336:1;49328:6;49324:14;49317:46;49200:170;:::o;49376:366::-;49518:3;49539:67;49603:2;49598:3;49539:67;:::i;:::-;49532:74;;49615:93;49704:3;49615:93;:::i;:::-;49733:2;49728:3;49724:12;49717:19;;49376:366;;;:::o;49748:419::-;49914:4;49952:2;49941:9;49937:18;49929:26;;50001:9;49995:4;49991:20;49987:1;49976:9;49972:17;49965:47;50029:131;50155:4;50029:131;:::i;:::-;50021:139;;49748:419;;;:::o

Swarm Source

ipfs://947f07ad14ae5cb3a24f0214ccd22afc00ba5f9d7f1e2a32e47fbc8df14dc0e3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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