ETH Price: $3,831.99 (-0.44%)

Token

E.R.V Gandalf (GANDALF)
 

Overview

Max Total Supply

2,089 GANDALF

Holders

1,948

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
198707.eth
Balance
1 GANDALF
0xa85821c91f16285173d3b3da59605afce29b227b
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:
ERVGandalf

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    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"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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"
            );
    }

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

    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

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

    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) 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

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

library SafeMath {
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library Counters {
    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

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

    // Compiler will pack the following
    // _currentIndex and _burnCounter into a single 256bit word.

    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex = 1;

    // The number of tokens burned.
    uint128 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_;
    }

    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter -1;
        }
    }

    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            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();
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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()))
                : "";
    }

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

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();

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

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) 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 > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 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;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (
                    safe &&
                    !_checkOnERC721Received(address(0), to, updatedIndex, _data)
                ) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract ERVGandalf is ERC721A, ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdTracker;
    uint256 public MAX_ELEMENTS = 2930;
    uint256 public PRICE = 88 * 10**14; //0.0088 Ether
    uint256 public SALE_START = 1658037600 ; // July 17, 2022 06:00:00 UTC

    bool public isPaused = false;

    string public baseTokenURI;

    mapping(address => bool) _freeClaimed;

    event CreateERVGandalfNFT(uint256 indexed id);

    constructor(string memory baseURI) ERC721A("E.R.V Gandalf", "GANDALF") {
        baseTokenURI = baseURI;
        transferOwnership(address(0xC307b94288d569E9Bbf75a17EB684E5325D646e2));
        _tokenIdTracker.increment();
    }

    function mint(uint256 _count) public payable {
        uint256 total = totalSupply();
        require(SALE_START < block.timestamp, "Minting not started");
        require(!isPaused, "Sale is Paused.");
        require(total + _count <= MAX_ELEMENTS, "Max limit");
        require(total <= MAX_ELEMENTS, "All NFT's are sold out");
        if(_freeClaimed[_msgSender()]){
            require(msg.value >= salePrice(_count), "Value below price");
        }else{
            require(_count == 1, "Can not mint more than 1 free NFT");
            _freeClaimed[_msgSender()] = true;
        }
        _safeMint(_msgSender(), _count);
        emit CreateERVGandalfNFT(_count);
        _withdraw(owner(), address(this).balance);
    }

    function isFreeClaimed(address _sender) public view returns(bool){
        return _freeClaimed[_sender];
    }

    function salePrice(uint256 _count) public view returns (uint256) {
        return PRICE.mul(_count);
    }

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        uint256 metaId = tokenId;
        string memory uriSuffix = ".json";
        string memory currentBaseURI = _baseURI();

        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        Strings.toString(metaId),
                        uriSuffix
                    )
                )
                : "";
    }

    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokensId;
    }

    function setMaxElements(uint256 _maxElements) external onlyOwner {
        MAX_ELEMENTS = _maxElements;
    }

    function pauseMinting() external onlyOwner {
        isPaused = true;
    }

    function resumeMinting() external onlyOwner {
        isPaused = false;
    }

    function setSalePrice(uint256 _price) external onlyOwner {
        PRICE = _price;
    }

    function setSaleStart(uint256 _time) external onlyOwner {
        SALE_START = _time;
    }
    
    function withdrawAll() external nonReentrant onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _withdraw(owner(), balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        payable(_address).transfer(_amount);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CreateERVGandalfNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"isFreeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","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":"pauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeMinting","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":"uint256","name":"_count","type":"uint256"}],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_maxElements","type":"uint256"}],"name":"setMaxElements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260016000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610b72600a55661f438daa060000600b556362d3a560600c556000600d60006101000a81548160ff0219169083151502179055503480156200007e57600080fd5b5060405162004a2638038062004a268339818101604052810190620000a4919062000639565b6040518060400160405280600d81526020017f452e522e562047616e64616c66000000000000000000000000000000000000008152506040518060400160405280600781526020017f47414e44414c4600000000000000000000000000000000000000000000000000815250816001908051906020019062000128929190620003ec565b50806002908051906020019062000141929190620003ec565b50505060016007819055506200016c62000160620001c860201b60201c565b620001d060201b60201c565b80600e908051906020019062000184929190620003ec565b50620001aa73c307b94288d569e9bbf75a17eb684e5325d646e26200029660201b60201c565b620001c16009620003ac60201b62001f071760201c565b506200080a565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a6620001c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002cc620003c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000325576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031c90620006eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038f9062000783565b60405180910390fd5b620003a981620001d060201b60201c565b50565b6001816000016000828254019250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003fa90620007d4565b90600052602060002090601f0160209004810192826200041e57600085556200046a565b82601f106200043957805160ff19168380011785556200046a565b828001600101855582156200046a579182015b82811115620004695782518255916020019190600101906200044c565b5b5090506200047991906200047d565b5090565b5b80821115620004985760008160009055506001016200047e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050582620004ba565b810181811067ffffffffffffffff82111715620005275762000526620004cb565b5b80604052505050565b60006200053c6200049c565b90506200054a8282620004fa565b919050565b600067ffffffffffffffff8211156200056d576200056c620004cb565b5b6200057882620004ba565b9050602081019050919050565b60005b83811015620005a557808201518184015260208101905062000588565b83811115620005b5576000848401525b50505050565b6000620005d2620005cc846200054f565b62000530565b905082815260208101848484011115620005f157620005f0620004b5565b5b620005fe84828562000585565b509392505050565b600082601f8301126200061e576200061d620004b0565b5b815162000630848260208601620005bb565b91505092915050565b600060208284031215620006525762000651620004a6565b5b600082015167ffffffffffffffff811115620006735762000672620004ab565b5b620006818482850162000606565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006d36020836200068a565b9150620006e0826200069b565b602082019050919050565b600060208201905081810360008301526200070681620006c4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200076b6026836200068a565b915062000778826200070d565b604082019050919050565b600060208201905081810360008301526200079e816200075c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ed57607f821691505b60208210811415620008045762000803620007a5565b5b50919050565b61420c806200081a6000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063ab36e64d116100a0578063d547cfb71161006f578063d547cfb714610758578063da8fbf2a14610783578063e985e9c51461079a578063edf85f51146107d7578063f2fde38b1461081457610204565b8063ab36e64d1461068a578063b187bd26146106c7578063b88d4fde146106f2578063c87b56dd1461071b57610204565b80638d859f3e116100e75780638d859f3e146105c45780638da5cb5b146105ef57806395d89b411461061a578063a0712d6814610645578063a22cb4651461066157610204565b806370a0823114610530578063715018a61461056d57806371f9f20014610584578063853828b6146105ad57610204565b80632f181f541161019b578063438b63001161016a578063438b6300146104395780634f6ccce71461047657806355f804b3146104b357806359ae340e146104dc5780636352211e146104f357610204565b80632f181f541461037f5780632f745c59146103a85780633502a716146103e557806342842e0e1461041057610204565b806318160ddd116101d757806318160ddd146102d75780631919fed714610302578063226730301461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061323e565b61083d565b60405161023d9190613286565b60405180910390f35b34801561025257600080fd5b5061025b610987565b604051610268919061333a565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613392565b610a19565b6040516102a59190613400565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613447565b610a95565b005b3480156102e357600080fd5b506102ec610ba0565b6040516102f99190613496565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613392565b610bf9565b005b34801561033757600080fd5b50610340610c7f565b60405161034d9190613496565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906134b1565b610c85565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613392565b610c95565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613447565b610d1b565b6040516103dc9190613496565b60405180910390f35b3480156103f157600080fd5b506103fa610f22565b6040516104079190613496565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906134b1565b610f28565b005b34801561044557600080fd5b50610460600480360381019061045b9190613504565b610f48565b60405161046d91906135ef565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613392565b610ff6565b6040516104aa9190613496565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613746565b611167565b005b3480156104e857600080fd5b506104f16111fd565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613392565b611296565b6040516105279190613400565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613504565b6112ac565b6040516105649190613496565b60405180910390f35b34801561057957600080fd5b5061058261137c565b005b34801561059057600080fd5b506105ab60048036038101906105a69190613392565b611404565b005b3480156105b957600080fd5b506105c261148a565b005b3480156105d057600080fd5b506105d9611582565b6040516105e69190613496565b60405180910390f35b3480156105fb57600080fd5b50610604611588565b6040516106119190613400565b60405180910390f35b34801561062657600080fd5b5061062f6115b2565b60405161063c919061333a565b60405180910390f35b61065f600480360381019061065a9190613392565b611644565b005b34801561066d57600080fd5b50610688600480360381019061068391906137bb565b611918565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613504565b611a90565b6040516106be9190613286565b60405180910390f35b3480156106d357600080fd5b506106dc611ae6565b6040516106e99190613286565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061389c565b611af9565b005b34801561072757600080fd5b50610742600480360381019061073d9190613392565b611b4c565b60405161074f919061333a565b60405180910390f35b34801561076457600080fd5b5061076d611c36565b60405161077a919061333a565b60405180910390f35b34801561078f57600080fd5b50610798611cc4565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061391f565b611d5d565b6040516107ce9190613286565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613392565b611df1565b60405161080b9190613496565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613504565b611e0f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610980575061097f82611f1d565b5b9050919050565b6060600180546109969061398e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c29061398e565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050905090565b6000610a2482611f87565b610a5a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa082611296565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b08576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b27611fef565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b595750610b5781610b52611fef565b611d5d565b155b15610b90576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b9b838383611ff7565b505050565b60006001600060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff1603036fffffffffffffffffffffffffffffffff16905090565b610c01611fef565b73ffffffffffffffffffffffffffffffffffffffff16610c1f611588565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90613a0c565b60405180910390fd5b80600b8190555050565b600c5481565b610c908383836120a9565b505050565b610c9d611fef565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611588565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613a0c565b60405180910390fd5b80600c8190555050565b6000610d26836112ac565b8210610d5e576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f16576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e755750610f09565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eb557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f075786841415610efe578195505050505050610f1c565b83806001019450505b505b8080600101915050610d98565b50600080fd5b92915050565b600a5481565b610f4383838360405180602001604052806000815250611af9565b505050565b60606000610f55836112ac565b905060008167ffffffffffffffff811115610f7357610f7261361b565b5b604051908082528060200260200182016040528015610fa15781602001602082028036833780820191505090505b50905060005b82811015610feb57610fb98582610d1b565b828281518110610fcc57610fcb613a2c565b5b6020026020010181815250508080610fe390613a8a565b915050610fa7565b508092505050919050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561112f576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161112157858314156111185781945050505050611162565b82806001019350505b50808060010191505061102e565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61116f611fef565b73ffffffffffffffffffffffffffffffffffffffff1661118d611588565b73ffffffffffffffffffffffffffffffffffffffff16146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613a0c565b60405180910390fd5b80600e90805190602001906111f99291906130ec565b5050565b611205611fef565b73ffffffffffffffffffffffffffffffffffffffff16611223611588565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613a0c565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b60006112a1826125c6565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611314576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611384611fef565b73ffffffffffffffffffffffffffffffffffffffff166113a2611588565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef90613a0c565b60405180910390fd5b611402600061286e565b565b61140c611fef565b73ffffffffffffffffffffffffffffffffffffffff1661142a611588565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613a0c565b60405180910390fd5b80600a8190555050565b600260075414156114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613b1f565b60405180910390fd5b60026007819055506114e0611fef565b73ffffffffffffffffffffffffffffffffffffffff166114fe611588565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90613a0c565b60405180910390fd5b60004790506000811161156657600080fd5b611577611571611588565b82612934565b506001600781905550565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115c19061398e565b80601f01602080910402602001604051908101604052809291908181526020018280546115ed9061398e565b801561163a5780601f1061160f5761010080835404028352916020019161163a565b820191906000526020600020905b81548152906001019060200180831161161d57829003601f168201915b5050505050905090565b600061164e610ba0565b905042600c5410611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613b8b565b60405180910390fd5b600d60009054906101000a900460ff16156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613bf7565b60405180910390fd5b600a5482826116f39190613c17565b1115611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90613cb9565b60405180910390fd5b600a54811115611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090613d25565b60405180910390fd5b600f6000611785611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611822576117db82611df1565b34101561181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490613d91565b60405180910390fd5b6118c5565b60018214611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613e23565b60405180910390fd5b6001600f6000611873611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6118d66118d0611fef565b8361297f565b817fe483ef4918fdf00e7726ca925d7097b0649a80eb05e69b04f4677a303500490160405160405180910390a261191461190e611588565b47612934565b5050565b611920611fef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611985576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611992611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3f611fef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a849190613286565b60405180910390a35050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d60009054906101000a900460ff1681565b611b048484846120a9565b611b108484848461299d565b611b46576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611b5782611f87565b611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90613eb5565b60405180910390fd5b600082905060006040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525090506000611bdf612b1c565b90506000815111611bff5760405180602001604052806000815250611c2c565b80611c0984612bae565b83604051602001611c1c93929190613f11565b6040516020818303038152906040525b9350505050919050565b600e8054611c439061398e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6f9061398e565b8015611cbc5780601f10611c9157610100808354040283529160200191611cbc565b820191906000526020600020905b815481529060010190602001808311611c9f57829003601f168201915b505050505081565b611ccc611fef565b73ffffffffffffffffffffffffffffffffffffffff16611cea611588565b73ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613a0c565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611e0882600b54612d0f90919063ffffffff16565b9050919050565b611e17611fef565b73ffffffffffffffffffffffffffffffffffffffff16611e35611588565b73ffffffffffffffffffffffffffffffffffffffff1614611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290613a0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290613fb4565b60405180910390fd5b611f048161286e565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611fe8575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120b4826125c6565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120db611fef565b73ffffffffffffffffffffffffffffffffffffffff16148061210e575061210d8260000151612108611fef565b611d5d565b5b80612153575061211c611fef565b73ffffffffffffffffffffffffffffffffffffffff1661213b84610a19565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061218c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121f5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561225c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122698585856001612d25565b6122796000848460000151611ff7565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125565760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156125555782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf8585856001612d2b565b5050505050565b6125ce613172565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612837576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161283557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612719578092505050612869565b5b60011561283457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461282f578092505050612869565b61271a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561297a573d6000803e3d6000fd5b505050565b612999828260405180602001604052806000815250612d31565b5050565b60006129be8473ffffffffffffffffffffffffffffffffffffffff16612d43565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e7611fef565b8786866040518563ffffffff1660e01b8152600401612a099493929190614029565b6020604051808303816000875af1925050508015612a4557506040513d601f19601f82011682018060405250810190612a42919061408a565b60015b612abf573d8060008114612a75576040519150601f19603f3d011682016040523d82523d6000602084013e612a7a565b606091505b50600081511415612ab7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b6060600e8054612b2b9061398e565b80601f0160208091040260200160405190810160405280929190818152602001828054612b579061398e565b8015612ba45780601f10612b7957610100808354040283529160200191612ba4565b820191906000526020600020905b815481529060010190602001808311612b8757829003601f168201915b5050505050905090565b60606000821415612bf6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d0a565b600082905060005b60008214612c28578080612c1190613a8a565b915050600a82612c2191906140e6565b9150612bfe565b60008167ffffffffffffffff811115612c4457612c4361361b565b5b6040519080825280601f01601f191660200182016040528015612c765781602001600182028036833780820191505090505b5090505b60008514612d0357600182612c8f9190614117565b9150600a85612c9e919061414b565b6030612caa9190613c17565b60f81b818381518110612cc057612cbf613a2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cfc91906140e6565b9450612c7a565b8093505050505b919050565b60008183612d1d919061417c565b905092915050565b50505050565b50505050565b612d3e8383836001612d56565b505050565b600080823b905060008111915050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612df1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612e2c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e396000868387612d25565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561309e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156130525750613050600088848861299d565b155b15613089576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612fd7565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506130e56000868387612d2b565b5050505050565b8280546130f89061398e565b90600052602060002090601f01602090048101928261311a5760008555613161565b82601f1061313357805160ff1916838001178555613161565b82800160010185558215613161579182015b82811115613160578251825591602001919060010190613145565b5b50905061316e91906131b5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156131ce5760008160009055506001016131b6565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61321b816131e6565b811461322657600080fd5b50565b60008135905061323881613212565b92915050565b600060208284031215613254576132536131dc565b5b600061326284828501613229565b91505092915050565b60008115159050919050565b6132808161326b565b82525050565b600060208201905061329b6000830184613277565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132db5780820151818401526020810190506132c0565b838111156132ea576000848401525b50505050565b6000601f19601f8301169050919050565b600061330c826132a1565b61331681856132ac565b93506133268185602086016132bd565b61332f816132f0565b840191505092915050565b600060208201905081810360008301526133548184613301565b905092915050565b6000819050919050565b61336f8161335c565b811461337a57600080fd5b50565b60008135905061338c81613366565b92915050565b6000602082840312156133a8576133a76131dc565b5b60006133b68482850161337d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133ea826133bf565b9050919050565b6133fa816133df565b82525050565b600060208201905061341560008301846133f1565b92915050565b613424816133df565b811461342f57600080fd5b50565b6000813590506134418161341b565b92915050565b6000806040838503121561345e5761345d6131dc565b5b600061346c85828601613432565b925050602061347d8582860161337d565b9150509250929050565b6134908161335c565b82525050565b60006020820190506134ab6000830184613487565b92915050565b6000806000606084860312156134ca576134c96131dc565b5b60006134d886828701613432565b93505060206134e986828701613432565b92505060406134fa8682870161337d565b9150509250925092565b60006020828403121561351a576135196131dc565b5b600061352884828501613432565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135668161335c565b82525050565b6000613578838361355d565b60208301905092915050565b6000602082019050919050565b600061359c82613531565b6135a6818561353c565b93506135b18361354d565b8060005b838110156135e25781516135c9888261356c565b97506135d483613584565b9250506001810190506135b5565b5085935050505092915050565b600060208201905081810360008301526136098184613591565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613653826132f0565b810181811067ffffffffffffffff821117156136725761367161361b565b5b80604052505050565b60006136856131d2565b9050613691828261364a565b919050565b600067ffffffffffffffff8211156136b1576136b061361b565b5b6136ba826132f0565b9050602081019050919050565b82818337600083830152505050565b60006136e96136e484613696565b61367b565b90508281526020810184848401111561370557613704613616565b5b6137108482856136c7565b509392505050565b600082601f83011261372d5761372c613611565b5b813561373d8482602086016136d6565b91505092915050565b60006020828403121561375c5761375b6131dc565b5b600082013567ffffffffffffffff81111561377a576137796131e1565b5b61378684828501613718565b91505092915050565b6137988161326b565b81146137a357600080fd5b50565b6000813590506137b58161378f565b92915050565b600080604083850312156137d2576137d16131dc565b5b60006137e085828601613432565b92505060206137f1858286016137a6565b9150509250929050565b600067ffffffffffffffff8211156138165761381561361b565b5b61381f826132f0565b9050602081019050919050565b600061383f61383a846137fb565b61367b565b90508281526020810184848401111561385b5761385a613616565b5b6138668482856136c7565b509392505050565b600082601f83011261388357613882613611565b5b813561389384826020860161382c565b91505092915050565b600080600080608085870312156138b6576138b56131dc565b5b60006138c487828801613432565b94505060206138d587828801613432565b93505060406138e68782880161337d565b925050606085013567ffffffffffffffff811115613907576139066131e1565b5b6139138782880161386e565b91505092959194509250565b60008060408385031215613936576139356131dc565b5b600061394485828601613432565b925050602061395585828601613432565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139a657607f821691505b602082108114156139ba576139b961395f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139f66020836132ac565b9150613a01826139c0565b602082019050919050565b60006020820190508181036000830152613a25816139e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a958261335c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ac857613ac7613a5b565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b09601f836132ac565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f4d696e74696e67206e6f74207374617274656400000000000000000000000000600082015250565b6000613b756013836132ac565b9150613b8082613b3f565b602082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b7f53616c65206973205061757365642e0000000000000000000000000000000000600082015250565b6000613be1600f836132ac565b9150613bec82613bab565b602082019050919050565b60006020820190508181036000830152613c1081613bd4565b9050919050565b6000613c228261335c565b9150613c2d8361335c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6257613c61613a5b565b5b828201905092915050565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b6000613ca36009836132ac565b9150613cae82613c6d565b602082019050919050565b60006020820190508181036000830152613cd281613c96565b9050919050565b7f416c6c204e465427732061726520736f6c64206f757400000000000000000000600082015250565b6000613d0f6016836132ac565b9150613d1a82613cd9565b602082019050919050565b60006020820190508181036000830152613d3e81613d02565b9050919050565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b6000613d7b6011836132ac565b9150613d8682613d45565b602082019050919050565b60006020820190508181036000830152613daa81613d6e565b9050919050565b7f43616e206e6f74206d696e74206d6f7265207468616e20312066726565204e4660008201527f5400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0d6021836132ac565b9150613e1882613db1565b604082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e9f602f836132ac565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b600081905092915050565b6000613eeb826132a1565b613ef58185613ed5565b9350613f058185602086016132bd565b80840191505092915050565b6000613f1d8286613ee0565b9150613f298285613ee0565b9150613f358284613ee0565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f9e6026836132ac565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ffb82613fd4565b6140058185613fdf565b93506140158185602086016132bd565b61401e816132f0565b840191505092915050565b600060808201905061403e60008301876133f1565b61404b60208301866133f1565b6140586040830185613487565b818103606083015261406a8184613ff0565b905095945050505050565b60008151905061408481613212565b92915050565b6000602082840312156140a05761409f6131dc565b5b60006140ae84828501614075565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140f18261335c565b91506140fc8361335c565b92508261410c5761410b6140b7565b5b828204905092915050565b60006141228261335c565b915061412d8361335c565b9250828210156141405761413f613a5b565b5b828203905092915050565b60006141568261335c565b91506141618361335c565b925082614171576141706140b7565b5b828206905092915050565b60006141878261335c565b91506141928361335c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cb576141ca613a5b565b5b82820290509291505056fea26469706673582212208e5cafd511db4eb94fee59a5f0d8499a8994d07e35acb8f8c45040949787ded864736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696264756a70643462636377796b6268787a6c7036686636657174656d616d367163796c6262766477656a643466357132766b33752f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a0823111610118578063ab36e64d116100a0578063d547cfb71161006f578063d547cfb714610758578063da8fbf2a14610783578063e985e9c51461079a578063edf85f51146107d7578063f2fde38b1461081457610204565b8063ab36e64d1461068a578063b187bd26146106c7578063b88d4fde146106f2578063c87b56dd1461071b57610204565b80638d859f3e116100e75780638d859f3e146105c45780638da5cb5b146105ef57806395d89b411461061a578063a0712d6814610645578063a22cb4651461066157610204565b806370a0823114610530578063715018a61461056d57806371f9f20014610584578063853828b6146105ad57610204565b80632f181f541161019b578063438b63001161016a578063438b6300146104395780634f6ccce71461047657806355f804b3146104b357806359ae340e146104dc5780636352211e146104f357610204565b80632f181f541461037f5780632f745c59146103a85780633502a716146103e557806342842e0e1461041057610204565b806318160ddd116101d757806318160ddd146102d75780631919fed714610302578063226730301461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061323e565b61083d565b60405161023d9190613286565b60405180910390f35b34801561025257600080fd5b5061025b610987565b604051610268919061333a565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613392565b610a19565b6040516102a59190613400565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613447565b610a95565b005b3480156102e357600080fd5b506102ec610ba0565b6040516102f99190613496565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613392565b610bf9565b005b34801561033757600080fd5b50610340610c7f565b60405161034d9190613496565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906134b1565b610c85565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613392565b610c95565b005b3480156103b457600080fd5b506103cf60048036038101906103ca9190613447565b610d1b565b6040516103dc9190613496565b60405180910390f35b3480156103f157600080fd5b506103fa610f22565b6040516104079190613496565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906134b1565b610f28565b005b34801561044557600080fd5b50610460600480360381019061045b9190613504565b610f48565b60405161046d91906135ef565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613392565b610ff6565b6040516104aa9190613496565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190613746565b611167565b005b3480156104e857600080fd5b506104f16111fd565b005b3480156104ff57600080fd5b5061051a60048036038101906105159190613392565b611296565b6040516105279190613400565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613504565b6112ac565b6040516105649190613496565b60405180910390f35b34801561057957600080fd5b5061058261137c565b005b34801561059057600080fd5b506105ab60048036038101906105a69190613392565b611404565b005b3480156105b957600080fd5b506105c261148a565b005b3480156105d057600080fd5b506105d9611582565b6040516105e69190613496565b60405180910390f35b3480156105fb57600080fd5b50610604611588565b6040516106119190613400565b60405180910390f35b34801561062657600080fd5b5061062f6115b2565b60405161063c919061333a565b60405180910390f35b61065f600480360381019061065a9190613392565b611644565b005b34801561066d57600080fd5b50610688600480360381019061068391906137bb565b611918565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613504565b611a90565b6040516106be9190613286565b60405180910390f35b3480156106d357600080fd5b506106dc611ae6565b6040516106e99190613286565b60405180910390f35b3480156106fe57600080fd5b506107196004803603810190610714919061389c565b611af9565b005b34801561072757600080fd5b50610742600480360381019061073d9190613392565b611b4c565b60405161074f919061333a565b60405180910390f35b34801561076457600080fd5b5061076d611c36565b60405161077a919061333a565b60405180910390f35b34801561078f57600080fd5b50610798611cc4565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061391f565b611d5d565b6040516107ce9190613286565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190613392565b611df1565b60405161080b9190613496565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613504565b611e0f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610980575061097f82611f1d565b5b9050919050565b6060600180546109969061398e565b80601f01602080910402602001604051908101604052809291908181526020018280546109c29061398e565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050905090565b6000610a2482611f87565b610a5a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa082611296565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b08576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b27611fef565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b595750610b5781610b52611fef565b611d5d565b155b15610b90576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b9b838383611ff7565b505050565b60006001600060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff1603036fffffffffffffffffffffffffffffffff16905090565b610c01611fef565b73ffffffffffffffffffffffffffffffffffffffff16610c1f611588565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c90613a0c565b60405180910390fd5b80600b8190555050565b600c5481565b610c908383836120a9565b505050565b610c9d611fef565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611588565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613a0c565b60405180910390fd5b80600c8190555050565b6000610d26836112ac565b8210610d5e576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610f16576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610e755750610f09565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eb557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f075786841415610efe578195505050505050610f1c565b83806001019450505b505b8080600101915050610d98565b50600080fd5b92915050565b600a5481565b610f4383838360405180602001604052806000815250611af9565b505050565b60606000610f55836112ac565b905060008167ffffffffffffffff811115610f7357610f7261361b565b5b604051908082528060200260200182016040528015610fa15781602001602082028036833780820191505090505b50905060005b82811015610feb57610fb98582610d1b565b828281518110610fcc57610fcb613a2c565b5b6020026020010181815250508080610fe390613a8a565b915050610fa7565b508092505050919050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561112f576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161112157858314156111185781945050505050611162565b82806001019350505b50808060010191505061102e565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61116f611fef565b73ffffffffffffffffffffffffffffffffffffffff1661118d611588565b73ffffffffffffffffffffffffffffffffffffffff16146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613a0c565b60405180910390fd5b80600e90805190602001906111f99291906130ec565b5050565b611205611fef565b73ffffffffffffffffffffffffffffffffffffffff16611223611588565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613a0c565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b60006112a1826125c6565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611314576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611384611fef565b73ffffffffffffffffffffffffffffffffffffffff166113a2611588565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef90613a0c565b60405180910390fd5b611402600061286e565b565b61140c611fef565b73ffffffffffffffffffffffffffffffffffffffff1661142a611588565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613a0c565b60405180910390fd5b80600a8190555050565b600260075414156114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613b1f565b60405180910390fd5b60026007819055506114e0611fef565b73ffffffffffffffffffffffffffffffffffffffff166114fe611588565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90613a0c565b60405180910390fd5b60004790506000811161156657600080fd5b611577611571611588565b82612934565b506001600781905550565b600b5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115c19061398e565b80601f01602080910402602001604051908101604052809291908181526020018280546115ed9061398e565b801561163a5780601f1061160f5761010080835404028352916020019161163a565b820191906000526020600020905b81548152906001019060200180831161161d57829003601f168201915b5050505050905090565b600061164e610ba0565b905042600c5410611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90613b8b565b60405180910390fd5b600d60009054906101000a900460ff16156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613bf7565b60405180910390fd5b600a5482826116f39190613c17565b1115611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90613cb9565b60405180910390fd5b600a54811115611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090613d25565b60405180910390fd5b600f6000611785611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611822576117db82611df1565b34101561181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490613d91565b60405180910390fd5b6118c5565b60018214611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613e23565b60405180910390fd5b6001600f6000611873611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6118d66118d0611fef565b8361297f565b817fe483ef4918fdf00e7726ca925d7097b0649a80eb05e69b04f4677a303500490160405160405180910390a261191461190e611588565b47612934565b5050565b611920611fef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611985576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611992611fef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3f611fef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a849190613286565b60405180910390a35050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d60009054906101000a900460ff1681565b611b048484846120a9565b611b108484848461299d565b611b46576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611b5782611f87565b611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90613eb5565b60405180910390fd5b600082905060006040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525090506000611bdf612b1c565b90506000815111611bff5760405180602001604052806000815250611c2c565b80611c0984612bae565b83604051602001611c1c93929190613f11565b6040516020818303038152906040525b9350505050919050565b600e8054611c439061398e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6f9061398e565b8015611cbc5780601f10611c9157610100808354040283529160200191611cbc565b820191906000526020600020905b815481529060010190602001808311611c9f57829003601f168201915b505050505081565b611ccc611fef565b73ffffffffffffffffffffffffffffffffffffffff16611cea611588565b73ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790613a0c565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611e0882600b54612d0f90919063ffffffff16565b9050919050565b611e17611fef565b73ffffffffffffffffffffffffffffffffffffffff16611e35611588565b73ffffffffffffffffffffffffffffffffffffffff1614611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290613a0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290613fb4565b60405180910390fd5b611f048161286e565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611fe8575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120b4826125c6565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120db611fef565b73ffffffffffffffffffffffffffffffffffffffff16148061210e575061210d8260000151612108611fef565b611d5d565b5b80612153575061211c611fef565b73ffffffffffffffffffffffffffffffffffffffff1661213b84610a19565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061218c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121f5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561225c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122698585856001612d25565b6122796000848460000151611ff7565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125565760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156125555782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf8585856001612d2b565b5050505050565b6125ce613172565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612837576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161283557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612719578092505050612869565b5b60011561283457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461282f578092505050612869565b61271a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561297a573d6000803e3d6000fd5b505050565b612999828260405180602001604052806000815250612d31565b5050565b60006129be8473ffffffffffffffffffffffffffffffffffffffff16612d43565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e7611fef565b8786866040518563ffffffff1660e01b8152600401612a099493929190614029565b6020604051808303816000875af1925050508015612a4557506040513d601f19601f82011682018060405250810190612a42919061408a565b60015b612abf573d8060008114612a75576040519150601f19603f3d011682016040523d82523d6000602084013e612a7a565b606091505b50600081511415612ab7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b6060600e8054612b2b9061398e565b80601f0160208091040260200160405190810160405280929190818152602001828054612b579061398e565b8015612ba45780601f10612b7957610100808354040283529160200191612ba4565b820191906000526020600020905b815481529060010190602001808311612b8757829003601f168201915b5050505050905090565b60606000821415612bf6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d0a565b600082905060005b60008214612c28578080612c1190613a8a565b915050600a82612c2191906140e6565b9150612bfe565b60008167ffffffffffffffff811115612c4457612c4361361b565b5b6040519080825280601f01601f191660200182016040528015612c765781602001600182028036833780820191505090505b5090505b60008514612d0357600182612c8f9190614117565b9150600a85612c9e919061414b565b6030612caa9190613c17565b60f81b818381518110612cc057612cbf613a2c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cfc91906140e6565b9450612c7a565b8093505050505b919050565b60008183612d1d919061417c565b905092915050565b50505050565b50505050565b612d3e8383836001612d56565b505050565b600080823b905060008111915050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612df1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612e2c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e396000868387612d25565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561309e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156130525750613050600088848861299d565b155b15613089576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612fd7565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506130e56000868387612d2b565b5050505050565b8280546130f89061398e565b90600052602060002090601f01602090048101928261311a5760008555613161565b82601f1061313357805160ff1916838001178555613161565b82800160010185558215613161579182015b82811115613160578251825591602001919060010190613145565b5b50905061316e91906131b5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156131ce5760008160009055506001016131b6565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61321b816131e6565b811461322657600080fd5b50565b60008135905061323881613212565b92915050565b600060208284031215613254576132536131dc565b5b600061326284828501613229565b91505092915050565b60008115159050919050565b6132808161326b565b82525050565b600060208201905061329b6000830184613277565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132db5780820151818401526020810190506132c0565b838111156132ea576000848401525b50505050565b6000601f19601f8301169050919050565b600061330c826132a1565b61331681856132ac565b93506133268185602086016132bd565b61332f816132f0565b840191505092915050565b600060208201905081810360008301526133548184613301565b905092915050565b6000819050919050565b61336f8161335c565b811461337a57600080fd5b50565b60008135905061338c81613366565b92915050565b6000602082840312156133a8576133a76131dc565b5b60006133b68482850161337d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133ea826133bf565b9050919050565b6133fa816133df565b82525050565b600060208201905061341560008301846133f1565b92915050565b613424816133df565b811461342f57600080fd5b50565b6000813590506134418161341b565b92915050565b6000806040838503121561345e5761345d6131dc565b5b600061346c85828601613432565b925050602061347d8582860161337d565b9150509250929050565b6134908161335c565b82525050565b60006020820190506134ab6000830184613487565b92915050565b6000806000606084860312156134ca576134c96131dc565b5b60006134d886828701613432565b93505060206134e986828701613432565b92505060406134fa8682870161337d565b9150509250925092565b60006020828403121561351a576135196131dc565b5b600061352884828501613432565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135668161335c565b82525050565b6000613578838361355d565b60208301905092915050565b6000602082019050919050565b600061359c82613531565b6135a6818561353c565b93506135b18361354d565b8060005b838110156135e25781516135c9888261356c565b97506135d483613584565b9250506001810190506135b5565b5085935050505092915050565b600060208201905081810360008301526136098184613591565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613653826132f0565b810181811067ffffffffffffffff821117156136725761367161361b565b5b80604052505050565b60006136856131d2565b9050613691828261364a565b919050565b600067ffffffffffffffff8211156136b1576136b061361b565b5b6136ba826132f0565b9050602081019050919050565b82818337600083830152505050565b60006136e96136e484613696565b61367b565b90508281526020810184848401111561370557613704613616565b5b6137108482856136c7565b509392505050565b600082601f83011261372d5761372c613611565b5b813561373d8482602086016136d6565b91505092915050565b60006020828403121561375c5761375b6131dc565b5b600082013567ffffffffffffffff81111561377a576137796131e1565b5b61378684828501613718565b91505092915050565b6137988161326b565b81146137a357600080fd5b50565b6000813590506137b58161378f565b92915050565b600080604083850312156137d2576137d16131dc565b5b60006137e085828601613432565b92505060206137f1858286016137a6565b9150509250929050565b600067ffffffffffffffff8211156138165761381561361b565b5b61381f826132f0565b9050602081019050919050565b600061383f61383a846137fb565b61367b565b90508281526020810184848401111561385b5761385a613616565b5b6138668482856136c7565b509392505050565b600082601f83011261388357613882613611565b5b813561389384826020860161382c565b91505092915050565b600080600080608085870312156138b6576138b56131dc565b5b60006138c487828801613432565b94505060206138d587828801613432565b93505060406138e68782880161337d565b925050606085013567ffffffffffffffff811115613907576139066131e1565b5b6139138782880161386e565b91505092959194509250565b60008060408385031215613936576139356131dc565b5b600061394485828601613432565b925050602061395585828601613432565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139a657607f821691505b602082108114156139ba576139b961395f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139f66020836132ac565b9150613a01826139c0565b602082019050919050565b60006020820190508181036000830152613a25816139e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a958261335c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ac857613ac7613a5b565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b09601f836132ac565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f4d696e74696e67206e6f74207374617274656400000000000000000000000000600082015250565b6000613b756013836132ac565b9150613b8082613b3f565b602082019050919050565b60006020820190508181036000830152613ba481613b68565b9050919050565b7f53616c65206973205061757365642e0000000000000000000000000000000000600082015250565b6000613be1600f836132ac565b9150613bec82613bab565b602082019050919050565b60006020820190508181036000830152613c1081613bd4565b9050919050565b6000613c228261335c565b9150613c2d8361335c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6257613c61613a5b565b5b828201905092915050565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b6000613ca36009836132ac565b9150613cae82613c6d565b602082019050919050565b60006020820190508181036000830152613cd281613c96565b9050919050565b7f416c6c204e465427732061726520736f6c64206f757400000000000000000000600082015250565b6000613d0f6016836132ac565b9150613d1a82613cd9565b602082019050919050565b60006020820190508181036000830152613d3e81613d02565b9050919050565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b6000613d7b6011836132ac565b9150613d8682613d45565b602082019050919050565b60006020820190508181036000830152613daa81613d6e565b9050919050565b7f43616e206e6f74206d696e74206d6f7265207468616e20312066726565204e4660008201527f5400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0d6021836132ac565b9150613e1882613db1565b604082019050919050565b60006020820190508181036000830152613e3c81613e00565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e9f602f836132ac565b9150613eaa82613e43565b604082019050919050565b60006020820190508181036000830152613ece81613e92565b9050919050565b600081905092915050565b6000613eeb826132a1565b613ef58185613ed5565b9350613f058185602086016132bd565b80840191505092915050565b6000613f1d8286613ee0565b9150613f298285613ee0565b9150613f358284613ee0565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f9e6026836132ac565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ffb82613fd4565b6140058185613fdf565b93506140158185602086016132bd565b61401e816132f0565b840191505092915050565b600060808201905061403e60008301876133f1565b61404b60208301866133f1565b6140586040830185613487565b818103606083015261406a8184613ff0565b905095945050505050565b60008151905061408481613212565b92915050565b6000602082840312156140a05761409f6131dc565b5b60006140ae84828501614075565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140f18261335c565b91506140fc8361335c565b92508261410c5761410b6140b7565b5b828204905092915050565b60006141228261335c565b915061412d8361335c565b9250828210156141405761413f613a5b565b5b828203905092915050565b60006141568261335c565b91506141618361335c565b925082614171576141706140b7565b5b828206905092915050565b60006141878261335c565b91506141928361335c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cb576141ca613a5b565b5b82820290509291505056fea26469706673582212208e5cafd511db4eb94fee59a5f0d8499a8994d07e35acb8f8c45040949787ded864736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696264756a70643462636377796b6268787a6c7036686636657174656d616d367163796c6262766477656a643466357132766b33752f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://bafybeibdujpd4bccwykbhxzlp6hf6eqtemam6qcylbbvdwejd4f5q2vk3u/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f626166796265696264756a70643462636377796b6268787a6c
Arg [3] : 7036686636657174656d616d367163796c6262766477656a643466357132766b
Arg [4] : 33752f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

31021:3921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18452:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20779:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21903:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21524:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16249:279;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34428:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31306:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22688:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34526:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17298:1146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31209:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22866:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33744:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16536:754;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32902:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34341:79;;;;;;;;;;;;;:::i;:::-;;20647:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18882:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13073:103;;;;;;;;;;;;;:::i;:::-;;34137:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34631:182;;;;;;;;;;;;;:::i;:::-;;31250:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12850:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20887:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31795:742;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22156:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32545:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31384:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23059:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33011:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31421:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34256:77;;;;;;;;;;;;;:::i;:::-;;22466:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32665:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13184:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18452:422;18599:4;18656:25;18641:40;;;:11;:40;;;;:105;;;;18713:33;18698:48;;;:11;:48;;;;18641:105;:172;;;;18778:35;18763:50;;;:11;:50;;;;18641:172;:225;;;;18830:36;18854:11;18830:23;:36::i;:::-;18641:225;18621:245;;18452:422;;;:::o;20779:100::-;20833:13;20866:5;20859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20779:100;:::o;21903:245::-;22007:7;22037:16;22045:7;22037;:16::i;:::-;22032:64;;22062:34;;;;;;;;;;;;;;22032:64;22116:15;:24;22132:7;22116:24;;;;;;;;;;;;;;;;;;;;;22109:31;;21903:245;;;:::o;21524:371::-;21597:13;21613:24;21629:7;21613:15;:24::i;:::-;21597:40;;21658:5;21652:11;;:2;:11;;;21648:48;;;21672:24;;;;;;;;;;;;;;21648:48;21729:5;21713:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;21739:37;21756:5;21763:12;:10;:12::i;:::-;21739:16;:37::i;:::-;21738:38;21713:63;21709:138;;;21800:35;;;;;;;;;;;;;;21709:138;21859:28;21868:2;21872:7;21881:5;21859:8;:28::i;:::-;21586:309;21524:371;;:::o;16249:279::-;16302:7;16508:1;16494:12;;;;;;;;;;;16478:13;;;;;;;;;;:28;:31;16471:38;;;;16249:279;:::o;34428:90::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34504:6:::1;34496:5;:14;;;;34428:90:::0;:::o;31306:38::-;;;;:::o;22688:170::-;22822:28;22832:4;22838:2;22842:7;22822:9;:28::i;:::-;22688:170;;;:::o;34526:93::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34606:5:::1;34593:10;:18;;;;34526:93:::0;:::o;17298:1146::-;17423:7;17461:16;17471:5;17461:9;:16::i;:::-;17452:5;:25;17448:61;;17486:23;;;;;;;;;;;;;;17448:61;17520:22;17545:13;;;;;;;;;;;17520:38;;;;17569:19;17599:25;17800:9;17795:557;17815:14;17811:1;:18;17795:557;;;17855:31;17889:11;:14;17901:1;17889:14;;;;;;;;;;;17855:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17926:9;:16;;;17922:73;;;17967:8;;;17922:73;18043:1;18017:28;;:9;:14;;;:28;;;18013:111;;18090:9;:14;;;18070:34;;18013:111;18167:5;18146:26;;:17;:26;;;18142:195;;;18216:5;18201:11;:20;18197:85;;;18257:1;18250:8;;;;;;;;;18197:85;18304:13;;;;;;;18142:195;17836:516;17795:557;17831:3;;;;;;;17795:557;;;;18428:8;;;17298:1146;;;;;:::o;31209:34::-;;;;:::o;22866:185::-;23004:39;23021:4;23027:2;23031:7;23004:39;;;;;;;;;;;;:16;:39::i;:::-;22866:185;;;:::o;33744:385::-;33833:16;33867:18;33888:17;33898:6;33888:9;:17::i;:::-;33867:38;;33918:25;33960:10;33946:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33918:53;;33987:9;33982:112;34006:10;34002:1;:14;33982:112;;;34052:30;34072:6;34080:1;34052:19;:30::i;:::-;34038:8;34047:1;34038:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;34018:3;;;;;:::i;:::-;;;;33982:112;;;;34113:8;34106:15;;;;33744:385;;;:::o;16536:754::-;16639:7;16664:22;16689:13;;;;;;;;;;16664:38;;;;16713:19;16908:9;16903:328;16923:14;16919:1;:18;16903:328;;;16963:31;16997:11;:14;17009:1;16997:14;;;;;;;;;;;16963:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17035:9;:16;;;17030:186;;17095:5;17080:11;:20;17076:85;;;17136:1;17129:8;;;;;;;;17076:85;17183:13;;;;;;;17030:186;16944:287;16939:3;;;;;;;16903:328;;;;17259:23;;;;;;;;;;;;;;16536:754;;;;:::o;32902:101::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32988:7:::1;32973:12;:22;;;;;;;;;;;;:::i;:::-;;32902:101:::0;:::o;34341:79::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34407:5:::1;34396:8;;:16;;;;;;;;;;;;;;;;;;34341:79::o:0;20647:124::-;20711:7;20738:20;20750:7;20738:11;:20::i;:::-;:25;;;20731:32;;20647:124;;;:::o;18882:206::-;18946:7;18987:1;18970:19;;:5;:19;;;18966:60;;;18998:28;;;;;;;;;;;;;;18966:60;19052:12;:19;19065:5;19052:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;19044:36;;19037:43;;18882:206;;;:::o;13073:103::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13138:30:::1;13165:1;13138:18;:30::i;:::-;13073:103::o:0;34137:111::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34228:12:::1;34213;:27;;;;34137:111:::0;:::o;34631:182::-;11727:1;11873:7;;:19;;11865:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11727:1;11939:7;:18;;;;12996:12:::1;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34697:15:::2;34715:21;34697:39;;34765:1;34755:7;:11;34747:20;;;::::0;::::2;;34778:27;34788:7;:5;:7::i;:::-;34797;34778:9;:27::i;:::-;34686:127;11683:1:::0;11980:7;:22;;;;34631:182::o;31250:34::-;;;;:::o;12850:87::-;12896:7;12923:6;;;;;;;;;;;12916:13;;12850:87;:::o;20887:104::-;20943:13;20976:7;20969:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20887:104;:::o;31795:742::-;31851:13;31867;:11;:13::i;:::-;31851:29;;31912:15;31899:10;;:28;31891:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31971:8;;;;;;;;;;;31970:9;31962:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;32036:12;;32026:6;32018:5;:14;;;;:::i;:::-;:30;;32010:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32090:12;;32081:5;:21;;32073:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:12;:26;32156:12;:10;:12::i;:::-;32143:26;;;;;;;;;;;;;;;;;;;;;;;;;32140:253;;;32206:17;32216:6;32206:9;:17::i;:::-;32193:9;:30;;32185:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;32140:253;;;32294:1;32284:6;:11;32276:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32377:4;32348:12;:26;32361:12;:10;:12::i;:::-;32348:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;32140:253;32403:31;32413:12;:10;:12::i;:::-;32427:6;32403:9;:31::i;:::-;32470:6;32450:27;;;;;;;;;;32488:41;32498:7;:5;:7::i;:::-;32507:21;32488:9;:41::i;:::-;31840:697;31795:742;:::o;22156:302::-;22282:12;:10;:12::i;:::-;22270:24;;:8;:24;;;22266:54;;;22303:17;;;;;;;;;;;;;;22266:54;22378:8;22333:18;:32;22352:12;:10;:12::i;:::-;22333:32;;;;;;;;;;;;;;;:42;22366:8;22333:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22431:8;22402:48;;22417:12;:10;:12::i;:::-;22402:48;;;22441:8;22402:48;;;;;;:::i;:::-;;;;;;;;22156:302;;:::o;32545:112::-;32605:4;32628:12;:21;32641:7;32628:21;;;;;;;;;;;;;;;;;;;;;;;;;32621:28;;32545:112;;;:::o;31384:28::-;;;;;;;;;;;;;:::o;23059:342::-;23226:28;23236:4;23242:2;23246:7;23226:9;:28::i;:::-;23270:48;23293:4;23299:2;23303:7;23312:5;23270:22;:48::i;:::-;23265:129;;23342:40;;;;;;;;;;;;;;23265:129;23059:342;;;;:::o;33011:725::-;33129:13;33182:16;33190:7;33182;:16::i;:::-;33160:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;33286:14;33303:7;33286:24;;33321:23;:33;;;;;;;;;;;;;;;;;;;33365:28;33396:10;:8;:10::i;:::-;33365:41;;33470:1;33445:14;33439:28;:32;:289;;;;;;;;;;;;;;;;;33563:14;33604:24;33621:6;33604:16;:24::i;:::-;33655:9;33520:167;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33439:289;33419:309;;;;;33011:725;;;:::o;31421:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34256:77::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34321:4:::1;34310:8;;:15;;;;;;;;;;;;;;;;;;34256:77::o:0;22466:214::-;22608:4;22637:18;:25;22656:5;22637:25;;;;;;;;;;;;;;;:35;22663:8;22637:35;;;;;;;;;;;;;;;;;;;;;;;;;22630:42;;22466:214;;;;:::o;32665:108::-;32721:7;32748:17;32758:6;32748:5;;:9;;:17;;;;:::i;:::-;32741:24;;32665:108;;;:::o;13184:238::-;12996:12;:10;:12::i;:::-;12985:23;;:7;:5;:7::i;:::-;:23;;;12977:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13307:1:::1;13287:22;;:8;:22;;;;13265:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;13386:28;13405:8;13386:18;:28::i;:::-;13184:238:::0;:::o;7247:127::-;7354:1;7336:7;:14;;;:19;;;;;;;;;;;7247:127;:::o;12124:207::-;12254:4;12298:25;12283:40;;;:11;:40;;;;12276:47;;12124:207;;;:::o;23409:144::-;23466:4;23500:13;;;;;;;;;;;23490:23;;:7;:23;:55;;;;;23518:11;:20;23530:7;23518:20;;;;;;;;;;;:27;;;;;;;;;;;;23517:28;23490:55;23483:62;;23409:144;;;:::o;12371:98::-;12424:7;12451:10;12444:17;;12371:98;:::o;29554:196::-;29696:2;29669:15;:24;29685:7;29669:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29734:7;29730:2;29714:28;;29723:5;29714:28;;;;;;;;;;;;29554:196;;;:::o;25335:2138::-;25450:35;25488:20;25500:7;25488:11;:20::i;:::-;25450:58;;25521:22;25563:13;:18;;;25547:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;25598:50;25615:13;:18;;;25635:12;:10;:12::i;:::-;25598:16;:50::i;:::-;25547:101;:154;;;;25689:12;:10;:12::i;:::-;25665:36;;:20;25677:7;25665:11;:20::i;:::-;:36;;;25547:154;25521:181;;25720:17;25715:66;;25746:35;;;;;;;;;;;;;;25715:66;25818:4;25796:26;;:13;:18;;;:26;;;25792:67;;25831:28;;;;;;;;;;;;;;25792:67;25888:1;25874:16;;:2;:16;;;25870:52;;;25899:23;;;;;;;;;;;;;;25870:52;25935:43;25957:4;25963:2;25967:7;25976:1;25935:21;:43::i;:::-;26043:49;26060:1;26064:7;26073:13;:18;;;26043:8;:49::i;:::-;26418:1;26388:12;:18;26401:4;26388:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26462:1;26434:12;:16;26447:2;26434:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26508:2;26480:11;:20;26492:7;26480:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;26570:15;26525:11;:20;26537:7;26525:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;26838:19;26870:1;26860:7;:11;26838:33;;26931:1;26890:43;;:11;:24;26902:11;26890:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;26886:471;;;27115:13;;;;;;;;;;27101:27;;:11;:27;27097:245;;;27185:13;:18;;;27153:11;:24;27165:11;27153:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;27268:13;:54;;;27226:11;:24;27238:11;27226:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;27097:245;26886:471;26363:1005;27404:7;27400:2;27385:27;;27394:4;27385:27;;;;;;;;;;;;27423:42;27444:4;27450:2;27454:7;27463:1;27423:20;:42::i;:::-;25439:2034;;25335:2138;;;:::o;19526:1113::-;19614:21;;:::i;:::-;19653:12;19668:7;19653:22;;19724:13;;;;;;;;;;19717:20;;:4;:20;19713:859;;;19758:31;19792:11;:17;19804:4;19792:17;;;;;;;;;;;19758:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19833:9;:16;;;19828:729;;19904:1;19878:28;;:9;:14;;;:28;;;19874:101;;19942:9;19935:16;;;;;;19874:101;20277:261;20284:4;20277:261;;;20317:6;;;;;;;;20362:11;:17;20374:4;20362:17;;;;;;;;;;;20350:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20436:1;20410:28;;:9;:14;;;:28;;;20406:109;;20478:9;20471:16;;;;;;20406:109;20277:261;;;19828:729;19739:833;19713:859;20600:31;;;;;;;;;;;;;;19526:1113;;;;:::o;13430:191::-;13504:16;13523:6;;;;;;;;;;;13504:25;;13549:8;13540:6;;:17;;;;;;;;;;;;;;;;;;13604:8;13573:40;;13594:8;13573:40;;;;;;;;;;;;13493:128;13430:191;:::o;34821:116::-;34902:8;34894:26;;:35;34921:7;34894:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34821:116;;:::o;23561:104::-;23630:27;23640:2;23644:8;23630:27;;;;;;;;;;;;:9;:27::i;:::-;23561:104;;:::o;29758:923::-;29913:4;29934:15;:2;:13;;;:15::i;:::-;29930:744;;;30003:2;29987:36;;;30046:12;:10;:12::i;:::-;30081:4;30108:7;30138:5;29987:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29966:653;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30366:1;30349:6;:13;:18;30345:259;;;30399:40;;;;;;;;;;;;;;30345:259;30554:6;30548:13;30539:6;30535:2;30531:15;30524:38;29966:653;30236:45;;;30226:55;;;:6;:55;;;;30219:62;;;;;29930:744;30658:4;30651:11;;29758:923;;;;;;;:::o;32781:113::-;32841:13;32874:12;32867:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32781:113;:::o;7808:723::-;7864:13;8094:1;8085:5;:10;8081:53;;;8112:10;;;;;;;;;;;;;;;;;;;;;8081:53;8144:12;8159:5;8144:20;;8175:14;8200:78;8215:1;8207:4;:9;8200:78;;8233:8;;;;;:::i;:::-;;;;8264:2;8256:10;;;;;:::i;:::-;;;8200:78;;;8288:19;8320:6;8310:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8288:39;;8338:154;8354:1;8345:5;:10;8338:154;;8382:1;8372:11;;;;;:::i;:::-;;;8449:2;8441:5;:10;;;;:::i;:::-;8428:2;:24;;;;:::i;:::-;8415:39;;8398:6;8405;8398:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8478:2;8469:11;;;;;:::i;:::-;;;8338:154;;;8516:6;8502:21;;;;;7808:723;;;;:::o;5972:98::-;6030:7;6061:1;6057;:5;;;;:::i;:::-;6050:12;;5972:98;;;;:::o;30689:159::-;;;;;:::o;30856:158::-;;;;;:::o;23673:163::-;23796:32;23802:2;23806:8;23816:5;23823:4;23796:5;:32::i;:::-;23673:163;;;:::o;84:196::-;144:4;161:12;228:7;216:20;208:28;;271:1;264:4;:8;257:15;;;84:196;;;:::o;23844:1483::-;23983:20;24006:13;;;;;;;;;;;23983:36;;;;24048:1;24034:16;;:2;:16;;;24030:48;;;24059:19;;;;;;;;;;;;;;24030:48;24105:1;24093:8;:13;24089:44;;;24115:18;;;;;;;;;;;;;;24089:44;24146:61;24176:1;24180:2;24184:12;24198:8;24146:21;:61::i;:::-;24520:8;24485:12;:16;24498:2;24485:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24584:8;24544:12;:16;24557:2;24544:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24643:2;24610:11;:25;24622:12;24610:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;24710:15;24660:11;:25;24672:12;24660:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;24743:20;24766:12;24743:35;;24800:9;24795:389;24815:8;24811:1;:12;24795:389;;;24879:12;24875:2;24854:38;;24871:1;24854:38;;;;;;;;;;;;24937:4;:89;;;;;24967:59;24998:1;25002:2;25006:12;25020:5;24967:22;:59::i;:::-;24966:60;24937:89;24911:225;;;25076:40;;;;;;;;;;;;;;24911:225;25154:14;;;;;;;24825:3;;;;;;;24795:389;;;;25224:12;25200:13;;:37;;;;;;;;;;;;;;;;;;24460:789;25259:60;25288:1;25292:2;25296:12;25310:8;25259:20;:60::i;:::-;23972:1355;23844:1483;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:180;8557:77;8554:1;8547:88;8654:4;8651:1;8644:15;8678:4;8675:1;8668:15;8695:281;8778:27;8800:4;8778:27;:::i;:::-;8770:6;8766:40;8908:6;8896:10;8893:22;8872:18;8860:10;8857:34;8854:62;8851:88;;;8919:18;;:::i;:::-;8851:88;8959:10;8955:2;8948:22;8738:238;8695:281;;:::o;8982:129::-;9016:6;9043:20;;:::i;:::-;9033:30;;9072:33;9100:4;9092:6;9072:33;:::i;:::-;8982:129;;;:::o;9117:308::-;9179:4;9269:18;9261:6;9258:30;9255:56;;;9291:18;;:::i;:::-;9255:56;9329:29;9351:6;9329:29;:::i;:::-;9321:37;;9413:4;9407;9403:15;9395:23;;9117:308;;;:::o;9431:154::-;9515:6;9510:3;9505;9492:30;9577:1;9568:6;9563:3;9559:16;9552:27;9431:154;;;:::o;9591:412::-;9669:5;9694:66;9710:49;9752:6;9710:49;:::i;:::-;9694:66;:::i;:::-;9685:75;;9783:6;9776:5;9769:21;9821:4;9814:5;9810:16;9859:3;9850:6;9845:3;9841:16;9838:25;9835:112;;;9866:79;;:::i;:::-;9835:112;9956:41;9990:6;9985:3;9980;9956:41;:::i;:::-;9675:328;9591:412;;;;;:::o;10023:340::-;10079:5;10128:3;10121:4;10113:6;10109:17;10105:27;10095:122;;10136:79;;:::i;:::-;10095:122;10253:6;10240:20;10278:79;10353:3;10345:6;10338:4;10330:6;10326:17;10278:79;:::i;:::-;10269:88;;10085:278;10023:340;;;;:::o;10369:509::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:119;;;10493:79;;:::i;:::-;10455:119;10641:1;10630:9;10626:17;10613:31;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10798:63;10853:7;10844:6;10833:9;10829:22;10798:63;:::i;:::-;10788:73;;10584:287;10369:509;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:182::-;14786:34;14782:1;14774:6;14770:14;14763:58;14646:182;:::o;14834:366::-;14976:3;14997:67;15061:2;15056:3;14997:67;:::i;:::-;14990:74;;15073:93;15162:3;15073:93;:::i;:::-;15191:2;15186:3;15182:12;15175:19;;14834:366;;;:::o;15206:419::-;15372:4;15410:2;15399:9;15395:18;15387:26;;15459:9;15453:4;15449:20;15445:1;15434:9;15430:17;15423:47;15487:131;15613:4;15487:131;:::i;:::-;15479:139;;15206:419;;;:::o;15631:180::-;15679:77;15676:1;15669:88;15776:4;15773:1;15766:15;15800:4;15797:1;15790:15;15817:180;15865:77;15862:1;15855:88;15962:4;15959:1;15952:15;15986:4;15983:1;15976:15;16003:233;16042:3;16065:24;16083:5;16065:24;:::i;:::-;16056:33;;16111:66;16104:5;16101:77;16098:103;;;16181:18;;:::i;:::-;16098:103;16228:1;16221:5;16217:13;16210:20;;16003:233;;;:::o;16242:181::-;16382:33;16378:1;16370:6;16366:14;16359:57;16242:181;:::o;16429:366::-;16571:3;16592:67;16656:2;16651:3;16592:67;:::i;:::-;16585:74;;16668:93;16757:3;16668:93;:::i;:::-;16786:2;16781:3;16777:12;16770:19;;16429:366;;;:::o;16801:419::-;16967:4;17005:2;16994:9;16990:18;16982:26;;17054:9;17048:4;17044:20;17040:1;17029:9;17025:17;17018:47;17082:131;17208:4;17082:131;:::i;:::-;17074:139;;16801:419;;;:::o;17226:169::-;17366:21;17362:1;17354:6;17350:14;17343:45;17226:169;:::o;17401:366::-;17543:3;17564:67;17628:2;17623:3;17564:67;:::i;:::-;17557:74;;17640:93;17729:3;17640:93;:::i;:::-;17758:2;17753:3;17749:12;17742:19;;17401:366;;;:::o;17773:419::-;17939:4;17977:2;17966:9;17962:18;17954:26;;18026:9;18020:4;18016:20;18012:1;18001:9;17997:17;17990:47;18054:131;18180:4;18054:131;:::i;:::-;18046:139;;17773:419;;;:::o;18198:165::-;18338:17;18334:1;18326:6;18322:14;18315:41;18198:165;:::o;18369:366::-;18511:3;18532:67;18596:2;18591:3;18532:67;:::i;:::-;18525:74;;18608:93;18697:3;18608:93;:::i;:::-;18726:2;18721:3;18717:12;18710:19;;18369:366;;;:::o;18741:419::-;18907:4;18945:2;18934:9;18930:18;18922:26;;18994:9;18988:4;18984:20;18980:1;18969:9;18965:17;18958:47;19022:131;19148:4;19022:131;:::i;:::-;19014:139;;18741:419;;;:::o;19166:305::-;19206:3;19225:20;19243:1;19225:20;:::i;:::-;19220:25;;19259:20;19277:1;19259:20;:::i;:::-;19254:25;;19413:1;19345:66;19341:74;19338:1;19335:81;19332:107;;;19419:18;;:::i;:::-;19332:107;19463:1;19460;19456:9;19449:16;;19166:305;;;;:::o;19477:159::-;19617:11;19613:1;19605:6;19601:14;19594:35;19477:159;:::o;19642:365::-;19784:3;19805:66;19869:1;19864:3;19805:66;:::i;:::-;19798:73;;19880:93;19969:3;19880:93;:::i;:::-;19998:2;19993:3;19989:12;19982:19;;19642:365;;;:::o;20013:419::-;20179:4;20217:2;20206:9;20202:18;20194:26;;20266:9;20260:4;20256:20;20252:1;20241:9;20237:17;20230:47;20294:131;20420:4;20294:131;:::i;:::-;20286:139;;20013:419;;;:::o;20438:172::-;20578:24;20574:1;20566:6;20562:14;20555:48;20438:172;:::o;20616:366::-;20758:3;20779:67;20843:2;20838:3;20779:67;:::i;:::-;20772:74;;20855:93;20944:3;20855:93;:::i;:::-;20973:2;20968:3;20964:12;20957:19;;20616:366;;;:::o;20988:419::-;21154:4;21192:2;21181:9;21177:18;21169:26;;21241:9;21235:4;21231:20;21227:1;21216:9;21212:17;21205:47;21269:131;21395:4;21269:131;:::i;:::-;21261:139;;20988:419;;;:::o;21413:167::-;21553:19;21549:1;21541:6;21537:14;21530:43;21413:167;:::o;21586:366::-;21728:3;21749:67;21813:2;21808:3;21749:67;:::i;:::-;21742:74;;21825:93;21914:3;21825:93;:::i;:::-;21943:2;21938:3;21934:12;21927:19;;21586:366;;;:::o;21958:419::-;22124:4;22162:2;22151:9;22147:18;22139:26;;22211:9;22205:4;22201:20;22197:1;22186:9;22182:17;22175:47;22239:131;22365:4;22239:131;:::i;:::-;22231:139;;21958:419;;;:::o;22383:220::-;22523:34;22519:1;22511:6;22507:14;22500:58;22592:3;22587:2;22579:6;22575:15;22568:28;22383:220;:::o;22609:366::-;22751:3;22772:67;22836:2;22831:3;22772:67;:::i;:::-;22765:74;;22848:93;22937:3;22848:93;:::i;:::-;22966:2;22961:3;22957:12;22950:19;;22609:366;;;:::o;22981:419::-;23147:4;23185:2;23174:9;23170:18;23162:26;;23234:9;23228:4;23224:20;23220:1;23209:9;23205:17;23198:47;23262:131;23388:4;23262:131;:::i;:::-;23254:139;;22981:419;;;:::o;23406:234::-;23546:34;23542:1;23534:6;23530:14;23523:58;23615:17;23610:2;23602:6;23598:15;23591:42;23406:234;:::o;23646:366::-;23788:3;23809:67;23873:2;23868:3;23809:67;:::i;:::-;23802:74;;23885:93;23974:3;23885:93;:::i;:::-;24003:2;23998:3;23994:12;23987:19;;23646:366;;;:::o;24018:419::-;24184:4;24222:2;24211:9;24207:18;24199:26;;24271:9;24265:4;24261:20;24257:1;24246:9;24242:17;24235:47;24299:131;24425:4;24299:131;:::i;:::-;24291:139;;24018:419;;;:::o;24443:148::-;24545:11;24582:3;24567:18;;24443:148;;;;:::o;24597:377::-;24703:3;24731:39;24764:5;24731:39;:::i;:::-;24786:89;24868:6;24863:3;24786:89;:::i;:::-;24779:96;;24884:52;24929:6;24924:3;24917:4;24910:5;24906:16;24884:52;:::i;:::-;24961:6;24956:3;24952:16;24945:23;;24707:267;24597:377;;;;:::o;24980:595::-;25208:3;25230:95;25321:3;25312:6;25230:95;:::i;:::-;25223:102;;25342:95;25433:3;25424:6;25342:95;:::i;:::-;25335:102;;25454:95;25545:3;25536:6;25454:95;:::i;:::-;25447:102;;25566:3;25559:10;;24980:595;;;;;;:::o;25581:225::-;25721:34;25717:1;25709:6;25705:14;25698:58;25790:8;25785:2;25777:6;25773:15;25766:33;25581:225;:::o;25812:366::-;25954:3;25975:67;26039:2;26034:3;25975:67;:::i;:::-;25968:74;;26051:93;26140:3;26051:93;:::i;:::-;26169:2;26164:3;26160:12;26153:19;;25812:366;;;:::o;26184:419::-;26350:4;26388:2;26377:9;26373:18;26365:26;;26437:9;26431:4;26427:20;26423:1;26412:9;26408:17;26401:47;26465:131;26591:4;26465:131;:::i;:::-;26457:139;;26184:419;;;:::o;26609:98::-;26660:6;26694:5;26688:12;26678:22;;26609:98;;;:::o;26713:168::-;26796:11;26830:6;26825:3;26818:19;26870:4;26865:3;26861:14;26846:29;;26713:168;;;;:::o;26887:360::-;26973:3;27001:38;27033:5;27001:38;:::i;:::-;27055:70;27118:6;27113:3;27055:70;:::i;:::-;27048:77;;27134:52;27179:6;27174:3;27167:4;27160:5;27156:16;27134:52;:::i;:::-;27211:29;27233:6;27211:29;:::i;:::-;27206:3;27202:39;27195:46;;26977:270;26887:360;;;;:::o;27253:640::-;27448:4;27486:3;27475:9;27471:19;27463:27;;27500:71;27568:1;27557:9;27553:17;27544:6;27500:71;:::i;:::-;27581:72;27649:2;27638:9;27634:18;27625:6;27581:72;:::i;:::-;27663;27731:2;27720:9;27716:18;27707:6;27663:72;:::i;:::-;27782:9;27776:4;27772:20;27767:2;27756:9;27752:18;27745:48;27810:76;27881:4;27872:6;27810:76;:::i;:::-;27802:84;;27253:640;;;;;;;:::o;27899:141::-;27955:5;27986:6;27980:13;27971:22;;28002:32;28028:5;28002:32;:::i;:::-;27899:141;;;;:::o;28046:349::-;28115:6;28164:2;28152:9;28143:7;28139:23;28135:32;28132:119;;;28170:79;;:::i;:::-;28132:119;28290:1;28315:63;28370:7;28361:6;28350:9;28346:22;28315:63;:::i;:::-;28305:73;;28261:127;28046:349;;;;:::o;28401:180::-;28449:77;28446:1;28439:88;28546:4;28543:1;28536:15;28570:4;28567:1;28560:15;28587:185;28627:1;28644:20;28662:1;28644:20;:::i;:::-;28639:25;;28678:20;28696:1;28678:20;:::i;:::-;28673:25;;28717:1;28707:35;;28722:18;;:::i;:::-;28707:35;28764:1;28761;28757:9;28752:14;;28587:185;;;;:::o;28778:191::-;28818:4;28838:20;28856:1;28838:20;:::i;:::-;28833:25;;28872:20;28890:1;28872:20;:::i;:::-;28867:25;;28911:1;28908;28905:8;28902:34;;;28916:18;;:::i;:::-;28902:34;28961:1;28958;28954:9;28946:17;;28778:191;;;;:::o;28975:176::-;29007:1;29024:20;29042:1;29024:20;:::i;:::-;29019:25;;29058:20;29076:1;29058:20;:::i;:::-;29053:25;;29097:1;29087:35;;29102:18;;:::i;:::-;29087:35;29143:1;29140;29136:9;29131:14;;28975:176;;;;:::o;29157:348::-;29197:7;29220:20;29238:1;29220:20;:::i;:::-;29215:25;;29254:20;29272:1;29254:20;:::i;:::-;29249:25;;29442:1;29374:66;29370:74;29367:1;29364:81;29359:1;29352:9;29345:17;29341:105;29338:131;;;29449:18;;:::i;:::-;29338:131;29497:1;29494;29490:9;29479:20;;29157:348;;;;:::o

Swarm Source

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