ETH Price: $2,649.52 (-0.27%)

Token

Apesons (Apesons)
 

Overview

Max Total Supply

4,985 Apesons

Holders

965

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 Apesons
0x0000000000000000000000000000000000000000
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:
Apesons

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error ApproveToCaller();

    error ApprovalToCurrentOwner();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

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

    //function totalSupply() external view returns (uint256);

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

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    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,
        bytes calldata data
    ) external;

    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 setApprovalForAll(address operator, bool _approved) external;

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

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

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

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

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

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

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

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

contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    function _setName(string memory name_) internal {
        _name = name_;
    }

    function _setSymbol(string memory symbol_) internal {
        _symbol = symbol_;
    }

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

    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

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

    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    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, _toString(tokenId))) : '';
    }

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

    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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 (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

contract Apesons is ERC721A, Ownable {
    using Address for address;
    using Strings for uint256;

    uint256 private maxTokens;

    mapping(uint256 => string) private customTokensURIs;

    bool private _saleEnabled = false;

    bool private _freeMintEnabled = false;

    uint256 private _maxMintForUser;

    uint256 private _maxFreeMints;

    uint256 private _currentFreeMints;

    string private _contractURI;
    string  private _baseTokenURI;

    uint256 price = 1 ether;

    mapping (address => uint256) freeMints;

    constructor(uint256 maxTokens_, bool saleEnabled_, bool freeMintEnabled_, string memory baseURI_, uint256 maxMintForUser_, uint256 maxFreeMints_, uint256 price_) ERC721A("Apesons","Apesons") {
        maxTokens = maxTokens_;

        _saleEnabled = saleEnabled_;

        _freeMintEnabled = freeMintEnabled_;

        _baseTokenURI = baseURI_;

        _maxMintForUser = maxMintForUser_;

        _maxFreeMints = maxFreeMints_;

        price = price_;
    }

    function setMaxTokens(uint256 _maxTokens) external onlyOwner {
        maxTokens = _maxTokens;
    }

    function setLimitFreeMintForUser(uint256 maxMintForUser_) external onlyOwner {
        _maxMintForUser = maxMintForUser_;
    }

    function setMaxFreeMints(uint256 maxFreeMints_) external onlyOwner {
        _maxFreeMints = maxFreeMints_;
    }

    function getMaxTokens()  external view returns(uint256) {
        return maxTokens;
    }

    function hasFreeMint(address target) public view returns(bool){
        return _freeMintEnabled && freeMints[target] < _maxMintForUser && _currentFreeMints < _maxFreeMints;
    }

    function freeMintEnabled() external view returns(bool){
        return _freeMintEnabled;
    }

    function freeMintSet(bool v) external onlyOwner {
        _freeMintEnabled = v;
    }

    function saleEnabled() external view returns(bool){
        return _saleEnabled;
    }

    function saleSet(bool v) external onlyOwner {
        _saleEnabled = v;
    }

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

    function setPrice(uint256 price_) external onlyOwner {
        price = price_;
    }

    function mintTo(address _to, uint256 count) external onlyOwner {
        require(tokensAvailable() >= count, "Max tokens reached");
        _safeMint(_to, count);
    }

    function mint(uint256 count) external payable {
        require(_saleEnabled, "Sale off");
        require(msg.value >= count*price, "Insufficient value to mint");
        require(tokensAvailable() >= count, "Max tokens reached");
        _safeMint(msg.sender, count);
    }

    function freeMint(uint256 count) external {
        require(_freeMintEnabled, "Free mint off");
        require(freeMints[msg.sender] + count <= _maxMintForUser, "You have max tokens");
        require(_currentFreeMints + count <= _maxFreeMints, "You have max tokens");
        _safeMint(msg.sender, count);
        freeMints[msg.sender] += count;
        _currentFreeMints += count;
    }

    function contractURI() public view returns (string memory) {
    	return _contractURI;
    }

    function withdraw() external onlyOwner
    {
        Address.sendValue(payable(msg.sender), address(this).balance);
    }

    function tokensAvailable() public view returns (uint256) {
        return maxTokens - _totalMinted();
    }

    function currentFreeMints() public view returns (uint256) {
        return _maxFreeMints - _currentFreeMints;
    }

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

    function setBaseURI(string memory uri) external onlyOwner {
        _baseTokenURI = uri;
    }

    function setContractURI(string memory uri) external onlyOwner {
        _contractURI = uri;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if(bytes(customTokensURIs[tokenId]).length != 0) return customTokensURIs[tokenId];
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
    }

    function URI(uint256 tokenId) external view virtual returns (string memory) {
        return tokenURI(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxTokens_","type":"uint256"},{"internalType":"bool","name":"saleEnabled_","type":"bool"},{"internalType":"bool","name":"freeMintEnabled_","type":"bool"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"maxMintForUser_","type":"uint256"},{"internalType":"uint256","name":"maxFreeMints_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"}],"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":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"URI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"v","type":"bool"}],"name":"freeMintSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"hasFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"v","type":"bool"}],"name":"saleSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintForUser_","type":"uint256"}],"name":"setLimitFreeMintForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxFreeMints_","type":"uint256"}],"name":"setMaxFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff021916908315150217905550670de0b6b3a76400006011553480156200005357600080fd5b5060405162004161380380620041618339818101604052810190620000799190620003f4565b6040518060400160405280600781526020017f417065736f6e73000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f417065736f6e73000000000000000000000000000000000000000000000000008152508160029080519060200190620000fd92919062000298565b5080600390805190602001906200011692919062000298565b5062000127620001c560201b60201c565b60008190555050506200014f62000143620001ca60201b60201c565b620001d260201b60201c565b8660098190555085600b60006101000a81548160ff02191690831515021790555084600b60016101000a81548160ff0219169083151502179055508360109080519060200190620001a292919062000298565b5082600c8190555081600d81905550806011819055505050505050505062000694565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a69062000571565b90600052602060002090601f016020900481019282620002ca576000855562000316565b82601f10620002e557805160ff191683800117855562000316565b8280016001018555821562000316579182015b8281111562000315578251825591602001919060010190620002f8565b5b50905062000325919062000329565b5090565b5b80821115620003445760008160009055506001016200032a565b5090565b60006200035f6200035984620004ef565b620004c6565b9050828152602081018484840111156200037e576200037d62000640565b5b6200038b8482856200053b565b509392505050565b600081519050620003a48162000660565b92915050565b600082601f830112620003c257620003c16200063b565b5b8151620003d484826020860162000348565b91505092915050565b600081519050620003ee816200067a565b92915050565b600080600080600080600060e0888a0312156200041657620004156200064a565b5b6000620004268a828b01620003dd565b9750506020620004398a828b0162000393565b96505060406200044c8a828b0162000393565b955050606088015167ffffffffffffffff81111562000470576200046f62000645565b5b6200047e8a828b01620003aa565b9450506080620004918a828b01620003dd565b93505060a0620004a48a828b01620003dd565b92505060c0620004b78a828b01620003dd565b91505092959891949750929550565b6000620004d2620004e5565b9050620004e08282620005a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200050d576200050c6200060c565b5b62000518826200064f565b9050602081019050919050565b60008115159050919050565b6000819050919050565b60005b838110156200055b5780820151818401526020810190506200053e565b838111156200056b576000848401525b50505050565b600060028204905060018216806200058a57607f821691505b60208210811415620005a157620005a0620005dd565b5b50919050565b620005b2826200064f565b810181811067ffffffffffffffff82111715620005d457620005d36200060c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200066b8162000525565b81146200067757600080fd5b50565b620006858162000531565b81146200069157600080fd5b50565b613abd80620006a46000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063e2eed4321161006f578063e2eed432146107aa578063e8a3d485146107d3578063e985e9c5146107fe578063f2fde38b1461083b578063fb374db6146108645761021a565b8063a0712d68146106c2578063a22cb465146106de578063b88d4fde14610707578063c87b56dd14610730578063d5cde1f21461076d5761021a565b80638da5cb5b116100f25780638da5cb5b146105dd578063901e1c011461060857806391b7f5ed14610645578063938e3d7b1461066e57806395d89b41146106975761021a565b806370a0823114610535578063715018a61461057257806371b9b646146105895780637c928fe9146105b45761021a565b8063407043fc116101a657806355f804b31161017557806355f804b31461044e57806360659a921461047757806362ad68aa146104a25780636352211e146104cd5780636abcded11461050a5761021a565b8063407043fc146103aa57806342842e0e146103d3578063449a52f8146103fc578063522680e0146104255761021a565b806311e776fe116101ed57806311e776fe146102ed57806318160ddd146103165780631dcee4251461034157806323b872dd1461036a5780633ccfd60b146103935761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612ddf565b61088f565b60405161025391906131ce565b60405180910390f35b34801561026857600080fd5b50610271610921565b60405161027e91906131e9565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612e82565b6109b3565b6040516102bb9190613167565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612d72565b610a2f565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612e82565b610bd6565b005b34801561032257600080fd5b5061032b610c5c565b604051610338919061334b565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612db2565b610c6b565b005b34801561037657600080fd5b50610391600480360381019061038c9190612c5c565b610d04565b005b34801561039f57600080fd5b506103a8610d14565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612e82565b610d9c565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612c5c565b610e22565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d72565b610e42565b005b34801561043157600080fd5b5061044c60048036038101906104479190612db2565b610f16565b005b34801561045a57600080fd5b5061047560048036038101906104709190612e39565b610faf565b005b34801561048357600080fd5b5061048c611045565b604051610499919061334b565b60405180910390f35b3480156104ae57600080fd5b506104b7611061565b6040516104c491906131ce565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612e82565b611078565b6040516105019190613167565b60405180910390f35b34801561051657600080fd5b5061051f61108a565b60405161052c919061334b565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190612bef565b611094565b604051610569919061334b565b60405180910390f35b34801561057e57600080fd5b5061058761114d565b005b34801561059557600080fd5b5061059e6111d5565b6040516105ab91906131ce565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190612e82565b6111ec565b005b3480156105e957600080fd5b506105f2611398565b6040516105ff9190613167565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612e82565b6113c2565b60405161063c91906131e9565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190612e82565b6113d4565b005b34801561067a57600080fd5b5061069560048036038101906106909190612e39565b61145a565b005b3480156106a357600080fd5b506106ac6114f0565b6040516106b991906131e9565b60405180910390f35b6106dc60048036038101906106d79190612e82565b611582565b005b3480156106ea57600080fd5b5061070560048036038101906107009190612d32565b611678565b005b34801561071357600080fd5b5061072e60048036038101906107299190612caf565b6117f0565b005b34801561073c57600080fd5b5061075760048036038101906107529190612e82565b611863565b60405161076491906131e9565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190612bef565b6119d5565b6040516107a191906131ce565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612e82565b611a49565b005b3480156107df57600080fd5b506107e8611acf565b6040516107f591906131e9565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190612c1c565b611b61565b60405161083291906131ce565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190612bef565b611bf5565b005b34801561087057600080fd5b50610879611ced565b604051610886919061334b565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461093090613606565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90613606565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109be82611d04565b6109f4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3a82611d63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac1611e31565b73ffffffffffffffffffffffffffffffffffffffff1614610b2457610aed81610ae8611e31565b611b61565b610b23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bde611e39565b73ffffffffffffffffffffffffffffffffffffffff16610bfc611398565b73ffffffffffffffffffffffffffffffffffffffff1614610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906132eb565b60405180910390fd5b8060098190555050565b6000610c66611e41565b905090565b610c73611e39565b73ffffffffffffffffffffffffffffffffffffffff16610c91611398565b73ffffffffffffffffffffffffffffffffffffffff1614610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde906132eb565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610d0f838383611e54565b505050565b610d1c611e39565b73ffffffffffffffffffffffffffffffffffffffff16610d3a611398565b73ffffffffffffffffffffffffffffffffffffffff1614610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906132eb565b60405180910390fd5b610d9a33476121fe565b565b610da4611e39565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611398565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f906132eb565b60405180910390fd5b80600d8190555050565b610e3d838383604051806020016040528060008152506117f0565b505050565b610e4a611e39565b73ffffffffffffffffffffffffffffffffffffffff16610e68611398565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb5906132eb565b60405180910390fd5b80610ec7611045565b1015610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff9061320b565b60405180910390fd5b610f1282826122f2565b5050565b610f1e611e39565b73ffffffffffffffffffffffffffffffffffffffff16610f3c611398565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906132eb565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b610fb7611e39565b73ffffffffffffffffffffffffffffffffffffffff16610fd5611398565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906132eb565b60405180910390fd5b8060109080519060200190611041929190612a03565b5050565b600061104f611e41565b60095461105c919061351c565b905090565b6000600b60019054906101000a900460ff16905090565b600061108382611d63565b9050919050565b6000600954905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611155611e39565b73ffffffffffffffffffffffffffffffffffffffff16611173611398565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906132eb565b60405180910390fd5b6111d36000612310565b565b6000600b60009054906101000a900460ff16905090565b600b60019054906101000a900460ff1661123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906132cb565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611289919061343b565b11156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c19061326b565b60405180910390fd5b600d5481600e546112db919061343b565b111561131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061326b565b60405180910390fd5b61132633826122f2565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611375919061343b565b9250508190555080600e600082825461138e919061343b565b9250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606113cd82611863565b9050919050565b6113dc611e39565b73ffffffffffffffffffffffffffffffffffffffff166113fa611398565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611447906132eb565b60405180910390fd5b8060118190555050565b611462611e39565b73ffffffffffffffffffffffffffffffffffffffff16611480611398565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906132eb565b60405180910390fd5b80600f90805190602001906114ec929190612a03565b5050565b6060600380546114ff90613606565b80601f016020809104026020016040519081016040528092919081815260200182805461152b90613606565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b5050505050905090565b600b60009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061332b565b60405180910390fd5b601154816115df91906134c2565b341015611621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116189061324b565b60405180910390fd5b8061162a611045565b101561166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061320b565b60405180910390fd5b61167533826122f2565b50565b611680611e31565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116f2611e31565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f611e31565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e491906131ce565b60405180910390a35050565b6117fb848484611e54565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461185d57611826848484846123d6565b61185c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061186e82611d04565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a49061330b565b60405180910390fd5b6000600a600084815260200190815260200160002080546118cd90613606565b90501461197757600a600083815260200190815260200160002080546118f290613606565b80601f016020809104026020016040519081016040528092919081815260200182805461191e90613606565b801561196b5780601f106119405761010080835404028352916020019161196b565b820191906000526020600020905b81548152906001019060200180831161194e57829003601f168201915b505050505090506119d0565b6000611981612536565b905060008151116119a157604051806020016040528060008152506119cc565b806119ab846125c8565b6040516020016119bc929190613123565b6040516020818303038152906040525b9150505b919050565b6000600b60019054906101000a900460ff168015611a335750600c54601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b8015611a425750600d54600e54105b9050919050565b611a51611e39565b73ffffffffffffffffffffffffffffffffffffffff16611a6f611398565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906132eb565b60405180910390fd5b80600c8190555050565b6060600f8054611ade90613606565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0a90613606565b8015611b575780601f10611b2c57610100808354040283529160200191611b57565b820191906000526020600020905b815481529060010190602001808311611b3a57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bfd611e39565b73ffffffffffffffffffffffffffffffffffffffff16611c1b611398565b73ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906132eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd89061322b565b60405180910390fd5b611cea81612310565b50565b6000600e54600d54611cff919061351c565b905090565b600081611d0f612729565b11158015611d1e575060005482105b8015611d5c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611d72612729565b11611dfa57600054811015611df95760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611df7575b6000811415611ded576004600083600190039350838152602001908152602001600020549050611dc2565b8092505050611e2c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b6000611e4b612729565b60005403905090565b6000611e5f82611d63565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611ee7611e31565b73ffffffffffffffffffffffffffffffffffffffff161480611f165750611f1585611f10611e31565b611b61565b5b80611f5b5750611f24611e31565b73ffffffffffffffffffffffffffffffffffffffff16611f43846109b3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f94576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ffb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612008858585600161272e565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61210586612734565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561218f57600060018401905060006004600083815260200190815260200160002054141561218d57600054811461218c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121f7858585600161273e565b5050505050565b80471015612241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612238906132ab565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161226790613152565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e49061328b565b60405180910390fd5b505050565b61230c828260405180602001604052806000815250612744565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fc611e31565b8786866040518563ffffffff1660e01b815260040161241e9493929190613182565b602060405180830381600087803b15801561243857600080fd5b505af192505050801561246957506040513d601f19601f820116820180604052508101906124669190612e0c565b60015b6124e3573d8060008114612499576040519150601f19603f3d011682016040523d82523d6000602084013e61249e565b606091505b506000815114156124db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461254590613606565b80601f016020809104026020016040519081016040528092919081815260200182805461257190613606565b80156125be5780601f10612593576101008083540402835291602001916125be565b820191906000526020600020905b8154815290600101906020018083116125a157829003601f168201915b5050505050905090565b60606000821415612610576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612724565b600082905060005b6000821461264257808061262b90613669565b915050600a8261263b9190613491565b9150612618565b60008167ffffffffffffffff81111561265e5761265d61379f565b5b6040519080825280601f01601f1916602001820160405280156126905781602001600182028036833780820191505090505b5090505b6000851461271d576001826126a9919061351c565b9150600a856126b891906136b2565b60306126c4919061343b565b60f81b8183815181106126da576126d9613770565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127169190613491565b9450612694565b8093505050505b919050565b600090565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127b1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127ec576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127f9600085838661272e565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161285e600185146129f9565b901b60a042901b61286e86612734565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612972575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292260008784806001019550876123d6565b612958576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128b357826000541461296d57600080fd5b6129dd565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612973575b8160008190555050506129f3600085838661273e565b50505050565b6000819050919050565b828054612a0f90613606565b90600052602060002090601f016020900481019282612a315760008555612a78565b82601f10612a4a57805160ff1916838001178555612a78565b82800160010185558215612a78579182015b82811115612a77578251825591602001919060010190612a5c565b5b509050612a859190612a89565b5090565b5b80821115612aa2576000816000905550600101612a8a565b5090565b6000612ab9612ab48461338b565b613366565b905082815260208101848484011115612ad557612ad46137d3565b5b612ae08482856135c4565b509392505050565b6000612afb612af6846133bc565b613366565b905082815260208101848484011115612b1757612b166137d3565b5b612b228482856135c4565b509392505050565b600081359050612b3981613a2b565b92915050565b600081359050612b4e81613a42565b92915050565b600081359050612b6381613a59565b92915050565b600081519050612b7881613a59565b92915050565b600082601f830112612b9357612b926137ce565b5b8135612ba3848260208601612aa6565b91505092915050565b600082601f830112612bc157612bc06137ce565b5b8135612bd1848260208601612ae8565b91505092915050565b600081359050612be981613a70565b92915050565b600060208284031215612c0557612c046137dd565b5b6000612c1384828501612b2a565b91505092915050565b60008060408385031215612c3357612c326137dd565b5b6000612c4185828601612b2a565b9250506020612c5285828601612b2a565b9150509250929050565b600080600060608486031215612c7557612c746137dd565b5b6000612c8386828701612b2a565b9350506020612c9486828701612b2a565b9250506040612ca586828701612bda565b9150509250925092565b60008060008060808587031215612cc957612cc86137dd565b5b6000612cd787828801612b2a565b9450506020612ce887828801612b2a565b9350506040612cf987828801612bda565b925050606085013567ffffffffffffffff811115612d1a57612d196137d8565b5b612d2687828801612b7e565b91505092959194509250565b60008060408385031215612d4957612d486137dd565b5b6000612d5785828601612b2a565b9250506020612d6885828601612b3f565b9150509250929050565b60008060408385031215612d8957612d886137dd565b5b6000612d9785828601612b2a565b9250506020612da885828601612bda565b9150509250929050565b600060208284031215612dc857612dc76137dd565b5b6000612dd684828501612b3f565b91505092915050565b600060208284031215612df557612df46137dd565b5b6000612e0384828501612b54565b91505092915050565b600060208284031215612e2257612e216137dd565b5b6000612e3084828501612b69565b91505092915050565b600060208284031215612e4f57612e4e6137dd565b5b600082013567ffffffffffffffff811115612e6d57612e6c6137d8565b5b612e7984828501612bac565b91505092915050565b600060208284031215612e9857612e976137dd565b5b6000612ea684828501612bda565b91505092915050565b612eb881613550565b82525050565b612ec781613562565b82525050565b6000612ed8826133ed565b612ee28185613403565b9350612ef28185602086016135d3565b612efb816137e2565b840191505092915050565b6000612f11826133f8565b612f1b818561341f565b9350612f2b8185602086016135d3565b612f34816137e2565b840191505092915050565b6000612f4a826133f8565b612f548185613430565b9350612f648185602086016135d3565b80840191505092915050565b6000612f7d60128361341f565b9150612f88826137f3565b602082019050919050565b6000612fa060268361341f565b9150612fab8261381c565b604082019050919050565b6000612fc3601a8361341f565b9150612fce8261386b565b602082019050919050565b6000612fe660138361341f565b9150612ff182613894565b602082019050919050565b6000613009603a8361341f565b9150613014826138bd565b604082019050919050565b600061302c601d8361341f565b91506130378261390c565b602082019050919050565b600061304f600d8361341f565b915061305a82613935565b602082019050919050565b6000613072600583613430565b915061307d8261395e565b600582019050919050565b600061309560208361341f565b91506130a082613987565b602082019050919050565b60006130b8602f8361341f565b91506130c3826139b0565b604082019050919050565b60006130db600083613414565b91506130e6826139ff565b600082019050919050565b60006130fe60088361341f565b915061310982613a02565b602082019050919050565b61311d816135ba565b82525050565b600061312f8285612f3f565b915061313b8284612f3f565b915061314682613065565b91508190509392505050565b600061315d826130ce565b9150819050919050565b600060208201905061317c6000830184612eaf565b92915050565b60006080820190506131976000830187612eaf565b6131a46020830186612eaf565b6131b16040830185613114565b81810360608301526131c38184612ecd565b905095945050505050565b60006020820190506131e36000830184612ebe565b92915050565b600060208201905081810360008301526132038184612f06565b905092915050565b6000602082019050818103600083015261322481612f70565b9050919050565b6000602082019050818103600083015261324481612f93565b9050919050565b6000602082019050818103600083015261326481612fb6565b9050919050565b6000602082019050818103600083015261328481612fd9565b9050919050565b600060208201905081810360008301526132a481612ffc565b9050919050565b600060208201905081810360008301526132c48161301f565b9050919050565b600060208201905081810360008301526132e481613042565b9050919050565b6000602082019050818103600083015261330481613088565b9050919050565b60006020820190508181036000830152613324816130ab565b9050919050565b60006020820190508181036000830152613344816130f1565b9050919050565b60006020820190506133606000830184613114565b92915050565b6000613370613381565b905061337c8282613638565b919050565b6000604051905090565b600067ffffffffffffffff8211156133a6576133a561379f565b5b6133af826137e2565b9050602081019050919050565b600067ffffffffffffffff8211156133d7576133d661379f565b5b6133e0826137e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613446826135ba565b9150613451836135ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613486576134856136e3565b5b828201905092915050565b600061349c826135ba565b91506134a7836135ba565b9250826134b7576134b6613712565b5b828204905092915050565b60006134cd826135ba565b91506134d8836135ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613511576135106136e3565b5b828202905092915050565b6000613527826135ba565b9150613532836135ba565b925082821015613545576135446136e3565b5b828203905092915050565b600061355b8261359a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135f15780820151818401526020810190506135d6565b83811115613600576000848401525b50505050565b6000600282049050600182168061361e57607f821691505b6020821081141561363257613631613741565b5b50919050565b613641826137e2565b810181811067ffffffffffffffff821117156136605761365f61379f565b5b80604052505050565b6000613674826135ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a7576136a66136e3565b5b600182019050919050565b60006136bd826135ba565b91506136c8836135ba565b9250826136d8576136d7613712565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820746f6b656e7320726561636865640000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742076616c756520746f206d696e74000000000000600082015250565b7f596f752068617665206d617820746f6b656e7300000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f46726565206d696e74206f666600000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f53616c65206f6666000000000000000000000000000000000000000000000000600082015250565b613a3481613550565b8114613a3f57600080fd5b50565b613a4b81613562565b8114613a5657600080fd5b50565b613a628161356e565b8114613a6d57600080fd5b50565b613a79816135ba565b8114613a8457600080fd5b5056fea26469706673582212201b833f37ca31d6507f212690a316988f7eed7996230305e1ae73dcf943364dbf64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000037697066733a2f2f516d64646565656331464a666666746f42586838713333336935526231313136723948655a43554c716566585858582f000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063e2eed4321161006f578063e2eed432146107aa578063e8a3d485146107d3578063e985e9c5146107fe578063f2fde38b1461083b578063fb374db6146108645761021a565b8063a0712d68146106c2578063a22cb465146106de578063b88d4fde14610707578063c87b56dd14610730578063d5cde1f21461076d5761021a565b80638da5cb5b116100f25780638da5cb5b146105dd578063901e1c011461060857806391b7f5ed14610645578063938e3d7b1461066e57806395d89b41146106975761021a565b806370a0823114610535578063715018a61461057257806371b9b646146105895780637c928fe9146105b45761021a565b8063407043fc116101a657806355f804b31161017557806355f804b31461044e57806360659a921461047757806362ad68aa146104a25780636352211e146104cd5780636abcded11461050a5761021a565b8063407043fc146103aa57806342842e0e146103d3578063449a52f8146103fc578063522680e0146104255761021a565b806311e776fe116101ed57806311e776fe146102ed57806318160ddd146103165780631dcee4251461034157806323b872dd1461036a5780633ccfd60b146103935761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612ddf565b61088f565b60405161025391906131ce565b60405180910390f35b34801561026857600080fd5b50610271610921565b60405161027e91906131e9565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612e82565b6109b3565b6040516102bb9190613167565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612d72565b610a2f565b005b3480156102f957600080fd5b50610314600480360381019061030f9190612e82565b610bd6565b005b34801561032257600080fd5b5061032b610c5c565b604051610338919061334b565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612db2565b610c6b565b005b34801561037657600080fd5b50610391600480360381019061038c9190612c5c565b610d04565b005b34801561039f57600080fd5b506103a8610d14565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612e82565b610d9c565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612c5c565b610e22565b005b34801561040857600080fd5b50610423600480360381019061041e9190612d72565b610e42565b005b34801561043157600080fd5b5061044c60048036038101906104479190612db2565b610f16565b005b34801561045a57600080fd5b5061047560048036038101906104709190612e39565b610faf565b005b34801561048357600080fd5b5061048c611045565b604051610499919061334b565b60405180910390f35b3480156104ae57600080fd5b506104b7611061565b6040516104c491906131ce565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612e82565b611078565b6040516105019190613167565b60405180910390f35b34801561051657600080fd5b5061051f61108a565b60405161052c919061334b565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190612bef565b611094565b604051610569919061334b565b60405180910390f35b34801561057e57600080fd5b5061058761114d565b005b34801561059557600080fd5b5061059e6111d5565b6040516105ab91906131ce565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190612e82565b6111ec565b005b3480156105e957600080fd5b506105f2611398565b6040516105ff9190613167565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190612e82565b6113c2565b60405161063c91906131e9565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190612e82565b6113d4565b005b34801561067a57600080fd5b5061069560048036038101906106909190612e39565b61145a565b005b3480156106a357600080fd5b506106ac6114f0565b6040516106b991906131e9565b60405180910390f35b6106dc60048036038101906106d79190612e82565b611582565b005b3480156106ea57600080fd5b5061070560048036038101906107009190612d32565b611678565b005b34801561071357600080fd5b5061072e60048036038101906107299190612caf565b6117f0565b005b34801561073c57600080fd5b5061075760048036038101906107529190612e82565b611863565b60405161076491906131e9565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190612bef565b6119d5565b6040516107a191906131ce565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612e82565b611a49565b005b3480156107df57600080fd5b506107e8611acf565b6040516107f591906131e9565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190612c1c565b611b61565b60405161083291906131ce565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190612bef565b611bf5565b005b34801561087057600080fd5b50610879611ced565b604051610886919061334b565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461093090613606565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90613606565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109be82611d04565b6109f4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3a82611d63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac1611e31565b73ffffffffffffffffffffffffffffffffffffffff1614610b2457610aed81610ae8611e31565b611b61565b610b23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bde611e39565b73ffffffffffffffffffffffffffffffffffffffff16610bfc611398565b73ffffffffffffffffffffffffffffffffffffffff1614610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906132eb565b60405180910390fd5b8060098190555050565b6000610c66611e41565b905090565b610c73611e39565b73ffffffffffffffffffffffffffffffffffffffff16610c91611398565b73ffffffffffffffffffffffffffffffffffffffff1614610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde906132eb565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610d0f838383611e54565b505050565b610d1c611e39565b73ffffffffffffffffffffffffffffffffffffffff16610d3a611398565b73ffffffffffffffffffffffffffffffffffffffff1614610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906132eb565b60405180910390fd5b610d9a33476121fe565b565b610da4611e39565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611398565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f906132eb565b60405180910390fd5b80600d8190555050565b610e3d838383604051806020016040528060008152506117f0565b505050565b610e4a611e39565b73ffffffffffffffffffffffffffffffffffffffff16610e68611398565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb5906132eb565b60405180910390fd5b80610ec7611045565b1015610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff9061320b565b60405180910390fd5b610f1282826122f2565b5050565b610f1e611e39565b73ffffffffffffffffffffffffffffffffffffffff16610f3c611398565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906132eb565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b610fb7611e39565b73ffffffffffffffffffffffffffffffffffffffff16610fd5611398565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906132eb565b60405180910390fd5b8060109080519060200190611041929190612a03565b5050565b600061104f611e41565b60095461105c919061351c565b905090565b6000600b60019054906101000a900460ff16905090565b600061108382611d63565b9050919050565b6000600954905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611155611e39565b73ffffffffffffffffffffffffffffffffffffffff16611173611398565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906132eb565b60405180910390fd5b6111d36000612310565b565b6000600b60009054906101000a900460ff16905090565b600b60019054906101000a900460ff1661123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906132cb565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611289919061343b565b11156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c19061326b565b60405180910390fd5b600d5481600e546112db919061343b565b111561131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061326b565b60405180910390fd5b61132633826122f2565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611375919061343b565b9250508190555080600e600082825461138e919061343b565b9250508190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606113cd82611863565b9050919050565b6113dc611e39565b73ffffffffffffffffffffffffffffffffffffffff166113fa611398565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611447906132eb565b60405180910390fd5b8060118190555050565b611462611e39565b73ffffffffffffffffffffffffffffffffffffffff16611480611398565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd906132eb565b60405180910390fd5b80600f90805190602001906114ec929190612a03565b5050565b6060600380546114ff90613606565b80601f016020809104026020016040519081016040528092919081815260200182805461152b90613606565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b5050505050905090565b600b60009054906101000a900460ff166115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c89061332b565b60405180910390fd5b601154816115df91906134c2565b341015611621576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116189061324b565b60405180910390fd5b8061162a611045565b101561166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116629061320b565b60405180910390fd5b61167533826122f2565b50565b611680611e31565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116f2611e31565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f611e31565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e491906131ce565b60405180910390a35050565b6117fb848484611e54565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461185d57611826848484846123d6565b61185c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061186e82611d04565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a49061330b565b60405180910390fd5b6000600a600084815260200190815260200160002080546118cd90613606565b90501461197757600a600083815260200190815260200160002080546118f290613606565b80601f016020809104026020016040519081016040528092919081815260200182805461191e90613606565b801561196b5780601f106119405761010080835404028352916020019161196b565b820191906000526020600020905b81548152906001019060200180831161194e57829003601f168201915b505050505090506119d0565b6000611981612536565b905060008151116119a157604051806020016040528060008152506119cc565b806119ab846125c8565b6040516020016119bc929190613123565b6040516020818303038152906040525b9150505b919050565b6000600b60019054906101000a900460ff168015611a335750600c54601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b8015611a425750600d54600e54105b9050919050565b611a51611e39565b73ffffffffffffffffffffffffffffffffffffffff16611a6f611398565b73ffffffffffffffffffffffffffffffffffffffff1614611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906132eb565b60405180910390fd5b80600c8190555050565b6060600f8054611ade90613606565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0a90613606565b8015611b575780601f10611b2c57610100808354040283529160200191611b57565b820191906000526020600020905b815481529060010190602001808311611b3a57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bfd611e39565b73ffffffffffffffffffffffffffffffffffffffff16611c1b611398565b73ffffffffffffffffffffffffffffffffffffffff1614611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906132eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd89061322b565b60405180910390fd5b611cea81612310565b50565b6000600e54600d54611cff919061351c565b905090565b600081611d0f612729565b11158015611d1e575060005482105b8015611d5c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611d72612729565b11611dfa57600054811015611df95760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611df7575b6000811415611ded576004600083600190039350838152602001908152602001600020549050611dc2565b8092505050611e2c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b6000611e4b612729565b60005403905090565b6000611e5f82611d63565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611ee7611e31565b73ffffffffffffffffffffffffffffffffffffffff161480611f165750611f1585611f10611e31565b611b61565b5b80611f5b5750611f24611e31565b73ffffffffffffffffffffffffffffffffffffffff16611f43846109b3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f94576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ffb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612008858585600161272e565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61210586612734565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561218f57600060018401905060006004600083815260200190815260200160002054141561218d57600054811461218c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121f7858585600161273e565b5050505050565b80471015612241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612238906132ab565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161226790613152565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e49061328b565b60405180910390fd5b505050565b61230c828260405180602001604052806000815250612744565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fc611e31565b8786866040518563ffffffff1660e01b815260040161241e9493929190613182565b602060405180830381600087803b15801561243857600080fd5b505af192505050801561246957506040513d601f19601f820116820180604052508101906124669190612e0c565b60015b6124e3573d8060008114612499576040519150601f19603f3d011682016040523d82523d6000602084013e61249e565b606091505b506000815114156124db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461254590613606565b80601f016020809104026020016040519081016040528092919081815260200182805461257190613606565b80156125be5780601f10612593576101008083540402835291602001916125be565b820191906000526020600020905b8154815290600101906020018083116125a157829003601f168201915b5050505050905090565b60606000821415612610576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612724565b600082905060005b6000821461264257808061262b90613669565b915050600a8261263b9190613491565b9150612618565b60008167ffffffffffffffff81111561265e5761265d61379f565b5b6040519080825280601f01601f1916602001820160405280156126905781602001600182028036833780820191505090505b5090505b6000851461271d576001826126a9919061351c565b9150600a856126b891906136b2565b60306126c4919061343b565b60f81b8183815181106126da576126d9613770565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127169190613491565b9450612694565b8093505050505b919050565b600090565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127b1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156127ec576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127f9600085838661272e565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161285e600185146129f9565b901b60a042901b61286e86612734565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612972575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292260008784806001019550876123d6565b612958576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106128b357826000541461296d57600080fd5b6129dd565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612973575b8160008190555050506129f3600085838661273e565b50505050565b6000819050919050565b828054612a0f90613606565b90600052602060002090601f016020900481019282612a315760008555612a78565b82601f10612a4a57805160ff1916838001178555612a78565b82800160010185558215612a78579182015b82811115612a77578251825591602001919060010190612a5c565b5b509050612a859190612a89565b5090565b5b80821115612aa2576000816000905550600101612a8a565b5090565b6000612ab9612ab48461338b565b613366565b905082815260208101848484011115612ad557612ad46137d3565b5b612ae08482856135c4565b509392505050565b6000612afb612af6846133bc565b613366565b905082815260208101848484011115612b1757612b166137d3565b5b612b228482856135c4565b509392505050565b600081359050612b3981613a2b565b92915050565b600081359050612b4e81613a42565b92915050565b600081359050612b6381613a59565b92915050565b600081519050612b7881613a59565b92915050565b600082601f830112612b9357612b926137ce565b5b8135612ba3848260208601612aa6565b91505092915050565b600082601f830112612bc157612bc06137ce565b5b8135612bd1848260208601612ae8565b91505092915050565b600081359050612be981613a70565b92915050565b600060208284031215612c0557612c046137dd565b5b6000612c1384828501612b2a565b91505092915050565b60008060408385031215612c3357612c326137dd565b5b6000612c4185828601612b2a565b9250506020612c5285828601612b2a565b9150509250929050565b600080600060608486031215612c7557612c746137dd565b5b6000612c8386828701612b2a565b9350506020612c9486828701612b2a565b9250506040612ca586828701612bda565b9150509250925092565b60008060008060808587031215612cc957612cc86137dd565b5b6000612cd787828801612b2a565b9450506020612ce887828801612b2a565b9350506040612cf987828801612bda565b925050606085013567ffffffffffffffff811115612d1a57612d196137d8565b5b612d2687828801612b7e565b91505092959194509250565b60008060408385031215612d4957612d486137dd565b5b6000612d5785828601612b2a565b9250506020612d6885828601612b3f565b9150509250929050565b60008060408385031215612d8957612d886137dd565b5b6000612d9785828601612b2a565b9250506020612da885828601612bda565b9150509250929050565b600060208284031215612dc857612dc76137dd565b5b6000612dd684828501612b3f565b91505092915050565b600060208284031215612df557612df46137dd565b5b6000612e0384828501612b54565b91505092915050565b600060208284031215612e2257612e216137dd565b5b6000612e3084828501612b69565b91505092915050565b600060208284031215612e4f57612e4e6137dd565b5b600082013567ffffffffffffffff811115612e6d57612e6c6137d8565b5b612e7984828501612bac565b91505092915050565b600060208284031215612e9857612e976137dd565b5b6000612ea684828501612bda565b91505092915050565b612eb881613550565b82525050565b612ec781613562565b82525050565b6000612ed8826133ed565b612ee28185613403565b9350612ef28185602086016135d3565b612efb816137e2565b840191505092915050565b6000612f11826133f8565b612f1b818561341f565b9350612f2b8185602086016135d3565b612f34816137e2565b840191505092915050565b6000612f4a826133f8565b612f548185613430565b9350612f648185602086016135d3565b80840191505092915050565b6000612f7d60128361341f565b9150612f88826137f3565b602082019050919050565b6000612fa060268361341f565b9150612fab8261381c565b604082019050919050565b6000612fc3601a8361341f565b9150612fce8261386b565b602082019050919050565b6000612fe660138361341f565b9150612ff182613894565b602082019050919050565b6000613009603a8361341f565b9150613014826138bd565b604082019050919050565b600061302c601d8361341f565b91506130378261390c565b602082019050919050565b600061304f600d8361341f565b915061305a82613935565b602082019050919050565b6000613072600583613430565b915061307d8261395e565b600582019050919050565b600061309560208361341f565b91506130a082613987565b602082019050919050565b60006130b8602f8361341f565b91506130c3826139b0565b604082019050919050565b60006130db600083613414565b91506130e6826139ff565b600082019050919050565b60006130fe60088361341f565b915061310982613a02565b602082019050919050565b61311d816135ba565b82525050565b600061312f8285612f3f565b915061313b8284612f3f565b915061314682613065565b91508190509392505050565b600061315d826130ce565b9150819050919050565b600060208201905061317c6000830184612eaf565b92915050565b60006080820190506131976000830187612eaf565b6131a46020830186612eaf565b6131b16040830185613114565b81810360608301526131c38184612ecd565b905095945050505050565b60006020820190506131e36000830184612ebe565b92915050565b600060208201905081810360008301526132038184612f06565b905092915050565b6000602082019050818103600083015261322481612f70565b9050919050565b6000602082019050818103600083015261324481612f93565b9050919050565b6000602082019050818103600083015261326481612fb6565b9050919050565b6000602082019050818103600083015261328481612fd9565b9050919050565b600060208201905081810360008301526132a481612ffc565b9050919050565b600060208201905081810360008301526132c48161301f565b9050919050565b600060208201905081810360008301526132e481613042565b9050919050565b6000602082019050818103600083015261330481613088565b9050919050565b60006020820190508181036000830152613324816130ab565b9050919050565b60006020820190508181036000830152613344816130f1565b9050919050565b60006020820190506133606000830184613114565b92915050565b6000613370613381565b905061337c8282613638565b919050565b6000604051905090565b600067ffffffffffffffff8211156133a6576133a561379f565b5b6133af826137e2565b9050602081019050919050565b600067ffffffffffffffff8211156133d7576133d661379f565b5b6133e0826137e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613446826135ba565b9150613451836135ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613486576134856136e3565b5b828201905092915050565b600061349c826135ba565b91506134a7836135ba565b9250826134b7576134b6613712565b5b828204905092915050565b60006134cd826135ba565b91506134d8836135ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613511576135106136e3565b5b828202905092915050565b6000613527826135ba565b9150613532836135ba565b925082821015613545576135446136e3565b5b828203905092915050565b600061355b8261359a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135f15780820151818401526020810190506135d6565b83811115613600576000848401525b50505050565b6000600282049050600182168061361e57607f821691505b6020821081141561363257613631613741565b5b50919050565b613641826137e2565b810181811067ffffffffffffffff821117156136605761365f61379f565b5b80604052505050565b6000613674826135ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a7576136a66136e3565b5b600182019050919050565b60006136bd826135ba565b91506136c8836135ba565b9250826136d8576136d7613712565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820746f6b656e7320726561636865640000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742076616c756520746f206d696e74000000000000600082015250565b7f596f752068617665206d617820746f6b656e7300000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f46726565206d696e74206f666600000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f53616c65206f6666000000000000000000000000000000000000000000000000600082015250565b613a3481613550565b8114613a3f57600080fd5b50565b613a4b81613562565b8114613a5657600080fd5b50565b613a628161356e565b8114613a6d57600080fd5b50565b613a79816135ba565b8114613a8457600080fd5b5056fea26469706673582212201b833f37ca31d6507f212690a316988f7eed7996230305e1ae73dcf943364dbf64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000037697066733a2f2f516d64646565656331464a666666746f42586838713333336935526231313136723948655a43554c716566585858582f000000000000000000

-----Decoded View---------------
Arg [0] : maxTokens_ (uint256): 10000
Arg [1] : saleEnabled_ (bool): True
Arg [2] : freeMintEnabled_ (bool): True
Arg [3] : baseURI_ (string): ipfs://Qmddeeec1FJffftoBXh8q333i5Rb1116r9HeZCULqefXXXX/
Arg [4] : maxMintForUser_ (uint256): 1
Arg [5] : maxFreeMints_ (uint256): 500
Arg [6] : price_ (uint256): 5000000000000000

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [6] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [8] : 697066733a2f2f516d64646565656331464a666666746f425868387133333369
Arg [9] : 35526231313136723948655a43554c716566585858582f000000000000000000


Deployed Bytecode Sourcemap

33288:4520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6756:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10604:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12040:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11558:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34331:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35370:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35283:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12740:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36545:124;;;;;;;;;;;;;:::i;:::-;;34578:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12918:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35573:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35092:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37034:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36677:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34988:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10452:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34701:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7379:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27200:103;;;;;;;;;;;;;:::i;:::-;;35187:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36039:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26977:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37686:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35479:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37138:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35752:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12252:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13111:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37245:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34800:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34441:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36443:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12568:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27311:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36794:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6756:615;6841:4;7156:10;7141:25;;:11;:25;;;;:102;;;;7233:10;7218:25;;:11;:25;;;;7141:102;:179;;;;7310:10;7295:25;;:11;:25;;;;7141:179;7121:199;;6756:615;;;:::o;10604:100::-;10658:13;10691:5;10684:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10604:100;:::o;12040:204::-;12108:7;12133:16;12141:7;12133;:16::i;:::-;12128:64;;12158:34;;;;;;;;;;;;;;12128:64;12212:15;:24;12228:7;12212:24;;;;;;;;;;;;;;;;;;;;;12205:31;;12040:204;;;:::o;11558:474::-;11631:13;11663:27;11682:7;11663:18;:27::i;:::-;11631:61;;11713:5;11707:11;;:2;:11;;;11703:48;;;11727:24;;;;;;;;;;;;;;11703:48;11791:5;11768:28;;:19;:17;:19::i;:::-;:28;;;11764:175;;11816:44;11833:5;11840:19;:17;:19::i;:::-;11816:16;:44::i;:::-;11811:128;;11888:35;;;;;;;;;;;;;;11811:128;11764:175;11978:2;11951:15;:24;11967:7;11951:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12016:7;12012:2;11996:28;;12005:5;11996:28;;;;;;;;;;;;11620:412;11558:474;;:::o;34331:102::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34415:10:::1;34403:9;:22;;;;34331:102:::0;:::o;35370:101::-;35422:7;35449:14;:12;:14::i;:::-;35442:21;;35370:101;:::o;35283:79::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35353:1:::1;35338:12;;:16;;;;;;;;;;;;;;;;;;35283:79:::0;:::o;12740:170::-;12874:28;12884:4;12890:2;12894:7;12874:9;:28::i;:::-;12740:170;;;:::o;36545:124::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36600:61:::1;36626:10;36639:21;36600:17;:61::i;:::-;36545:124::o:0;34578:115::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34672:13:::1;34656;:29;;;;34578:115:::0;:::o;12918:185::-;13056:39;13073:4;13079:2;13083:7;13056:39;;;;;;;;;;;;:16;:39::i;:::-;12918:185;;;:::o;35573:171::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35676:5:::1;35655:17;:15;:17::i;:::-;:26;;35647:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35715:21;35725:3;35730:5;35715:9;:21::i;:::-;35573:171:::0;;:::o;35092:87::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35170:1:::1;35151:16;;:20;;;;;;;;;;;;;;;;;;35092:87:::0;:::o;37034:96::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37119:3:::1;37103:13;:19;;;;;;;;;;;;:::i;:::-;;37034:96:::0;:::o;36677:109::-;36725:7;36764:14;:12;:14::i;:::-;36752:9;;:26;;;;:::i;:::-;36745:33;;36677:109;:::o;34988:96::-;35037:4;35060:16;;;;;;;;;;;35053:23;;34988:96;:::o;10452:144::-;10516:7;10559:27;10578:7;10559:18;:27::i;:::-;10536:52;;10452:144;;;:::o;34701:91::-;34748:7;34775:9;;34768:16;;34701:91;:::o;7379:224::-;7443:7;7484:1;7467:19;;:5;:19;;;7463:60;;;7495:28;;;;;;;;;;;;;;7463:60;3232:13;7541:18;:25;7560:5;7541:25;;;;;;;;;;;;;;;;:54;7534:61;;7379:224;;;:::o;27200:103::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27265:30:::1;27292:1;27265:18;:30::i;:::-;27200:103::o:0;35187:88::-;35232:4;35255:12;;;;;;;;;;;35248:19;;35187:88;:::o;36039:396::-;36100:16;;;;;;;;;;;36092:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;36186:15;;36177:5;36153:9;:21;36163:10;36153:21;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:48;;36145:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36273:13;;36264:5;36244:17;;:25;;;;:::i;:::-;:42;;36236:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36321:28;36331:10;36343:5;36321:9;:28::i;:::-;36385:5;36360:9;:21;36370:10;36360:21;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;36422:5;36401:17;;:26;;;;;;;:::i;:::-;;;;;;;;36039:396;:::o;26977:87::-;27023:7;27050:6;;;;;;;;;;;27043:13;;26977:87;:::o;37686:119::-;37747:13;37780:17;37789:7;37780:8;:17::i;:::-;37773:24;;37686:119;;;:::o;35479:86::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35551:6:::1;35543:5;:14;;;;35479:86:::0;:::o;37138:99::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37226:3:::1;37211:12;:18;;;;;;;;;;;;:::i;:::-;;37138:99:::0;:::o;10712:104::-;10768:13;10801:7;10794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10712:104;:::o;35752:279::-;35817:12;;;;;;;;;;;35809:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;35880:5;;35874;:11;;;;:::i;:::-;35861:9;:24;;35853:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35956:5;35935:17;:15;:17::i;:::-;:26;;35927:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35995:28;36005:10;36017:5;35995:9;:28::i;:::-;35752:279;:::o;12252:308::-;12363:19;:17;:19::i;:::-;12351:31;;:8;:31;;;12347:61;;;12391:17;;;;;;;;;;;;;;12347:61;12473:8;12421:18;:39;12440:19;:17;:19::i;:::-;12421:39;;;;;;;;;;;;;;;:49;12461:8;12421:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12533:8;12497:55;;12512:19;:17;:19::i;:::-;12497:55;;;12543:8;12497:55;;;;;;:::i;:::-;;;;;;;;12252:308;;:::o;13111:396::-;13278:28;13288:4;13294:2;13298:7;13278:9;:28::i;:::-;13339:1;13321:2;:14;;;:19;13317:183;;13360:56;13391:4;13397:2;13401:7;13410:5;13360:30;:56::i;:::-;13355:145;;13444:40;;;;;;;;;;;;;;13355:145;13317:183;13111:396;;;;:::o;37245:433::-;37318:13;37352:16;37360:7;37352;:16::i;:::-;37344:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37477:1;37440:16;:25;37457:7;37440:25;;;;;;;;;;;37434:39;;;;;:::i;:::-;;;:44;37431:81;;37487:16;:25;37504:7;37487:25;;;;;;;;;;;37480:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37431:81;37523:21;37547:10;:8;:10::i;:::-;37523:34;;37599:1;37581:7;37575:21;:25;:95;;;;;;;;;;;;;;;;;37627:7;37636:18;:7;:16;:18::i;:::-;37610:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37575:95;37568:102;;;37245:433;;;;:::o;34800:180::-;34857:4;34880:16;;;;;;;;;;;:55;;;;;34920:15;;34900:9;:17;34910:6;34900:17;;;;;;;;;;;;;;;;:35;34880:55;:92;;;;;34959:13;;34939:17;;:33;34880:92;34873:99;;34800:180;;;:::o;34441:129::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34547:15:::1;34529;:33;;;;34441:129:::0;:::o;36443:94::-;36487:13;36517:12;36510:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36443:94;:::o;12568:164::-;12665:4;12689:18;:25;12708:5;12689:25;;;;;;;;;;;;;;;:35;12715:8;12689:35;;;;;;;;;;;;;;;;;;;;;;;;;12682:42;;12568:164;;;;:::o;27311:201::-;27123:12;:10;:12::i;:::-;27112:23;;:7;:5;:7::i;:::-;:23;;;27104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27420:1:::1;27400:22;;:8;:22;;;;27392:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27476:28;27495:8;27476:18;:28::i;:::-;27311:201:::0;:::o;36794:117::-;36843:7;36886:17;;36870:13;;:33;;;;:::i;:::-;36863:40;;36794:117;:::o;13515:273::-;13572:4;13628:7;13609:15;:13;:15::i;:::-;:26;;:66;;;;;13662:13;;13652:7;:23;13609:66;:152;;;;;13760:1;4002:8;13713:17;:26;13731:7;13713:26;;;;;;;;;;;;:43;:48;13609:152;13589:172;;13515:273;;;:::o;8489:1129::-;8556:7;8576:12;8591:7;8576:22;;8659:4;8640:15;:13;:15::i;:::-;:23;8636:915;;8693:13;;8686:4;:20;8682:869;;;8731:14;8748:17;:23;8766:4;8748:23;;;;;;;;;;;;8731:40;;8864:1;4002:8;8837:6;:23;:28;8833:699;;;9356:113;9373:1;9363:6;:11;9356:113;;;9416:17;:25;9434:6;;;;;;;9416:25;;;;;;;;;;;;9407:34;;9356:113;;;9502:6;9495:13;;;;;;8833:699;8708:843;8682:869;8636:915;9579:31;;;;;;;;;;;;;;8489:1129;;;;:::o;24310:105::-;24370:7;24397:10;24390:17;;24310:105;:::o;26466:98::-;26519:7;26546:10;26539:17;;26466:98;:::o;6361:285::-;6408:7;6612:15;:13;:15::i;:::-;6596:13;;:31;6589:38;;6361:285;:::o;17816:2515::-;17931:27;17961;17980:7;17961:18;:27::i;:::-;17931:57;;18046:4;18005:45;;18021:19;18005:45;;;18001:86;;18059:28;;;;;;;;;;;;;;18001:86;18100:22;18149:4;18126:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;18170:43;18187:4;18193:19;:17;:19::i;:::-;18170:16;:43::i;:::-;18126:87;:147;;;;18254:19;:17;:19::i;:::-;18230:43;;:20;18242:7;18230:11;:20::i;:::-;:43;;;18126:147;18100:174;;18292:17;18287:66;;18318:35;;;;;;;;;;;;;;18287:66;18382:1;18368:16;;:2;:16;;;18364:52;;;18393:23;;;;;;;;;;;;;;18364:52;18429:43;18451:4;18457:2;18461:7;18470:1;18429:21;:43::i;:::-;18545:15;:24;18561:7;18545:24;;;;;;;;;;;;18538:31;;;;;;;;;;;18937:18;:24;18956:4;18937:24;;;;;;;;;;;;;;;;18935:26;;;;;;;;;;;;19006:18;:22;19025:2;19006:22;;;;;;;;;;;;;;;;19004:24;;;;;;;;;;;4280:8;3886:3;19387:15;:41;;19345:21;19363:2;19345:17;:21::i;:::-;:84;:128;19299:17;:26;19317:7;19299:26;;;;;;;;;;;:174;;;;19643:1;4280:8;19593:19;:46;:51;19589:626;;;19665:19;19697:1;19687:7;:11;19665:33;;19854:1;19820:17;:30;19838:11;19820:30;;;;;;;;;;;;:35;19816:384;;;19958:13;;19943:11;:28;19939:242;;20138:19;20105:17;:30;20123:11;20105:30;;;;;;;;;;;:52;;;;19939:242;19816:384;19646:569;19589:626;20262:7;20258:2;20243:27;;20252:4;20243:27;;;;;;;;;;;;20281:42;20302:4;20308:2;20312:7;20321:1;20281:20;:42::i;:::-;17920:2411;;17816:2515;;;:::o;29816:317::-;29931:6;29906:21;:31;;29898:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29985:12;30003:9;:14;;30025:6;30003:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29984:52;;;30055:7;30047:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;29887:246;29816:317;;:::o;13796:104::-;13865:27;13875:2;13879:8;13865:27;;;;;;;;;;;;:9;:27::i;:::-;13796:104;;:::o;27520:191::-;27594:16;27613:6;;;;;;;;;;;27594:25;;27639:8;27630:6;;:17;;;;;;;;;;;;;;;;;;27694:8;27663:40;;27684:8;27663:40;;;;;;;;;;;;27583:128;27520:191;:::o;23253:716::-;23416:4;23462:2;23437:45;;;23483:19;:17;:19::i;:::-;23504:4;23510:7;23519:5;23437:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23433:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23737:1;23720:6;:13;:18;23716:235;;;23766:40;;;;;;;;;;;;;;23716:235;23909:6;23903:13;23894:6;23890:2;23886:15;23879:38;23433:529;23606:54;;;23596:64;;;:6;:64;;;;23589:71;;;23253:716;;;;;;:::o;36919:107::-;36972:13;37005;36998:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36919:107;:::o;27864:723::-;27920:13;28150:1;28141:5;:10;28137:53;;;28168:10;;;;;;;;;;;;;;;;;;;;;28137:53;28200:12;28215:5;28200:20;;28231:14;28256:78;28271:1;28263:4;:9;28256:78;;28289:8;;;;;:::i;:::-;;;;28320:2;28312:10;;;;;:::i;:::-;;;28256:78;;;28344:19;28376:6;28366:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28344:39;;28394:154;28410:1;28401:5;:10;28394:154;;28438:1;28428:11;;;;;:::i;:::-;;;28505:2;28497:5;:10;;;;:::i;:::-;28484:2;:24;;;;:::i;:::-;28471:39;;28454:6;28461;28454:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;28534:2;28525:11;;;;;:::i;:::-;;;28394:154;;;28572:6;28558:21;;;;;27864:723;;;;:::o;5836:92::-;5892:7;5836:92;:::o;23977:159::-;;;;;:::o;11252:148::-;11316:14;11377:5;11367:15;;11252:148;;;:::o;24144:158::-;;;;;:::o;13908:2236::-;14031:20;14054:13;;14031:36;;14096:1;14082:16;;:2;:16;;;14078:48;;;14107:19;;;;;;;;;;;;;;14078:48;14153:1;14141:8;:13;14137:44;;;14163:18;;;;;;;;;;;;;;14137:44;14194:61;14224:1;14228:2;14232:12;14246:8;14194:21;:61::i;:::-;14798:1;3369:2;14769:1;:25;;14768:31;14756:8;:44;14730:18;:22;14749:2;14730:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;4145:3;15199:29;15226:1;15214:8;:13;15199:14;:29::i;:::-;:56;;3886:3;15136:15;:41;;15094:21;15112:2;15094:17;:21::i;:::-;:84;:162;15043:17;:31;15061:12;15043:31;;;;;;;;;;;:213;;;;15273:20;15296:12;15273:35;;15323:11;15352:8;15337:12;:23;15323:37;;15399:1;15381:2;:14;;;:19;15377:635;;15421:313;15477:12;15473:2;15452:38;;15469:1;15452:38;;;;;;;;;;;;15518:69;15557:1;15561:2;15565:14;;;;;;15581:5;15518:30;:69::i;:::-;15513:174;;15623:40;;;;;;;;;;;;;;15513:174;15729:3;15714:12;:18;15421:313;;15815:12;15798:13;;:29;15794:43;;15829:8;;;15794:43;15377:635;;;15878:119;15934:14;;;;;;15930:2;15909:40;;15926:1;15909:40;;;;;;;;;;;;15992:3;15977:12;:18;15878:119;;15377:635;16042:12;16026:13;:28;;;;14507:1559;;16076:60;16105:1;16109:2;16113:12;16127:8;16076:20;:60::i;:::-;14020:2124;13908:2236;;;:::o;11408:142::-;11466:14;11527:5;11517:15;;11408:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:::-;10847:3;10868:67;10932:2;10927:3;10868:67;:::i;:::-;10861:74;;10944:93;11033:3;10944:93;:::i;:::-;11062:2;11057:3;11053:12;11046:19;;10705:366;;;:::o;11077:::-;11219:3;11240:67;11304:2;11299:3;11240:67;:::i;:::-;11233:74;;11316:93;11405:3;11316:93;:::i;:::-;11434:2;11429:3;11425:12;11418:19;;11077:366;;;:::o;11449:400::-;11609:3;11630:84;11712:1;11707:3;11630:84;:::i;:::-;11623:91;;11723:93;11812:3;11723:93;:::i;:::-;11841:1;11836:3;11832:11;11825:18;;11449:400;;;:::o;11855:366::-;11997:3;12018:67;12082:2;12077:3;12018:67;:::i;:::-;12011:74;;12094:93;12183:3;12094:93;:::i;:::-;12212:2;12207:3;12203:12;12196:19;;11855:366;;;:::o;12227:::-;12369:3;12390:67;12454:2;12449:3;12390:67;:::i;:::-;12383:74;;12466:93;12555:3;12466:93;:::i;:::-;12584:2;12579:3;12575:12;12568:19;;12227:366;;;:::o;12599:398::-;12758:3;12779:83;12860:1;12855:3;12779:83;:::i;:::-;12772:90;;12871:93;12960:3;12871:93;:::i;:::-;12989:1;12984:3;12980:11;12973:18;;12599:398;;;:::o;13003:365::-;13145:3;13166:66;13230:1;13225:3;13166:66;:::i;:::-;13159:73;;13241:93;13330:3;13241:93;:::i;:::-;13359:2;13354:3;13350:12;13343:19;;13003:365;;;:::o;13374:118::-;13461:24;13479:5;13461:24;:::i;:::-;13456:3;13449:37;13374:118;;:::o;13498:701::-;13779:3;13801:95;13892:3;13883:6;13801:95;:::i;:::-;13794:102;;13913:95;14004:3;13995:6;13913:95;:::i;:::-;13906:102;;14025:148;14169:3;14025:148;:::i;:::-;14018:155;;14190:3;14183:10;;13498:701;;;;;:::o;14205:379::-;14389:3;14411:147;14554:3;14411:147;:::i;:::-;14404:154;;14575:3;14568:10;;14205:379;;;:::o;14590:222::-;14683:4;14721:2;14710:9;14706:18;14698:26;;14734:71;14802:1;14791:9;14787:17;14778:6;14734:71;:::i;:::-;14590:222;;;;:::o;14818:640::-;15013:4;15051:3;15040:9;15036:19;15028:27;;15065:71;15133:1;15122:9;15118:17;15109:6;15065:71;:::i;:::-;15146:72;15214:2;15203:9;15199:18;15190:6;15146:72;:::i;:::-;15228;15296:2;15285:9;15281:18;15272:6;15228:72;:::i;:::-;15347:9;15341:4;15337:20;15332:2;15321:9;15317:18;15310:48;15375:76;15446:4;15437:6;15375:76;:::i;:::-;15367:84;;14818:640;;;;;;;:::o;15464:210::-;15551:4;15589:2;15578:9;15574:18;15566:26;;15602:65;15664:1;15653:9;15649:17;15640:6;15602:65;:::i;:::-;15464:210;;;;:::o;15680:313::-;15793:4;15831:2;15820:9;15816:18;15808:26;;15880:9;15874:4;15870:20;15866:1;15855:9;15851:17;15844:47;15908:78;15981:4;15972:6;15908:78;:::i;:::-;15900:86;;15680:313;;;;:::o;15999:419::-;16165:4;16203:2;16192:9;16188:18;16180:26;;16252:9;16246:4;16242:20;16238:1;16227:9;16223:17;16216:47;16280:131;16406:4;16280:131;:::i;:::-;16272:139;;15999:419;;;:::o;16424:::-;16590:4;16628:2;16617:9;16613:18;16605:26;;16677:9;16671:4;16667:20;16663:1;16652:9;16648:17;16641:47;16705:131;16831:4;16705:131;:::i;:::-;16697:139;;16424:419;;;:::o;16849:::-;17015:4;17053:2;17042:9;17038:18;17030:26;;17102:9;17096:4;17092:20;17088:1;17077:9;17073:17;17066:47;17130:131;17256:4;17130:131;:::i;:::-;17122:139;;16849:419;;;:::o;17274:::-;17440:4;17478:2;17467:9;17463:18;17455:26;;17527:9;17521:4;17517:20;17513:1;17502:9;17498:17;17491:47;17555:131;17681:4;17555:131;:::i;:::-;17547:139;;17274:419;;;:::o;17699:::-;17865:4;17903:2;17892:9;17888:18;17880:26;;17952:9;17946:4;17942:20;17938:1;17927:9;17923:17;17916:47;17980:131;18106:4;17980:131;:::i;:::-;17972:139;;17699:419;;;:::o;18124:::-;18290:4;18328:2;18317:9;18313:18;18305:26;;18377:9;18371:4;18367:20;18363:1;18352:9;18348:17;18341:47;18405:131;18531:4;18405:131;:::i;:::-;18397:139;;18124:419;;;:::o;18549:::-;18715:4;18753:2;18742:9;18738:18;18730:26;;18802:9;18796:4;18792:20;18788:1;18777:9;18773:17;18766:47;18830:131;18956:4;18830:131;:::i;:::-;18822:139;;18549:419;;;:::o;18974:::-;19140:4;19178:2;19167:9;19163:18;19155:26;;19227:9;19221:4;19217:20;19213:1;19202:9;19198:17;19191:47;19255:131;19381:4;19255:131;:::i;:::-;19247:139;;18974:419;;;:::o;19399:::-;19565:4;19603:2;19592:9;19588:18;19580:26;;19652:9;19646:4;19642:20;19638:1;19627:9;19623:17;19616:47;19680:131;19806:4;19680:131;:::i;:::-;19672:139;;19399:419;;;:::o;19824:::-;19990:4;20028:2;20017:9;20013:18;20005:26;;20077:9;20071:4;20067:20;20063:1;20052:9;20048:17;20041:47;20105:131;20231:4;20105:131;:::i;:::-;20097:139;;19824:419;;;:::o;20249:222::-;20342:4;20380:2;20369:9;20365:18;20357:26;;20393:71;20461:1;20450:9;20446:17;20437:6;20393:71;:::i;:::-;20249:222;;;;:::o;20477:129::-;20511:6;20538:20;;:::i;:::-;20528:30;;20567:33;20595:4;20587:6;20567:33;:::i;:::-;20477:129;;;:::o;20612:75::-;20645:6;20678:2;20672:9;20662:19;;20612:75;:::o;20693:307::-;20754:4;20844:18;20836:6;20833:30;20830:56;;;20866:18;;:::i;:::-;20830:56;20904:29;20926:6;20904:29;:::i;:::-;20896:37;;20988:4;20982;20978:15;20970:23;;20693:307;;;:::o;21006:308::-;21068:4;21158:18;21150:6;21147:30;21144:56;;;21180:18;;:::i;:::-;21144:56;21218:29;21240:6;21218:29;:::i;:::-;21210:37;;21302:4;21296;21292:15;21284:23;;21006:308;;;:::o;21320:98::-;21371:6;21405:5;21399:12;21389:22;;21320:98;;;:::o;21424:99::-;21476:6;21510:5;21504:12;21494:22;;21424:99;;;:::o;21529:168::-;21612:11;21646:6;21641:3;21634:19;21686:4;21681:3;21677:14;21662:29;;21529:168;;;;:::o;21703:147::-;21804:11;21841:3;21826:18;;21703:147;;;;:::o;21856:169::-;21940:11;21974:6;21969:3;21962:19;22014:4;22009:3;22005:14;21990:29;;21856:169;;;;:::o;22031:148::-;22133:11;22170:3;22155:18;;22031:148;;;;:::o;22185:305::-;22225:3;22244:20;22262:1;22244:20;:::i;:::-;22239:25;;22278:20;22296:1;22278:20;:::i;:::-;22273:25;;22432:1;22364:66;22360:74;22357:1;22354:81;22351:107;;;22438:18;;:::i;:::-;22351:107;22482:1;22479;22475:9;22468:16;;22185:305;;;;:::o;22496:185::-;22536:1;22553:20;22571:1;22553:20;:::i;:::-;22548:25;;22587:20;22605:1;22587:20;:::i;:::-;22582:25;;22626:1;22616:35;;22631:18;;:::i;:::-;22616:35;22673:1;22670;22666:9;22661:14;;22496:185;;;;:::o;22687:348::-;22727:7;22750:20;22768:1;22750:20;:::i;:::-;22745:25;;22784:20;22802:1;22784:20;:::i;:::-;22779:25;;22972:1;22904:66;22900:74;22897:1;22894:81;22889:1;22882:9;22875:17;22871:105;22868:131;;;22979:18;;:::i;:::-;22868:131;23027:1;23024;23020:9;23009:20;;22687:348;;;;:::o;23041:191::-;23081:4;23101:20;23119:1;23101:20;:::i;:::-;23096:25;;23135:20;23153:1;23135:20;:::i;:::-;23130:25;;23174:1;23171;23168:8;23165:34;;;23179:18;;:::i;:::-;23165:34;23224:1;23221;23217:9;23209:17;;23041:191;;;;:::o;23238:96::-;23275:7;23304:24;23322:5;23304:24;:::i;:::-;23293:35;;23238:96;;;:::o;23340:90::-;23374:7;23417:5;23410:13;23403:21;23392:32;;23340:90;;;:::o;23436:149::-;23472:7;23512:66;23505:5;23501:78;23490:89;;23436:149;;;:::o;23591:126::-;23628:7;23668:42;23661:5;23657:54;23646:65;;23591:126;;;:::o;23723:77::-;23760:7;23789:5;23778:16;;23723:77;;;:::o;23806:154::-;23890:6;23885:3;23880;23867:30;23952:1;23943:6;23938:3;23934:16;23927:27;23806:154;;;:::o;23966:307::-;24034:1;24044:113;24058:6;24055:1;24052:13;24044:113;;;24143:1;24138:3;24134:11;24128:18;24124:1;24119:3;24115:11;24108:39;24080:2;24077:1;24073:10;24068:15;;24044:113;;;24175:6;24172:1;24169:13;24166:101;;;24255:1;24246:6;24241:3;24237:16;24230:27;24166:101;24015:258;23966:307;;;:::o;24279:320::-;24323:6;24360:1;24354:4;24350:12;24340:22;;24407:1;24401:4;24397:12;24428:18;24418:81;;24484:4;24476:6;24472:17;24462:27;;24418:81;24546:2;24538:6;24535:14;24515:18;24512:38;24509:84;;;24565:18;;:::i;:::-;24509:84;24330:269;24279:320;;;:::o;24605:281::-;24688:27;24710:4;24688:27;:::i;:::-;24680:6;24676:40;24818:6;24806:10;24803:22;24782:18;24770:10;24767:34;24764:62;24761:88;;;24829:18;;:::i;:::-;24761:88;24869:10;24865:2;24858:22;24648:238;24605:281;;:::o;24892:233::-;24931:3;24954:24;24972:5;24954:24;:::i;:::-;24945:33;;25000:66;24993:5;24990:77;24987:103;;;25070:18;;:::i;:::-;24987:103;25117:1;25110:5;25106:13;25099:20;;24892:233;;;:::o;25131:176::-;25163:1;25180:20;25198:1;25180:20;:::i;:::-;25175:25;;25214:20;25232:1;25214:20;:::i;:::-;25209:25;;25253:1;25243:35;;25258:18;;:::i;:::-;25243:35;25299:1;25296;25292:9;25287:14;;25131:176;;;;:::o;25313:180::-;25361:77;25358:1;25351:88;25458:4;25455:1;25448:15;25482:4;25479:1;25472:15;25499:180;25547:77;25544:1;25537:88;25644:4;25641:1;25634:15;25668:4;25665:1;25658:15;25685:180;25733:77;25730:1;25723:88;25830:4;25827:1;25820:15;25854:4;25851:1;25844:15;25871:180;25919:77;25916:1;25909:88;26016:4;26013:1;26006:15;26040:4;26037:1;26030:15;26057:180;26105:77;26102:1;26095:88;26202:4;26199:1;26192:15;26226:4;26223:1;26216:15;26243:117;26352:1;26349;26342:12;26366:117;26475:1;26472;26465:12;26489:117;26598:1;26595;26588:12;26612:117;26721:1;26718;26711:12;26735:102;26776:6;26827:2;26823:7;26818:2;26811:5;26807:14;26803:28;26793:38;;26735:102;;;:::o;26843:168::-;26983:20;26979:1;26971:6;26967:14;26960:44;26843:168;:::o;27017:225::-;27157:34;27153:1;27145:6;27141:14;27134:58;27226:8;27221:2;27213:6;27209:15;27202:33;27017:225;:::o;27248:176::-;27388:28;27384:1;27376:6;27372:14;27365:52;27248:176;:::o;27430:169::-;27570:21;27566:1;27558:6;27554:14;27547:45;27430:169;:::o;27605:245::-;27745:34;27741:1;27733:6;27729:14;27722:58;27814:28;27809:2;27801:6;27797:15;27790:53;27605:245;:::o;27856:179::-;27996:31;27992:1;27984:6;27980:14;27973:55;27856:179;:::o;28041:163::-;28181:15;28177:1;28169:6;28165:14;28158:39;28041:163;:::o;28210:155::-;28350:7;28346:1;28338:6;28334:14;28327:31;28210:155;:::o;28371:182::-;28511:34;28507:1;28499:6;28495:14;28488:58;28371:182;:::o;28559:234::-;28699:34;28695:1;28687:6;28683:14;28676:58;28768:17;28763:2;28755:6;28751:15;28744:42;28559:234;:::o;28799:114::-;;:::o;28919:158::-;29059:10;29055:1;29047:6;29043:14;29036:34;28919:158;:::o;29083:122::-;29156:24;29174:5;29156:24;:::i;:::-;29149:5;29146:35;29136:63;;29195:1;29192;29185:12;29136:63;29083:122;:::o;29211:116::-;29281:21;29296:5;29281:21;:::i;:::-;29274:5;29271:32;29261:60;;29317:1;29314;29307:12;29261:60;29211:116;:::o;29333:120::-;29405:23;29422:5;29405:23;:::i;:::-;29398:5;29395:34;29385:62;;29443:1;29440;29433:12;29385:62;29333:120;:::o;29459:122::-;29532:24;29550:5;29532:24;:::i;:::-;29525:5;29522:35;29512:63;;29571:1;29568;29561:12;29512:63;29459:122;:::o

Swarm Source

ipfs://1b833f37ca31d6507f212690a316988f7eed7996230305e1ae73dcf943364dbf
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.