ETH Price: $3,480.25 (+5.13%)
Gas: 14 Gwei

Token

wgmis (WGMIS)
 

Overview

Max Total Supply

8,888 WGMIS

Holders

1,203

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
africanartnfts.eth
Balance
2 WGMIS
0x757f179e05c4c0dd8932e8ce12e59fd567130cff
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:
Wgmis

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : Wgmis.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

import "./interfaces/IRandomNumberConsumer.sol";
import "./interfaces/IERC2981.sol";

interface IWgmisMerkleTreeWhitelist {
    function isValidMerkleProof(bytes32[] calldata _merkleProof, address _minter, uint96 _amount) external view returns (bool);
}

contract Wgmis is ERC721, Ownable {
    using Strings for uint256;

    // Controlled variables
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    uint256 public price;
    bool public isRandomnessRequested;
    bytes32 public randomNumberRequestId;
    uint256 public vrfResult;
    uint256 public foundationMinted;
    mapping(address => bool) public merkleWhitelistClaimed;
    mapping(address => uint256) public merkleWhitelistEarlyAccessMintCount;

    // Static
    uint16 public earlyAccessAllowance = 10;
    uint96 public foundationAllowance = 150;

    // Config variables
    string public preRevealURI;
    string public baseURI;
    uint256 public supplyLimit;
    uint256 public mintingStartTimeUnix;
    uint256 public singleOrderLimit;
    address public vrfProvider;
    address[] public payoutAddresses;
    uint16[] public payoutAddressBasisPoints;
    address public royaltyReceiver;
    uint16 public royaltyBasisPoints;
    // A merkle-proof-based whitelist for initial batch of whitelisted addresses
    // All whitelisted addresses must be defined at time of WgmisMerkleTreeWhitelist deployment
    IWgmisMerkleTreeWhitelist merkleProofWhitelist;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        string memory _preRevealURI,
        string memory _baseURI,
        uint256 _supplyLimit,
        uint256 _mintingStartTimeUnix,
        uint256 _singleOrderLimit,
        address _vrfProvider,
        address[] memory _payoutAddresses,
        uint16[] memory _payoutAddressBasisPoints,
        address _merkleProofWhitelist
    ) ERC721(_tokenName, _tokenSymbol) {
        preRevealURI = _preRevealURI;
        baseURI = _baseURI;
        supplyLimit = _supplyLimit;
        mintingStartTimeUnix = _mintingStartTimeUnix;
        singleOrderLimit = _singleOrderLimit;
        vrfProvider = _vrfProvider;
        uint256 totalBasisPoints;
        for(uint256 i = 0; i < _payoutAddresses.length; i++) {
            require((_payoutAddressBasisPoints[i] > 0) && (_payoutAddressBasisPoints[i] <= 10000)); // "BP_NOT_BETWEEN_0_AND_10000"
            totalBasisPoints += _payoutAddressBasisPoints[i];
        }
        require(totalBasisPoints == 10000); // "BP_MUST_ADD_TO_10000"
        payoutAddresses = _payoutAddresses;
        payoutAddressBasisPoints = _payoutAddressBasisPoints;
        merkleProofWhitelist = IWgmisMerkleTreeWhitelist(_merkleProofWhitelist);
        foundationMinted = 0;
        price = 0.069 ether;
    }

    // We signify support for ERC2981, ERC721 & ERC721Metadata
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function mint(address _recipient, uint96 _quantity) external payable {
        require(isRandomnessRequested == false, "MINTING_OVER");
        require(_quantity > 0, "NO_ZERO_QUANTITY");
        require(block.timestamp >= mintingStartTimeUnix, "MINTING_PERIOD_NOT_STARTED");
        require(_quantity <= singleOrderLimit, "EXCEEDS_SINGLE_ORDER_LIMIT");
        require((_tokenIds.current() + _quantity) <= supplyLimit, "EXCEEDS_MAX_SUPPLY");
        require((msg.value) == (price * _quantity), "INCORRECT_ETH_VALUE");

        _handleMint(_recipient, _quantity);
    }

    function mintFoundation(address _recipient, uint96 _quantity) external onlyOwner {
        require(isRandomnessRequested == false); // "MINTING_OVER"
        require(_quantity > 0, "NO_ZERO_QUANTITY");
        require((foundationMinted + _quantity) <= foundationAllowance, "FOUNDATION_MINT_EXCEEDS_ALLOWANCE");
        require((_tokenIds.current() + _quantity) <= supplyLimit, "EXCEEDS_MAX_SUPPLY");
        foundationMinted += _quantity;
        _handleMint(_recipient, _quantity);
    }

    function mintMerkleWhitelist(bytes32[] calldata _merkleProof, uint96 _quantity) external {
        require(isRandomnessRequested == false, "MINTING_OVER");
        require(block.timestamp >= (mintingStartTimeUnix - 24 hours), "EARLY_ACCESS_NOT_STARTED");
        require((_tokenIds.current() + _quantity) <= supplyLimit, "EXCEEDS_MAX_SUPPLY");
        require(!merkleWhitelistClaimed[msg.sender], 'MERKLE_CLAIM_ALREADY_MADE');
        require(merkleProofWhitelist.isValidMerkleProof(_merkleProof, msg.sender, _quantity), 'INVALID_MERKLE_PROOF');

        merkleWhitelistClaimed[msg.sender] = true;

        _handleMint(msg.sender, _quantity);
    }

    function mintMerkleWhitelistEarlyAccess(bytes32[] calldata _merkleProof, uint96 _merkleProofAmount, uint96 _mintAmount) external payable {
        require(merkleProofWhitelist.isValidMerkleProof(_merkleProof, msg.sender, _merkleProofAmount), 'INVALID_MERKLE_PROOF');
        require(isRandomnessRequested == false, "MINTING_OVER");
        require(block.timestamp >= (mintingStartTimeUnix - 24 hours), "EARLY_ACCESS_NOT_STARTED");
        require((_tokenIds.current() + _mintAmount) <= supplyLimit, "EXCEEDS_MAX_SUPPLY");
        require((msg.value) == (price * _mintAmount), "INCORRECT_ETH_VALUE");

        merkleWhitelistEarlyAccessMintCount[msg.sender] += _mintAmount;

        require(merkleWhitelistEarlyAccessMintCount[msg.sender] <= earlyAccessAllowance, "EXCEEDS_EARLY_ACCESS_ALLOWANCE");

        _handleMint(msg.sender, _mintAmount);
    }

    function _handleMint(address _recipient, uint96 _quantity) internal {
        for(uint96 i = 0; i < _quantity; i++) {
            _tokenIds.increment();
            uint256 newTokenId = _tokenIds.current();
            _mint(_recipient, newTokenId);
        }
    }

    function initiateRandomDistribution() external {
        require(_tokenIds.current() == supplyLimit, "MINTING_ONGOING");
        require(isRandomnessRequested == false, "RANDOMNESS_REQ_NOT_INITIATED");
        IRandomNumberConsumer randomNumberConsumer = IRandomNumberConsumer(vrfProvider);
        randomNumberRequestId = randomNumberConsumer.getRandomNumber();
        isRandomnessRequested = true;
    }

    function forceInitiateRandomDistribution() external onlyOwner {
        // Forces ending of minting period by skipping check for all tokens being minted
        uint256 supply = _tokenIds.current();
        require(supply > 0);
        require(isRandomnessRequested == false);
        IRandomNumberConsumer randomNumberConsumer = IRandomNumberConsumer(vrfProvider);
        randomNumberRequestId = randomNumberConsumer.getRandomNumber();
        isRandomnessRequested = true;
    }

    function commitRandomDistribution() external {
        require(isRandomnessRequested == true, "RANDOMNESS_REQ_NOT_INITIATED");
        IRandomNumberConsumer randomNumberConsumer = IRandomNumberConsumer(vrfProvider);
        uint256 result = randomNumberConsumer.readFulfilledRandomness(randomNumberRequestId);
        require(result > 0, "RANDOMNESS_NOT_FULFILLED");
        vrfResult = result;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "NONEXISTENT_TOKEN");

        if (vrfResult == 0) {
            return preRevealURI;
        }

        string memory tokenURI_ = metadataOf(tokenId);
        
        return string(abi.encodePacked(baseURI, tokenURI_, ".json"));
    }

    function metadataOf(uint256 _tokenId) public view returns (string memory) {
        require((_tokenId > 0) && (_tokenId <= totalSupply()), "INVALID_TOKEN_ID");

        uint256 seed_ = vrfResult;
        if (seed_ == 0) {
            return "";
        }

        uint256[] memory randomIds = new uint256[](supplyLimit);
        for (uint256 i = 0; i < supplyLimit; i++) {
            randomIds[i] = 8888 - i;
        }

        for (uint256 i = 0; i < supplyLimit - 1; i++) {
            uint256 j = i + (uint256(keccak256(abi.encode(seed_, i))) % (supplyLimit - i));
            (randomIds[i], randomIds[j]) = (randomIds[j], randomIds[i]);
        }

        return randomIds[_tokenId - 1].toString();
    }

    function totalSupply() public view returns(uint256) {
        return _tokenIds.current();
    }

    // Fee distribution logic below

    modifier onlyFeeRecipientOrOwner() {
        bool isFeeRecipient = false;
        for(uint256 i = 0; i < payoutAddresses.length; i++) {
            if(payoutAddresses[i] == msg.sender) {
                isFeeRecipient = true;
            }
        }
        require((isFeeRecipient == true) || (owner() == _msgSender()));
        _;
    }

    function getPercentageOf(
        uint256 _amount,
        uint16 _basisPoints
    ) internal pure returns (uint256 value) {
        value = (_amount * _basisPoints) / 10000;
    }

    function distributeFees() public onlyFeeRecipientOrOwner {
        uint256 feeCutsTotal;
        uint256 balance = address(this).balance;
        for(uint256 i = 0; i < payoutAddresses.length; i++) {
            uint256 feeCut;
            if(i < (payoutAddresses.length - 1)) {
                feeCut = getPercentageOf(balance, payoutAddressBasisPoints[i]);
            } else {
                feeCut = (balance - feeCutsTotal);
            }
            feeCutsTotal += feeCut;
            (bool feeCutDeliverySuccess, ) = payoutAddresses[i].call{value: feeCut}("");
            require(feeCutDeliverySuccess, "FEE_CUT_NO_DELIVERY");
        }
    }
    
    function updateFeePayoutScheme(
      address[] memory _payoutAddresses,
      uint16[] memory _payoutAddressBasisPoints
    ) public onlyOwner {
        payoutAddresses = _payoutAddresses;
        payoutAddressBasisPoints = _payoutAddressBasisPoints;
    }

    function updateMerkleProofWhitelist(address _merkleProofWhitelist) external onlyOwner {
        require(isRandomnessRequested == false);
        merkleProofWhitelist = IWgmisMerkleTreeWhitelist(_merkleProofWhitelist);
    }

    // ERC2981 logic

    function updateRoyaltyInfo(address _royaltyReceiver, uint16 _royaltyBasisPoints) external onlyOwner {
        royaltyReceiver = _royaltyReceiver;
        royaltyBasisPoints = _royaltyBasisPoints;
    }

    // Takes a _tokenId and _price (in wei) and returns the royalty receiver's address and how much of a royalty the royalty receiver is owed
    function royaltyInfo(uint256 _tokenId, uint256 _price) external view returns (address receiver, uint256 royaltyAmount) {
        receiver = royaltyReceiver;
        royaltyAmount = getPercentageOf(_price, royaltyBasisPoints);
    }

}

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

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

File 3 of 14 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

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

File 4 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 5 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 6 of 14 : IRandomNumberConsumer.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;

interface IRandomNumberConsumer {

  function getRandomNumber() external returns (bytes32 requestId);
  function readFulfilledRandomness(bytes32 requestId) external view returns (uint256);
  function setRandomnessRequesterApproval(address _requester, bool _approvalStatus) external;

}

File 7 of 14 : IERC2981.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;

// OpenZeppelin Contracts @ version 4.5.0
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/**
 * @title IERC2981 interface
 *
 * @notice NFT Royalty Standard.
 *
 * See https://eips.ethereum.org/EIPS/eip-2981
 */
interface IERC2981 is IERC165 {

    /**
     * @notice Determine how much royalty is owed (if any) and to whom.
     * @param _tokenId - the NFT asset queried for royalty information
     * @param _salePrice - the sale price of the NFT asset specified by _tokenId
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for _salePrice
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
    external
    view
    returns (
        address receiver,
        uint256 royaltyAmount
    );

}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 11 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_preRevealURI","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"uint256","name":"_supplyLimit","type":"uint256"},{"internalType":"uint256","name":"_mintingStartTimeUnix","type":"uint256"},{"internalType":"uint256","name":"_singleOrderLimit","type":"uint256"},{"internalType":"address","name":"_vrfProvider","type":"address"},{"internalType":"address[]","name":"_payoutAddresses","type":"address[]"},{"internalType":"uint16[]","name":"_payoutAddressBasisPoints","type":"uint16[]"},{"internalType":"address","name":"_merkleProofWhitelist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitRandomDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyAccessAllowance","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceInitiateRandomDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundationAllowance","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundationMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRandomDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRandomnessRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"merkleWhitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"merkleWhitelistEarlyAccessMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"metadataOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint96","name":"_quantity","type":"uint96"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint96","name":"_quantity","type":"uint96"}],"name":"mintFoundation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint96","name":"_quantity","type":"uint96"}],"name":"mintMerkleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint96","name":"_merkleProofAmount","type":"uint96"},{"internalType":"uint96","name":"_mintAmount","type":"uint96"}],"name":"mintMerkleWhitelistEarlyAccess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingStartTimeUnix","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutAddressBasisPoints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomNumberRequestId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBasisPoints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singleOrderLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_payoutAddresses","type":"address[]"},{"internalType":"uint16[]","name":"_payoutAddressBasisPoints","type":"uint16[]"}],"name":"updateFeePayoutScheme","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_merkleProofWhitelist","type":"address"}],"name":"updateMerkleProofWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint16","name":"_royaltyBasisPoints","type":"uint16"}],"name":"updateRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vrfProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfResult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600a600f60006101000a81548161ffff021916908361ffff1602179055506096600f60026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055503480156200006157600080fd5b5060405162006c3238038062006c328339818101604052810190620000879190620007ed565b8a8a8160009080519060200190620000a192919062000402565b508060019080519060200190620000ba92919062000402565b505050620000dd620000d16200033460201b60201c565b6200033c60201b60201c565b8860109080519060200190620000f592919062000402565b5087601190805190602001906200010e92919062000402565b5086601281905550856013819055508460148190555083601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600080600090505b845181101562000289576000848281518110620001b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161ffff1611801562000214575061271084828151811062000205577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161ffff1611155b6200021e57600080fd5b83818151811062000258577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161ffff168262000271919062000a47565b91508080620002809062000b92565b9150506200016d565b5061271081146200029957600080fd5b8360169080519060200190620002b192919062000493565b508260179080519060200190620002ca92919062000522565b5081601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c8190555066f523226980800060088190555050505050505050505050505062000ccc565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004109062000b26565b90600052602060002090601f01602090048101928262000434576000855562000480565b82601f106200044f57805160ff191683800117855562000480565b8280016001018555821562000480579182015b828111156200047f57825182559160200191906001019062000462565b5b5090506200048f9190620005d3565b5090565b8280548282559060005260206000209081019282156200050f579160200282015b828111156200050e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620004b4565b5b5090506200051e9190620005d3565b5090565b82805482825590600052602060002090600f01601090048101928215620005c05791602002820160005b838211156200058e57835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200054c565b8015620005be5782816101000a81549061ffff02191690556002016020816001010492830192600103026200058e565b505b509050620005cf9190620005d3565b5090565b5b80821115620005ee576000816000905550600101620005d4565b5090565b6000620006096200060384620009b3565b6200098a565b905080838252602082019050828560208602820111156200062957600080fd5b60005b858110156200065d578162000642888262000721565b8452602084019350602083019250506001810190506200062c565b5050509392505050565b60006200067e6200067884620009e2565b6200098a565b905080838252602082019050828560208602820111156200069e57600080fd5b60005b85811015620006d25781620006b78882620007bf565b845260208401935060208301925050600181019050620006a1565b5050509392505050565b6000620006f3620006ed8462000a11565b6200098a565b9050828152602081018484840111156200070c57600080fd5b6200071984828562000af0565b509392505050565b600081519050620007328162000c7e565b92915050565b600082601f8301126200074a57600080fd5b81516200075c848260208601620005f2565b91505092915050565b600082601f8301126200077757600080fd5b81516200078984826020860162000667565b91505092915050565b600082601f830112620007a457600080fd5b8151620007b6848260208601620006dc565b91505092915050565b600081519050620007d08162000c98565b92915050565b600081519050620007e78162000cb2565b92915050565b60008060008060008060008060008060006101608c8e0312156200081057600080fd5b60008c015167ffffffffffffffff8111156200082b57600080fd5b620008398e828f0162000792565b9b505060208c015167ffffffffffffffff8111156200085757600080fd5b620008658e828f0162000792565b9a505060408c015167ffffffffffffffff8111156200088357600080fd5b620008918e828f0162000792565b99505060608c015167ffffffffffffffff811115620008af57600080fd5b620008bd8e828f0162000792565b9850506080620008d08e828f01620007d6565b97505060a0620008e38e828f01620007d6565b96505060c0620008f68e828f01620007d6565b95505060e0620009098e828f0162000721565b9450506101008c015167ffffffffffffffff8111156200092857600080fd5b620009368e828f0162000738565b9350506101208c015167ffffffffffffffff8111156200095557600080fd5b620009638e828f0162000765565b925050610140620009778e828f0162000721565b9150509295989b509295989b9093969950565b600062000996620009a9565b9050620009a4828262000b5c565b919050565b6000604051905090565b600067ffffffffffffffff821115620009d157620009d062000c3e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a0057620009ff62000c3e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a2f5762000a2e62000c3e565b5b62000a3a8262000c6d565b9050602081019050919050565b600062000a548262000ae6565b915062000a618362000ae6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a995762000a9862000be0565b5b828201905092915050565b600062000ab18262000ac6565b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1057808201518184015260208101905062000af3565b8381111562000b20576000848401525b50505050565b6000600282049050600182168062000b3f57607f821691505b6020821081141562000b565762000b5562000c0f565b5b50919050565b62000b678262000c6d565b810181811067ffffffffffffffff8211171562000b895762000b8862000c3e565b5b80604052505050565b600062000b9f8262000ae6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000bd55762000bd462000be0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b62000c898162000aa4565b811462000c9557600080fd5b50565b62000ca38162000ab8565b811462000caf57600080fd5b50565b62000cbd8162000ae6565b811462000cc957600080fd5b50565b615f568062000cdc6000396000f3fe6080604052600436106102ad5760003560e01c8063715018a611610175578063a3ff3fdb116100dc578063d9d4363a11610095578063f2fde38b1161006f578063f2fde38b14610a60578063f487077414610a89578063f60d704614610ac6578063fd78b79514610af1576102ad565b8063d9d4363a146109bd578063e77b43d3146109fa578063e985e9c514610a23576102ad565b8063a3ff3fdb146108d0578063b6bad53a146108ec578063b88d4fde14610915578063bb57ad201461093e578063c87b56dd14610955578063c99eb61d14610992576102ad565b806395d89b411161012e57806395d89b41146107d25780639fbc8713146107fd578063a035b1fe14610828578063a22cb46514610853578063a2a759121461087c578063a3f2a2c6146108a5576102ad565b8063715018a6146106fa57806371a07999146107115780637514bdb41461073c578063771291091461075357806379b6ed361461077c5780638da5cb5b146107a7576102ad565b806323b872dd1161021957806342842e0e116101d257806342842e0e146105d65780634ec1b802146105ff5780635b6b62e21461062a5780636352211e146106555780636c0360eb1461069257806370a08231146106bd576102ad565b806323b872dd146104b15780632a55205a146104da57806330807a671461051857806339b5b521146105435780633c8975021461058057806342260b5d146105ab576102ad565b80630ef7cc8e1161026b5780630ef7cc8e146103c257806314f076d9146103ff57806318160ddd1461041657806319d1997a146104415780631a54a0081461046c5780631b025a4014610495576102ad565b80628df643146102b257806301ffc9a7146102dd5780630460c3371461031a57806306fdde0314610331578063081812fc1461035c578063095ea7b314610399575b600080fd5b3480156102be57600080fd5b506102c7610b2e565b6040516102d49190615210565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff919061452f565b610b34565b6040516103119190614d9d565b60405180910390f35b34801561032657600080fd5b5061032f610c7e565b005b34801561033d57600080fd5b50610346610e01565b6040516103539190614dd3565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190614581565b610e93565b6040516103909190614ccd565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190614335565b610f18565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190614581565b611030565b6040516103f69190614dd3565b60405180910390f35b34801561040b57600080fd5b50610414611385565b005b34801561042257600080fd5b5061042b6114f3565b6040516104389190615210565b60405180910390f35b34801561044d57600080fd5b50610456611504565b6040516104639190615210565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614419565b61150a565b005b6104af60048036038101906104aa9190614371565b6117fe565b005b3480156104bd57600080fd5b506104d860048036038101906104d391906141f3565b611a0f565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906145d3565b611a6f565b60405161050f929190614d34565b60405180910390f35b34801561052457600080fd5b5061052d611aba565b60405161053a91906151f5565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190614581565b611ace565b60405161057791906151f5565b60405180910390f35b34801561058c57600080fd5b50610595611b06565b6040516105a29190615210565b60405180910390f35b3480156105b757600080fd5b506105c0611b0c565b6040516105cd91906151f5565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f891906141f3565b611b20565b005b34801561060b57600080fd5b50610614611b40565b6040516106219190615254565b60405180910390f35b34801561063657600080fd5b5061063f611b5e565b60405161064c9190614db8565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190614581565b611b64565b6040516106899190614ccd565b60405180910390f35b34801561069e57600080fd5b506106a7611c16565b6040516106b49190614dd3565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df919061418e565b611ca4565b6040516106f19190615210565b60405180910390f35b34801561070657600080fd5b5061070f611d5c565b005b34801561071d57600080fd5b50610726611de4565b6040516107339190615210565b60405180910390f35b34801561074857600080fd5b50610751611dea565b005b34801561075f57600080fd5b5061077a600480360381019061077591906142f9565b611f44565b005b34801561078857600080fd5b50610791612022565b60405161079e9190614dd3565b60405180910390f35b3480156107b357600080fd5b506107bc6120b0565b6040516107c99190614ccd565b60405180910390f35b3480156107de57600080fd5b506107e76120da565b6040516107f49190614dd3565b60405180910390f35b34801561080957600080fd5b5061081261216c565b60405161081f9190614ccd565b60405180910390f35b34801561083457600080fd5b5061083d612192565b60405161084a9190615210565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906142bd565b612198565b005b34801561088857600080fd5b506108a3600480360381019061089e9190614371565b6121ae565b005b3480156108b157600080fd5b506108ba6123bd565b6040516108c79190615210565b60405180910390f35b6108ea60048036038101906108e59190614471565b6123c3565b005b3480156108f857600080fd5b50610913600480360381019061090e919061418e565b61272a565b005b34801561092157600080fd5b5061093c60048036038101906109379190614242565b61280a565b005b34801561094a57600080fd5b5061095361286c565b005b34801561096157600080fd5b5061097c60048036038101906109779190614581565b612b6a565b6040516109899190614dd3565b60405180910390f35b34801561099e57600080fd5b506109a7612c8a565b6040516109b49190614d9d565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df919061418e565b612c9d565b6040516109f19190615210565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c91906143ad565b612cb5565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a4591906141b7565b612d63565b604051610a579190614d9d565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a82919061418e565b612df7565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190614581565b612eef565b604051610abd9190614ccd565b60405180910390f35b348015610ad257600080fd5b50610adb612f2e565b604051610ae89190614ccd565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b13919061418e565b612f54565b604051610b259190614d9d565b60405180910390f35b60145481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c6757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c775750610c7682612f74565b5b9050919050565b610c86613056565b73ffffffffffffffffffffffffffffffffffffffff16610ca46120b0565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf1906150d5565b60405180910390fd5b6000610d06600761305e565b905060008111610d1557600080fd5b60001515600960009054906101000a900460ff16151514610d3557600080fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc9190614506565b600a819055506001600960006101000a81548160ff0219169083151502179055505050565b606060008054610e109061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c9061558c565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e8261306c565b610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906150b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f2382611b64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90615155565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb3613056565b73ffffffffffffffffffffffffffffffffffffffff161480610fe25750610fe181610fdc613056565b612d63565b5b611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890614fd5565b60405180910390fd5b61102b83836130d8565b505050565b606060008211801561104957506110456114f3565b8211155b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90615055565b60405180910390fd5b6000600b54905060008114156110b05760405180602001604052806000815250915050611380565b600060125467ffffffffffffffff8111156110f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111225781602001602082028036833780820191505090505b50905060005b60125481101561119857806122b86111409190615472565b828281518110611179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611190906155ef565b915050611128565b5060005b60016012546111ab9190615472565b811015611325576000816012546111c29190615472565b84836040516020016111d592919061522b565b6040516020818303038152906040528051906020012060001c6111f8919061566d565b826112039190615391565b905082818151811061123e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518484815181106112c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110611300577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061131d906155ef565b91505061119c565b5061137b816001866113379190615472565b8151811061136e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613191565b925050505b919050565b601254611392600761305e565b146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906151d5565b60405180910390fd5b60001515600960009054906101000a900460ff16151514611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90614e75565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cf9190614506565b600a819055506001600960006101000a81548160ff02191690831515021790555050565b60006114ff600761305e565b905090565b60125481565b60001515600960009054906101000a900460ff16151514611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790614f75565b60405180910390fd5b620151806013546115719190615472565b4210156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90615115565b60405180910390fd5b601254816bffffffffffffffffffffffff166115cf600761305e565b6115d99190615391565b111561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190615035565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e906151b5565b60405180910390fd5b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631780b5cd848433856040518563ffffffff1660e01b81526004016117089493929190614d5d565b60206040518083038186803b15801561172057600080fd5b505afa158015611734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175891906144dd565b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614f95565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117f9338261333e565b505050565b60001515600960009054906101000a900460ff16151514611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614f75565b60405180910390fd5b6000816bffffffffffffffffffffffff16116118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90615075565b60405180910390fd5b6013544210156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614e15565b60405180910390fd5b601454816bffffffffffffffffffffffff16111561193d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193490614df5565b60405180910390fd5b601254816bffffffffffffffffffffffff16611959600761305e565b6119639190615391565b11156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90615035565b60405180910390fd5b806bffffffffffffffffffffffff166008546119c09190615418565b3414611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890615135565b60405180910390fd5b611a0b828261333e565b5050565b611a20611a1a613056565b826133a0565b611a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5690615175565b60405180910390fd5b611a6a83838361347e565b505050565b600080601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150611ab183601860149054906101000a900461ffff166136da565b90509250929050565b600f60009054906101000a900461ffff1681565b60178181548110611ade57600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b60135481565b601860149054906101000a900461ffff1681565b611b3b8383836040518060200160405280600081525061280a565b505050565b600f60029054906101000a90046bffffffffffffffffffffffff1681565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490615015565b60405180910390fd5b80915050919050565b60118054611c239061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f9061558c565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90614ff5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d64613056565b73ffffffffffffffffffffffffffffffffffffffff16611d826120b0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf906150d5565b60405180910390fd5b611de26000613701565b565b600b5481565b60011515600960009054906101000a900460ff16151514611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3790614e75565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663568ee8be600a546040518263ffffffff1660e01b8152600401611ea49190614db8565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef491906145aa565b905060008111611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090614f35565b60405180910390fd5b80600b819055505050565b611f4c613056565b73ffffffffffffffffffffffffffffffffffffffff16611f6a6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb7906150d5565b60405180910390fd5b81601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601860146101000a81548161ffff021916908361ffff1602179055505050565b6010805461202f9061558c565b80601f016020809104026020016040519081016040528092919081815260200182805461205b9061558c565b80156120a85780601f1061207d576101008083540402835291602001916120a8565b820191906000526020600020905b81548152906001019060200180831161208b57829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546120e99061558c565b80601f01602080910402602001604051908101604052809291908181526020018280546121159061558c565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b5050505050905090565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b6121aa6121a3613056565b83836137c7565b5050565b6121b6613056565b73ffffffffffffffffffffffffffffffffffffffff166121d46120b0565b73ffffffffffffffffffffffffffffffffffffffff161461222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906150d5565b60405180910390fd5b60001515600960009054906101000a900460ff1615151461224a57600080fd5b6000816bffffffffffffffffffffffff161161229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229290615075565b60405180910390fd5b600f60029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16816bffffffffffffffffffffffff16600c546122e09190615391565b1115612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890614ed5565b60405180910390fd5b601254816bffffffffffffffffffffffff1661233d600761305e565b6123479190615391565b1115612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90615035565b60405180910390fd5b806bffffffffffffffffffffffff16600c60008282546123a89190615391565b925050819055506123b9828261333e565b5050565b600c5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631780b5cd858533866040518563ffffffff1660e01b81526004016124249493929190614d5d565b60206040518083038186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247491906144dd565b6124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614f95565b60405180910390fd5b60001515600960009054906101000a900460ff16151514612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614f75565b60405180910390fd5b6201518060135461251a9190615472565b42101561255c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255390615115565b60405180910390fd5b601254816bffffffffffffffffffffffff16612578600761305e565b6125829190615391565b11156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90615035565b60405180910390fd5b806bffffffffffffffffffffffff166008546125df9190615418565b3414612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790615135565b60405180910390fd5b806bffffffffffffffffffffffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461267d9190615391565b92505081905550600f60009054906101000a900461ffff1661ffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190615195565b60405180910390fd5b612724338261333e565b50505050565b612732613056565b73ffffffffffffffffffffffffffffffffffffffff166127506120b0565b73ffffffffffffffffffffffffffffffffffffffff16146127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d906150d5565b60405180910390fd5b60001515600960009054906101000a900460ff161515146127c657600080fd5b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61281b612815613056565b836133a0565b61285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285190615175565b60405180910390fd5b61286684848484613934565b50505050565b6000805b60168054905081101561292d573373ffffffffffffffffffffffffffffffffffffffff16601682815481106128ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561291a57600191505b8080612925906155ef565b915050612870565b5060011515811515148061297a5750612944613056565b73ffffffffffffffffffffffffffffffffffffffff166129626120b0565b73ffffffffffffffffffffffffffffffffffffffff16145b61298357600080fd5b60008047905060005b601680549050811015612b6457600060016016805490506129ad9190615472565b821015612a2257612a1b83601784815481106129f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166136da565b9050612a31565b8383612a2e9190615472565b90505b8084612a3d9190615391565b9350600060168381548110612a7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612ac990614cb8565b60006040518083038185875af1925050503d8060008114612b06576040519150601f19603f3d011682016040523d82523d6000602084013e612b0b565b606091505b5050905080612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4690614f15565b60405180910390fd5b50508080612b5c906155ef565b91505061298c565b50505050565b6060612b758261306c565b612bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bab90614fb5565b60405180910390fd5b6000600b541415612c515760108054612bcc9061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf89061558c565b8015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b50505050509050612c85565b6000612c5c83611030565b9050601181604051602001612c72929190614c89565b6040516020818303038152906040529150505b919050565b600960009054906101000a900460ff1681565b600e6020528060005260406000206000915090505481565b612cbd613056565b73ffffffffffffffffffffffffffffffffffffffff16612cdb6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d28906150d5565b60405180910390fd5b8160169080519060200190612d47929190613d8d565b508060179080519060200190612d5e929190613e17565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612dff613056565b73ffffffffffffffffffffffffffffffffffffffff16612e1d6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a906150d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90614e55565b60405180910390fd5b612eec81613701565b50565b60168181548110612eff57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061304f575061304e82613990565b5b9050919050565b600033905090565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661314b83611b64565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060008214156131d9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613339565b600082905060005b6000821461320b5780806131f4906155ef565b915050600a8261320491906153e7565b91506131e1565b60008167ffffffffffffffff81111561324d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561327f5781602001600182028036833780820191505090505b5090505b60008514613332576001826132989190615472565b9150600a856132a7919061566d565b60306132b39190615391565b60f81b8183815181106132ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561332b91906153e7565b9450613283565b8093505050505b919050565b60005b816bffffffffffffffffffffffff16816bffffffffffffffffffffffff16101561339b5761336f60076139fa565b600061337b600761305e565b90506133878482613a10565b50808061339390615638565b915050613341565b505050565b60006133ab8261306c565b6133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190614f55565b60405180910390fd5b60006133f583611b64565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061346457508373ffffffffffffffffffffffffffffffffffffffff1661344c84610e93565b73ffffffffffffffffffffffffffffffffffffffff16145b8061347557506134748185612d63565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661349e82611b64565b73ffffffffffffffffffffffffffffffffffffffff16146134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb906150f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355b90614eb5565b60405180910390fd5b61356f838383613bde565b61357a6000826130d8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135ca9190615472565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136219190615391565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127108261ffff16846136ef9190615418565b6136f991906153e7565b905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382d90614ef5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516139279190614d9d565b60405180910390a3505050565b61393f84848461347e565b61394b84848484613be3565b61398a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398190614e35565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7790615095565b60405180910390fd5b613a898161306c565b15613ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac090614e95565b60405180910390fd5b613ad560008383613bde565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b259190615391565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000613c048473ffffffffffffffffffffffffffffffffffffffff16613d7a565b15613d6d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c2d613056565b8786866040518563ffffffff1660e01b8152600401613c4f9493929190614ce8565b602060405180830381600087803b158015613c6957600080fd5b505af1925050508015613c9a57506040513d601f19601f82011682018060405250810190613c979190614558565b60015b613d1d573d8060008114613cca576040519150601f19603f3d011682016040523d82523d6000602084013e613ccf565b606091505b50600081511415613d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0c90614e35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613d72565b600190505b949350505050565b600080823b905060008111915050919050565b828054828255906000526020600020908101928215613e06579160200282015b82811115613e055782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613dad565b5b509050613e139190613ec1565b5090565b82805482825590600052602060002090600f01601090048101928215613eb05791602002820160005b83821115613e8057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613e40565b8015613eae5782816101000a81549061ffff0219169055600201602081600101049283019260010302613e80565b505b509050613ebd9190613ec1565b5090565b5b80821115613eda576000816000905550600101613ec2565b5090565b6000613ef1613eec84615294565b61526f565b90508083825260208201905082856020860282011115613f1057600080fd5b60005b85811015613f405781613f268882613ff4565b845260208401935060208301925050600181019050613f13565b5050509392505050565b6000613f5d613f58846152c0565b61526f565b90508083825260208201905082856020860282011115613f7c57600080fd5b60005b85811015613fac5781613f92888261413a565b845260208401935060208301925050600181019050613f7f565b5050509392505050565b6000613fc9613fc4846152ec565b61526f565b905082815260208101848484011115613fe157600080fd5b613fec84828561554a565b509392505050565b60008135905061400381615e7f565b92915050565b600082601f83011261401a57600080fd5b813561402a848260208601613ede565b91505092915050565b60008083601f84011261404557600080fd5b8235905067ffffffffffffffff81111561405e57600080fd5b60208301915083602082028301111561407657600080fd5b9250929050565b600082601f83011261408e57600080fd5b813561409e848260208601613f4a565b91505092915050565b6000813590506140b681615e96565b92915050565b6000815190506140cb81615e96565b92915050565b6000815190506140e081615ead565b92915050565b6000813590506140f581615ec4565b92915050565b60008151905061410a81615ec4565b92915050565b600082601f83011261412157600080fd5b8135614131848260208601613fb6565b91505092915050565b60008135905061414981615edb565b92915050565b60008135905061415e81615ef2565b92915050565b60008151905061417381615ef2565b92915050565b60008135905061418881615f09565b92915050565b6000602082840312156141a057600080fd5b60006141ae84828501613ff4565b91505092915050565b600080604083850312156141ca57600080fd5b60006141d885828601613ff4565b92505060206141e985828601613ff4565b9150509250929050565b60008060006060848603121561420857600080fd5b600061421686828701613ff4565b935050602061422786828701613ff4565b92505060406142388682870161414f565b9150509250925092565b6000806000806080858703121561425857600080fd5b600061426687828801613ff4565b945050602061427787828801613ff4565b93505060406142888782880161414f565b925050606085013567ffffffffffffffff8111156142a557600080fd5b6142b187828801614110565b91505092959194509250565b600080604083850312156142d057600080fd5b60006142de85828601613ff4565b92505060206142ef858286016140a7565b9150509250929050565b6000806040838503121561430c57600080fd5b600061431a85828601613ff4565b925050602061432b8582860161413a565b9150509250929050565b6000806040838503121561434857600080fd5b600061435685828601613ff4565b92505060206143678582860161414f565b9150509250929050565b6000806040838503121561438457600080fd5b600061439285828601613ff4565b92505060206143a385828601614179565b9150509250929050565b600080604083850312156143c057600080fd5b600083013567ffffffffffffffff8111156143da57600080fd5b6143e685828601614009565b925050602083013567ffffffffffffffff81111561440357600080fd5b61440f8582860161407d565b9150509250929050565b60008060006040848603121561442e57600080fd5b600084013567ffffffffffffffff81111561444857600080fd5b61445486828701614033565b9350935050602061446786828701614179565b9150509250925092565b6000806000806060858703121561448757600080fd5b600085013567ffffffffffffffff8111156144a157600080fd5b6144ad87828801614033565b945094505060206144c087828801614179565b92505060406144d187828801614179565b91505092959194509250565b6000602082840312156144ef57600080fd5b60006144fd848285016140bc565b91505092915050565b60006020828403121561451857600080fd5b6000614526848285016140d1565b91505092915050565b60006020828403121561454157600080fd5b600061454f848285016140e6565b91505092915050565b60006020828403121561456a57600080fd5b6000614578848285016140fb565b91505092915050565b60006020828403121561459357600080fd5b60006145a18482850161414f565b91505092915050565b6000602082840312156145bc57600080fd5b60006145ca84828501614164565b91505092915050565b600080604083850312156145e657600080fd5b60006145f48582860161414f565b92505060206146058582860161414f565b9150509250929050565b614618816154a6565b82525050565b600061462a8385615348565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561465957600080fd5b60208302925061466a83858461554a565b82840190509392505050565b61467f816154b8565b82525050565b61468e816154c4565b82525050565b600061469f82615332565b6146a98185615359565b93506146b9818560208601615559565b6146c28161575a565b840191505092915050565b60006146d88261533d565b6146e28185615375565b93506146f2818560208601615559565b6146fb8161575a565b840191505092915050565b60006147118261533d565b61471b8185615386565b935061472b818560208601615559565b80840191505092915050565b600081546147448161558c565b61474e8186615386565b94506001821660008114614769576001811461477a576147ad565b60ff198316865281860193506147ad565b6147838561531d565b60005b838110156147a557815481890152600182019150602081019050614786565b838801955050505b50505092915050565b60006147c3601a83615375565b91506147ce8261576b565b602082019050919050565b60006147e6601a83615375565b91506147f182615794565b602082019050919050565b6000614809603283615375565b9150614814826157bd565b604082019050919050565b600061482c602683615375565b91506148378261580c565b604082019050919050565b600061484f601c83615375565b915061485a8261585b565b602082019050919050565b6000614872601c83615375565b915061487d82615884565b602082019050919050565b6000614895602483615375565b91506148a0826158ad565b604082019050919050565b60006148b8602183615375565b91506148c3826158fc565b604082019050919050565b60006148db601983615375565b91506148e68261594b565b602082019050919050565b60006148fe601383615375565b915061490982615974565b602082019050919050565b6000614921601883615375565b915061492c8261599d565b602082019050919050565b6000614944602c83615375565b915061494f826159c6565b604082019050919050565b6000614967600c83615375565b915061497282615a15565b602082019050919050565b600061498a601483615375565b915061499582615a3e565b602082019050919050565b60006149ad601183615375565b91506149b882615a67565b602082019050919050565b60006149d0603883615375565b91506149db82615a90565b604082019050919050565b60006149f3602a83615375565b91506149fe82615adf565b604082019050919050565b6000614a16602983615375565b9150614a2182615b2e565b604082019050919050565b6000614a39601283615375565b9150614a4482615b7d565b602082019050919050565b6000614a5c601083615375565b9150614a6782615ba6565b602082019050919050565b6000614a7f601083615375565b9150614a8a82615bcf565b602082019050919050565b6000614aa2602083615375565b9150614aad82615bf8565b602082019050919050565b6000614ac5602c83615375565b9150614ad082615c21565b604082019050919050565b6000614ae8600583615386565b9150614af382615c70565b600582019050919050565b6000614b0b602083615375565b9150614b1682615c99565b602082019050919050565b6000614b2e602983615375565b9150614b3982615cc2565b604082019050919050565b6000614b51601883615375565b9150614b5c82615d11565b602082019050919050565b6000614b74601383615375565b9150614b7f82615d3a565b602082019050919050565b6000614b97602183615375565b9150614ba282615d63565b604082019050919050565b6000614bba60008361536a565b9150614bc582615db2565b600082019050919050565b6000614bdd603183615375565b9150614be882615db5565b604082019050919050565b6000614c00601e83615375565b9150614c0b82615e04565b602082019050919050565b6000614c23601983615375565b9150614c2e82615e2d565b602082019050919050565b6000614c46600f83615375565b9150614c5182615e56565b602082019050919050565b614c65816154fa565b82525050565b614c7481615528565b82525050565b614c8381615532565b82525050565b6000614c958285614737565b9150614ca18284614706565b9150614cac82614adb565b91508190509392505050565b6000614cc382614bad565b9150819050919050565b6000602082019050614ce2600083018461460f565b92915050565b6000608082019050614cfd600083018761460f565b614d0a602083018661460f565b614d176040830185614c6b565b8181036060830152614d298184614694565b905095945050505050565b6000604082019050614d49600083018561460f565b614d566020830184614c6b565b9392505050565b60006060820190508181036000830152614d7881868861461e565b9050614d87602083018561460f565b614d946040830184614c7a565b95945050505050565b6000602082019050614db26000830184614676565b92915050565b6000602082019050614dcd6000830184614685565b92915050565b60006020820190508181036000830152614ded81846146cd565b905092915050565b60006020820190508181036000830152614e0e816147b6565b9050919050565b60006020820190508181036000830152614e2e816147d9565b9050919050565b60006020820190508181036000830152614e4e816147fc565b9050919050565b60006020820190508181036000830152614e6e8161481f565b9050919050565b60006020820190508181036000830152614e8e81614842565b9050919050565b60006020820190508181036000830152614eae81614865565b9050919050565b60006020820190508181036000830152614ece81614888565b9050919050565b60006020820190508181036000830152614eee816148ab565b9050919050565b60006020820190508181036000830152614f0e816148ce565b9050919050565b60006020820190508181036000830152614f2e816148f1565b9050919050565b60006020820190508181036000830152614f4e81614914565b9050919050565b60006020820190508181036000830152614f6e81614937565b9050919050565b60006020820190508181036000830152614f8e8161495a565b9050919050565b60006020820190508181036000830152614fae8161497d565b9050919050565b60006020820190508181036000830152614fce816149a0565b9050919050565b60006020820190508181036000830152614fee816149c3565b9050919050565b6000602082019050818103600083015261500e816149e6565b9050919050565b6000602082019050818103600083015261502e81614a09565b9050919050565b6000602082019050818103600083015261504e81614a2c565b9050919050565b6000602082019050818103600083015261506e81614a4f565b9050919050565b6000602082019050818103600083015261508e81614a72565b9050919050565b600060208201905081810360008301526150ae81614a95565b9050919050565b600060208201905081810360008301526150ce81614ab8565b9050919050565b600060208201905081810360008301526150ee81614afe565b9050919050565b6000602082019050818103600083015261510e81614b21565b9050919050565b6000602082019050818103600083015261512e81614b44565b9050919050565b6000602082019050818103600083015261514e81614b67565b9050919050565b6000602082019050818103600083015261516e81614b8a565b9050919050565b6000602082019050818103600083015261518e81614bd0565b9050919050565b600060208201905081810360008301526151ae81614bf3565b9050919050565b600060208201905081810360008301526151ce81614c16565b9050919050565b600060208201905081810360008301526151ee81614c39565b9050919050565b600060208201905061520a6000830184614c5c565b92915050565b60006020820190506152256000830184614c6b565b92915050565b60006040820190506152406000830185614c6b565b61524d6020830184614c6b565b9392505050565b60006020820190506152696000830184614c7a565b92915050565b600061527961528a565b905061528582826155be565b919050565b6000604051905090565b600067ffffffffffffffff8211156152af576152ae61572b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152db576152da61572b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153075761530661572b565b5b6153108261575a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061539c82615528565b91506153a783615528565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153dc576153db61569e565b5b828201905092915050565b60006153f282615528565b91506153fd83615528565b92508261540d5761540c6156cd565b5b828204905092915050565b600061542382615528565b915061542e83615528565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154675761546661569e565b5b828202905092915050565b600061547d82615528565b915061548883615528565b92508282101561549b5761549a61569e565b5b828203905092915050565b60006154b182615508565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561557757808201518184015260208101905061555c565b83811115615586576000848401525b50505050565b600060028204905060018216806155a457607f821691505b602082108114156155b8576155b76156fc565b5b50919050565b6155c78261575a565b810181811067ffffffffffffffff821117156155e6576155e561572b565b5b80604052505050565b60006155fa82615528565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561562d5761562c61569e565b5b600182019050919050565b600061564382615532565b91506bffffffffffffffffffffffff8214156156625761566161569e565b5b600182019050919050565b600061567882615528565b915061568383615528565b925082615693576156926156cd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455843454544535f53494e474c455f4f524445525f4c494d4954000000000000600082015250565b7f4d494e54494e475f504552494f445f4e4f545f53544152544544000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52414e444f4d4e4553535f5245515f4e4f545f494e4954494154454400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f464f554e444154494f4e5f4d494e545f455843454544535f414c4c4f57414e4360008201527f4500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4645455f4355545f4e4f5f44454c495645525900000000000000000000000000600082015250565b7f52414e444f4d4e4553535f4e4f545f46554c46494c4c45440000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d494e54494e475f4f5645520000000000000000000000000000000000000000600082015250565b7f494e56414c49445f4d45524b4c455f50524f4f46000000000000000000000000600082015250565b7f4e4f4e4558495354454e545f544f4b454e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f4d41585f535550504c590000000000000000000000000000600082015250565b7f494e56414c49445f544f4b454e5f494400000000000000000000000000000000600082015250565b7f4e4f5f5a45524f5f5155414e5449545900000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4541524c595f4143434553535f4e4f545f535441525445440000000000000000600082015250565b7f494e434f52524543545f4554485f56414c554500000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455843454544535f4541524c595f4143434553535f414c4c4f57414e43450000600082015250565b7f4d45524b4c455f434c41494d5f414c52454144595f4d41444500000000000000600082015250565b7f4d494e54494e475f4f4e474f494e470000000000000000000000000000000000600082015250565b615e88816154a6565b8114615e9357600080fd5b50565b615e9f816154b8565b8114615eaa57600080fd5b50565b615eb6816154c4565b8114615ec157600080fd5b50565b615ecd816154ce565b8114615ed857600080fd5b50565b615ee4816154fa565b8114615eef57600080fd5b50565b615efb81615528565b8114615f0657600080fd5b50565b615f1281615532565b8114615f1d57600080fd5b5056fea26469706673582212209590a333479732841171ba46b14412418f11454fa14c4e7c8958d7c75301918b64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000062e33110000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009a5ac0108f5cf769e517cf6a78da720171a5c7b500000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000fac28dc73edea55de482116a890e64c0e93edc71000000000000000000000000000000000000000000000000000000000000000577676d6973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000557474d49530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045697066733a2f2f516d515439557131524a67346759366a45463247464262654a3569673438504653364a51385563554d77737567512f756e72657665616c65642e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d515439557131524a67346759366a45463247464262654a3569673438504653364a51385563554d77737567512f0000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000003fad3d09dc89ca4a07928f6d5e292ad360f726730000000000000000000000006904f0db06d0d45705b9fcdb17c90f6625226a9e0000000000000000000000005858eafe41ca64eeaf404c4cf511c24526bea1a20000000000000000000000001d95b0b6d3582feec7ef35d2ccf91564ded0cf7f0000000000000000000000009f0cbc2982d397293462e5bb45eb48255a46df0b0000000000000000000000000ddfa905aaddddc533bff695316979c0bb2d9eb80000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001f4

Deployed Bytecode

0x6080604052600436106102ad5760003560e01c8063715018a611610175578063a3ff3fdb116100dc578063d9d4363a11610095578063f2fde38b1161006f578063f2fde38b14610a60578063f487077414610a89578063f60d704614610ac6578063fd78b79514610af1576102ad565b8063d9d4363a146109bd578063e77b43d3146109fa578063e985e9c514610a23576102ad565b8063a3ff3fdb146108d0578063b6bad53a146108ec578063b88d4fde14610915578063bb57ad201461093e578063c87b56dd14610955578063c99eb61d14610992576102ad565b806395d89b411161012e57806395d89b41146107d25780639fbc8713146107fd578063a035b1fe14610828578063a22cb46514610853578063a2a759121461087c578063a3f2a2c6146108a5576102ad565b8063715018a6146106fa57806371a07999146107115780637514bdb41461073c578063771291091461075357806379b6ed361461077c5780638da5cb5b146107a7576102ad565b806323b872dd1161021957806342842e0e116101d257806342842e0e146105d65780634ec1b802146105ff5780635b6b62e21461062a5780636352211e146106555780636c0360eb1461069257806370a08231146106bd576102ad565b806323b872dd146104b15780632a55205a146104da57806330807a671461051857806339b5b521146105435780633c8975021461058057806342260b5d146105ab576102ad565b80630ef7cc8e1161026b5780630ef7cc8e146103c257806314f076d9146103ff57806318160ddd1461041657806319d1997a146104415780631a54a0081461046c5780631b025a4014610495576102ad565b80628df643146102b257806301ffc9a7146102dd5780630460c3371461031a57806306fdde0314610331578063081812fc1461035c578063095ea7b314610399575b600080fd5b3480156102be57600080fd5b506102c7610b2e565b6040516102d49190615210565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff919061452f565b610b34565b6040516103119190614d9d565b60405180910390f35b34801561032657600080fd5b5061032f610c7e565b005b34801561033d57600080fd5b50610346610e01565b6040516103539190614dd3565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190614581565b610e93565b6040516103909190614ccd565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190614335565b610f18565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190614581565b611030565b6040516103f69190614dd3565b60405180910390f35b34801561040b57600080fd5b50610414611385565b005b34801561042257600080fd5b5061042b6114f3565b6040516104389190615210565b60405180910390f35b34801561044d57600080fd5b50610456611504565b6040516104639190615210565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614419565b61150a565b005b6104af60048036038101906104aa9190614371565b6117fe565b005b3480156104bd57600080fd5b506104d860048036038101906104d391906141f3565b611a0f565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906145d3565b611a6f565b60405161050f929190614d34565b60405180910390f35b34801561052457600080fd5b5061052d611aba565b60405161053a91906151f5565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190614581565b611ace565b60405161057791906151f5565b60405180910390f35b34801561058c57600080fd5b50610595611b06565b6040516105a29190615210565b60405180910390f35b3480156105b757600080fd5b506105c0611b0c565b6040516105cd91906151f5565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f891906141f3565b611b20565b005b34801561060b57600080fd5b50610614611b40565b6040516106219190615254565b60405180910390f35b34801561063657600080fd5b5061063f611b5e565b60405161064c9190614db8565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190614581565b611b64565b6040516106899190614ccd565b60405180910390f35b34801561069e57600080fd5b506106a7611c16565b6040516106b49190614dd3565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df919061418e565b611ca4565b6040516106f19190615210565b60405180910390f35b34801561070657600080fd5b5061070f611d5c565b005b34801561071d57600080fd5b50610726611de4565b6040516107339190615210565b60405180910390f35b34801561074857600080fd5b50610751611dea565b005b34801561075f57600080fd5b5061077a600480360381019061077591906142f9565b611f44565b005b34801561078857600080fd5b50610791612022565b60405161079e9190614dd3565b60405180910390f35b3480156107b357600080fd5b506107bc6120b0565b6040516107c99190614ccd565b60405180910390f35b3480156107de57600080fd5b506107e76120da565b6040516107f49190614dd3565b60405180910390f35b34801561080957600080fd5b5061081261216c565b60405161081f9190614ccd565b60405180910390f35b34801561083457600080fd5b5061083d612192565b60405161084a9190615210565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906142bd565b612198565b005b34801561088857600080fd5b506108a3600480360381019061089e9190614371565b6121ae565b005b3480156108b157600080fd5b506108ba6123bd565b6040516108c79190615210565b60405180910390f35b6108ea60048036038101906108e59190614471565b6123c3565b005b3480156108f857600080fd5b50610913600480360381019061090e919061418e565b61272a565b005b34801561092157600080fd5b5061093c60048036038101906109379190614242565b61280a565b005b34801561094a57600080fd5b5061095361286c565b005b34801561096157600080fd5b5061097c60048036038101906109779190614581565b612b6a565b6040516109899190614dd3565b60405180910390f35b34801561099e57600080fd5b506109a7612c8a565b6040516109b49190614d9d565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df919061418e565b612c9d565b6040516109f19190615210565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c91906143ad565b612cb5565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a4591906141b7565b612d63565b604051610a579190614d9d565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a82919061418e565b612df7565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190614581565b612eef565b604051610abd9190614ccd565b60405180910390f35b348015610ad257600080fd5b50610adb612f2e565b604051610ae89190614ccd565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b13919061418e565b612f54565b604051610b259190614d9d565b60405180910390f35b60145481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c6757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c775750610c7682612f74565b5b9050919050565b610c86613056565b73ffffffffffffffffffffffffffffffffffffffff16610ca46120b0565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf1906150d5565b60405180910390fd5b6000610d06600761305e565b905060008111610d1557600080fd5b60001515600960009054906101000a900460ff16151514610d3557600080fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc9190614506565b600a819055506001600960006101000a81548160ff0219169083151502179055505050565b606060008054610e109061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c9061558c565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e8261306c565b610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906150b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f2382611b64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90615155565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb3613056565b73ffffffffffffffffffffffffffffffffffffffff161480610fe25750610fe181610fdc613056565b612d63565b5b611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890614fd5565b60405180910390fd5b61102b83836130d8565b505050565b606060008211801561104957506110456114f3565b8211155b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90615055565b60405180910390fd5b6000600b54905060008114156110b05760405180602001604052806000815250915050611380565b600060125467ffffffffffffffff8111156110f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111225781602001602082028036833780820191505090505b50905060005b60125481101561119857806122b86111409190615472565b828281518110611179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611190906155ef565b915050611128565b5060005b60016012546111ab9190615472565b811015611325576000816012546111c29190615472565b84836040516020016111d592919061522b565b6040516020818303038152906040528051906020012060001c6111f8919061566d565b826112039190615391565b905082818151811061123e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811061127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518484815181106112c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110611300577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061131d906155ef565b91505061119c565b5061137b816001866113379190615472565b8151811061136e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613191565b925050505b919050565b601254611392600761305e565b146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906151d5565b60405180910390fd5b60001515600960009054906101000a900460ff16151514611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90614e75565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663dbdff2c16040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cf9190614506565b600a819055506001600960006101000a81548160ff02191690831515021790555050565b60006114ff600761305e565b905090565b60125481565b60001515600960009054906101000a900460ff16151514611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790614f75565b60405180910390fd5b620151806013546115719190615472565b4210156115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90615115565b60405180910390fd5b601254816bffffffffffffffffffffffff166115cf600761305e565b6115d99190615391565b111561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190615035565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e906151b5565b60405180910390fd5b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631780b5cd848433856040518563ffffffff1660e01b81526004016117089493929190614d5d565b60206040518083038186803b15801561172057600080fd5b505afa158015611734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175891906144dd565b611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614f95565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117f9338261333e565b505050565b60001515600960009054906101000a900460ff16151514611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614f75565b60405180910390fd5b6000816bffffffffffffffffffffffff16116118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90615075565b60405180910390fd5b6013544210156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614e15565b60405180910390fd5b601454816bffffffffffffffffffffffff16111561193d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193490614df5565b60405180910390fd5b601254816bffffffffffffffffffffffff16611959600761305e565b6119639190615391565b11156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b90615035565b60405180910390fd5b806bffffffffffffffffffffffff166008546119c09190615418565b3414611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890615135565b60405180910390fd5b611a0b828261333e565b5050565b611a20611a1a613056565b826133a0565b611a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5690615175565b60405180910390fd5b611a6a83838361347e565b505050565b600080601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150611ab183601860149054906101000a900461ffff166136da565b90509250929050565b600f60009054906101000a900461ffff1681565b60178181548110611ade57600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b60135481565b601860149054906101000a900461ffff1681565b611b3b8383836040518060200160405280600081525061280a565b505050565b600f60029054906101000a90046bffffffffffffffffffffffff1681565b600a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490615015565b60405180910390fd5b80915050919050565b60118054611c239061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4f9061558c565b8015611c9c5780601f10611c7157610100808354040283529160200191611c9c565b820191906000526020600020905b815481529060010190602001808311611c7f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c90614ff5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d64613056565b73ffffffffffffffffffffffffffffffffffffffff16611d826120b0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf906150d5565b60405180910390fd5b611de26000613701565b565b600b5481565b60011515600960009054906101000a900460ff16151514611e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3790614e75565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663568ee8be600a546040518263ffffffff1660e01b8152600401611ea49190614db8565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef491906145aa565b905060008111611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090614f35565b60405180910390fd5b80600b819055505050565b611f4c613056565b73ffffffffffffffffffffffffffffffffffffffff16611f6a6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb7906150d5565b60405180910390fd5b81601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601860146101000a81548161ffff021916908361ffff1602179055505050565b6010805461202f9061558c565b80601f016020809104026020016040519081016040528092919081815260200182805461205b9061558c565b80156120a85780601f1061207d576101008083540402835291602001916120a8565b820191906000526020600020905b81548152906001019060200180831161208b57829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546120e99061558c565b80601f01602080910402602001604051908101604052809291908181526020018280546121159061558c565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b5050505050905090565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b6121aa6121a3613056565b83836137c7565b5050565b6121b6613056565b73ffffffffffffffffffffffffffffffffffffffff166121d46120b0565b73ffffffffffffffffffffffffffffffffffffffff161461222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906150d5565b60405180910390fd5b60001515600960009054906101000a900460ff1615151461224a57600080fd5b6000816bffffffffffffffffffffffff161161229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229290615075565b60405180910390fd5b600f60029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16816bffffffffffffffffffffffff16600c546122e09190615391565b1115612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890614ed5565b60405180910390fd5b601254816bffffffffffffffffffffffff1661233d600761305e565b6123479190615391565b1115612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90615035565b60405180910390fd5b806bffffffffffffffffffffffff16600c60008282546123a89190615391565b925050819055506123b9828261333e565b5050565b600c5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631780b5cd858533866040518563ffffffff1660e01b81526004016124249493929190614d5d565b60206040518083038186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247491906144dd565b6124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614f95565b60405180910390fd5b60001515600960009054906101000a900460ff16151514612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614f75565b60405180910390fd5b6201518060135461251a9190615472565b42101561255c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255390615115565b60405180910390fd5b601254816bffffffffffffffffffffffff16612578600761305e565b6125829190615391565b11156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba90615035565b60405180910390fd5b806bffffffffffffffffffffffff166008546125df9190615418565b3414612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790615135565b60405180910390fd5b806bffffffffffffffffffffffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461267d9190615391565b92505081905550600f60009054906101000a900461ffff1661ffff16600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190615195565b60405180910390fd5b612724338261333e565b50505050565b612732613056565b73ffffffffffffffffffffffffffffffffffffffff166127506120b0565b73ffffffffffffffffffffffffffffffffffffffff16146127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d906150d5565b60405180910390fd5b60001515600960009054906101000a900460ff161515146127c657600080fd5b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61281b612815613056565b836133a0565b61285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285190615175565b60405180910390fd5b61286684848484613934565b50505050565b6000805b60168054905081101561292d573373ffffffffffffffffffffffffffffffffffffffff16601682815481106128ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561291a57600191505b8080612925906155ef565b915050612870565b5060011515811515148061297a5750612944613056565b73ffffffffffffffffffffffffffffffffffffffff166129626120b0565b73ffffffffffffffffffffffffffffffffffffffff16145b61298357600080fd5b60008047905060005b601680549050811015612b6457600060016016805490506129ad9190615472565b821015612a2257612a1b83601784815481106129f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff166136da565b9050612a31565b8383612a2e9190615472565b90505b8084612a3d9190615391565b9350600060168381548110612a7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612ac990614cb8565b60006040518083038185875af1925050503d8060008114612b06576040519150601f19603f3d011682016040523d82523d6000602084013e612b0b565b606091505b5050905080612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4690614f15565b60405180910390fd5b50508080612b5c906155ef565b91505061298c565b50505050565b6060612b758261306c565b612bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bab90614fb5565b60405180910390fd5b6000600b541415612c515760108054612bcc9061558c565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf89061558c565b8015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b50505050509050612c85565b6000612c5c83611030565b9050601181604051602001612c72929190614c89565b6040516020818303038152906040529150505b919050565b600960009054906101000a900460ff1681565b600e6020528060005260406000206000915090505481565b612cbd613056565b73ffffffffffffffffffffffffffffffffffffffff16612cdb6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d28906150d5565b60405180910390fd5b8160169080519060200190612d47929190613d8d565b508060179080519060200190612d5e929190613e17565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612dff613056565b73ffffffffffffffffffffffffffffffffffffffff16612e1d6120b0565b73ffffffffffffffffffffffffffffffffffffffff1614612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a906150d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90614e55565b60405180910390fd5b612eec81613701565b50565b60168181548110612eff57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061304f575061304e82613990565b5b9050919050565b600033905090565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661314b83611b64565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060008214156131d9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613339565b600082905060005b6000821461320b5780806131f4906155ef565b915050600a8261320491906153e7565b91506131e1565b60008167ffffffffffffffff81111561324d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561327f5781602001600182028036833780820191505090505b5090505b60008514613332576001826132989190615472565b9150600a856132a7919061566d565b60306132b39190615391565b60f81b8183815181106132ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561332b91906153e7565b9450613283565b8093505050505b919050565b60005b816bffffffffffffffffffffffff16816bffffffffffffffffffffffff16101561339b5761336f60076139fa565b600061337b600761305e565b90506133878482613a10565b50808061339390615638565b915050613341565b505050565b60006133ab8261306c565b6133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190614f55565b60405180910390fd5b60006133f583611b64565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061346457508373ffffffffffffffffffffffffffffffffffffffff1661344c84610e93565b73ffffffffffffffffffffffffffffffffffffffff16145b8061347557506134748185612d63565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661349e82611b64565b73ffffffffffffffffffffffffffffffffffffffff16146134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb906150f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355b90614eb5565b60405180910390fd5b61356f838383613bde565b61357a6000826130d8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135ca9190615472565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136219190615391565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127108261ffff16846136ef9190615418565b6136f991906153e7565b905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382d90614ef5565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516139279190614d9d565b60405180910390a3505050565b61393f84848461347e565b61394b84848484613be3565b61398a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398190614e35565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7790615095565b60405180910390fd5b613a898161306c565b15613ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac090614e95565b60405180910390fd5b613ad560008383613bde565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b259190615391565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6000613c048473ffffffffffffffffffffffffffffffffffffffff16613d7a565b15613d6d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c2d613056565b8786866040518563ffffffff1660e01b8152600401613c4f9493929190614ce8565b602060405180830381600087803b158015613c6957600080fd5b505af1925050508015613c9a57506040513d601f19601f82011682018060405250810190613c979190614558565b60015b613d1d573d8060008114613cca576040519150601f19603f3d011682016040523d82523d6000602084013e613ccf565b606091505b50600081511415613d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0c90614e35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613d72565b600190505b949350505050565b600080823b905060008111915050919050565b828054828255906000526020600020908101928215613e06579160200282015b82811115613e055782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613dad565b5b509050613e139190613ec1565b5090565b82805482825590600052602060002090600f01601090048101928215613eb05791602002820160005b83821115613e8057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613e40565b8015613eae5782816101000a81549061ffff0219169055600201602081600101049283019260010302613e80565b505b509050613ebd9190613ec1565b5090565b5b80821115613eda576000816000905550600101613ec2565b5090565b6000613ef1613eec84615294565b61526f565b90508083825260208201905082856020860282011115613f1057600080fd5b60005b85811015613f405781613f268882613ff4565b845260208401935060208301925050600181019050613f13565b5050509392505050565b6000613f5d613f58846152c0565b61526f565b90508083825260208201905082856020860282011115613f7c57600080fd5b60005b85811015613fac5781613f92888261413a565b845260208401935060208301925050600181019050613f7f565b5050509392505050565b6000613fc9613fc4846152ec565b61526f565b905082815260208101848484011115613fe157600080fd5b613fec84828561554a565b509392505050565b60008135905061400381615e7f565b92915050565b600082601f83011261401a57600080fd5b813561402a848260208601613ede565b91505092915050565b60008083601f84011261404557600080fd5b8235905067ffffffffffffffff81111561405e57600080fd5b60208301915083602082028301111561407657600080fd5b9250929050565b600082601f83011261408e57600080fd5b813561409e848260208601613f4a565b91505092915050565b6000813590506140b681615e96565b92915050565b6000815190506140cb81615e96565b92915050565b6000815190506140e081615ead565b92915050565b6000813590506140f581615ec4565b92915050565b60008151905061410a81615ec4565b92915050565b600082601f83011261412157600080fd5b8135614131848260208601613fb6565b91505092915050565b60008135905061414981615edb565b92915050565b60008135905061415e81615ef2565b92915050565b60008151905061417381615ef2565b92915050565b60008135905061418881615f09565b92915050565b6000602082840312156141a057600080fd5b60006141ae84828501613ff4565b91505092915050565b600080604083850312156141ca57600080fd5b60006141d885828601613ff4565b92505060206141e985828601613ff4565b9150509250929050565b60008060006060848603121561420857600080fd5b600061421686828701613ff4565b935050602061422786828701613ff4565b92505060406142388682870161414f565b9150509250925092565b6000806000806080858703121561425857600080fd5b600061426687828801613ff4565b945050602061427787828801613ff4565b93505060406142888782880161414f565b925050606085013567ffffffffffffffff8111156142a557600080fd5b6142b187828801614110565b91505092959194509250565b600080604083850312156142d057600080fd5b60006142de85828601613ff4565b92505060206142ef858286016140a7565b9150509250929050565b6000806040838503121561430c57600080fd5b600061431a85828601613ff4565b925050602061432b8582860161413a565b9150509250929050565b6000806040838503121561434857600080fd5b600061435685828601613ff4565b92505060206143678582860161414f565b9150509250929050565b6000806040838503121561438457600080fd5b600061439285828601613ff4565b92505060206143a385828601614179565b9150509250929050565b600080604083850312156143c057600080fd5b600083013567ffffffffffffffff8111156143da57600080fd5b6143e685828601614009565b925050602083013567ffffffffffffffff81111561440357600080fd5b61440f8582860161407d565b9150509250929050565b60008060006040848603121561442e57600080fd5b600084013567ffffffffffffffff81111561444857600080fd5b61445486828701614033565b9350935050602061446786828701614179565b9150509250925092565b6000806000806060858703121561448757600080fd5b600085013567ffffffffffffffff8111156144a157600080fd5b6144ad87828801614033565b945094505060206144c087828801614179565b92505060406144d187828801614179565b91505092959194509250565b6000602082840312156144ef57600080fd5b60006144fd848285016140bc565b91505092915050565b60006020828403121561451857600080fd5b6000614526848285016140d1565b91505092915050565b60006020828403121561454157600080fd5b600061454f848285016140e6565b91505092915050565b60006020828403121561456a57600080fd5b6000614578848285016140fb565b91505092915050565b60006020828403121561459357600080fd5b60006145a18482850161414f565b91505092915050565b6000602082840312156145bc57600080fd5b60006145ca84828501614164565b91505092915050565b600080604083850312156145e657600080fd5b60006145f48582860161414f565b92505060206146058582860161414f565b9150509250929050565b614618816154a6565b82525050565b600061462a8385615348565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561465957600080fd5b60208302925061466a83858461554a565b82840190509392505050565b61467f816154b8565b82525050565b61468e816154c4565b82525050565b600061469f82615332565b6146a98185615359565b93506146b9818560208601615559565b6146c28161575a565b840191505092915050565b60006146d88261533d565b6146e28185615375565b93506146f2818560208601615559565b6146fb8161575a565b840191505092915050565b60006147118261533d565b61471b8185615386565b935061472b818560208601615559565b80840191505092915050565b600081546147448161558c565b61474e8186615386565b94506001821660008114614769576001811461477a576147ad565b60ff198316865281860193506147ad565b6147838561531d565b60005b838110156147a557815481890152600182019150602081019050614786565b838801955050505b50505092915050565b60006147c3601a83615375565b91506147ce8261576b565b602082019050919050565b60006147e6601a83615375565b91506147f182615794565b602082019050919050565b6000614809603283615375565b9150614814826157bd565b604082019050919050565b600061482c602683615375565b91506148378261580c565b604082019050919050565b600061484f601c83615375565b915061485a8261585b565b602082019050919050565b6000614872601c83615375565b915061487d82615884565b602082019050919050565b6000614895602483615375565b91506148a0826158ad565b604082019050919050565b60006148b8602183615375565b91506148c3826158fc565b604082019050919050565b60006148db601983615375565b91506148e68261594b565b602082019050919050565b60006148fe601383615375565b915061490982615974565b602082019050919050565b6000614921601883615375565b915061492c8261599d565b602082019050919050565b6000614944602c83615375565b915061494f826159c6565b604082019050919050565b6000614967600c83615375565b915061497282615a15565b602082019050919050565b600061498a601483615375565b915061499582615a3e565b602082019050919050565b60006149ad601183615375565b91506149b882615a67565b602082019050919050565b60006149d0603883615375565b91506149db82615a90565b604082019050919050565b60006149f3602a83615375565b91506149fe82615adf565b604082019050919050565b6000614a16602983615375565b9150614a2182615b2e565b604082019050919050565b6000614a39601283615375565b9150614a4482615b7d565b602082019050919050565b6000614a5c601083615375565b9150614a6782615ba6565b602082019050919050565b6000614a7f601083615375565b9150614a8a82615bcf565b602082019050919050565b6000614aa2602083615375565b9150614aad82615bf8565b602082019050919050565b6000614ac5602c83615375565b9150614ad082615c21565b604082019050919050565b6000614ae8600583615386565b9150614af382615c70565b600582019050919050565b6000614b0b602083615375565b9150614b1682615c99565b602082019050919050565b6000614b2e602983615375565b9150614b3982615cc2565b604082019050919050565b6000614b51601883615375565b9150614b5c82615d11565b602082019050919050565b6000614b74601383615375565b9150614b7f82615d3a565b602082019050919050565b6000614b97602183615375565b9150614ba282615d63565b604082019050919050565b6000614bba60008361536a565b9150614bc582615db2565b600082019050919050565b6000614bdd603183615375565b9150614be882615db5565b604082019050919050565b6000614c00601e83615375565b9150614c0b82615e04565b602082019050919050565b6000614c23601983615375565b9150614c2e82615e2d565b602082019050919050565b6000614c46600f83615375565b9150614c5182615e56565b602082019050919050565b614c65816154fa565b82525050565b614c7481615528565b82525050565b614c8381615532565b82525050565b6000614c958285614737565b9150614ca18284614706565b9150614cac82614adb565b91508190509392505050565b6000614cc382614bad565b9150819050919050565b6000602082019050614ce2600083018461460f565b92915050565b6000608082019050614cfd600083018761460f565b614d0a602083018661460f565b614d176040830185614c6b565b8181036060830152614d298184614694565b905095945050505050565b6000604082019050614d49600083018561460f565b614d566020830184614c6b565b9392505050565b60006060820190508181036000830152614d7881868861461e565b9050614d87602083018561460f565b614d946040830184614c7a565b95945050505050565b6000602082019050614db26000830184614676565b92915050565b6000602082019050614dcd6000830184614685565b92915050565b60006020820190508181036000830152614ded81846146cd565b905092915050565b60006020820190508181036000830152614e0e816147b6565b9050919050565b60006020820190508181036000830152614e2e816147d9565b9050919050565b60006020820190508181036000830152614e4e816147fc565b9050919050565b60006020820190508181036000830152614e6e8161481f565b9050919050565b60006020820190508181036000830152614e8e81614842565b9050919050565b60006020820190508181036000830152614eae81614865565b9050919050565b60006020820190508181036000830152614ece81614888565b9050919050565b60006020820190508181036000830152614eee816148ab565b9050919050565b60006020820190508181036000830152614f0e816148ce565b9050919050565b60006020820190508181036000830152614f2e816148f1565b9050919050565b60006020820190508181036000830152614f4e81614914565b9050919050565b60006020820190508181036000830152614f6e81614937565b9050919050565b60006020820190508181036000830152614f8e8161495a565b9050919050565b60006020820190508181036000830152614fae8161497d565b9050919050565b60006020820190508181036000830152614fce816149a0565b9050919050565b60006020820190508181036000830152614fee816149c3565b9050919050565b6000602082019050818103600083015261500e816149e6565b9050919050565b6000602082019050818103600083015261502e81614a09565b9050919050565b6000602082019050818103600083015261504e81614a2c565b9050919050565b6000602082019050818103600083015261506e81614a4f565b9050919050565b6000602082019050818103600083015261508e81614a72565b9050919050565b600060208201905081810360008301526150ae81614a95565b9050919050565b600060208201905081810360008301526150ce81614ab8565b9050919050565b600060208201905081810360008301526150ee81614afe565b9050919050565b6000602082019050818103600083015261510e81614b21565b9050919050565b6000602082019050818103600083015261512e81614b44565b9050919050565b6000602082019050818103600083015261514e81614b67565b9050919050565b6000602082019050818103600083015261516e81614b8a565b9050919050565b6000602082019050818103600083015261518e81614bd0565b9050919050565b600060208201905081810360008301526151ae81614bf3565b9050919050565b600060208201905081810360008301526151ce81614c16565b9050919050565b600060208201905081810360008301526151ee81614c39565b9050919050565b600060208201905061520a6000830184614c5c565b92915050565b60006020820190506152256000830184614c6b565b92915050565b60006040820190506152406000830185614c6b565b61524d6020830184614c6b565b9392505050565b60006020820190506152696000830184614c7a565b92915050565b600061527961528a565b905061528582826155be565b919050565b6000604051905090565b600067ffffffffffffffff8211156152af576152ae61572b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152db576152da61572b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153075761530661572b565b5b6153108261575a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061539c82615528565b91506153a783615528565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153dc576153db61569e565b5b828201905092915050565b60006153f282615528565b91506153fd83615528565b92508261540d5761540c6156cd565b5b828204905092915050565b600061542382615528565b915061542e83615528565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154675761546661569e565b5b828202905092915050565b600061547d82615528565b915061548883615528565b92508282101561549b5761549a61569e565b5b828203905092915050565b60006154b182615508565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561557757808201518184015260208101905061555c565b83811115615586576000848401525b50505050565b600060028204905060018216806155a457607f821691505b602082108114156155b8576155b76156fc565b5b50919050565b6155c78261575a565b810181811067ffffffffffffffff821117156155e6576155e561572b565b5b80604052505050565b60006155fa82615528565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561562d5761562c61569e565b5b600182019050919050565b600061564382615532565b91506bffffffffffffffffffffffff8214156156625761566161569e565b5b600182019050919050565b600061567882615528565b915061568383615528565b925082615693576156926156cd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455843454544535f53494e474c455f4f524445525f4c494d4954000000000000600082015250565b7f4d494e54494e475f504552494f445f4e4f545f53544152544544000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f52414e444f4d4e4553535f5245515f4e4f545f494e4954494154454400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f464f554e444154494f4e5f4d494e545f455843454544535f414c4c4f57414e4360008201527f4500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4645455f4355545f4e4f5f44454c495645525900000000000000000000000000600082015250565b7f52414e444f4d4e4553535f4e4f545f46554c46494c4c45440000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d494e54494e475f4f5645520000000000000000000000000000000000000000600082015250565b7f494e56414c49445f4d45524b4c455f50524f4f46000000000000000000000000600082015250565b7f4e4f4e4558495354454e545f544f4b454e000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f4d41585f535550504c590000000000000000000000000000600082015250565b7f494e56414c49445f544f4b454e5f494400000000000000000000000000000000600082015250565b7f4e4f5f5a45524f5f5155414e5449545900000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4541524c595f4143434553535f4e4f545f535441525445440000000000000000600082015250565b7f494e434f52524543545f4554485f56414c554500000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455843454544535f4541524c595f4143434553535f414c4c4f57414e43450000600082015250565b7f4d45524b4c455f434c41494d5f414c52454144595f4d41444500000000000000600082015250565b7f4d494e54494e475f4f4e474f494e470000000000000000000000000000000000600082015250565b615e88816154a6565b8114615e9357600080fd5b50565b615e9f816154b8565b8114615eaa57600080fd5b50565b615eb6816154c4565b8114615ec157600080fd5b50565b615ecd816154ce565b8114615ed857600080fd5b50565b615ee4816154fa565b8114615eef57600080fd5b50565b615efb81615528565b8114615f0657600080fd5b50565b615f1281615532565b8114615f1d57600080fd5b5056fea26469706673582212209590a333479732841171ba46b14412418f11454fa14c4e7c8958d7c75301918b64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000062e33110000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009a5ac0108f5cf769e517cf6a78da720171a5c7b500000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000fac28dc73edea55de482116a890e64c0e93edc71000000000000000000000000000000000000000000000000000000000000000577676d6973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000557474d49530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045697066733a2f2f516d515439557131524a67346759366a45463247464262654a3569673438504653364a51385563554d77737567512f756e72657665616c65642e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d515439557131524a67346759366a45463247464262654a3569673438504653364a51385563554d77737567512f0000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000003fad3d09dc89ca4a07928f6d5e292ad360f726730000000000000000000000006904f0db06d0d45705b9fcdb17c90f6625226a9e0000000000000000000000005858eafe41ca64eeaf404c4cf511c24526bea1a20000000000000000000000001d95b0b6d3582feec7ef35d2ccf91564ded0cf7f0000000000000000000000009f0cbc2982d397293462e5bb45eb48255a46df0b0000000000000000000000000ddfa905aaddddc533bff695316979c0bb2d9eb80000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001f4

-----Decoded View---------------
Arg [0] : _tokenName (string): wgmis
Arg [1] : _tokenSymbol (string): WGMIS
Arg [2] : _preRevealURI (string): ipfs://QmQT9Uq1RJg4gY6jEF2GFBbeJ5ig48PFS6JQ8UcUMwsugQ/unrevealed.json
Arg [3] : _baseURI (string): ipfs://QmQT9Uq1RJg4gY6jEF2GFBbeJ5ig48PFS6JQ8UcUMwsugQ/
Arg [4] : _supplyLimit (uint256): 8888
Arg [5] : _mintingStartTimeUnix (uint256): 1659056400
Arg [6] : _singleOrderLimit (uint256): 10
Arg [7] : _vrfProvider (address): 0x9A5aC0108f5CF769E517Cf6a78dA720171a5c7b5
Arg [8] : _payoutAddresses (address[]): 0x3faD3d09Dc89Ca4A07928f6D5E292Ad360f72673,0x6904F0Db06d0D45705B9FcDB17c90F6625226A9e,0x5858EAfe41ca64eEaF404C4cf511c24526Bea1A2,0x1D95b0b6D3582FEeC7Ef35D2CCF91564DEd0Cf7f,0x9F0CBc2982D397293462E5bb45eB48255A46dF0B,0x0ddfA905AaddddC533BFf695316979C0bB2d9EB8
Arg [9] : _payoutAddressBasisPoints (uint16[]): 5000,1500,1000,1000,1000,500
Arg [10] : _merkleProofWhitelist (address): 0xFAC28DC73eDea55De482116A890E64C0e93edc71

-----Encoded View---------------
36 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [4] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [5] : 0000000000000000000000000000000000000000000000000000000062e33110
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 0000000000000000000000009a5ac0108f5cf769e517cf6a78da720171a5c7b5
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [9] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [10] : 000000000000000000000000fac28dc73edea55de482116a890e64c0e93edc71
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 77676d6973000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 57474d4953000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [16] : 697066733a2f2f516d515439557131524a67346759366a45463247464262654a
Arg [17] : 3569673438504653364a51385563554d77737567512f756e72657665616c6564
Arg [18] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [20] : 697066733a2f2f516d515439557131524a67346759366a45463247464262654a
Arg [21] : 3569673438504653364a51385563554d77737567512f00000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [23] : 0000000000000000000000003fad3d09dc89ca4a07928f6d5e292ad360f72673
Arg [24] : 0000000000000000000000006904f0db06d0d45705b9fcdb17c90f6625226a9e
Arg [25] : 0000000000000000000000005858eafe41ca64eeaf404c4cf511c24526bea1a2
Arg [26] : 0000000000000000000000001d95b0b6d3582feec7ef35d2ccf91564ded0cf7f
Arg [27] : 0000000000000000000000009f0cbc2982d397293462e5bb45eb48255a46df0b
Arg [28] : 0000000000000000000000000ddfa905aaddddc533bff695316979c0bb2d9eb8
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [30] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [31] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [32] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [33] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [34] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [35] : 00000000000000000000000000000000000000000000000000000000000001f4


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.