ETH Price: $2,463.73 (+1.62%)

Token

Tsukimi (TSUKIMI)
 

Overview

Max Total Supply

379 TSUKIMI

Holders

132

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 TSUKIMI
0xa5af79f05fc5a46cacab9b6935e408de3832b353
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:
Tsukimi

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : tsukimi.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./ERC721A.sol";
import "./ERC721AQueryable.sol";

contract Tsukimi is ERC721A, ERC721AQueryable, Ownable, ReentrancyGuard {
    constructor() ERC721A("Tsukimi", "TSUKIMI") {}

    event AllowlistSale(bool indexed _type);
    event PublicSale(bool indexed _type);

    address public allowlistSigner = 0x51F62DaA652D1827e6912d1B582F9d33Db465CfA;

    struct AllowlistSaleConfig {
        uint256 allowlistSaleStartTime;
        uint256 allowlistSaleEndTime;
        bool allowlistStarted;
    }

    AllowlistSaleConfig public allowlistSaleConfig;

    using ECDSA for bytes32;
    bytes32 private DOMAIN_VERIFICATION =
        keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes("TsukimiLoft")),
                keccak256(bytes("1")),
                1,
                address(this)
            )
        );

    bool public isPublicSaleOn = false;
    string private _baseTokenURI;

    function isAllowlisted(address buyerWalletAddress, bytes memory _signature)
        public
        view
        returns (bool)
    {
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_VERIFICATION,
                keccak256(
                    abi.encode(
                        keccak256(
                            "daydreamers(address buyerWalletAddress,string saleType)"
                        ),
                        buyerWalletAddress,
                        keccak256(bytes("allowlistSale"))
                    )
                )
            )
        );
        return
            ECDSA.recover(digest, _signature) == allowlistSigner ? true : false;
    }

    // sets allowlist signer
    function setAllowlistSigner(address _allowlistSigner) external onlyOwner {
        allowlistSigner = _allowlistSigner;
    }

    // toggles public sale
    function togglePublicSale() public onlyOwner {
        isPublicSaleOn = !isPublicSaleOn;
        emit PublicSale(isPublicSaleOn);
    }

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

    // sets base URI
    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    // starts allowlist sale
    function startAllowListSale(uint256 _durationInMinutes) external onlyOwner {
        allowlistSaleConfig = AllowlistSaleConfig(
            block.timestamp,
            block.timestamp + (_durationInMinutes * 60),
            true
        );
        emit AllowlistSale(true);
    }

    function stopAllowlistSale() external onlyOwner {
        allowlistSaleConfig = AllowlistSaleConfig(0, 0, false);
        emit AllowlistSale(false);
    }

    function allowListStarted() public view returns (bool) {
        AllowlistSaleConfig memory config = allowlistSaleConfig;
        return config.allowlistStarted;
    }

    function allowListTimeLeft() public view returns (uint256) {
        // returns time left in seconds
        AllowlistSaleConfig memory config = allowlistSaleConfig;
        uint32 startTime = uint32(config.allowlistSaleStartTime);
        uint32 endTime = uint32(config.allowlistSaleEndTime);
        if (block.timestamp >= startTime && block.timestamp <= endTime) {
            return endTime - block.timestamp;
        }
        return 0;
    }

    // dev mints
    function devMint(address _address, uint256 _amount) external onlyOwner {
        require(
            totalSupply() + _amount <= 5555,
            "Can't mint more than max supply"
        );
        _mint(_address, _amount);
    }

    function AllowlistMint(uint256 _amount, bytes memory _signature)
        public
        payable
    {
        require(allowListTimeLeft() > 0, "Allowlist sale is not active");

        require(
            isAllowlisted(msg.sender, _signature),
            "Address is not in allowlist"
        );

        require(
            totalSupply() + _amount <= 5555,
            "Can't mint more than max tokens"
        );

        require(
            _amount > 0 && _amount <= 5,
            string(
                abi.encodePacked(
                    "You can't buy more than ",
                    Strings.toString(5),
                    " tokens per transaction."
                )
            )
        );

        require(
            msg.value >= 0.069 ether * _amount,
            string(
                abi.encodePacked(
                    "Not enough ETH! At least ",
                    Strings.toString(0.069 ether * _amount),
                    " wei has to be sent!"
                )
            )
        );

        require(
            10 >= balanceOf(msg.sender) + _amount,
            "Max token count per wallet exceeded!"
        );

        _mint(msg.sender, _amount);
    }

    function mintPublicSale(uint256 _amount) public payable {
        require(isPublicSaleOn, "Public sale is not on");

        require(
            totalSupply() + _amount <= 5555,
            "Can't mint more than max tokens"
        );

        require(
            _amount > 0 && _amount <= 5,
            string(
                abi.encodePacked(
                    "You can't buy more than ",
                    Strings.toString(5),
                    " tokens per transaction."
                )
            )
        );

        require(
            msg.value >= 0.089 ether * _amount,
            string(
                abi.encodePacked(
                    "Not enough ETH! At least ",
                    Strings.toString(0.089 ether * _amount),
                    " wei has to be sent!"
                )
            )
        );

        require(
            10 >= balanceOf(msg.sender) + _amount,
            "Max token count per wallet exceeded!"
        );

        _mint(msg.sender, _amount);
    }

    function withdrawAll() public onlyOwner nonReentrant {
        (bool success, ) = payable(owner()).call{value: address(this).balance}(
            ""
        );
        require(success, "");
    }

    function withdraw(uint256 _weiAmount, address _to)
        public
        onlyOwner
        nonReentrant
    {
        require(
            address(this).balance >= _weiAmount,
            "Not enough ETH to withdraw!"
        );
        (bool success, ) = payable(_to).call{value: _weiAmount}("");
        require(success, "");
    }
}

File 2 of 16 : ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 3 of 16 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

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

    /**
     * Sets the auxillary 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 {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

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

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

File 4 of 16 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

File 5 of 16 : 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 6 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 7 of 16 : IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 8 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 9 of 16 : 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);
    }
}

File 10 of 16 : 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 11 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 12 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 13 of 16 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

File 14 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

File 15 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @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 have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

File 16 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"bool","name":"_type","type":"bool"}],"name":"AllowlistSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_type","type":"bool"}],"name":"PublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"AllowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowListStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListTimeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSaleConfig","outputs":[{"internalType":"uint256","name":"allowlistSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"allowlistSaleEndTime","type":"uint256"},{"internalType":"bool","name":"allowlistStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"buyerWalletAddress","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintPublicSale","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_allowlistSigner","type":"address"}],"name":"setAllowlistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_durationInMinutes","type":"uint256"}],"name":"startAllowListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopAllowlistSale","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":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weiAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527351f62daa652d1827e6912d1b582f9d33db465cfa600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600b81526020017f5473756b696d694c6f6674000000000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001206001306040516020016200010d959493929190620003b2565b60405160208183030381529060405280519060200120600e556000600f60006101000a81548160ff0219169083151502179055503480156200014e57600080fd5b506040518060400160405280600781526020017f5473756b696d69000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f5453554b494d49000000000000000000000000000000000000000000000000008152508160029081620001cc91906200067f565b508060039081620001de91906200067f565b50620001ef6200022560201b60201c565b6000819055505050620002176200020b6200022a60201b60201c565b6200023260201b60201c565b600160098190555062000766565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b6200030d81620002f8565b82525050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000620003556200034f620003498462000313565b6200032a565b6200031d565b9050919050565b620003678162000334565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200039a826200036d565b9050919050565b620003ac816200038d565b82525050565b600060a082019050620003c9600083018862000302565b620003d8602083018762000302565b620003e7604083018662000302565b620003f660608301856200035c565b620004056080830184620003a1565b9695505050505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049157607f821691505b602082108103620004a757620004a662000449565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d2565b6200051d8683620004d2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005606200055a620005548462000535565b6200032a565b62000535565b9050919050565b6000819050919050565b6200057c836200053f565b620005946200058b8262000567565b848454620004df565b825550505050565b600090565b620005ab6200059c565b620005b881848462000571565b505050565b5b81811015620005e057620005d4600082620005a1565b600181019050620005be565b5050565b601f8211156200062f57620005f981620004ad565b6200060484620004c2565b8101602085101562000614578190505b6200062c6200062385620004c2565b830182620005bd565b50505b505050565b600082821c905092915050565b6000620006546000198460080262000634565b1980831691505092915050565b60006200066f838362000641565b9150826002028217905092915050565b6200068a826200040f565b67ffffffffffffffff811115620006a657620006a56200041a565b5b620006b2825462000478565b620006bf828285620005e4565b600060209050601f831160018114620006f75760008415620006e2578287015190505b620006ee858262000661565b8655506200075e565b601f1984166200070786620004ad565b60005b8281101562000731578489015182556001820191506020850194506020810190506200070a565b868310156200075157848901516200074d601f89168262000641565b8355505b6001600288020188555050505b505050505050565b61534780620007766000396000f3fe6080604052600436106102195760003560e01c80638462151c11610123578063c12f0396116100ab578063e222c7f91161006f578063e222c7f9146107dc578063e474def4146107f3578063e985e9c51461081c578063ebc90e1b14610859578063f2fde38b1461087057610219565b8063c12f0396146106df578063c23dc68f1461070a578063c32fe11b14610747578063c87b56dd14610772578063d5e2eb55146107af57610219565b806392f6f745116100f257806392f6f745146105fc57806395d89b411461062557806399a2557a14610650578063a22cb4651461068d578063b88d4fde146106b657610219565b80638462151c14610561578063853828b61461059e5780638da5cb5b146105b557806392ed4b10146105e057610219565b806349985a79116101a65780635bbb2177116101755780635bbb21771461046a578063627804af146104a75780636352211e146104d057806370a082311461050d578063715018a61461054a57610219565b806349985a79146103bd57806350cee227146103e857806355f804b3146104255780635a5e5d581461044e57610219565b8063095ea7b3116101ed578063095ea7b3146102ec57806318160ddd1461031557806323b872dd146103405780633f5e47411461036957806342842e0e1461039457610219565b8062f714ce1461021e57806301ffc9a71461024757806306fdde0314610284578063081812fc146102af575b600080fd5b34801561022a57600080fd5b5061024560048036038101906102409190613811565b610899565b005b34801561025357600080fd5b5061026e600480360381019061026991906138a9565b6109ea565b60405161027b91906138f1565b60405180910390f35b34801561029057600080fd5b50610299610acc565b6040516102a6919061399c565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d191906139be565b610b5e565b6040516102e391906139fa565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613a15565b610bda565b005b34801561032157600080fd5b5061032a610cde565b6040516103379190613a64565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a7f565b610cf5565b005b34801561037557600080fd5b5061037e610d05565b60405161038b91906138f1565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613a7f565b610d18565b005b3480156103c957600080fd5b506103d2610d38565b6040516103df91906138f1565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613c07565b610d84565b60405161041c91906138f1565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613cc3565b610eab565b005b610468600480360381019061046391906139be565b610ec9565b005b34801561047657600080fd5b50610491600480360381019061048c9190613dd3565b6110e3565b60405161049e9190613f4e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613a15565b6111a4565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906139be565b611211565b60405161050491906139fa565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613f70565b611227565b6040516105419190613a64565b60405180910390f35b34801561055657600080fd5b5061055f6112f6565b005b34801561056d57600080fd5b5061058860048036038101906105839190613f70565b61130a565b604051610595919061405b565b60405180910390f35b3480156105aa57600080fd5b506105b3611505565b005b3480156105c157600080fd5b506105ca611618565b6040516105d791906139fa565b60405180910390f35b6105fa60048036038101906105f5919061407d565b611642565b005b34801561060857600080fd5b50610623600480360381019061061e91906139be565b61189f565b005b34801561063157600080fd5b5061063a611948565b604051610647919061399c565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906140d9565b6119da565b604051610684919061405b565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190614158565b611c99565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614198565b611e10565b005b3480156106eb57600080fd5b506106f4611e88565b6040516107019190613a64565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906139be565b611f23565b60405161073e919061425d565b60405180910390f35b34801561075357600080fd5b5061075c612040565b60405161076991906139fa565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906139be565b612066565b6040516107a6919061399c565b60405180910390f35b3480156107bb57600080fd5b506107c4612104565b6040516107d393929190614278565b60405180910390f35b3480156107e857600080fd5b506107f1612129565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613f70565b61219b565b005b34801561082857600080fd5b50610843600480360381019061083e91906142af565b6121e7565b60405161085091906138f1565b60405180910390f35b34801561086557600080fd5b5061086e61227b565b005b34801561087c57600080fd5b5061089760048036038101906108929190613f70565b61230e565b005b6108a1612391565b6002600954036108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd9061433b565b60405180910390fd5b600260098190555081471015610931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610928906143a7565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051610957906143f8565b60006040518083038185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490614430565b60405180910390fd5b5060016009819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac55750610ac48261240f565b5b9050919050565b606060028054610adb9061447f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b079061447f565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b5050505050905090565b6000610b6982612479565b610b9f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be582611211565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6b6124c7565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c926124c7565b6121e7565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd98383836124cf565b505050565b6000610ce8612581565b6001546000540303905090565b610d00838383612586565b505050565b600f60009054906101000a900460ff1681565b610d3383838360405180602001604052806000815250611e10565b505050565b600080600b60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509050806040015191505090565b600080600e547fe6b90c15f3ba2bb52929ad300ac2ab0bf348830f281145566f53d3691638349f856040518060400160405280600d81526020017f616c6c6f776c69737453616c650000000000000000000000000000000000000081525080519060200120604051602001610dfb939291906144c9565b60405160208183030381529060405280519060200120604051602001610e22929190614578565b604051602081830303815290604052805190602001209050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7d8285612a3a565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576000610ea2565b60015b91505092915050565b610eb3612391565b818160109182610ec4929190614766565b505050565b600f60009054906101000a900460ff16610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614882565b60405180910390fd5b6115b381610f24610cde565b610f2e91906148d1565b1115610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690614951565b60405180910390fd5b600081118015610f80575060058111155b610f8a6005612a61565b604051602001610f9a9190614a3a565b60405160208183030381529060405290610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1919061399c565b60405180910390fd5b508067013c310749028000610fff9190614a67565b34101561101e8267013c3107490280006110199190614a67565b612a61565b60405160200161102e9190614b41565b6040516020818303038152906040529061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075919061399c565b60405180910390fd5b508061108933611227565b61109391906148d1565b600a10156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614be0565b60405180910390fd5b6110e03382612bc1565b50565b606060008251905060008167ffffffffffffffff81111561110757611106613adc565b5b60405190808252806020026020018201604052801561114057816020015b61112d613726565b8152602001906001900390816111255790505b50905060005b8281146111995761117085828151811061116357611162614c00565b5b6020026020010151611f23565b82828151811061118357611182614c00565b5b6020026020010181905250806001019050611146565b508092505050919050565b6111ac612391565b6115b3816111b8610cde565b6111c291906148d1565b1115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614c7b565b60405180910390fd5b61120d8282612bc1565b5050565b600061121c82612e9b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6112fe612391565b6113086000613126565b565b6060600080600061131a85611227565b905060008167ffffffffffffffff81111561133857611337613adc565b5b6040519080825280602002602001820160405280156113665781602001602082028036833780820191505090505b509050611371613726565b600061137b612581565b90505b8386146114f757600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001516114ec57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461149157816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114eb57808387806001019850815181106114de576114dd614c00565b5b6020026020010181815250505b5b80600101905061137e565b508195505050505050919050565b61150d612391565b600260095403611552576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115499061433b565b60405180910390fd5b60026009819055506000611564611618565b73ffffffffffffffffffffffffffffffffffffffff1647604051611587906143f8565b60006040518083038185875af1925050503d80600081146115c4576040519150601f19603f3d011682016040523d82523d6000602084013e6115c9565b606091505b505090508061160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490614430565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061164c611e88565b1161168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614ce7565b60405180910390fd5b6116963382610d84565b6116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90614d53565b60405180910390fd5b6115b3826116e1610cde565b6116eb91906148d1565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614951565b60405180910390fd5b60008211801561173d575060058211155b6117476005612a61565b6040516020016117579190614a3a565b604051602081830303815290604052906117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e919061399c565b60405180910390fd5b508166f52322698080006117bb9190614a67565b3410156117d98366f52322698080006117d49190614a67565b612a61565b6040516020016117e99190614b41565b60405160208183030381529060405290611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830919061399c565b60405180910390fd5b508161184433611227565b61184e91906148d1565b600a1015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890614be0565b60405180910390fd5b61189b3383612bc1565b5050565b6118a7612391565b6040518060600160405280428152602001603c836118c59190614a67565b426118d091906148d1565b815260200160011515815250600b600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600115157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a250565b6060600380546119579061447f565b80601f01602080910402602001604051908101604052809291908181526020018280546119839061447f565b80156119d05780601f106119a5576101008083540402835291602001916119d0565b820191906000526020600020905b8154815290600101906020018083116119b357829003601f168201915b5050505050905090565b6060818310611a15576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a25612581565b851015611a3757611a34612581565b94505b80841115611a43578093505b6000611a4e87611227565b905084861015611a71576000868603905081811015611a6b578091505b50611a76565b600090505b60008167ffffffffffffffff811115611a9257611a91613adc565b5b604051908082528060200260200182016040528015611ac05781602001602082028036833780820191505090505b50905060008203611ad75780945050505050611c92565b6000611ae288611f23565b905060008160400151611af757816000015190505b60008990505b888114158015611b0d5750848714155b15611c8457600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505092508260400151611c7957600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c1e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c785780848880600101995081518110611c6b57611c6a614c00565b5b6020026020010181815250505b5b806001019050611afd565b508583528296505050505050505b9392505050565b611ca16124c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d05576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d126124c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dbf6124c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e0491906138f1565b60405180910390a35050565b611e1b848484612586565b611e3a8373ffffffffffffffffffffffffffffffffffffffff166131ec565b15611e8257611e4b8484848461320f565b611e81576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600080600b60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090506000816000015190506000826020015190508163ffffffff164210158015611ef757508063ffffffff164211155b15611f1857428163ffffffff16611f0e9190614d73565b9350505050611f20565b600093505050505b90565b611f2b613726565b611f33613726565b611f3b612581565b831080611f4a57506000548310155b15611f58578091505061203b565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561202e578091505061203b565b61203783612e9b565b9150505b919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061207182612479565b6120a7576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120b161335f565b905060008151036120d157604051806020016040528060008152506120fc565b806120db84612a61565b6040516020016120ec929190614da7565b6040516020818303038152906040525b915050919050565b600b8060000154908060010154908060020160009054906101000a900460ff16905083565b612131612391565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550600f60009054906101000a900460ff1615157ff09b37ecbfe134bf1f6c2f38082fa76cd990d1ffddfb88add51b7c8348c79c4a60405160405180910390a2565b6121a3612391565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612283612391565b6040518060600160405280600081526020016000815260200160001515815250600b600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600015157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a2565b612316612391565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237c90614e3d565b60405180910390fd5b61238e81613126565b50565b6123996124c7565b73ffffffffffffffffffffffffffffffffffffffff166123b7611618565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614ea9565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612484612581565b11158015612493575060005482105b80156124c0575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061259182612e9b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661261d6124c7565b73ffffffffffffffffffffffffffffffffffffffff16148061264c575061264b856126466124c7565b6121e7565b5b80612691575061265a6124c7565b73ffffffffffffffffffffffffffffffffffffffff1661267984610b5e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126ca576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612730576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273d85858560016133f1565b612749600084876124cf565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129c85760005482146129c757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a3385858560016133f7565b5050505050565b6000806000612a4985856133fd565b91509150612a568161344e565b819250505092915050565b606060008203612aa8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bbc565b600082905060005b60008214612ada578080612ac390614ec9565b915050600a82612ad39190614f40565b9150612ab0565b60008167ffffffffffffffff811115612af657612af5613adc565b5b6040519080825280601f01601f191660200182016040528015612b285781602001600182028036833780820191505090505b5090505b60008514612bb557600182612b419190614d73565b9150600a85612b509190614f71565b6030612b5c91906148d1565b60f81b818381518110612b7257612b71614c00565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bae9190614f40565b9450612b2c565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c2d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612c67576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7460008483856133f1565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e1757816000819055505050612e9660008483856133f7565b505050565b612ea3613726565b600082905080612eb1612581565b116130ef576000548110156130ee576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130ec57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fd0578092505050613121565b5b6001156130eb57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e6578092505050613121565b612fd1565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132356124c7565b8786866040518563ffffffff1660e01b81526004016132579493929190614ff7565b6020604051808303816000875af192505050801561329357506040513d601f19601f820116820180604052508101906132909190615058565b60015b61330c573d80600081146132c3576040519150601f19603f3d011682016040523d82523d6000602084013e6132c8565b606091505b506000815103613304576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461336e9061447f565b80601f016020809104026020016040519081016040528092919081815260200182805461339a9061447f565b80156133e75780601f106133bc576101008083540402835291602001916133e7565b820191906000526020600020905b8154815290600101906020018083116133ca57829003601f168201915b5050505050905090565b50505050565b50505050565b600080604183510361343e5760008060006020860151925060408601519150606086015160001a90506134328782858561361a565b94509450505050613447565b60006002915091505b9250929050565b6000600481111561346257613461615085565b5b81600481111561347557613474615085565b5b0315613617576001600481111561348f5761348e615085565b5b8160048111156134a2576134a1615085565b5b036134e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d990615100565b60405180910390fd5b600260048111156134f6576134f5615085565b5b81600481111561350957613508615085565b5b03613549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135409061516c565b60405180910390fd5b6003600481111561355d5761355c615085565b5b8160048111156135705761356f615085565b5b036135b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a7906151fe565b60405180910390fd5b6004808111156135c3576135c2615085565b5b8160048111156135d6576135d5615085565b5b03613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d90615290565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561365557600060039150915061371d565b601b8560ff161415801561366d5750601c8560ff1614155b1561367f57600060049150915061371d565b6000600187878787604051600081526020016040526040516136a494939291906152cc565b6020604051602081039080840390855afa1580156136c6573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137145760006001925092505061371d565b80600092509250505b94509492505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6137908161377d565b811461379b57600080fd5b50565b6000813590506137ad81613787565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137de826137b3565b9050919050565b6137ee816137d3565b81146137f957600080fd5b50565b60008135905061380b816137e5565b92915050565b6000806040838503121561382857613827613773565b5b60006138368582860161379e565b9250506020613847858286016137fc565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61388681613851565b811461389157600080fd5b50565b6000813590506138a38161387d565b92915050565b6000602082840312156138bf576138be613773565b5b60006138cd84828501613894565b91505092915050565b60008115159050919050565b6138eb816138d6565b82525050565b600060208201905061390660008301846138e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394657808201518184015260208101905061392b565b60008484015250505050565b6000601f19601f8301169050919050565b600061396e8261390c565b6139788185613917565b9350613988818560208601613928565b61399181613952565b840191505092915050565b600060208201905081810360008301526139b68184613963565b905092915050565b6000602082840312156139d4576139d3613773565b5b60006139e28482850161379e565b91505092915050565b6139f4816137d3565b82525050565b6000602082019050613a0f60008301846139eb565b92915050565b60008060408385031215613a2c57613a2b613773565b5b6000613a3a858286016137fc565b9250506020613a4b8582860161379e565b9150509250929050565b613a5e8161377d565b82525050565b6000602082019050613a796000830184613a55565b92915050565b600080600060608486031215613a9857613a97613773565b5b6000613aa6868287016137fc565b9350506020613ab7868287016137fc565b9250506040613ac88682870161379e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b1482613952565b810181811067ffffffffffffffff82111715613b3357613b32613adc565b5b80604052505050565b6000613b46613769565b9050613b528282613b0b565b919050565b600067ffffffffffffffff821115613b7257613b71613adc565b5b613b7b82613952565b9050602081019050919050565b82818337600083830152505050565b6000613baa613ba584613b57565b613b3c565b905082815260208101848484011115613bc657613bc5613ad7565b5b613bd1848285613b88565b509392505050565b600082601f830112613bee57613bed613ad2565b5b8135613bfe848260208601613b97565b91505092915050565b60008060408385031215613c1e57613c1d613773565b5b6000613c2c858286016137fc565b925050602083013567ffffffffffffffff811115613c4d57613c4c613778565b5b613c5985828601613bd9565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613c8357613c82613ad2565b5b8235905067ffffffffffffffff811115613ca057613c9f613c63565b5b602083019150836001820283011115613cbc57613cbb613c68565b5b9250929050565b60008060208385031215613cda57613cd9613773565b5b600083013567ffffffffffffffff811115613cf857613cf7613778565b5b613d0485828601613c6d565b92509250509250929050565b600067ffffffffffffffff821115613d2b57613d2a613adc565b5b602082029050602081019050919050565b6000613d4f613d4a84613d10565b613b3c565b90508083825260208201905060208402830185811115613d7257613d71613c68565b5b835b81811015613d9b5780613d87888261379e565b845260208401935050602081019050613d74565b5050509392505050565b600082601f830112613dba57613db9613ad2565b5b8135613dca848260208601613d3c565b91505092915050565b600060208284031215613de957613de8613773565b5b600082013567ffffffffffffffff811115613e0757613e06613778565b5b613e1384828501613da5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e51816137d3565b82525050565b600067ffffffffffffffff82169050919050565b613e7481613e57565b82525050565b613e83816138d6565b82525050565b606082016000820151613e9f6000850182613e48565b506020820151613eb26020850182613e6b565b506040820151613ec56040850182613e7a565b50505050565b6000613ed78383613e89565b60608301905092915050565b6000602082019050919050565b6000613efb82613e1c565b613f058185613e27565b9350613f1083613e38565b8060005b83811015613f41578151613f288882613ecb565b9750613f3383613ee3565b925050600181019050613f14565b5085935050505092915050565b60006020820190508181036000830152613f688184613ef0565b905092915050565b600060208284031215613f8657613f85613773565b5b6000613f94848285016137fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd28161377d565b82525050565b6000613fe48383613fc9565b60208301905092915050565b6000602082019050919050565b600061400882613f9d565b6140128185613fa8565b935061401d83613fb9565b8060005b8381101561404e5781516140358882613fd8565b975061404083613ff0565b925050600181019050614021565b5085935050505092915050565b600060208201905081810360008301526140758184613ffd565b905092915050565b6000806040838503121561409457614093613773565b5b60006140a28582860161379e565b925050602083013567ffffffffffffffff8111156140c3576140c2613778565b5b6140cf85828601613bd9565b9150509250929050565b6000806000606084860312156140f2576140f1613773565b5b6000614100868287016137fc565b93505060206141118682870161379e565b92505060406141228682870161379e565b9150509250925092565b614135816138d6565b811461414057600080fd5b50565b6000813590506141528161412c565b92915050565b6000806040838503121561416f5761416e613773565b5b600061417d858286016137fc565b925050602061418e85828601614143565b9150509250929050565b600080600080608085870312156141b2576141b1613773565b5b60006141c0878288016137fc565b94505060206141d1878288016137fc565b93505060406141e28782880161379e565b925050606085013567ffffffffffffffff81111561420357614202613778565b5b61420f87828801613bd9565b91505092959194509250565b6060820160008201516142316000850182613e48565b5060208201516142446020850182613e6b565b5060408201516142576040850182613e7a565b50505050565b6000606082019050614272600083018461421b565b92915050565b600060608201905061428d6000830186613a55565b61429a6020830185613a55565b6142a760408301846138e2565b949350505050565b600080604083850312156142c6576142c5613773565b5b60006142d4858286016137fc565b92505060206142e5858286016137fc565b9150509250929050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614325601f83613917565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f4e6f7420656e6f7567682045544820746f207769746864726177210000000000600082015250565b6000614391601b83613917565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b600081905092915050565b50565b60006143e26000836143c7565b91506143ed826143d2565b600082019050919050565b6000614403826143d5565b9150819050919050565b600061441a600083613917565b9150614425826143d2565b600082019050919050565b600060208201905081810360008301526144498161440d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061449757607f821691505b6020821081036144aa576144a9614450565b5b50919050565b6000819050919050565b6144c3816144b0565b82525050565b60006060820190506144de60008301866144ba565b6144eb60208301856139eb565b6144f860408301846144ba565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614541600283614500565b915061454c8261450b565b600282019050919050565b6000819050919050565b61457261456d826144b0565b614557565b82525050565b600061458382614534565b915061458f8285614561565b60208201915061459f8284614561565b6020820191508190509392505050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145df565b61462686836145df565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466361465e6146598461377d565b61463e565b61377d565b9050919050565b6000819050919050565b61467d83614648565b6146916146898261466a565b8484546145ec565b825550505050565b600090565b6146a6614699565b6146b1818484614674565b505050565b5b818110156146d5576146ca60008261469e565b6001810190506146b7565b5050565b601f82111561471a576146eb816145ba565b6146f4846145cf565b81016020851015614703578190505b61471761470f856145cf565b8301826146b6565b50505b505050565b600082821c905092915050565b600061473d6000198460080261471f565b1980831691505092915050565b6000614756838361472c565b9150826002028217905092915050565b61477083836145af565b67ffffffffffffffff81111561478957614788613adc565b5b614793825461447f565b61479e8282856146d9565b6000601f8311600181146147cd57600084156147bb578287013590505b6147c5858261474a565b86555061482d565b601f1984166147db866145ba565b60005b82811015614803578489013582556001820191506020850194506020810190506147de565b86831015614820578489013561481c601f89168261472c565b8355505b6001600288020188555050505b50505050505050565b7f5075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b600061486c601583613917565b915061487782614836565b602082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148dc8261377d565b91506148e78361377d565b92508282019050808211156148ff576148fe6148a2565b5b92915050565b7f43616e2774206d696e74206d6f7265207468616e206d617820746f6b656e7300600082015250565b600061493b601f83613917565b915061494682614905565b602082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b7f596f752063616e277420627579206d6f7265207468616e200000000000000000600082015250565b60006149a7601883614500565b91506149b282614971565b601882019050919050565b60006149c88261390c565b6149d28185614500565b93506149e2818560208601613928565b80840191505092915050565b7f20746f6b656e7320706572207472616e73616374696f6e2e0000000000000000600082015250565b6000614a24601883614500565b9150614a2f826149ee565b601882019050919050565b6000614a458261499a565b9150614a5182846149bd565b9150614a5c82614a17565b915081905092915050565b6000614a728261377d565b9150614a7d8361377d565b9250828202614a8b8161377d565b91508282048414831517614aa257614aa16148a2565b5b5092915050565b7f4e6f7420656e6f7567682045544821204174206c656173742000000000000000600082015250565b6000614adf601983614500565b9150614aea82614aa9565b601982019050919050565b7f207765692068617320746f2062652073656e7421000000000000000000000000600082015250565b6000614b2b601483614500565b9150614b3682614af5565b601482019050919050565b6000614b4c82614ad2565b9150614b5882846149bd565b9150614b6382614b1e565b915081905092915050565b7f4d617820746f6b656e20636f756e74207065722077616c6c657420657863656560008201527f6465642100000000000000000000000000000000000000000000000000000000602082015250565b6000614bca602483613917565b9150614bd582614b6e565b604082019050919050565b60006020820190508181036000830152614bf981614bbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b6000614c65601f83613917565b9150614c7082614c2f565b602082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f416c6c6f776c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614cd1601c83613917565b9150614cdc82614c9b565b602082019050919050565b60006020820190508181036000830152614d0081614cc4565b9050919050565b7f41646472657373206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614d3d601b83613917565b9150614d4882614d07565b602082019050919050565b60006020820190508181036000830152614d6c81614d30565b9050919050565b6000614d7e8261377d565b9150614d898361377d565b9250828203905081811115614da157614da06148a2565b5b92915050565b6000614db382856149bd565b9150614dbf82846149bd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e27602683613917565b9150614e3282614dcb565b604082019050919050565b60006020820190508181036000830152614e5681614e1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e93602083613917565b9150614e9e82614e5d565b602082019050919050565b60006020820190508181036000830152614ec281614e86565b9050919050565b6000614ed48261377d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f0657614f056148a2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4b8261377d565b9150614f568361377d565b925082614f6657614f65614f11565b5b828204905092915050565b6000614f7c8261377d565b9150614f878361377d565b925082614f9757614f96614f11565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614fc982614fa2565b614fd38185614fad565b9350614fe3818560208601613928565b614fec81613952565b840191505092915050565b600060808201905061500c60008301876139eb565b61501960208301866139eb565b6150266040830185613a55565b81810360608301526150388184614fbe565b905095945050505050565b6000815190506150528161387d565b92915050565b60006020828403121561506e5761506d613773565b5b600061507c84828501615043565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006150ea601883613917565b91506150f5826150b4565b602082019050919050565b60006020820190508181036000830152615119816150dd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615156601f83613917565b915061516182615120565b602082019050919050565b6000602082019050818103600083015261518581615149565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151e8602283613917565b91506151f38261518c565b604082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061527a602283613917565b91506152858261521e565b604082019050919050565b600060208201905081810360008301526152a98161526d565b9050919050565b600060ff82169050919050565b6152c6816152b0565b82525050565b60006080820190506152e160008301876144ba565b6152ee60208301866152bd565b6152fb60408301856144ba565b61530860608301846144ba565b9594505050505056fea26469706673582212209ca3371653b2407c63419c24edbfbbcf0c6bef6abece15efdbc57a5afbd822e764736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102195760003560e01c80638462151c11610123578063c12f0396116100ab578063e222c7f91161006f578063e222c7f9146107dc578063e474def4146107f3578063e985e9c51461081c578063ebc90e1b14610859578063f2fde38b1461087057610219565b8063c12f0396146106df578063c23dc68f1461070a578063c32fe11b14610747578063c87b56dd14610772578063d5e2eb55146107af57610219565b806392f6f745116100f257806392f6f745146105fc57806395d89b411461062557806399a2557a14610650578063a22cb4651461068d578063b88d4fde146106b657610219565b80638462151c14610561578063853828b61461059e5780638da5cb5b146105b557806392ed4b10146105e057610219565b806349985a79116101a65780635bbb2177116101755780635bbb21771461046a578063627804af146104a75780636352211e146104d057806370a082311461050d578063715018a61461054a57610219565b806349985a79146103bd57806350cee227146103e857806355f804b3146104255780635a5e5d581461044e57610219565b8063095ea7b3116101ed578063095ea7b3146102ec57806318160ddd1461031557806323b872dd146103405780633f5e47411461036957806342842e0e1461039457610219565b8062f714ce1461021e57806301ffc9a71461024757806306fdde0314610284578063081812fc146102af575b600080fd5b34801561022a57600080fd5b5061024560048036038101906102409190613811565b610899565b005b34801561025357600080fd5b5061026e600480360381019061026991906138a9565b6109ea565b60405161027b91906138f1565b60405180910390f35b34801561029057600080fd5b50610299610acc565b6040516102a6919061399c565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d191906139be565b610b5e565b6040516102e391906139fa565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613a15565b610bda565b005b34801561032157600080fd5b5061032a610cde565b6040516103379190613a64565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a7f565b610cf5565b005b34801561037557600080fd5b5061037e610d05565b60405161038b91906138f1565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613a7f565b610d18565b005b3480156103c957600080fd5b506103d2610d38565b6040516103df91906138f1565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613c07565b610d84565b60405161041c91906138f1565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613cc3565b610eab565b005b610468600480360381019061046391906139be565b610ec9565b005b34801561047657600080fd5b50610491600480360381019061048c9190613dd3565b6110e3565b60405161049e9190613f4e565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613a15565b6111a4565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906139be565b611211565b60405161050491906139fa565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613f70565b611227565b6040516105419190613a64565b60405180910390f35b34801561055657600080fd5b5061055f6112f6565b005b34801561056d57600080fd5b5061058860048036038101906105839190613f70565b61130a565b604051610595919061405b565b60405180910390f35b3480156105aa57600080fd5b506105b3611505565b005b3480156105c157600080fd5b506105ca611618565b6040516105d791906139fa565b60405180910390f35b6105fa60048036038101906105f5919061407d565b611642565b005b34801561060857600080fd5b50610623600480360381019061061e91906139be565b61189f565b005b34801561063157600080fd5b5061063a611948565b604051610647919061399c565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906140d9565b6119da565b604051610684919061405b565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190614158565b611c99565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614198565b611e10565b005b3480156106eb57600080fd5b506106f4611e88565b6040516107019190613a64565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906139be565b611f23565b60405161073e919061425d565b60405180910390f35b34801561075357600080fd5b5061075c612040565b60405161076991906139fa565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906139be565b612066565b6040516107a6919061399c565b60405180910390f35b3480156107bb57600080fd5b506107c4612104565b6040516107d393929190614278565b60405180910390f35b3480156107e857600080fd5b506107f1612129565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613f70565b61219b565b005b34801561082857600080fd5b50610843600480360381019061083e91906142af565b6121e7565b60405161085091906138f1565b60405180910390f35b34801561086557600080fd5b5061086e61227b565b005b34801561087c57600080fd5b5061089760048036038101906108929190613f70565b61230e565b005b6108a1612391565b6002600954036108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd9061433b565b60405180910390fd5b600260098190555081471015610931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610928906143a7565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051610957906143f8565b60006040518083038185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490614430565b60405180910390fd5b5060016009819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac55750610ac48261240f565b5b9050919050565b606060028054610adb9061447f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b079061447f565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b5050505050905090565b6000610b6982612479565b610b9f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be582611211565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6b6124c7565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c926124c7565b6121e7565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd98383836124cf565b505050565b6000610ce8612581565b6001546000540303905090565b610d00838383612586565b505050565b600f60009054906101000a900460ff1681565b610d3383838360405180602001604052806000815250611e10565b505050565b600080600b60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509050806040015191505090565b600080600e547fe6b90c15f3ba2bb52929ad300ac2ab0bf348830f281145566f53d3691638349f856040518060400160405280600d81526020017f616c6c6f776c69737453616c650000000000000000000000000000000000000081525080519060200120604051602001610dfb939291906144c9565b60405160208183030381529060405280519060200120604051602001610e22929190614578565b604051602081830303815290604052805190602001209050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7d8285612a3a565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576000610ea2565b60015b91505092915050565b610eb3612391565b818160109182610ec4929190614766565b505050565b600f60009054906101000a900460ff16610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614882565b60405180910390fd5b6115b381610f24610cde565b610f2e91906148d1565b1115610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690614951565b60405180910390fd5b600081118015610f80575060058111155b610f8a6005612a61565b604051602001610f9a9190614a3a565b60405160208183030381529060405290610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1919061399c565b60405180910390fd5b508067013c310749028000610fff9190614a67565b34101561101e8267013c3107490280006110199190614a67565b612a61565b60405160200161102e9190614b41565b6040516020818303038152906040529061107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075919061399c565b60405180910390fd5b508061108933611227565b61109391906148d1565b600a10156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614be0565b60405180910390fd5b6110e03382612bc1565b50565b606060008251905060008167ffffffffffffffff81111561110757611106613adc565b5b60405190808252806020026020018201604052801561114057816020015b61112d613726565b8152602001906001900390816111255790505b50905060005b8281146111995761117085828151811061116357611162614c00565b5b6020026020010151611f23565b82828151811061118357611182614c00565b5b6020026020010181905250806001019050611146565b508092505050919050565b6111ac612391565b6115b3816111b8610cde565b6111c291906148d1565b1115611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614c7b565b60405180910390fd5b61120d8282612bc1565b5050565b600061121c82612e9b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6112fe612391565b6113086000613126565b565b6060600080600061131a85611227565b905060008167ffffffffffffffff81111561133857611337613adc565b5b6040519080825280602002602001820160405280156113665781602001602082028036833780820191505090505b509050611371613726565b600061137b612581565b90505b8386146114f757600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001516114ec57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461149157816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114eb57808387806001019850815181106114de576114dd614c00565b5b6020026020010181815250505b5b80600101905061137e565b508195505050505050919050565b61150d612391565b600260095403611552576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115499061433b565b60405180910390fd5b60026009819055506000611564611618565b73ffffffffffffffffffffffffffffffffffffffff1647604051611587906143f8565b60006040518083038185875af1925050503d80600081146115c4576040519150601f19603f3d011682016040523d82523d6000602084013e6115c9565b606091505b505090508061160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490614430565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061164c611e88565b1161168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390614ce7565b60405180910390fd5b6116963382610d84565b6116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90614d53565b60405180910390fd5b6115b3826116e1610cde565b6116eb91906148d1565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614951565b60405180910390fd5b60008211801561173d575060058211155b6117476005612a61565b6040516020016117579190614a3a565b604051602081830303815290604052906117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e919061399c565b60405180910390fd5b508166f52322698080006117bb9190614a67565b3410156117d98366f52322698080006117d49190614a67565b612a61565b6040516020016117e99190614b41565b60405160208183030381529060405290611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830919061399c565b60405180910390fd5b508161184433611227565b61184e91906148d1565b600a1015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890614be0565b60405180910390fd5b61189b3383612bc1565b5050565b6118a7612391565b6040518060600160405280428152602001603c836118c59190614a67565b426118d091906148d1565b815260200160011515815250600b600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600115157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a250565b6060600380546119579061447f565b80601f01602080910402602001604051908101604052809291908181526020018280546119839061447f565b80156119d05780601f106119a5576101008083540402835291602001916119d0565b820191906000526020600020905b8154815290600101906020018083116119b357829003601f168201915b5050505050905090565b6060818310611a15576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a25612581565b851015611a3757611a34612581565b94505b80841115611a43578093505b6000611a4e87611227565b905084861015611a71576000868603905081811015611a6b578091505b50611a76565b600090505b60008167ffffffffffffffff811115611a9257611a91613adc565b5b604051908082528060200260200182016040528015611ac05781602001602082028036833780820191505090505b50905060008203611ad75780945050505050611c92565b6000611ae288611f23565b905060008160400151611af757816000015190505b60008990505b888114158015611b0d5750848714155b15611c8457600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505092508260400151611c7957600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c1e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c785780848880600101995081518110611c6b57611c6a614c00565b5b6020026020010181815250505b5b806001019050611afd565b508583528296505050505050505b9392505050565b611ca16124c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d05576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d126124c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dbf6124c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e0491906138f1565b60405180910390a35050565b611e1b848484612586565b611e3a8373ffffffffffffffffffffffffffffffffffffffff166131ec565b15611e8257611e4b8484848461320f565b611e81576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600080600b60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090506000816000015190506000826020015190508163ffffffff164210158015611ef757508063ffffffff164211155b15611f1857428163ffffffff16611f0e9190614d73565b9350505050611f20565b600093505050505b90565b611f2b613726565b611f33613726565b611f3b612581565b831080611f4a57506000548310155b15611f58578091505061203b565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561202e578091505061203b565b61203783612e9b565b9150505b919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061207182612479565b6120a7576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120b161335f565b905060008151036120d157604051806020016040528060008152506120fc565b806120db84612a61565b6040516020016120ec929190614da7565b6040516020818303038152906040525b915050919050565b600b8060000154908060010154908060020160009054906101000a900460ff16905083565b612131612391565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550600f60009054906101000a900460ff1615157ff09b37ecbfe134bf1f6c2f38082fa76cd990d1ffddfb88add51b7c8348c79c4a60405160405180910390a2565b6121a3612391565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612283612391565b6040518060600160405280600081526020016000815260200160001515815250600b600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600015157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a2565b612316612391565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237c90614e3d565b60405180910390fd5b61238e81613126565b50565b6123996124c7565b73ffffffffffffffffffffffffffffffffffffffff166123b7611618565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614ea9565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612484612581565b11158015612493575060005482105b80156124c0575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061259182612e9b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661261d6124c7565b73ffffffffffffffffffffffffffffffffffffffff16148061264c575061264b856126466124c7565b6121e7565b5b80612691575061265a6124c7565b73ffffffffffffffffffffffffffffffffffffffff1661267984610b5e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126ca576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612730576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273d85858560016133f1565b612749600084876124cf565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129c85760005482146129c757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a3385858560016133f7565b5050505050565b6000806000612a4985856133fd565b91509150612a568161344e565b819250505092915050565b606060008203612aa8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bbc565b600082905060005b60008214612ada578080612ac390614ec9565b915050600a82612ad39190614f40565b9150612ab0565b60008167ffffffffffffffff811115612af657612af5613adc565b5b6040519080825280601f01601f191660200182016040528015612b285781602001600182028036833780820191505090505b5090505b60008514612bb557600182612b419190614d73565b9150600a85612b509190614f71565b6030612b5c91906148d1565b60f81b818381518110612b7257612b71614c00565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bae9190614f40565b9450612b2c565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c2d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612c67576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7460008483856133f1565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e1757816000819055505050612e9660008483856133f7565b505050565b612ea3613726565b600082905080612eb1612581565b116130ef576000548110156130ee576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130ec57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fd0578092505050613121565b5b6001156130eb57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e6578092505050613121565b612fd1565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132356124c7565b8786866040518563ffffffff1660e01b81526004016132579493929190614ff7565b6020604051808303816000875af192505050801561329357506040513d601f19601f820116820180604052508101906132909190615058565b60015b61330c573d80600081146132c3576040519150601f19603f3d011682016040523d82523d6000602084013e6132c8565b606091505b506000815103613304576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461336e9061447f565b80601f016020809104026020016040519081016040528092919081815260200182805461339a9061447f565b80156133e75780601f106133bc576101008083540402835291602001916133e7565b820191906000526020600020905b8154815290600101906020018083116133ca57829003601f168201915b5050505050905090565b50505050565b50505050565b600080604183510361343e5760008060006020860151925060408601519150606086015160001a90506134328782858561361a565b94509450505050613447565b60006002915091505b9250929050565b6000600481111561346257613461615085565b5b81600481111561347557613474615085565b5b0315613617576001600481111561348f5761348e615085565b5b8160048111156134a2576134a1615085565b5b036134e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d990615100565b60405180910390fd5b600260048111156134f6576134f5615085565b5b81600481111561350957613508615085565b5b03613549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135409061516c565b60405180910390fd5b6003600481111561355d5761355c615085565b5b8160048111156135705761356f615085565b5b036135b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a7906151fe565b60405180910390fd5b6004808111156135c3576135c2615085565b5b8160048111156135d6576135d5615085565b5b03613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d90615290565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561365557600060039150915061371d565b601b8560ff161415801561366d5750601c8560ff1614155b1561367f57600060049150915061371d565b6000600187878787604051600081526020016040526040516136a494939291906152cc565b6020604051602081039080840390855afa1580156136c6573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137145760006001925092505061371d565b80600092509250505b94509492505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6137908161377d565b811461379b57600080fd5b50565b6000813590506137ad81613787565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137de826137b3565b9050919050565b6137ee816137d3565b81146137f957600080fd5b50565b60008135905061380b816137e5565b92915050565b6000806040838503121561382857613827613773565b5b60006138368582860161379e565b9250506020613847858286016137fc565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61388681613851565b811461389157600080fd5b50565b6000813590506138a38161387d565b92915050565b6000602082840312156138bf576138be613773565b5b60006138cd84828501613894565b91505092915050565b60008115159050919050565b6138eb816138d6565b82525050565b600060208201905061390660008301846138e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394657808201518184015260208101905061392b565b60008484015250505050565b6000601f19601f8301169050919050565b600061396e8261390c565b6139788185613917565b9350613988818560208601613928565b61399181613952565b840191505092915050565b600060208201905081810360008301526139b68184613963565b905092915050565b6000602082840312156139d4576139d3613773565b5b60006139e28482850161379e565b91505092915050565b6139f4816137d3565b82525050565b6000602082019050613a0f60008301846139eb565b92915050565b60008060408385031215613a2c57613a2b613773565b5b6000613a3a858286016137fc565b9250506020613a4b8582860161379e565b9150509250929050565b613a5e8161377d565b82525050565b6000602082019050613a796000830184613a55565b92915050565b600080600060608486031215613a9857613a97613773565b5b6000613aa6868287016137fc565b9350506020613ab7868287016137fc565b9250506040613ac88682870161379e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b1482613952565b810181811067ffffffffffffffff82111715613b3357613b32613adc565b5b80604052505050565b6000613b46613769565b9050613b528282613b0b565b919050565b600067ffffffffffffffff821115613b7257613b71613adc565b5b613b7b82613952565b9050602081019050919050565b82818337600083830152505050565b6000613baa613ba584613b57565b613b3c565b905082815260208101848484011115613bc657613bc5613ad7565b5b613bd1848285613b88565b509392505050565b600082601f830112613bee57613bed613ad2565b5b8135613bfe848260208601613b97565b91505092915050565b60008060408385031215613c1e57613c1d613773565b5b6000613c2c858286016137fc565b925050602083013567ffffffffffffffff811115613c4d57613c4c613778565b5b613c5985828601613bd9565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613c8357613c82613ad2565b5b8235905067ffffffffffffffff811115613ca057613c9f613c63565b5b602083019150836001820283011115613cbc57613cbb613c68565b5b9250929050565b60008060208385031215613cda57613cd9613773565b5b600083013567ffffffffffffffff811115613cf857613cf7613778565b5b613d0485828601613c6d565b92509250509250929050565b600067ffffffffffffffff821115613d2b57613d2a613adc565b5b602082029050602081019050919050565b6000613d4f613d4a84613d10565b613b3c565b90508083825260208201905060208402830185811115613d7257613d71613c68565b5b835b81811015613d9b5780613d87888261379e565b845260208401935050602081019050613d74565b5050509392505050565b600082601f830112613dba57613db9613ad2565b5b8135613dca848260208601613d3c565b91505092915050565b600060208284031215613de957613de8613773565b5b600082013567ffffffffffffffff811115613e0757613e06613778565b5b613e1384828501613da5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e51816137d3565b82525050565b600067ffffffffffffffff82169050919050565b613e7481613e57565b82525050565b613e83816138d6565b82525050565b606082016000820151613e9f6000850182613e48565b506020820151613eb26020850182613e6b565b506040820151613ec56040850182613e7a565b50505050565b6000613ed78383613e89565b60608301905092915050565b6000602082019050919050565b6000613efb82613e1c565b613f058185613e27565b9350613f1083613e38565b8060005b83811015613f41578151613f288882613ecb565b9750613f3383613ee3565b925050600181019050613f14565b5085935050505092915050565b60006020820190508181036000830152613f688184613ef0565b905092915050565b600060208284031215613f8657613f85613773565b5b6000613f94848285016137fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd28161377d565b82525050565b6000613fe48383613fc9565b60208301905092915050565b6000602082019050919050565b600061400882613f9d565b6140128185613fa8565b935061401d83613fb9565b8060005b8381101561404e5781516140358882613fd8565b975061404083613ff0565b925050600181019050614021565b5085935050505092915050565b600060208201905081810360008301526140758184613ffd565b905092915050565b6000806040838503121561409457614093613773565b5b60006140a28582860161379e565b925050602083013567ffffffffffffffff8111156140c3576140c2613778565b5b6140cf85828601613bd9565b9150509250929050565b6000806000606084860312156140f2576140f1613773565b5b6000614100868287016137fc565b93505060206141118682870161379e565b92505060406141228682870161379e565b9150509250925092565b614135816138d6565b811461414057600080fd5b50565b6000813590506141528161412c565b92915050565b6000806040838503121561416f5761416e613773565b5b600061417d858286016137fc565b925050602061418e85828601614143565b9150509250929050565b600080600080608085870312156141b2576141b1613773565b5b60006141c0878288016137fc565b94505060206141d1878288016137fc565b93505060406141e28782880161379e565b925050606085013567ffffffffffffffff81111561420357614202613778565b5b61420f87828801613bd9565b91505092959194509250565b6060820160008201516142316000850182613e48565b5060208201516142446020850182613e6b565b5060408201516142576040850182613e7a565b50505050565b6000606082019050614272600083018461421b565b92915050565b600060608201905061428d6000830186613a55565b61429a6020830185613a55565b6142a760408301846138e2565b949350505050565b600080604083850312156142c6576142c5613773565b5b60006142d4858286016137fc565b92505060206142e5858286016137fc565b9150509250929050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614325601f83613917565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f4e6f7420656e6f7567682045544820746f207769746864726177210000000000600082015250565b6000614391601b83613917565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b600081905092915050565b50565b60006143e26000836143c7565b91506143ed826143d2565b600082019050919050565b6000614403826143d5565b9150819050919050565b600061441a600083613917565b9150614425826143d2565b600082019050919050565b600060208201905081810360008301526144498161440d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061449757607f821691505b6020821081036144aa576144a9614450565b5b50919050565b6000819050919050565b6144c3816144b0565b82525050565b60006060820190506144de60008301866144ba565b6144eb60208301856139eb565b6144f860408301846144ba565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614541600283614500565b915061454c8261450b565b600282019050919050565b6000819050919050565b61457261456d826144b0565b614557565b82525050565b600061458382614534565b915061458f8285614561565b60208201915061459f8284614561565b6020820191508190509392505050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145df565b61462686836145df565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466361465e6146598461377d565b61463e565b61377d565b9050919050565b6000819050919050565b61467d83614648565b6146916146898261466a565b8484546145ec565b825550505050565b600090565b6146a6614699565b6146b1818484614674565b505050565b5b818110156146d5576146ca60008261469e565b6001810190506146b7565b5050565b601f82111561471a576146eb816145ba565b6146f4846145cf565b81016020851015614703578190505b61471761470f856145cf565b8301826146b6565b50505b505050565b600082821c905092915050565b600061473d6000198460080261471f565b1980831691505092915050565b6000614756838361472c565b9150826002028217905092915050565b61477083836145af565b67ffffffffffffffff81111561478957614788613adc565b5b614793825461447f565b61479e8282856146d9565b6000601f8311600181146147cd57600084156147bb578287013590505b6147c5858261474a565b86555061482d565b601f1984166147db866145ba565b60005b82811015614803578489013582556001820191506020850194506020810190506147de565b86831015614820578489013561481c601f89168261472c565b8355505b6001600288020188555050505b50505050505050565b7f5075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b600061486c601583613917565b915061487782614836565b602082019050919050565b6000602082019050818103600083015261489b8161485f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148dc8261377d565b91506148e78361377d565b92508282019050808211156148ff576148fe6148a2565b5b92915050565b7f43616e2774206d696e74206d6f7265207468616e206d617820746f6b656e7300600082015250565b600061493b601f83613917565b915061494682614905565b602082019050919050565b6000602082019050818103600083015261496a8161492e565b9050919050565b7f596f752063616e277420627579206d6f7265207468616e200000000000000000600082015250565b60006149a7601883614500565b91506149b282614971565b601882019050919050565b60006149c88261390c565b6149d28185614500565b93506149e2818560208601613928565b80840191505092915050565b7f20746f6b656e7320706572207472616e73616374696f6e2e0000000000000000600082015250565b6000614a24601883614500565b9150614a2f826149ee565b601882019050919050565b6000614a458261499a565b9150614a5182846149bd565b9150614a5c82614a17565b915081905092915050565b6000614a728261377d565b9150614a7d8361377d565b9250828202614a8b8161377d565b91508282048414831517614aa257614aa16148a2565b5b5092915050565b7f4e6f7420656e6f7567682045544821204174206c656173742000000000000000600082015250565b6000614adf601983614500565b9150614aea82614aa9565b601982019050919050565b7f207765692068617320746f2062652073656e7421000000000000000000000000600082015250565b6000614b2b601483614500565b9150614b3682614af5565b601482019050919050565b6000614b4c82614ad2565b9150614b5882846149bd565b9150614b6382614b1e565b915081905092915050565b7f4d617820746f6b656e20636f756e74207065722077616c6c657420657863656560008201527f6465642100000000000000000000000000000000000000000000000000000000602082015250565b6000614bca602483613917565b9150614bd582614b6e565b604082019050919050565b60006020820190508181036000830152614bf981614bbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b6000614c65601f83613917565b9150614c7082614c2f565b602082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f416c6c6f776c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614cd1601c83613917565b9150614cdc82614c9b565b602082019050919050565b60006020820190508181036000830152614d0081614cc4565b9050919050565b7f41646472657373206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614d3d601b83613917565b9150614d4882614d07565b602082019050919050565b60006020820190508181036000830152614d6c81614d30565b9050919050565b6000614d7e8261377d565b9150614d898361377d565b9250828203905081811115614da157614da06148a2565b5b92915050565b6000614db382856149bd565b9150614dbf82846149bd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e27602683613917565b9150614e3282614dcb565b604082019050919050565b60006020820190508181036000830152614e5681614e1a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e93602083613917565b9150614e9e82614e5d565b602082019050919050565b60006020820190508181036000830152614ec281614e86565b9050919050565b6000614ed48261377d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f0657614f056148a2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4b8261377d565b9150614f568361377d565b925082614f6657614f65614f11565b5b828204905092915050565b6000614f7c8261377d565b9150614f878361377d565b925082614f9757614f96614f11565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614fc982614fa2565b614fd38185614fad565b9350614fe3818560208601613928565b614fec81613952565b840191505092915050565b600060808201905061500c60008301876139eb565b61501960208301866139eb565b6150266040830185613a55565b81810360608301526150388184614fbe565b905095945050505050565b6000815190506150528161387d565b92915050565b60006020828403121561506e5761506d613773565b5b600061507c84828501615043565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006150ea601883613917565b91506150f5826150b4565b602082019050919050565b60006020820190508181036000830152615119816150dd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615156601f83613917565b915061516182615120565b602082019050919050565b6000602082019050818103600083015261518581615149565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151e8602283613917565b91506151f38261518c565b604082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061527a602283613917565b91506152858261521e565b604082019050919050565b600060208201905081810360008301526152a98161526d565b9050919050565b600060ff82169050919050565b6152c6816152b0565b82525050565b60006080820190506152e160008301876144ba565b6152ee60208301866152bd565b6152fb60408301856144ba565b61530860608301846144ba565b9594505050505056fea26469706673582212209ca3371653b2407c63419c24edbfbbcf0c6bef6abece15efdbc57a5afbd822e764736f6c63430008110033

Deployed Bytecode Sourcemap

305:6668:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6625:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3147:305:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6262:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7766:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7328:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2387:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8631:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1265:34:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8872:185:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3199:170:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1343:761;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2594:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5355:1053;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1548:468:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3859:237:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6070:125:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3516:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;5362:891:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6416:201:15;;;;;;;;;;;;;:::i;:::-;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4104:1243:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2738:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6431:104:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2406:2507:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8042:287:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9128:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3377:456:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;971:418:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;529:75:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6606:318:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;768:46:15;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;2304:138;;;;;;;;;;;;;:::i;:::-;;2142:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8400:164:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:157:15;;;;;;;;;;;;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6625:345:15;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;6796:10:15::2;6771:21;:35;;6749:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;6873:12;6899:3;6891:17;;6916:10;6891:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6872:59;;;6950:7;6942:20;;;;;;;;;;;;:::i;:::-;;;;;;;;;6738:232;1701:1:1::1;2628:7;:22;;;;6625:345:15::0;;:::o;3147:305:11:-;3249:4;3301:25;3286:40;;;:11;:40;;;;:105;;;;3358:33;3343:48;;;:11;:48;;;;3286:105;:158;;;;3408:36;3432:11;3408:23;:36::i;:::-;3286:158;3266:178;;3147:305;;;:::o;6262:100::-;6316:13;6349:5;6342:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6262:100;:::o;7766:204::-;7834:7;7859:16;7867:7;7859;:16::i;:::-;7854:64;;7884:34;;;;;;;;;;;;;;7854:64;7938:15;:24;7954:7;7938:24;;;;;;;;;;;;;;;;;;;;;7931:31;;7766:204;;;:::o;7328:372::-;7401:13;7417:24;7433:7;7417:15;:24::i;:::-;7401:40;;7462:5;7456:11;;:2;:11;;;7452:48;;7476:24;;;;;;;;;;;;;;7452:48;7533:5;7517:21;;:12;:10;:12::i;:::-;:21;;;7513:139;;7544:37;7561:5;7568:12;:10;:12::i;:::-;7544:16;:37::i;:::-;7540:112;;7605:35;;;;;;;;;;;;;;7540:112;7513:139;7664:28;7673:2;7677:7;7686:5;7664:8;:28::i;:::-;7390:310;7328:372;;:::o;2387:312::-;2440:7;2665:15;:13;:15::i;:::-;2650:12;;2634:13;;:28;:46;2627:53;;2387:312;:::o;8631:170::-;8765:28;8775:4;8781:2;8785:7;8765:9;:28::i;:::-;8631:170;;;:::o;1265:34:15:-;;;;;;;;;;;;;:::o;8872:185:11:-;9010:39;9027:4;9033:2;9037:7;9010:39;;;;;;;;;;;;:16;:39::i;:::-;8872:185;;;:::o;3199:170:15:-;3248:4;3265:33;3301:19;3265:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3338:6;:23;;;3331:30;;;3199:170;:::o;1343:761::-;1467:4;1489:14;1594:19;;1701:124;1852:18;1907:22;;;;;;;;;;;;;;;;;1897:33;;;;;;1664:289;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1632:340;;;;;;1530:457;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1506:492;;;;;;1489:509;;2066:15;;;;;;;;;;;2029:52;;:33;2043:6;2051:10;2029:13;:33::i;:::-;:52;;;:67;;2091:5;2029:67;;;2084:4;2029:67;2009:87;;;1343:761;;;;:::o;2594:106::-;1094:13:0;:11;:13::i;:::-;2685:7:15::1;;2669:13;:23;;;;;;;:::i;:::-;;2594:106:::0;;:::o;5355:1053::-;5430:14;;;;;;;;;;;5422:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;5532:4;5521:7;5505:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;5483:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;5640:1;5630:7;:11;:27;;;;;5656:1;5645:7;:12;;5630:27;5785:19;5802:1;5785:16;:19::i;:::-;5697:175;;;;;;;;:::i;:::-;;;;;;;;;;;;;5608:290;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5960:7;5946:11;:21;;;;:::i;:::-;5933:9;:34;;6096:39;6127:7;6113:11;:21;;;;:::i;:::-;6096:16;:39::i;:::-;6007:192;;;;;;;;:::i;:::-;;;;;;;;;;;;;5911:314;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6290:7;6266:21;6276:10;6266:9;:21::i;:::-;:31;;;;:::i;:::-;6260:2;:37;;6238:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;6374:26;6380:10;6392:7;6374:5;:26::i;:::-;5355:1053;:::o;1548:468:12:-;1637:23;1698:22;1723:8;:15;1698:40;;1753:34;1811:14;1790:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1753:73;;1846:9;1841:125;1862:14;1857:1;:19;1841:125;;1918:32;1938:8;1947:1;1938:11;;;;;;;;:::i;:::-;;;;;;;;1918:19;:32::i;:::-;1902:10;1913:1;1902:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1878:3;;;;;1841:125;;;;1987:10;1980:17;;;;1548:468;;;:::o;3859:237:15:-;1094:13:0;:11;:13::i;:::-;3990:4:15::1;3979:7;3963:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;3941:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4064:24;4070:8;4080:7;4064:5;:24::i;:::-;3859:237:::0;;:::o;6070:125:11:-;6134:7;6161:21;6174:7;6161:12;:21::i;:::-;:26;;;6154:33;;6070:125;;;:::o;3516:206::-;3580:7;3621:1;3604:19;;:5;:19;;;3600:60;;3632:28;;;;;;;;;;;;;;3600:60;3686:12;:19;3699:5;3686:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;3678:36;;3671:43;;3516:206;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5362:891:12:-;5432:16;5486:19;5520:25;5560:22;5585:16;5595:5;5585:9;:16::i;:::-;5560:41;;5616:25;5658:14;5644:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:57;;5688:31;;:::i;:::-;5739:9;5751:15;:13;:15::i;:::-;5739:27;;5734:471;5783:14;5768:11;:29;5734:471;;5835:11;:14;5847:1;5835:14;;;;;;;;;;;5823:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5872:9;:16;;;5913:8;5868:73;5989:1;5963:28;;:9;:14;;;:28;;;5959:111;;6036:9;:14;;;6016:34;;5959:111;6113:5;6092:26;;:17;:26;;;6088:102;;6169:1;6143:8;6152:13;;;;;;6143:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6088:102;5734:471;5799:3;;;;;5734:471;;;;6226:8;6219:15;;;;;;;5362:891;;;:::o;6416:201:15:-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;6481:12:15::2;6507:7;:5;:7::i;:::-;6499:21;;6528;6499:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6480:98;;;6597:7;6589:20;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:148;1701:1:1::1;2628:7;:22;;;;6416:201:15:o:0;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;4104:1243:15:-;4248:1;4226:19;:17;:19::i;:::-;:23;4218:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4317:37;4331:10;4343;4317:13;:37::i;:::-;4295:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;4471:4;4460:7;4444:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;4422:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4579:1;4569:7;:11;:27;;;;;4595:1;4584:7;:12;;4569:27;4724:19;4741:1;4724:16;:19::i;:::-;4636:175;;;;;;;;:::i;:::-;;;;;;;;;;;;;4547:290;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4899:7;4885:11;:21;;;;:::i;:::-;4872:9;:34;;5035:39;5066:7;5052:11;:21;;;;:::i;:::-;5035:16;:39::i;:::-;4946:192;;;;;;;;:::i;:::-;;;;;;;;;;;;;4850:314;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5229:7;5205:21;5215:10;5205:9;:21::i;:::-;:31;;;;:::i;:::-;5199:2;:37;;5177:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;5313:26;5319:10;5331:7;5313:5;:26::i;:::-;4104:1243;;:::o;2738:288::-;1094:13:0;:11;:13::i;:::-;2846:137:15::1;;;;;;;;2880:15;2846:137;;;;2950:2;2929:18;:23;;;;:::i;:::-;2910:15;:43;;;;:::i;:::-;2846:137;;;;2968:4;2846:137;;;;::::0;2824:19:::1;:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3013:4;2999:19;;;;;;;;;;;;2738:288:::0;:::o;6431:104:11:-;6487:13;6520:7;6513:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6431:104;:::o;2406:2507:12:-;2541:16;2608:4;2599:5;:13;2595:45;;2621:19;;;;;;;;;;;;;;2595:45;2655:19;2689:17;2709:13;;2689:33;;2808:15;:13;:15::i;:::-;2800:5;:23;2796:87;;;2852:15;:13;:15::i;:::-;2844:23;;2796:87;2963:9;2956:4;:16;2952:73;;;3000:9;2993:16;;2952:73;3039:25;3067:16;3077:5;3067:9;:16::i;:::-;3039:44;;3261:4;3253:5;:12;3249:278;;;3286:19;3315:5;3308:4;:12;3286:34;;3357:17;3343:11;:31;3339:111;;;3419:11;3399:31;;3339:111;3267:198;3249:278;;;3510:1;3490:21;;3249:278;3541:25;3583:17;3569:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3541:60;;3641:1;3620:17;:22;3616:78;;3670:8;3663:15;;;;;;;;3616:78;3838:31;3872:26;3892:5;3872:19;:26::i;:::-;3838:60;;3913:25;4158:9;:16;;;4153:92;;4215:9;:14;;;4195:34;;4153:92;4264:9;4276:5;4264:17;;4259:477;4288:4;4283:1;:9;;:45;;;;;4311:17;4296:11;:32;;4283:45;4259:477;;;4366:11;:14;4378:1;4366:14;;;;;;;;;;;4354:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4403:9;:16;;;4444:8;4399:73;4520:1;4494:28;;:9;:14;;;:28;;;4490:111;;4567:9;:14;;;4547:34;;4490:111;4644:5;4623:26;;:17;:26;;;4619:102;;4700:1;4674:8;4683:13;;;;;;4674:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4619:102;4259:477;4330:3;;;;;4259:477;;;;4838:11;4828:8;4821:29;4886:8;4879:15;;;;;;;;2406:2507;;;;;;:::o;8042:287:11:-;8153:12;:10;:12::i;:::-;8141:24;;:8;:24;;;8137:54;;8174:17;;;;;;;;;;;;;;8137:54;8249:8;8204:18;:32;8223:12;:10;:12::i;:::-;8204:32;;;;;;;;;;;;;;;:42;8237:8;8204:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8302:8;8273:48;;8288:12;:10;:12::i;:::-;8273:48;;;8312:8;8273:48;;;;;;:::i;:::-;;;;;;;;8042:287;;:::o;9128:370::-;9295:28;9305:4;9311:2;9315:7;9295:9;:28::i;:::-;9338:15;:2;:13;;;:15::i;:::-;9334:157;;;9359:56;9390:4;9396:2;9400:7;9409:5;9359:30;:56::i;:::-;9355:136;;9439:40;;;;;;;;;;;;;;9355:136;9334:157;9128:370;;;;:::o;3377:456:15:-;3427:7;3488:33;3524:19;3488:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3554:16;3580:6;:29;;;3554:56;;3621:14;3645:6;:27;;;3621:52;;3707:9;3688:28;;:15;:28;;:58;;;;;3739:7;3720:26;;:15;:26;;3688:58;3684:123;;;3780:15;3770:7;:25;;;;;;:::i;:::-;3763:32;;;;;;;3684:123;3824:1;3817:8;;;;;3377:456;;:::o;971:418:12:-;1047:21;;:::i;:::-;1081:31;;:::i;:::-;1137:15;:13;:15::i;:::-;1127:7;:25;:53;;;;1167:13;;1156:7;:24;;1127:53;1123:102;;;1204:9;1197:16;;;;;1123:102;1247:11;:20;1259:7;1247:20;;;;;;;;;;;1235:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:9;:16;;;1278:65;;;1322:9;1315:16;;;;;1278:65;1360:21;1373:7;1360:12;:21::i;:::-;1353:28;;;971:418;;;;:::o;529:75:15:-;;;;;;;;;;;;;:::o;6606:318:11:-;6679:13;6710:16;6718:7;6710;:16::i;:::-;6705:59;;6735:29;;;;;;;;;;;;;;6705:59;6777:21;6801:10;:8;:10::i;:::-;6777:34;;6854:1;6835:7;6829:21;:26;:87;;;;;;;;;;;;;;;;;6882:7;6891:18;:7;:16;:18::i;:::-;6865:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6829:87;6822:94;;;6606:318;;;:::o;768:46:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2304:138::-;1094:13:0;:11;:13::i;:::-;2378:14:15::1;;;;;;;;;;;2377:15;2360:14;;:32;;;;;;;;;;;;;;;;;;2419:14;;;;;;;;;;;2408:26;;;;;;;;;;;;2304:138::o:0;2142:126::-;1094:13:0;:11;:13::i;:::-;2244:16:15::1;2226:15;;:34;;;;;;;;;;;;;;;;;;2142:126:::0;:::o;8400:164:11:-;8497:4;8521:18;:25;8540:5;8521:25;;;;;;;;;;;;;;;:35;8547:8;8521:35;;;;;;;;;;;;;;;;;;;;;;;;;8514:42;;8400:164;;;;:::o;3034:157:15:-;1094:13:0;:11;:13::i;:::-;3115:32:15::1;;;;;;;;3135:1;3115:32;;;;3138:1;3115:32;;;;3141:5;3115:32;;;;::::0;3093:19:::1;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3177:5;3163:20;;;;;;;;;;;;3034:157::o:0;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9753:174:11:-;9810:4;9853:7;9834:15;:13;:15::i;:::-;:26;;:53;;;;;9874:13;;9864:7;:23;9834:53;:85;;;;;9892:11;:20;9904:7;9892:20;;;;;;;;;;;:27;;;;;;;;;;;;9891:28;9834:85;9827:92;;9753:174;;;:::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;18975:196:11:-;19117:2;19090:15;:24;19106:7;19090:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19155:7;19151:2;19135:28;;19144:5;19135:28;;;;;;;;;;;;18975:196;;;:::o;2161:92::-;2217:7;2161:92;:::o;13923:2130::-;14038:35;14076:21;14089:7;14076:12;:21::i;:::-;14038:59;;14136:4;14114:26;;:13;:18;;;:26;;;14110:67;;14149:28;;;;;;;;;;;;;;14110:67;14190:22;14232:4;14216:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;14253:36;14270:4;14276:12;:10;:12::i;:::-;14253:16;:36::i;:::-;14216:73;:126;;;;14330:12;:10;:12::i;:::-;14306:36;;:20;14318:7;14306:11;:20::i;:::-;:36;;;14216:126;14190:153;;14361:17;14356:66;;14387:35;;;;;;;;;;;;;;14356:66;14451:1;14437:16;;:2;:16;;;14433:52;;14462:23;;;;;;;;;;;;;;14433:52;14498:43;14520:4;14526:2;14530:7;14539:1;14498:21;:43::i;:::-;14606:35;14623:1;14627:7;14636:4;14606:8;:35::i;:::-;14967:1;14937:12;:18;14950:4;14937:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15011:1;14983:12;:16;14996:2;14983:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15029:31;15063:11;:20;15075:7;15063:20;;;;;;;;;;;15029:54;;15114:2;15098:8;:13;;;:18;;;;;;;;;;;;;;;;;;15164:15;15131:8;:23;;;:49;;;;;;;;;;;;;;;;;;15432:19;15464:1;15454:7;:11;15432:33;;15480:31;15514:11;:24;15526:11;15514:24;;;;;;;;;;;15480:58;;15582:1;15557:27;;:8;:13;;;;;;;;;;;;:27;;;15553:384;;15767:13;;15752:11;:28;15748:174;;15821:4;15805:8;:13;;;:20;;;;;;;;;;;;;;;;;;15874:13;:28;;;15848:8;:23;;;:54;;;;;;;;;;;;;;;;;;15748:174;15553:384;14912:1036;;;15984:7;15980:2;15965:27;;15974:4;15965:27;;;;;;;;;;;;16003:42;16024:4;16030:2;16034:7;16043:1;16003:20;:42::i;:::-;14027:2026;;13923:2130;;;:::o;3759:227:8:-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;3970:9;3963:16;;;;3759:227;;;;:::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;12496:1173:11:-;12561:20;12584:13;;12561:36;;12626:1;12612:16;;:2;:16;;;12608:48;;12637:19;;;;;;;;;;;;;;12608:48;12683:1;12671:8;:13;12667:44;;12693:18;;;;;;;;;;;;;;12667:44;12724:61;12754:1;12758:2;12762:12;12776:8;12724:21;:61::i;:::-;13097:8;13062:12;:16;13075:2;13062:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13161:8;13121:12;:16;13134:2;13121:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13220:2;13187:11;:25;13199:12;13187:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13287:15;13237:11;:25;13249:12;13237:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13320:20;13343:12;13320:35;;13370:11;13399:8;13384:12;:23;13370:37;;13424:111;13476:14;;;;;;13472:2;13451:40;;13468:1;13451:40;;;;;;;;;;;;13530:3;13515:12;:18;13424:111;;13567:12;13551:13;:28;;;;13037:554;;13601:60;13630:1;13634:2;13638:12;13652:8;13601:20;:60::i;:::-;12550:1119;12496:1173;;:::o;4897:1111::-;4959:21;;:::i;:::-;4993:12;5008:7;4993:22;;5076:4;5057:15;:13;:15::i;:::-;:23;5053:888;;5093:13;;5086:4;:20;5082:859;;;5127:31;5161:11;:17;5173:4;5161:17;;;;;;;;;;;5127:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5202:9;:16;;;5197:729;;5273:1;5247:28;;:9;:14;;;:28;;;5243:101;;5311:9;5304:16;;;;;;5243:101;5646:261;5653:4;5646:261;;;5686:6;;;;;;;;5731:11;:17;5743:4;5731:17;;;;;;;;;;;5719:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5805:1;5779:28;;:9;:14;;;:28;;;5775:109;;5847:9;5840:16;;;;;;5775:109;5646:261;;;5197:729;5108:833;5082:859;5053:888;5969:31;;;;;;;;;;;;;;4897:1111;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19663:667:11:-;19826:4;19863:2;19847:36;;;19884:12;:10;:12::i;:::-;19898:4;19904:7;19913:5;19847:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19843:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20098:1;20081:6;:13;:18;20077:235;;20127:40;;;;;;;;;;;;;;20077:235;20270:6;20264:13;20255:6;20251:2;20247:15;20240:38;19843:480;19976:45;;;19966:55;;;:6;:55;;;;19959:62;;;19663:667;;;;;;:::o;2450:114:15:-;2510:13;2543;2536:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:114;:::o;20978:159:11:-;;;;;:::o;21796:158::-;;;;;:::o;2243:730:8:-;2324:7;2333:12;2381:2;2361:9;:16;:22;2357:610;;2399:9;2422;2445:7;2697:4;2686:9;2682:20;2676:27;2671:32;;2746:4;2735:9;2731:20;2725:27;2720:32;;2803:4;2792:9;2788:20;2782:27;2779:1;2774:36;2769:41;;2844:25;2855:4;2861:1;2864;2867;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;2916:1;2920:35;2900:56;;;;2243:730;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;661:7;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;5167:1603::-;5293:7;5302:12;6217:66;6212:1;6204:10;;:79;6200:161;;;6315:1;6319:30;6299:51;;;;;;6200:161;6379:2;6374:1;:7;;;;:18;;;;;6390:2;6385:1;:7;;;;6374:18;6370:100;;;6424:1;6428:30;6408:51;;;;;;6370:100;6564:14;6581:24;6591:4;6597:1;6600;6603;6581:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6564:41;;6637:1;6619:20;;:6;:20;;;6615:101;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;6742:20;6726:37;;;;;5167:1603;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;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:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:126::-;727:7;767:42;760:5;756:54;745:65;;690:126;;;:::o;822:96::-;859:7;888:24;906:5;888:24;:::i;:::-;877:35;;822:96;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:149::-;1713:7;1753:66;1746:5;1742:78;1731:89;;1677:149;;;:::o;1832:120::-;1904:23;1921:5;1904:23;:::i;:::-;1897:5;1894:34;1884:62;;1942:1;1939;1932:12;1884:62;1832:120;:::o;1958:137::-;2003:5;2041:6;2028:20;2019:29;;2057:32;2083:5;2057:32;:::i;:::-;1958:137;;;;:::o;2101:327::-;2159:6;2208:2;2196:9;2187:7;2183:23;2179:32;2176:119;;;2214:79;;:::i;:::-;2176:119;2334:1;2359:52;2403:7;2394:6;2383:9;2379:22;2359:52;:::i;:::-;2349:62;;2305:116;2101:327;;;;:::o;2434:90::-;2468:7;2511:5;2504:13;2497:21;2486:32;;2434:90;;;:::o;2530:109::-;2611:21;2626:5;2611:21;:::i;:::-;2606:3;2599:34;2530:109;;:::o;2645:210::-;2732:4;2770:2;2759:9;2755:18;2747:26;;2783:65;2845:1;2834:9;2830:17;2821:6;2783:65;:::i;:::-;2645:210;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:246::-;3222:1;3232:113;3246:6;3243:1;3240:13;3232:113;;;3331:1;3326:3;3322:11;3316:18;3312:1;3307:3;3303:11;3296:39;3268:2;3265:1;3261:10;3256:15;;3232:113;;;3379:1;3370:6;3365:3;3361:16;3354:27;3203:184;3141:246;;;:::o;3393:102::-;3434:6;3485:2;3481:7;3476:2;3469:5;3465:14;3461:28;3451:38;;3393:102;;;:::o;3501:377::-;3589:3;3617:39;3650:5;3617:39;:::i;:::-;3672:71;3736:6;3731:3;3672:71;:::i;:::-;3665:78;;3752:65;3810:6;3805:3;3798:4;3791:5;3787:16;3752:65;:::i;:::-;3842:29;3864:6;3842:29;:::i;:::-;3837:3;3833:39;3826:46;;3593:285;3501:377;;;;:::o;3884:313::-;3997:4;4035:2;4024:9;4020:18;4012:26;;4084:9;4078:4;4074:20;4070:1;4059:9;4055:17;4048:47;4112:78;4185:4;4176:6;4112:78;:::i;:::-;4104:86;;3884:313;;;;:::o;4203:329::-;4262:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:119;;;4317:79;;:::i;:::-;4279:119;4437:1;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4408:117;4203:329;;;;:::o;4538:118::-;4625:24;4643:5;4625:24;:::i;:::-;4620:3;4613:37;4538:118;;:::o;4662:222::-;4755:4;4793:2;4782:9;4778:18;4770:26;;4806:71;4874:1;4863:9;4859:17;4850:6;4806:71;:::i;:::-;4662:222;;;;:::o;4890:474::-;4958:6;4966;5015:2;5003:9;4994:7;4990:23;4986:32;4983:119;;;5021:79;;:::i;:::-;4983:119;5141:1;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5112:117;5268:2;5294:53;5339:7;5330:6;5319:9;5315:22;5294:53;:::i;:::-;5284:63;;5239:118;4890:474;;;;;:::o;5370:118::-;5457:24;5475:5;5457:24;:::i;:::-;5452:3;5445:37;5370:118;;:::o;5494:222::-;5587:4;5625:2;5614:9;5610:18;5602:26;;5638:71;5706:1;5695:9;5691:17;5682:6;5638:71;:::i;:::-;5494:222;;;;:::o;5722:619::-;5799:6;5807;5815;5864:2;5852:9;5843:7;5839:23;5835:32;5832:119;;;5870:79;;:::i;:::-;5832:119;5990:1;6015:53;6060:7;6051:6;6040:9;6036:22;6015:53;:::i;:::-;6005:63;;5961:117;6117:2;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6088:118;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5722:619;;;;;:::o;6347:117::-;6456:1;6453;6446:12;6470:117;6579:1;6576;6569:12;6593:180;6641:77;6638:1;6631:88;6738:4;6735:1;6728:15;6762:4;6759:1;6752:15;6779:281;6862:27;6884:4;6862:27;:::i;:::-;6854:6;6850:40;6992:6;6980:10;6977:22;6956:18;6944:10;6941:34;6938:62;6935:88;;;7003:18;;:::i;:::-;6935:88;7043:10;7039:2;7032:22;6822:238;6779:281;;:::o;7066:129::-;7100:6;7127:20;;:::i;:::-;7117:30;;7156:33;7184:4;7176:6;7156:33;:::i;:::-;7066:129;;;:::o;7201:307::-;7262:4;7352:18;7344:6;7341:30;7338:56;;;7374:18;;:::i;:::-;7338:56;7412:29;7434:6;7412:29;:::i;:::-;7404:37;;7496:4;7490;7486:15;7478:23;;7201:307;;;:::o;7514:146::-;7611:6;7606:3;7601;7588:30;7652:1;7643:6;7638:3;7634:16;7627:27;7514:146;;;:::o;7666:423::-;7743:5;7768:65;7784:48;7825:6;7784:48;:::i;:::-;7768:65;:::i;:::-;7759:74;;7856:6;7849:5;7842:21;7894:4;7887:5;7883:16;7932:3;7923:6;7918:3;7914:16;7911:25;7908:112;;;7939:79;;:::i;:::-;7908:112;8029:54;8076:6;8071:3;8066;8029:54;:::i;:::-;7749:340;7666:423;;;;;:::o;8108:338::-;8163:5;8212:3;8205:4;8197:6;8193:17;8189:27;8179:122;;8220:79;;:::i;:::-;8179:122;8337:6;8324:20;8362:78;8436:3;8428:6;8421:4;8413:6;8409:17;8362:78;:::i;:::-;8353:87;;8169:277;8108:338;;;;:::o;8452:652::-;8529:6;8537;8586:2;8574:9;8565:7;8561:23;8557:32;8554:119;;;8592:79;;:::i;:::-;8554:119;8712:1;8737:53;8782:7;8773:6;8762:9;8758:22;8737:53;:::i;:::-;8727:63;;8683:117;8867:2;8856:9;8852:18;8839:32;8898:18;8890:6;8887:30;8884:117;;;8920:79;;:::i;:::-;8884:117;9025:62;9079:7;9070:6;9059:9;9055:22;9025:62;:::i;:::-;9015:72;;8810:287;8452:652;;;;;:::o;9110:117::-;9219:1;9216;9209:12;9233:117;9342:1;9339;9332:12;9370:553;9428:8;9438:6;9488:3;9481:4;9473:6;9469:17;9465:27;9455:122;;9496:79;;:::i;:::-;9455:122;9609:6;9596:20;9586:30;;9639:18;9631:6;9628:30;9625:117;;;9661:79;;:::i;:::-;9625:117;9775:4;9767:6;9763:17;9751:29;;9829:3;9821:4;9813:6;9809:17;9799:8;9795:32;9792:41;9789:128;;;9836:79;;:::i;:::-;9789:128;9370:553;;;;;:::o;9929:529::-;10000:6;10008;10057:2;10045:9;10036:7;10032:23;10028:32;10025:119;;;10063:79;;:::i;:::-;10025:119;10211:1;10200:9;10196:17;10183:31;10241:18;10233:6;10230:30;10227:117;;;10263:79;;:::i;:::-;10227:117;10376:65;10433:7;10424:6;10413:9;10409:22;10376:65;:::i;:::-;10358:83;;;;10154:297;9929:529;;;;;:::o;10464:311::-;10541:4;10631:18;10623:6;10620:30;10617:56;;;10653:18;;:::i;:::-;10617:56;10703:4;10695:6;10691:17;10683:25;;10763:4;10757;10753:15;10745:23;;10464:311;;;:::o;10798:710::-;10894:5;10919:81;10935:64;10992:6;10935:64;:::i;:::-;10919:81;:::i;:::-;10910:90;;11020:5;11049:6;11042:5;11035:21;11083:4;11076:5;11072:16;11065:23;;11136:4;11128:6;11124:17;11116:6;11112:30;11165:3;11157:6;11154:15;11151:122;;;11184:79;;:::i;:::-;11151:122;11299:6;11282:220;11316:6;11311:3;11308:15;11282:220;;;11391:3;11420:37;11453:3;11441:10;11420:37;:::i;:::-;11415:3;11408:50;11487:4;11482:3;11478:14;11471:21;;11358:144;11342:4;11337:3;11333:14;11326:21;;11282:220;;;11286:21;10900:608;;10798:710;;;;;:::o;11531:370::-;11602:5;11651:3;11644:4;11636:6;11632:17;11628:27;11618:122;;11659:79;;:::i;:::-;11618:122;11776:6;11763:20;11801:94;11891:3;11883:6;11876:4;11868:6;11864:17;11801:94;:::i;:::-;11792:103;;11608:293;11531:370;;;;:::o;11907:539::-;11991:6;12040:2;12028:9;12019:7;12015:23;12011:32;12008:119;;;12046:79;;:::i;:::-;12008:119;12194:1;12183:9;12179:17;12166:31;12224:18;12216:6;12213:30;12210:117;;;12246:79;;:::i;:::-;12210:117;12351:78;12421:7;12412:6;12401:9;12397:22;12351:78;:::i;:::-;12341:88;;12137:302;11907:539;;;;:::o;12452:146::-;12551:6;12585:5;12579:12;12569:22;;12452:146;;;:::o;12604:216::-;12735:11;12769:6;12764:3;12757:19;12809:4;12804:3;12800:14;12785:29;;12604:216;;;;:::o;12826:164::-;12925:4;12948:3;12940:11;;12978:4;12973:3;12969:14;12961:22;;12826:164;;;:::o;12996:108::-;13073:24;13091:5;13073:24;:::i;:::-;13068:3;13061:37;12996:108;;:::o;13110:101::-;13146:7;13186:18;13179:5;13175:30;13164:41;;13110:101;;;:::o;13217:105::-;13292:23;13309:5;13292:23;:::i;:::-;13287:3;13280:36;13217:105;;:::o;13328:99::-;13399:21;13414:5;13399:21;:::i;:::-;13394:3;13387:34;13328:99;;:::o;13505:689::-;13656:4;13651:3;13647:14;13743:4;13736:5;13732:16;13726:23;13762:63;13819:4;13814:3;13810:14;13796:12;13762:63;:::i;:::-;13671:164;13927:4;13920:5;13916:16;13910:23;13946:61;14001:4;13996:3;13992:14;13978:12;13946:61;:::i;:::-;13845:172;14101:4;14094:5;14090:16;14084:23;14120:57;14171:4;14166:3;14162:14;14148:12;14120:57;:::i;:::-;14027:160;13625:569;13505:689;;:::o;14200:307::-;14333:10;14354:110;14460:3;14452:6;14354:110;:::i;:::-;14496:4;14491:3;14487:14;14473:28;;14200:307;;;;:::o;14513:145::-;14615:4;14647;14642:3;14638:14;14630:22;;14513:145;;;:::o;14740:988::-;14923:3;14952:86;15032:5;14952:86;:::i;:::-;15054:118;15165:6;15160:3;15054:118;:::i;:::-;15047:125;;15196:88;15278:5;15196:88;:::i;:::-;15307:7;15338:1;15323:380;15348:6;15345:1;15342:13;15323:380;;;15424:6;15418:13;15451:127;15574:3;15559:13;15451:127;:::i;:::-;15444:134;;15601:92;15686:6;15601:92;:::i;:::-;15591:102;;15383:320;15370:1;15367;15363:9;15358:14;;15323:380;;;15327:14;15719:3;15712:10;;14928:800;;;14740:988;;;;:::o;15734:501::-;15941:4;15979:2;15968:9;15964:18;15956:26;;16028:9;16022:4;16018:20;16014:1;16003:9;15999:17;15992:47;16056:172;16223:4;16214:6;16056:172;:::i;:::-;16048:180;;15734:501;;;;:::o;16241:329::-;16300:6;16349:2;16337:9;16328:7;16324:23;16320:32;16317:119;;;16355:79;;:::i;:::-;16317:119;16475:1;16500:53;16545:7;16536:6;16525:9;16521:22;16500:53;:::i;:::-;16490:63;;16446:117;16241:329;;;;:::o;16576:114::-;16643:6;16677:5;16671:12;16661:22;;16576:114;;;:::o;16696:184::-;16795:11;16829:6;16824:3;16817:19;16869:4;16864:3;16860:14;16845:29;;16696:184;;;;:::o;16886:132::-;16953:4;16976:3;16968:11;;17006:4;17001:3;16997:14;16989:22;;16886:132;;;:::o;17024:108::-;17101:24;17119:5;17101:24;:::i;:::-;17096:3;17089:37;17024:108;;:::o;17138:179::-;17207:10;17228:46;17270:3;17262:6;17228:46;:::i;:::-;17306:4;17301:3;17297:14;17283:28;;17138:179;;;;:::o;17323:113::-;17393:4;17425;17420:3;17416:14;17408:22;;17323:113;;;:::o;17472:732::-;17591:3;17620:54;17668:5;17620:54;:::i;:::-;17690:86;17769:6;17764:3;17690:86;:::i;:::-;17683:93;;17800:56;17850:5;17800:56;:::i;:::-;17879:7;17910:1;17895:284;17920:6;17917:1;17914:13;17895:284;;;17996:6;17990:13;18023:63;18082:3;18067:13;18023:63;:::i;:::-;18016:70;;18109:60;18162:6;18109:60;:::i;:::-;18099:70;;17955:224;17942:1;17939;17935:9;17930:14;;17895:284;;;17899:14;18195:3;18188:10;;17596:608;;;17472:732;;;;:::o;18210:373::-;18353:4;18391:2;18380:9;18376:18;18368:26;;18440:9;18434:4;18430:20;18426:1;18415:9;18411:17;18404:47;18468:108;18571:4;18562:6;18468:108;:::i;:::-;18460:116;;18210:373;;;;:::o;18589:652::-;18666:6;18674;18723:2;18711:9;18702:7;18698:23;18694:32;18691:119;;;18729:79;;:::i;:::-;18691:119;18849:1;18874:53;18919:7;18910:6;18899:9;18895:22;18874:53;:::i;:::-;18864:63;;18820:117;19004:2;18993:9;18989:18;18976:32;19035:18;19027:6;19024:30;19021:117;;;19057:79;;:::i;:::-;19021:117;19162:62;19216:7;19207:6;19196:9;19192:22;19162:62;:::i;:::-;19152:72;;18947:287;18589:652;;;;;:::o;19247:619::-;19324:6;19332;19340;19389:2;19377:9;19368:7;19364:23;19360:32;19357:119;;;19395:79;;:::i;:::-;19357:119;19515:1;19540:53;19585:7;19576:6;19565:9;19561:22;19540:53;:::i;:::-;19530:63;;19486:117;19642:2;19668:53;19713:7;19704:6;19693:9;19689:22;19668:53;:::i;:::-;19658:63;;19613:118;19770:2;19796:53;19841:7;19832:6;19821:9;19817:22;19796:53;:::i;:::-;19786:63;;19741:118;19247:619;;;;;:::o;19872:116::-;19942:21;19957:5;19942:21;:::i;:::-;19935:5;19932:32;19922:60;;19978:1;19975;19968:12;19922:60;19872:116;:::o;19994:133::-;20037:5;20075:6;20062:20;20053:29;;20091:30;20115:5;20091:30;:::i;:::-;19994:133;;;;:::o;20133:468::-;20198:6;20206;20255:2;20243:9;20234:7;20230:23;20226:32;20223:119;;;20261:79;;:::i;:::-;20223:119;20381:1;20406:53;20451:7;20442:6;20431:9;20427:22;20406:53;:::i;:::-;20396:63;;20352:117;20508:2;20534:50;20576:7;20567:6;20556:9;20552:22;20534:50;:::i;:::-;20524:60;;20479:115;20133:468;;;;;:::o;20607:943::-;20702:6;20710;20718;20726;20775:3;20763:9;20754:7;20750:23;20746:33;20743:120;;;20782:79;;:::i;:::-;20743:120;20902:1;20927:53;20972:7;20963:6;20952:9;20948:22;20927:53;:::i;:::-;20917:63;;20873:117;21029:2;21055:53;21100:7;21091:6;21080:9;21076:22;21055:53;:::i;:::-;21045:63;;21000:118;21157:2;21183:53;21228:7;21219:6;21208:9;21204:22;21183:53;:::i;:::-;21173:63;;21128:118;21313:2;21302:9;21298:18;21285:32;21344:18;21336:6;21333:30;21330:117;;;21366:79;;:::i;:::-;21330:117;21471:62;21525:7;21516:6;21505:9;21501:22;21471:62;:::i;:::-;21461:72;;21256:287;20607:943;;;;;;;:::o;21628:699::-;21789:4;21784:3;21780:14;21876:4;21869:5;21865:16;21859:23;21895:63;21952:4;21947:3;21943:14;21929:12;21895:63;:::i;:::-;21804:164;22060:4;22053:5;22049:16;22043:23;22079:61;22134:4;22129:3;22125:14;22111:12;22079:61;:::i;:::-;21978:172;22234:4;22227:5;22223:16;22217:23;22253:57;22304:4;22299:3;22295:14;22281:12;22253:57;:::i;:::-;22160:160;21758:569;21628:699;;:::o;22333:350::-;22490:4;22528:2;22517:9;22513:18;22505:26;;22541:135;22673:1;22662:9;22658:17;22649:6;22541:135;:::i;:::-;22333:350;;;;:::o;22689:430::-;22832:4;22870:2;22859:9;22855:18;22847:26;;22883:71;22951:1;22940:9;22936:17;22927:6;22883:71;:::i;:::-;22964:72;23032:2;23021:9;23017:18;23008:6;22964:72;:::i;:::-;23046:66;23108:2;23097:9;23093:18;23084:6;23046:66;:::i;:::-;22689:430;;;;;;:::o;23125:474::-;23193:6;23201;23250:2;23238:9;23229:7;23225:23;23221:32;23218:119;;;23256:79;;:::i;:::-;23218:119;23376:1;23401:53;23446:7;23437:6;23426:9;23422:22;23401:53;:::i;:::-;23391:63;;23347:117;23503:2;23529:53;23574:7;23565:6;23554:9;23550:22;23529:53;:::i;:::-;23519:63;;23474:118;23125:474;;;;;:::o;23605:181::-;23745:33;23741:1;23733:6;23729:14;23722:57;23605:181;:::o;23792:366::-;23934:3;23955:67;24019:2;24014:3;23955:67;:::i;:::-;23948:74;;24031:93;24120:3;24031:93;:::i;:::-;24149:2;24144:3;24140:12;24133:19;;23792:366;;;:::o;24164:419::-;24330:4;24368:2;24357:9;24353:18;24345:26;;24417:9;24411:4;24407:20;24403:1;24392:9;24388:17;24381:47;24445:131;24571:4;24445:131;:::i;:::-;24437:139;;24164:419;;;:::o;24589:177::-;24729:29;24725:1;24717:6;24713:14;24706:53;24589:177;:::o;24772:366::-;24914:3;24935:67;24999:2;24994:3;24935:67;:::i;:::-;24928:74;;25011:93;25100:3;25011:93;:::i;:::-;25129:2;25124:3;25120:12;25113:19;;24772:366;;;:::o;25144:419::-;25310:4;25348:2;25337:9;25333:18;25325:26;;25397:9;25391:4;25387:20;25383:1;25372:9;25368:17;25361:47;25425:131;25551:4;25425:131;:::i;:::-;25417:139;;25144:419;;;:::o;25569:147::-;25670:11;25707:3;25692:18;;25569:147;;;;:::o;25722:114::-;;:::o;25842:398::-;26001:3;26022:83;26103:1;26098:3;26022:83;:::i;:::-;26015:90;;26114:93;26203:3;26114:93;:::i;:::-;26232:1;26227:3;26223:11;26216:18;;25842:398;;;:::o;26246:379::-;26430:3;26452:147;26595:3;26452:147;:::i;:::-;26445:154;;26616:3;26609:10;;26246:379;;;:::o;26631:364::-;26773:3;26794:66;26858:1;26853:3;26794:66;:::i;:::-;26787:73;;26869:93;26958:3;26869:93;:::i;:::-;26987:1;26982:3;26978:11;26971:18;;26631:364;;;:::o;27001:419::-;27167:4;27205:2;27194:9;27190:18;27182:26;;27254:9;27248:4;27244:20;27240:1;27229:9;27225:17;27218:47;27282:131;27408:4;27282:131;:::i;:::-;27274:139;;27001:419;;;:::o;27426:180::-;27474:77;27471:1;27464:88;27571:4;27568:1;27561:15;27595:4;27592:1;27585:15;27612:320;27656:6;27693:1;27687:4;27683:12;27673:22;;27740:1;27734:4;27730:12;27761:18;27751:81;;27817:4;27809:6;27805:17;27795:27;;27751:81;27879:2;27871:6;27868:14;27848:18;27845:38;27842:84;;27898:18;;:::i;:::-;27842:84;27663:269;27612:320;;;:::o;27938:77::-;27975:7;28004:5;27993:16;;27938:77;;;:::o;28021:118::-;28108:24;28126:5;28108:24;:::i;:::-;28103:3;28096:37;28021:118;;:::o;28145:442::-;28294:4;28332:2;28321:9;28317:18;28309:26;;28345:71;28413:1;28402:9;28398:17;28389:6;28345:71;:::i;:::-;28426:72;28494:2;28483:9;28479:18;28470:6;28426:72;:::i;:::-;28508;28576:2;28565:9;28561:18;28552:6;28508:72;:::i;:::-;28145:442;;;;;;:::o;28593:148::-;28695:11;28732:3;28717:18;;28593:148;;;;:::o;28747:214::-;28887:66;28883:1;28875:6;28871:14;28864:90;28747:214;:::o;28967:400::-;29127:3;29148:84;29230:1;29225:3;29148:84;:::i;:::-;29141:91;;29241:93;29330:3;29241:93;:::i;:::-;29359:1;29354:3;29350:11;29343:18;;28967:400;;;:::o;29373:79::-;29412:7;29441:5;29430:16;;29373:79;;;:::o;29458:157::-;29563:45;29583:24;29601:5;29583:24;:::i;:::-;29563:45;:::i;:::-;29558:3;29551:58;29458:157;;:::o;29621:663::-;29862:3;29884:148;30028:3;29884:148;:::i;:::-;29877:155;;30042:75;30113:3;30104:6;30042:75;:::i;:::-;30142:2;30137:3;30133:12;30126:19;;30155:75;30226:3;30217:6;30155:75;:::i;:::-;30255:2;30250:3;30246:12;30239:19;;30275:3;30268:10;;29621:663;;;;;:::o;30290:97::-;30349:6;30377:3;30367:13;;30290:97;;;;:::o;30393:141::-;30442:4;30465:3;30457:11;;30488:3;30485:1;30478:14;30522:4;30519:1;30509:18;30501:26;;30393:141;;;:::o;30540:93::-;30577:6;30624:2;30619;30612:5;30608:14;30604:23;30594:33;;30540:93;;;:::o;30639:107::-;30683:8;30733:5;30727:4;30723:16;30702:37;;30639:107;;;;:::o;30752:393::-;30821:6;30871:1;30859:10;30855:18;30894:97;30924:66;30913:9;30894:97;:::i;:::-;31012:39;31042:8;31031:9;31012:39;:::i;:::-;31000:51;;31084:4;31080:9;31073:5;31069:21;31060:30;;31133:4;31123:8;31119:19;31112:5;31109:30;31099:40;;30828:317;;30752:393;;;;;:::o;31151:60::-;31179:3;31200:5;31193:12;;31151:60;;;:::o;31217:142::-;31267:9;31300:53;31318:34;31327:24;31345:5;31327:24;:::i;:::-;31318:34;:::i;:::-;31300:53;:::i;:::-;31287:66;;31217:142;;;:::o;31365:75::-;31408:3;31429:5;31422:12;;31365:75;;;:::o;31446:269::-;31556:39;31587:7;31556:39;:::i;:::-;31617:91;31666:41;31690:16;31666:41;:::i;:::-;31658:6;31651:4;31645:11;31617:91;:::i;:::-;31611:4;31604:105;31522:193;31446:269;;;:::o;31721:73::-;31766:3;31721:73;:::o;31800:189::-;31877:32;;:::i;:::-;31918:65;31976:6;31968;31962:4;31918:65;:::i;:::-;31853:136;31800:189;;:::o;31995:186::-;32055:120;32072:3;32065:5;32062:14;32055:120;;;32126:39;32163:1;32156:5;32126:39;:::i;:::-;32099:1;32092:5;32088:13;32079:22;;32055:120;;;31995:186;;:::o;32187:543::-;32288:2;32283:3;32280:11;32277:446;;;32322:38;32354:5;32322:38;:::i;:::-;32406:29;32424:10;32406:29;:::i;:::-;32396:8;32392:44;32589:2;32577:10;32574:18;32571:49;;;32610:8;32595:23;;32571:49;32633:80;32689:22;32707:3;32689:22;:::i;:::-;32679:8;32675:37;32662:11;32633:80;:::i;:::-;32292:431;;32277:446;32187:543;;;:::o;32736:117::-;32790:8;32840:5;32834:4;32830:16;32809:37;;32736:117;;;;:::o;32859:169::-;32903:6;32936:51;32984:1;32980:6;32972:5;32969:1;32965:13;32936:51;:::i;:::-;32932:56;33017:4;33011;33007:15;32997:25;;32910:118;32859:169;;;;:::o;33033:295::-;33109:4;33255:29;33280:3;33274:4;33255:29;:::i;:::-;33247:37;;33317:3;33314:1;33310:11;33304:4;33301:21;33293:29;;33033:295;;;;:::o;33333:1403::-;33457:44;33497:3;33492;33457:44;:::i;:::-;33566:18;33558:6;33555:30;33552:56;;;33588:18;;:::i;:::-;33552:56;33632:38;33664:4;33658:11;33632:38;:::i;:::-;33717:67;33777:6;33769;33763:4;33717:67;:::i;:::-;33811:1;33840:2;33832:6;33829:14;33857:1;33852:632;;;;34528:1;34545:6;34542:84;;;34601:9;34596:3;34592:19;34579:33;34570:42;;34542:84;34652:67;34712:6;34705:5;34652:67;:::i;:::-;34646:4;34639:81;34501:229;33822:908;;33852:632;33904:4;33900:9;33892:6;33888:22;33938:37;33970:4;33938:37;:::i;:::-;33997:1;34011:215;34025:7;34022:1;34019:14;34011:215;;;34111:9;34106:3;34102:19;34089:33;34081:6;34074:49;34162:1;34154:6;34150:14;34140:24;;34209:2;34198:9;34194:18;34181:31;;34048:4;34045:1;34041:12;34036:17;;34011:215;;;34254:6;34245:7;34242:19;34239:186;;;34319:9;34314:3;34310:19;34297:33;34362:48;34404:4;34396:6;34392:17;34381:9;34362:48;:::i;:::-;34354:6;34347:64;34262:163;34239:186;34471:1;34467;34459:6;34455:14;34451:22;34445:4;34438:36;33859:625;;;33822:908;;33432:1304;;;33333:1403;;;:::o;34742:171::-;34882:23;34878:1;34870:6;34866:14;34859:47;34742:171;:::o;34919:366::-;35061:3;35082:67;35146:2;35141:3;35082:67;:::i;:::-;35075:74;;35158:93;35247:3;35158:93;:::i;:::-;35276:2;35271:3;35267:12;35260:19;;34919:366;;;:::o;35291:419::-;35457:4;35495:2;35484:9;35480:18;35472:26;;35544:9;35538:4;35534:20;35530:1;35519:9;35515:17;35508:47;35572:131;35698:4;35572:131;:::i;:::-;35564:139;;35291:419;;;:::o;35716:180::-;35764:77;35761:1;35754:88;35861:4;35858:1;35851:15;35885:4;35882:1;35875:15;35902:191;35942:3;35961:20;35979:1;35961:20;:::i;:::-;35956:25;;35995:20;36013:1;35995:20;:::i;:::-;35990:25;;36038:1;36035;36031:9;36024:16;;36059:3;36056:1;36053:10;36050:36;;;36066:18;;:::i;:::-;36050:36;35902:191;;;;:::o;36099:181::-;36239:33;36235:1;36227:6;36223:14;36216:57;36099:181;:::o;36286:366::-;36428:3;36449:67;36513:2;36508:3;36449:67;:::i;:::-;36442:74;;36525:93;36614:3;36525:93;:::i;:::-;36643:2;36638:3;36634:12;36627:19;;36286:366;;;:::o;36658:419::-;36824:4;36862:2;36851:9;36847:18;36839:26;;36911:9;36905:4;36901:20;36897:1;36886:9;36882:17;36875:47;36939:131;37065:4;36939:131;:::i;:::-;36931:139;;36658:419;;;:::o;37083:174::-;37223:26;37219:1;37211:6;37207:14;37200:50;37083:174;:::o;37263:402::-;37423:3;37444:85;37526:2;37521:3;37444:85;:::i;:::-;37437:92;;37538:93;37627:3;37538:93;:::i;:::-;37656:2;37651:3;37647:12;37640:19;;37263:402;;;:::o;37671:390::-;37777:3;37805:39;37838:5;37805:39;:::i;:::-;37860:89;37942:6;37937:3;37860:89;:::i;:::-;37853:96;;37958:65;38016:6;38011:3;38004:4;37997:5;37993:16;37958:65;:::i;:::-;38048:6;38043:3;38039:16;38032:23;;37781:280;37671:390;;;;:::o;38067:174::-;38207:26;38203:1;38195:6;38191:14;38184:50;38067:174;:::o;38247:402::-;38407:3;38428:85;38510:2;38505:3;38428:85;:::i;:::-;38421:92;;38522:93;38611:3;38522:93;:::i;:::-;38640:2;38635:3;38631:12;38624:19;;38247:402;;;:::o;38655:807::-;38989:3;39011:148;39155:3;39011:148;:::i;:::-;39004:155;;39176:95;39267:3;39258:6;39176:95;:::i;:::-;39169:102;;39288:148;39432:3;39288:148;:::i;:::-;39281:155;;39453:3;39446:10;;38655:807;;;;:::o;39468:410::-;39508:7;39531:20;39549:1;39531:20;:::i;:::-;39526:25;;39565:20;39583:1;39565:20;:::i;:::-;39560:25;;39620:1;39617;39613:9;39642:30;39660:11;39642:30;:::i;:::-;39631:41;;39821:1;39812:7;39808:15;39805:1;39802:22;39782:1;39775:9;39755:83;39732:139;;39851:18;;:::i;:::-;39732:139;39516:362;39468:410;;;;:::o;39884:175::-;40024:27;40020:1;40012:6;40008:14;40001:51;39884:175;:::o;40065:402::-;40225:3;40246:85;40328:2;40323:3;40246:85;:::i;:::-;40239:92;;40340:93;40429:3;40340:93;:::i;:::-;40458:2;40453:3;40449:12;40442:19;;40065:402;;;:::o;40473:170::-;40613:22;40609:1;40601:6;40597:14;40590:46;40473:170;:::o;40649:402::-;40809:3;40830:85;40912:2;40907:3;40830:85;:::i;:::-;40823:92;;40924:93;41013:3;40924:93;:::i;:::-;41042:2;41037:3;41033:12;41026:19;;40649:402;;;:::o;41057:807::-;41391:3;41413:148;41557:3;41413:148;:::i;:::-;41406:155;;41578:95;41669:3;41660:6;41578:95;:::i;:::-;41571:102;;41690:148;41834:3;41690:148;:::i;:::-;41683:155;;41855:3;41848:10;;41057:807;;;;:::o;41870:223::-;42010:34;42006:1;41998:6;41994:14;41987:58;42079:6;42074:2;42066:6;42062:15;42055:31;41870:223;:::o;42099:366::-;42241:3;42262:67;42326:2;42321:3;42262:67;:::i;:::-;42255:74;;42338:93;42427:3;42338:93;:::i;:::-;42456:2;42451:3;42447:12;42440:19;;42099:366;;;:::o;42471:419::-;42637:4;42675:2;42664:9;42660:18;42652:26;;42724:9;42718:4;42714:20;42710:1;42699:9;42695:17;42688:47;42752:131;42878:4;42752:131;:::i;:::-;42744:139;;42471:419;;;:::o;42896:180::-;42944:77;42941:1;42934:88;43041:4;43038:1;43031:15;43065:4;43062:1;43055:15;43082:181;43222:33;43218:1;43210:6;43206:14;43199:57;43082:181;:::o;43269:366::-;43411:3;43432:67;43496:2;43491:3;43432:67;:::i;:::-;43425:74;;43508:93;43597:3;43508:93;:::i;:::-;43626:2;43621:3;43617:12;43610:19;;43269:366;;;:::o;43641:419::-;43807:4;43845:2;43834:9;43830:18;43822:26;;43894:9;43888:4;43884:20;43880:1;43869:9;43865:17;43858:47;43922:131;44048:4;43922:131;:::i;:::-;43914:139;;43641:419;;;:::o;44066:178::-;44206:30;44202:1;44194:6;44190:14;44183:54;44066:178;:::o;44250:366::-;44392:3;44413:67;44477:2;44472:3;44413:67;:::i;:::-;44406:74;;44489:93;44578:3;44489:93;:::i;:::-;44607:2;44602:3;44598:12;44591:19;;44250:366;;;:::o;44622:419::-;44788:4;44826:2;44815:9;44811:18;44803:26;;44875:9;44869:4;44865:20;44861:1;44850:9;44846:17;44839:47;44903:131;45029:4;44903:131;:::i;:::-;44895:139;;44622:419;;;:::o;45047:177::-;45187:29;45183:1;45175:6;45171:14;45164:53;45047:177;:::o;45230:366::-;45372:3;45393:67;45457:2;45452:3;45393:67;:::i;:::-;45386:74;;45469:93;45558:3;45469:93;:::i;:::-;45587:2;45582:3;45578:12;45571:19;;45230:366;;;:::o;45602:419::-;45768:4;45806:2;45795:9;45791:18;45783:26;;45855:9;45849:4;45845:20;45841:1;45830:9;45826:17;45819:47;45883:131;46009:4;45883:131;:::i;:::-;45875:139;;45602:419;;;:::o;46027:194::-;46067:4;46087:20;46105:1;46087:20;:::i;:::-;46082:25;;46121:20;46139:1;46121:20;:::i;:::-;46116:25;;46165:1;46162;46158:9;46150:17;;46189:1;46183:4;46180:11;46177:37;;;46194:18;;:::i;:::-;46177:37;46027:194;;;;:::o;46227:435::-;46407:3;46429:95;46520:3;46511:6;46429:95;:::i;:::-;46422:102;;46541:95;46632:3;46623:6;46541:95;:::i;:::-;46534:102;;46653:3;46646:10;;46227:435;;;;;:::o;46668:225::-;46808:34;46804:1;46796:6;46792:14;46785:58;46877:8;46872:2;46864:6;46860:15;46853:33;46668:225;:::o;46899:366::-;47041:3;47062:67;47126:2;47121:3;47062:67;:::i;:::-;47055:74;;47138:93;47227:3;47138:93;:::i;:::-;47256:2;47251:3;47247:12;47240:19;;46899:366;;;:::o;47271:419::-;47437:4;47475:2;47464:9;47460:18;47452:26;;47524:9;47518:4;47514:20;47510:1;47499:9;47495:17;47488:47;47552:131;47678:4;47552:131;:::i;:::-;47544:139;;47271:419;;;:::o;47696:182::-;47836:34;47832:1;47824:6;47820:14;47813:58;47696:182;:::o;47884:366::-;48026:3;48047:67;48111:2;48106:3;48047:67;:::i;:::-;48040:74;;48123:93;48212:3;48123:93;:::i;:::-;48241:2;48236:3;48232:12;48225:19;;47884:366;;;:::o;48256:419::-;48422:4;48460:2;48449:9;48445:18;48437:26;;48509:9;48503:4;48499:20;48495:1;48484:9;48480:17;48473:47;48537:131;48663:4;48537:131;:::i;:::-;48529:139;;48256:419;;;:::o;48681:233::-;48720:3;48743:24;48761:5;48743:24;:::i;:::-;48734:33;;48789:66;48782:5;48779:77;48776:103;;48859:18;;:::i;:::-;48776:103;48906:1;48899:5;48895:13;48888:20;;48681:233;;;:::o;48920:180::-;48968:77;48965:1;48958:88;49065:4;49062:1;49055:15;49089:4;49086:1;49079:15;49106:185;49146:1;49163:20;49181:1;49163:20;:::i;:::-;49158:25;;49197:20;49215:1;49197:20;:::i;:::-;49192:25;;49236:1;49226:35;;49241:18;;:::i;:::-;49226:35;49283:1;49280;49276:9;49271:14;;49106:185;;;;:::o;49297:176::-;49329:1;49346:20;49364:1;49346:20;:::i;:::-;49341:25;;49380:20;49398:1;49380:20;:::i;:::-;49375:25;;49419:1;49409:35;;49424:18;;:::i;:::-;49409:35;49465:1;49462;49458:9;49453:14;;49297:176;;;;:::o;49479:98::-;49530:6;49564:5;49558:12;49548:22;;49479:98;;;:::o;49583:168::-;49666:11;49700:6;49695:3;49688:19;49740:4;49735:3;49731:14;49716:29;;49583:168;;;;:::o;49757:373::-;49843:3;49871:38;49903:5;49871:38;:::i;:::-;49925:70;49988:6;49983:3;49925:70;:::i;:::-;49918:77;;50004:65;50062:6;50057:3;50050:4;50043:5;50039:16;50004:65;:::i;:::-;50094:29;50116:6;50094:29;:::i;:::-;50089:3;50085:39;50078:46;;49847:283;49757:373;;;;:::o;50136:640::-;50331:4;50369:3;50358:9;50354:19;50346:27;;50383:71;50451:1;50440:9;50436:17;50427:6;50383:71;:::i;:::-;50464:72;50532:2;50521:9;50517:18;50508:6;50464:72;:::i;:::-;50546;50614:2;50603:9;50599:18;50590:6;50546:72;:::i;:::-;50665:9;50659:4;50655:20;50650:2;50639:9;50635:18;50628:48;50693:76;50764:4;50755:6;50693:76;:::i;:::-;50685:84;;50136:640;;;;;;;:::o;50782:141::-;50838:5;50869:6;50863:13;50854:22;;50885:32;50911:5;50885:32;:::i;:::-;50782:141;;;;:::o;50929:349::-;50998:6;51047:2;51035:9;51026:7;51022:23;51018:32;51015:119;;;51053:79;;:::i;:::-;51015:119;51173:1;51198:63;51253:7;51244:6;51233:9;51229:22;51198:63;:::i;:::-;51188:73;;51144:127;50929:349;;;;:::o;51284:180::-;51332:77;51329:1;51322:88;51429:4;51426:1;51419:15;51453:4;51450:1;51443:15;51470:174;51610:26;51606:1;51598:6;51594:14;51587:50;51470:174;:::o;51650:366::-;51792:3;51813:67;51877:2;51872:3;51813:67;:::i;:::-;51806:74;;51889:93;51978:3;51889:93;:::i;:::-;52007:2;52002:3;51998:12;51991:19;;51650:366;;;:::o;52022:419::-;52188:4;52226:2;52215:9;52211:18;52203:26;;52275:9;52269:4;52265:20;52261:1;52250:9;52246:17;52239:47;52303:131;52429:4;52303:131;:::i;:::-;52295:139;;52022:419;;;:::o;52447:181::-;52587:33;52583:1;52575:6;52571:14;52564:57;52447:181;:::o;52634:366::-;52776:3;52797:67;52861:2;52856:3;52797:67;:::i;:::-;52790:74;;52873:93;52962:3;52873:93;:::i;:::-;52991:2;52986:3;52982:12;52975:19;;52634:366;;;:::o;53006:419::-;53172:4;53210:2;53199:9;53195:18;53187:26;;53259:9;53253:4;53249:20;53245:1;53234:9;53230:17;53223:47;53287:131;53413:4;53287:131;:::i;:::-;53279:139;;53006:419;;;:::o;53431:221::-;53571:34;53567:1;53559:6;53555:14;53548:58;53640:4;53635:2;53627:6;53623:15;53616:29;53431:221;:::o;53658:366::-;53800:3;53821:67;53885:2;53880:3;53821:67;:::i;:::-;53814:74;;53897:93;53986:3;53897:93;:::i;:::-;54015:2;54010:3;54006:12;53999:19;;53658:366;;;:::o;54030:419::-;54196:4;54234:2;54223:9;54219:18;54211:26;;54283:9;54277:4;54273:20;54269:1;54258:9;54254:17;54247:47;54311:131;54437:4;54311:131;:::i;:::-;54303:139;;54030:419;;;:::o;54455:221::-;54595:34;54591:1;54583:6;54579:14;54572:58;54664:4;54659:2;54651:6;54647:15;54640:29;54455:221;:::o;54682:366::-;54824:3;54845:67;54909:2;54904:3;54845:67;:::i;:::-;54838:74;;54921:93;55010:3;54921:93;:::i;:::-;55039:2;55034:3;55030:12;55023:19;;54682:366;;;:::o;55054:419::-;55220:4;55258:2;55247:9;55243:18;55235:26;;55307:9;55301:4;55297:20;55293:1;55282:9;55278:17;55271:47;55335:131;55461:4;55335:131;:::i;:::-;55327:139;;55054:419;;;:::o;55479:86::-;55514:7;55554:4;55547:5;55543:16;55532:27;;55479:86;;;:::o;55571:112::-;55654:22;55670:5;55654:22;:::i;:::-;55649:3;55642:35;55571:112;;:::o;55689:545::-;55862:4;55900:3;55889:9;55885:19;55877:27;;55914:71;55982:1;55971:9;55967:17;55958:6;55914:71;:::i;:::-;55995:68;56059:2;56048:9;56044:18;56035:6;55995:68;:::i;:::-;56073:72;56141:2;56130:9;56126:18;56117:6;56073:72;:::i;:::-;56155;56223:2;56212:9;56208:18;56199:6;56155:72;:::i;:::-;55689:545;;;;;;;:::o

Swarm Source

ipfs://9ca3371653b2407c63419c24edbfbbcf0c6bef6abece15efdbc57a5afbd822e7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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