Token Frog Frens

NFT  

Overview ERC721

Total Supply:
3,333 FREN

Holders:
374 addresses
Balance
2 FREN
0xc2cc8983624ca702a2973fc2893da6be6e12feb4
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Spawned in sewers, running riot on Avalanche. Frog Frens is a high-quality NFT collection that earns you a passive income from distributed royalties and treasury rewards and $SPAWN tokens when you stake your $FREN.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FrogFrens

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 13: FrogFrens.sol
// SPDX-License-Identifier: MIT
/**
* ______              ______                  
* |  ___|             |  ___|                 
* | |_ _ __ ___   __ _| |_ _ __ ___ _ __  ___ 
* |  _| '__/ _ \ / _` |  _| '__/ _ \ '_ \/ __|
* | | | | | (_) | (_| | | | | |  __/ | | \__ \
* \_| |_|  \___/ \__, \_| |_|  \___|_| |_|___/
*                 __/ |                       
*                |___/          
*/

import "./ERC721.sol";
import "./IERC165.sol";
import "./IERC721.sol";
import "./IERC721Enumerable.sol";
import "./ERC165.sol";
import "./Strings.sol";
import "./Address.sol";
import "./IERC721Metadata.sol";
import "./IERC721Receiver.sol";
import "./Context.sol";
import "./IERC20.sol";
import "./Ownable.sol";

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity 0.8.3;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity 0.8.3;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - 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 value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

pragma solidity 0.8.3;

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC165, IERC2981Royalties {
    struct Royalty {
        address recipient;
        uint256 value;
    }

    mapping(uint256 => Royalty) internal _royalties;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param id the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties[id] = Royalty(recipient, value);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        return (royalty.recipient, (value * royalty.value) / 10000);
    }
}

interface RoyaltiesInterface {
    function claimCommunity(uint256 tokenId) external;
}

pragma solidity 0.8.3;

contract FrogFrens is
    IERC721Receiver,
    ERC721Enumerable,
    Ownable,
    ERC2981PerTokenRoyalties
{
    using Strings for uint256;

    string baseURI; 
    string public baseExtension = ".json";
    uint256 public whitelistCost = 1 ether;
    uint256 public publicCost = 1.5 ether;
    uint256 public maxSupply = 5555;
    uint256 public maxMintPerTx = 5;
    uint256 public maxMintsPerAddress = 10;
    uint256 private noFreeAddresses = 0;
    uint256 private contractRoyalties = 300; // Decided by community vote on Discord
    address public royaltiesAddress; 
    bool public contractPaused = true;
    bool public airdropActive = false;
    bool public publicSaleActive = false;
    bool public metadataLocked; // Metadata lock
    address[] private airdropAddresses;

    mapping(address => bool) public whitelistAddresses;
    mapping(address => uint256) public addressMints;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }
    
    /**
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }

    /*
    @function pauseContract(_state)
    @description - Allows the contract to be paused.
    @param <bool> _state - true/false
  */
    function pauseContract(bool _state) public onlyOwner {
        contractPaused = _state;
    }

    /*
    @function _baseURI()
    @description - Gets the current base URI for nft metadata
    @returns <string>
  */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721Enumerable, ERC2981PerTokenRoyalties)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

	/*
    @function lockMetadata()
    @description - Lock metadata for the eternity!
    */
	function lockMetadata() external onlyOwner {
		metadataLocked = true;
	}

    /*
    @function setAirdropStatus(value)
    @description - Sets the status of airdrop to true/false
    @param <bool> value - true/false
    */
    function setAirdropStatus(bool value) public onlyOwner {
        airdropActive = value;
    }

    /*
    @function setPublicSaleActive(value)
    @description - Sets the status of public sale
    @param <bool> value - true/false
    */
    function setPublicSaleActive(bool value) public onlyOwner {
        publicSaleActive = value;
    }

    /*
    @function addWhitelistAddress()
    @description - Add an address to the whitelist.
   */
    function addWhitelistAddress(address addr) external onlyOwner {
        whitelistAddresses[addr] = true;
    }

    /*
    @function addWhitelistBatch(address[])
    @description - Add whitelist addresses in batch.
   */
    function addWhitelistBatch(address[] memory addr) public onlyOwner { 
  
        for(uint i=0; i< addr.length; i++){  
            whitelistAddresses[addr[i]] = true;  
        }
    }

    /*
    @function setMaxSupply()
    @description - Sets the max supply that can be minted.
    */
    function setMaxSupply(uint256 amount) public onlyOwner {
        require(amount > maxSupply, "ERROR: You cannot decrease the max supply");
        maxSupply = amount;
    }

    /*
    @function setWhitelistCost(_newCost)
    @description - Sets the whitelist cost of a single NFT
    @param <uint256> _newCost - The new cost of a single NFT
   */
    function setWhitelistCost(uint256 _newCost) public onlyOwner {
        whitelistCost = _newCost;
    }

    /*
    @function setPublicCost(_newCost)
    @description - Sets the public cost of a single NFT
    @param <uint256> _newCost - The new cost of a single NFT
   */
    function setPublicCost(uint256 _newCost) public onlyOwner {
        publicCost = _newCost;
    }

    /*
    @function setRoyaltiesAddress(address) 
    @description - Sets royalties address for the NFTs
    @param <addr> _newRoyaltiesAddress - Address of the FrogFrensRoyalties Contract
   */
    function setRoyaltiesAddress(address _newRoyaltiesAddress) public onlyOwner {
        royaltiesAddress = _newRoyaltiesAddress;
    }

    /*
    @function setMaxMintPerTx
    @description - Set the max mintable per TX
    @param <uint256> amount - The mintible limit per TX
  */
    function setMaxMintPerTx(uint256 amount) public onlyOwner {
        maxMintPerTx = amount;
    }

    /*
    @function setMaxMintPerAddress
    @description - Set the max mintable per address
    @param <uint256> amount - The mintible limit per adddress
  */
    function setMaxMintPerAddress(uint256 amount) public onlyOwner {
        maxMintsPerAddress = amount;
    }

    /*
    @function setBaseURI(_newBaseURI)
    @description - Sets the base URI for the metadata files
    @param <string> _newBaseURI - The new base URI for the metadata files
  */
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        require(!metadataLocked, "Metadata locked forever!");
        baseURI = _newBaseURI;
    }

    /*
    @function setBaseExtension(_newBaseExtension)
    @description - Sets the extension for the metadata file (default .json)
    @param <string> _newBaseExtension - The new file extension to use.
  */
    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    /*
    @function mint(_mintAmount)
    @description - Mints a token.
    @param <uint256> _mintAmount - The number of NFTs to mint.
   */
    function mint(uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        uint256 ownerCanMintCount = maxMintsPerAddress - addressMints[msg.sender];
        require(ownerCanMintCount >= _mintAmount, "Sorry fren, you have reached your Frog Frens limit.");
        require(!contractPaused, "Sorry fren, contract is paused. Please check https://dsc.gg/frogfrens");
        require(_mintAmount <= maxMintPerTx, "Sorry fren, you have breached the max number of mints per transaction.");       
        require(supply + _mintAmount <= maxSupply, "Sorry fren, all our Frog Frens are now minted!");

        if (!publicSaleActive) {
            if (whitelistAddresses[msg.sender]) {
                require(msg.value >= whitelistCost * _mintAmount, "Sorry fren, you need more AVAX to mint WL!");
            } else {
                require(whitelistAddresses[msg.sender], "Sorry fren, only whitelist addresses can mint!");        
            }   
        }
        
        if (publicSaleActive) {
            if (whitelistAddresses[msg.sender]) {
                require(msg.value >= whitelistCost * _mintAmount, "Sorry fren, you need more AVAX to mint WL!");
            } else {
                require(msg.value >= publicCost * _mintAmount, "Sorry fren, you need more AVAX to mint public!");         
            }   
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + 1;
            _safeMint(msg.sender, tokenId);
            _setTokenRoyalty(tokenId, royaltiesAddress, contractRoyalties);

            addressMints[msg.sender]++;

            supply = totalSupply();
        }
    }

    /*
    @function reserveNFT()
    @description - Reserve a number of NFT's 
   */
    function reserveNFT(uint16 _mintAmount, address _for) external onlyOwner {
        _mintReserveTokens(_mintAmount, _for);
    }

    /*
    @function _mintReserveTokens() internal
    @description - Internal function used by reserveNFT() to mint reserve tokens
   */
    function _mintReserveTokens(uint16 _mintAmount, address _for) internal {
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "ERROR: Insufficient supply");
        
        for (uint i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + 1;
            _safeMint(_for, tokenId);
            _setTokenRoyalty(tokenId, royaltiesAddress, contractRoyalties);
            supply = totalSupply();
        }
    }

    /*
    @function getTokensForAddress(_owner)
    @description - Gets the list of NFT tokenIds that owner has.
  */
    function getTokensForAddress(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    /*
    @function tokenURI(tokenId)
    @description - Gets the metadata URI for tokenId
    @param <uint256> tokenId - The id of the NFT token
    @returns <string> - The URI of the NFT metadata file
  */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /*
    @function getRoyaltiesAddress() 
    @description - Gets the royalties address for the NFTs
   */
    function getRoyaltiesAddress() public view returns (address) {
        return royaltiesAddress;
    }

    /*
    @function rand()
    @description - Generates a random tokenID from within the maxSupply
    */
    function rand(address randomAddress, uint256 randomNo) internal view returns (uint256) {
        uint256 seed = uint256(keccak256(abi.encodePacked((block.timestamp - randomNo) + block.difficulty +((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (block.timestamp)) + block.gaslimit + ((uint256(keccak256(abi.encodePacked(randomAddress)))) / (block.timestamp)) + block.number)));
        return (seed - ((seed / maxSupply) * maxSupply)) + 1;
    }

    /*
    @function getRandomAddress()
    @description - Gets a random address using rand function
    @param <address> random address holding tokenID
    */
    function getRandomAddress() public view onlyOwner returns (address) {
        uint256 tokenId = rand(msg.sender, 0);
        return ownerOf(tokenId);
    }

    /*
    @function airdrop(to, amount)
    @description - Airdrop an nft to address
    @param <address> to - The address to airdrop the NFT to
    */
    function airdrop(address to) public onlyOwner {
        require(airdropActive, "ERROR: Air drop is not active");
        airdropAddresses.push(to);

        uint256 supply = totalSupply();
        uint256 tokenId = supply + 1;

        _safeMint(to, tokenId);
        _setTokenRoyalty(tokenId, royaltiesAddress, contractRoyalties);
        addressMints[to]++;
    }

    /*
    @function withdrawBalance()
    @description - Withdraw AVAX balance from contract to owner
    */
    function withdrawBalance() public payable onlyOwner {
        (bool success, ) = payable(owner()).call{value: address(this).balance}("");
        require(success);
    }

    /*
    @function burnToken(tokenId)
    @description - Burn a tokenId 
    @param <uint256> tokenId - tokenId to burn
    */
    function burnToken(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        ERC721.transferFrom(msg.sender, address(0xdead), tokenId);
    }

    /*
    @function bulkBurn(tokenId)
    @description - Bulk burn a tokenIds
    @param <uint256> tokenId - tokenIds to burn
    */
    function bulkBurn(uint256[] memory tokenId) external onlyOwner {
        for (uint256 i = 0; i < tokenId.length; i++) {  
            ERC721.transferFrom(owner(), address(0xdead), tokenId[i]);
        }
    }

    // reclaim stuck ERC20 tokens in contract
	function reclaimERC20(IERC20 erc20Token) external onlyOwner {
		erc20Token.transfer(msg.sender, erc20Token.balanceOf(address(this)));
	}

    // reclaim stuck ERC721 tokens in contract
	function reclaimERC721(IERC721 erc721Token, uint256 id) external onlyOwner {
		erc721Token.safeTransferFrom(address(this), msg.sender, id);
	}

    /*
    @function _beforeTokenTransfer()
    @description - Allows for the royalty claim to occur automatically on every transfer of NFT
    */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);

        // do stuff before every transfer
        if (royaltiesAddress != address(0) && from != address(0) && !Address.isContract(from)) {
            RoyaltiesInterface(royaltiesAddress).claimCommunity(tokenId);
        }
    }
}

File 1 of 13: 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 2 of 13: 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 3 of 13: 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 4 of 13: 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 "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./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 6 of 13: 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);
}

File 7 of 13: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

pragma solidity ^0.8.0;

import "./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 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 13: 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 13: 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 12 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"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":"addr","type":"address"}],"name":"addWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"addWhitelistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"bulkBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"getRandomAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoyaltiesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokensForAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"bool","name":"_state","type":"bool"}],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"erc721Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"reclaimERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_for","type":"address"}],"name":"reserveNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bool","name":"value","type":"bool"}],"name":"setAirdropStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRoyaltiesAddress","type":"address"}],"name":"setRoyaltiesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600d91906200022c565b50670de0b6b3a7640000600e556714d1120d7b160000600f556115b36010556005601155600a601255600060135561012c6014556015805462ffffff60a01b1916600160a01b1790553480156200007e57600080fd5b5060405162003da638038062003da6833981016040819052620000a19162000385565b825183908390620000ba9060009060208501906200022c565b508051620000d09060019060208401906200022c565b505050620000ed620000e76200010160201b60201c565b62000105565b620000f88162000157565b50505062000465565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601554600160b81b900460ff1615620002135760405162461bcd60e51b815260206004820152601860248201527f4d65746164617461206c6f636b656420666f72657665722100000000000000006044820152606401620001ae565b80516200022890600c9060208401906200022c565b5050565b8280546200023a9062000412565b90600052602060002090601f0160209004810192826200025e5760008555620002a9565b82601f106200027957805160ff1916838001178555620002a9565b82800160010185558215620002a9579182015b82811115620002a95782518255916020019190600101906200028c565b50620002b7929150620002bb565b5090565b5b80821115620002b75760008155600101620002bc565b600082601f830112620002e3578081fd5b81516001600160401b03808211156200030057620003006200044f565b604051601f8301601f19908116603f011681019082821181831017156200032b576200032b6200044f565b8160405283815260209250868385880101111562000347578485fd5b8491505b838210156200036a57858201830151818301840152908201906200034b565b838211156200037b57848385830101525b9695505050505050565b6000806000606084860312156200039a578283fd5b83516001600160401b0380821115620003b1578485fd5b620003bf87838801620002d2565b94506020860151915080821115620003d5578384fd5b620003e387838801620002d2565b93506040860151915080821115620003f9578283fd5b506200040886828701620002d2565b9150509250925092565b600181811c908216806200042757607f821691505b602082108114156200044957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61393180620004756000396000f3fe60806040526004361061038c5760003560e01c8063811d2437116101dc578063b88d4fde11610102578063dc95c4a7116100a0578063e7b99ec71161006f578063e7b99ec714610a8a578063e985e9c514610aa0578063edd0eb0614610ae9578063f2fde38b14610afe5761038c565b8063dc95c4a714610a14578063de7fcb1d14610a34578063e272b89214610a4a578063e2e06fa314610a6a5761038c565b8063c87b56dd116100dc578063c87b56dd1461099e578063d49479eb146109be578063d5abeb01146109de578063da3ef23f146109f45761038c565b8063b88d4fde14610948578063bc8893b414610968578063c6682862146109895761038c565b8063964c33b51161017a578063a0712d6811610149578063a0712d68146108df578063a22cb465146108f2578063ae6a80d514610912578063b44d7374146109285761038c565b8063964c33b51461085c5780639843eae314610889578063989bdbb6146108aa5780639e124d69146108bf5761038c565b80638a67456a116101b65780638a67456a146107e85780638da5cb5b1461080957806394a7ef151461082757806395d89b41146108475761038c565b8063811d2437146107925780638693da20146107b25780638905fd4f146107c85761038c565b806332882535116102c1578063677a92b91161025f5780636f8b44b01161022e5780636f8b44b01461071d57806370a082311461073d578063715018a61461075d5780637b47ec1a146107725761038c565b8063677a92b91461068e57806369d2ceb1146106ac57806369ddd67d146106cd5780636b7d2470146106fd5761038c565b806355f804b31161029b57806355f804b3146106265780635fd8c71014610646578063616cdb1e1461064e5780636352211e1461066e5761038c565b806332882535146105c657806342842e0e146105e65780634f6ccce7146106065761038c565b806318160ddd1161032e57806321860a051161030857806321860a051461052757806323b872dd146105475780632a55205a146105675780632f745c59146105a65761038c565b806318160ddd146104c85780631a4467ee146104e75780631e14d44b146105075761038c565b806308ed02361161036a57806308ed023614610420578063095ea7b3146104425780630f60e3ce14610462578063150b7a021461048f5761038c565b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac36600461339d565b610b1e565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b31565b6040516103bd91906135fe565b3480156103f457600080fd5b5061040861040336600461343e565b610bc3565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613365565b610c5d565b005b34801561044e57600080fd5b5061044061045d366004613212565b610ca5565b34801561046e57600080fd5b5061048261047d3660046130d4565b610dbb565b6040516103bd91906135ba565b34801561049b57600080fd5b506104af6104aa366004613168565b610e79565b6040516001600160e01b031990911681526020016103bd565b3480156104d457600080fd5b506008545b6040519081526020016103bd565b3480156104f357600080fd5b5061044061050236600461341b565b610e8a565b34801561051357600080fd5b5061044061052236600461343e565b610ec2565b34801561053357600080fd5b506104406105423660046130d4565b610ef1565b34801561055357600080fd5b50610440610562366004613128565b61102d565b34801561057357600080fd5b5061058761058236600461346e565b61105f565b604080516001600160a01b0390931683526020830191909152016103bd565b3480156105b257600080fd5b506104d96105c1366004613212565b6110b8565b3480156105d257600080fd5b50601554610408906001600160a01b031681565b3480156105f257600080fd5b50610440610601366004613128565b61114e565b34801561061257600080fd5b506104d961062136600461343e565b611169565b34801561063257600080fd5b506104406106413660046133d5565b61120a565b6104406112a1565b34801561065a57600080fd5b5061044061066936600461343e565b61133f565b34801561067a57600080fd5b5061040861068936600461343e565b61136e565b34801561069a57600080fd5b506015546001600160a01b0316610408565b3480156106b857600080fd5b506015546103b190600160b81b900460ff1681565b3480156106d957600080fd5b506103b16106e83660046130d4565b60176020526000908152604090205460ff1681565b34801561070957600080fd5b50610440610718366004613212565b6113e5565b34801561072957600080fd5b5061044061073836600461343e565b611479565b34801561074957600080fd5b506104d96107583660046130d4565b61150b565b34801561076957600080fd5b50610440611592565b34801561077e57600080fd5b5061044061078d36600461343e565b6115c8565b34801561079e57600080fd5b506104406107ad36600461343e565b611643565b3480156107be57600080fd5b506104d9600f5481565b3480156107d457600080fd5b506104406107e33660046130d4565b611672565b3480156107f457600080fd5b506015546103b190600160a01b900460ff1681565b34801561081557600080fd5b50600a546001600160a01b0316610408565b34801561083357600080fd5b506104406108423660046130d4565b61179b565b34801561085357600080fd5b506103db6117e9565b34801561086857600080fd5b506104d96108773660046130d4565b60186020526000908152604090205481565b34801561089557600080fd5b506015546103b190600160a81b900460ff1681565b3480156108b657600080fd5b506104406117f8565b3480156108cb57600080fd5b506104406108da3660046132de565b611837565b6104406108ed36600461343e565b6118c4565b3480156108fe57600080fd5b5061044061090d3660046131e5565b611d06565b34801561091e57600080fd5b506104d960125481565b34801561093457600080fd5b5061044061094336600461323d565b611d11565b34801561095457600080fd5b50610440610963366004613168565b611db1565b34801561097457600080fd5b506015546103b190600160b01b900460ff1681565b34801561099557600080fd5b506103db611de3565b3480156109aa57600080fd5b506103db6109b936600461343e565b611e71565b3480156109ca57600080fd5b506104406109d936600461343e565b611f4f565b3480156109ea57600080fd5b506104d960105481565b348015610a0057600080fd5b50610440610a0f3660046133d5565b611f7e565b348015610a2057600080fd5b50610440610a2f3660046130d4565b611fbb565b348015610a4057600080fd5b506104d960115481565b348015610a5657600080fd5b50610440610a65366004613365565b612007565b348015610a7657600080fd5b50610440610a85366004613365565b61204f565b348015610a9657600080fd5b506104d9600e5481565b348015610aac57600080fd5b506103b1610abb3660046130f0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610af557600080fd5b50610408612097565b348015610b0a57600080fd5b50610440610b193660046130d4565b6120e2565b6000610b298261217a565b90505b919050565b606060008054610b4090613816565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c90613816565b8015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600a546001600160a01b03163314610c875760405162461bcd60e51b8152600401610c38906136ad565b60158054911515600160a81b0260ff60a81b19909216919091179055565b6000610cb08261136e565b9050806001600160a01b0316836001600160a01b03161415610d1e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c38565b336001600160a01b0382161480610d3a5750610d3a8133610abb565b610dac5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c38565b610db6838361219f565b505050565b60606000610dc88361150b565b905060008167ffffffffffffffff811115610df357634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e1c578160200160208202803683370190505b50905060005b82811015610e7157610e3485826110b8565b828281518110610e5457634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610e6981613851565b915050610e22565b509392505050565b630a85bd0160e11b5b949350505050565b600a546001600160a01b03163314610eb45760405162461bcd60e51b8152600401610c38906136ad565b610ebe828261220d565b5050565b600a546001600160a01b03163314610eec5760405162461bcd60e51b8152600401610c38906136ad565b601255565b600a546001600160a01b03163314610f1b5760405162461bcd60e51b8152600401610c38906136ad565b601554600160a81b900460ff16610f745760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a204169722064726f70206973206e6f74206163746976650000006044820152606401610c38565b6016805460018101825560009182527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b0319166001600160a01b038416179055610fc760085490565b90506000610fd6826001613788565b9050610fe283826122d6565b601554601454610fff9183916001600160a01b03909116906122f0565b6001600160a01b038316600090815260186020526040812080549161102383613851565b9190505550505050565b611038335b8261238a565b6110545760405162461bcd60e51b8152600401610c38906136e2565b610db683838361247d565b6000828152600b60209081526040808320815180830190925280546001600160a01b03168083526001909101549282018390528392612710906110a290876137b4565b6110ac91906137a0565b92509250509250929050565b60006110c38361150b565b82106111255760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c38565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610db683838360405180602001604052806000815250611db1565b600061117460085490565b82106111d75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c38565b600882815481106111f857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146112345760405162461bcd60e51b8152600401610c38906136ad565b601554600160b81b900460ff161561128e5760405162461bcd60e51b815260206004820152601860248201527f4d65746164617461206c6f636b656420666f72657665722100000000000000006044820152606401610c38565b8051610ebe90600c906020840190612fe3565b600a546001600160a01b031633146112cb5760405162461bcd60e51b8152600401610c38906136ad565b60006112df600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b505090508061133c57600080fd5b50565b600a546001600160a01b031633146113695760405162461bcd60e51b8152600401610c38906136ad565b601155565b6000818152600260205260408120546001600160a01b031680610b295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c38565b600a546001600160a01b0316331461140f5760405162461bcd60e51b8152600401610c38906136ad565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b505050505050565b600a546001600160a01b031633146114a35760405162461bcd60e51b8152600401610c38906136ad565b60105481116115065760405162461bcd60e51b815260206004820152602960248201527f4552524f523a20596f752063616e6e6f7420646563726561736520746865206d604482015268617820737570706c7960b81b6064820152608401610c38565b601055565b60006001600160a01b0382166115765760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c38565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115bc5760405162461bcd60e51b8152600401610c38906136ad565b6115c66000612628565b565b6115d133611032565b6116365760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610c38565b61133c3361dead8361102d565b600a546001600160a01b0316331461166d5760405162461bcd60e51b8152600401610c38906136ad565b600f55565b600a546001600160a01b0316331461169c5760405162461bcd60e51b8152600401610c38906136ad565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b1580156116e557600080fd5b505afa1580156116f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171d9190613456565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561176357600080fd5b505af1158015611777573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebe9190613381565b600a546001600160a01b031633146117c55760405162461bcd60e51b8152600401610c38906136ad565b6001600160a01b03166000908152601760205260409020805460ff19166001179055565b606060018054610b4090613816565b600a546001600160a01b031633146118225760405162461bcd60e51b8152600401610c38906136ad565b6015805460ff60b81b1916600160b81b179055565b600a546001600160a01b031633146118615760405162461bcd60e51b8152600401610c38906136ad565b60005b8151811015610ebe576118b2611882600a546001600160a01b031690565b61dead8484815181106118a557634e487b7160e01b600052603260045260246000fd5b602002602001015161102d565b806118bc81613851565b915050611864565b60006118cf60085490565b3360009081526018602052604081205460125492935090916118f191906137d3565b90508281101561195f5760405162461bcd60e51b815260206004820152603360248201527f536f727279206672656e2c20796f752068617665207265616368656420796f756044820152723910233937b390233932b739903634b6b4ba1760691b6064820152608401610c38565b601554600160a01b900460ff16156119ed5760405162461bcd60e51b815260206004820152604560248201527f536f727279206672656e2c20636f6e7472616374206973207061757365642e2060448201527f506c6561736520636865636b2068747470733a2f2f6473632e67672f66726f676064820152646672656e7360d81b608482015260a401610c38565b601154831115611a745760405162461bcd60e51b815260206004820152604660248201527f536f727279206672656e2c20796f75206861766520627265616368656420746860448201527f65206d6178206e756d626572206f66206d696e747320706572207472616e736160648201526531ba34b7b71760d11b608482015260a401610c38565b601054611a818484613788565b1115611ae65760405162461bcd60e51b815260206004820152602e60248201527f536f727279206672656e2c20616c6c206f75722046726f67204672656e73206160448201526d7265206e6f77206d696e7465642160901b6064820152608401610c38565b601554600160b01b900460ff16611bb7573360009081526017602052604090205460ff1615611b415782600e54611b1d91906137b4565b341015611b3c5760405162461bcd60e51b8152600401610c3890613611565b611bb7565b3360009081526017602052604090205460ff16611bb75760405162461bcd60e51b815260206004820152602e60248201527f536f727279206672656e2c206f6e6c792077686974656c69737420616464726560448201526d737365732063616e206d696e742160901b6064820152608401610c38565b601554600160b01b900460ff1615611c87573360009081526017602052604090205460ff1615611c135782600e54611bef91906137b4565b341015611c0e5760405162461bcd60e51b8152600401610c3890613611565b611c87565b82600f54611c2191906137b4565b341015611c875760405162461bcd60e51b815260206004820152602e60248201527f536f727279206672656e2c20796f75206e656564206d6f72652041564158207460448201526d6f206d696e74207075626c69632160901b6064820152608401610c38565b60015b838111611d00576000611c9e846001613788565b9050611caa33826122d6565b601554601454611cc79183916001600160a01b03909116906122f0565b336000908152601860205260408120805491611ce283613851565b90915550506008549350508080611cf890613851565b915050611c8a565b50505050565b610ebe33838361267a565b600a546001600160a01b03163314611d3b5760405162461bcd60e51b8152600401610c38906136ad565b60005b8151811015610ebe57600160176000848481518110611d6d57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611da981613851565b915050611d3e565b611dbb338361238a565b611dd75760405162461bcd60e51b8152600401610c38906136e2565b611d0084848484612749565b600d8054611df090613816565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1c90613816565b8015611e695780601f10611e3e57610100808354040283529160200191611e69565b820191906000526020600020905b815481529060010190602001808311611e4c57829003601f168201915b505050505081565b6000818152600260205260409020546060906001600160a01b0316611ef05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c38565b6000611efa61277c565b90506000815111611f1a5760405180602001604052806000815250611f48565b80611f248461278b565b600d604051602001611f38939291906134bb565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611f795760405162461bcd60e51b8152600401610c38906136ad565b600e55565b600a546001600160a01b03163314611fa85760405162461bcd60e51b8152600401610c38906136ad565b8051610ebe90600d906020840190612fe3565b600a546001600160a01b03163314611fe55760405162461bcd60e51b8152600401610c38906136ad565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146120315760405162461bcd60e51b8152600401610c38906136ad565b60158054911515600160a01b0260ff60a01b19909216919091179055565b600a546001600160a01b031633146120795760405162461bcd60e51b8152600401610c38906136ad565b60158054911515600160b01b0260ff60b01b19909216919091179055565b600a546000906001600160a01b031633146120c45760405162461bcd60e51b8152600401610c38906136ad565b60006120d13360006128a6565b90506120dc8161136e565b91505090565b600a546001600160a01b0316331461210c5760405162461bcd60e51b8152600401610c38906136ad565b6001600160a01b0381166121715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c38565b61133c81612628565b60006001600160e01b0319821663152a902d60e11b1480610b295750610b29826129cc565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121d48261136e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061221860085490565b60105490915061222c61ffff851683613788565b111561227a5760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a20496e73756666696369656e7420737570706c790000000000006044820152606401610c38565b60015b8361ffff168111611d00576000612295836001613788565b90506122a184826122d6565b6015546014546122be9183916001600160a01b03909116906122f0565b506008549150806122ce81613851565b91505061227d565b610ebe8282604051806020016040528060008152506129f1565b6127108111156123425760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f20686967680000000000006044820152606401610c38565b6040805180820182526001600160a01b03938416815260208082019384526000958652600b90529320925183546001600160a01b031916921691909117825551600190910155565b6000818152600260205260408120546001600160a01b03166124035760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c38565b600061240e8361136e565b9050806001600160a01b0316846001600160a01b031614806124495750836001600160a01b031661243e84610bc3565b6001600160a01b0316145b80610e8257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610e82565b826001600160a01b03166124908261136e565b6001600160a01b0316146124f85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c38565b6001600160a01b03821661255a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c38565b612565838383612a24565b61257060008261219f565b6001600160a01b03831660009081526003602052604081208054600192906125999084906137d3565b90915550506001600160a01b03821660009081526003602052604081208054600192906125c7908490613788565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156126dc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c38565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61275484848461247d565b61276084848484612ac4565b611d005760405162461bcd60e51b8152600401610c389061365b565b6060600c8054610b4090613816565b6060816127b057506040805180820190915260018152600360fc1b6020820152610b2c565b8160005b81156127da57806127c481613851565b91506127d39050600a836137a0565b91506127b4565b60008167ffffffffffffffff81111561280357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561282d576020820181803683370190505b5090505b8415610e82576128426001836137d3565b915061284f600a8661386c565b61285a906030613788565b60f81b81838151811061287d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061289f600a866137a0565b9450612831565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190439042906034016040516020818303038152906040528051906020012060001c6128f191906137a0565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c61293691906137a0565b4461294188426137d3565b61294b9190613788565b6129559190613788565b61295f9190613788565b6129699190613788565b6129739190613788565b60405160200161298591815260200190565b60408051601f1981840301815291905280516020909101206010549091506129ad81836137a0565b6129b791906137b4565b6129c190826137d3565b610e82906001613788565b60006001600160e01b0319821663780e9d6360e01b1480610b295750610b2982612bce565b6129fb8383612c1e565b612a086000848484612ac4565b610db65760405162461bcd60e51b8152600401610c389061365b565b612a2f838383612d6c565b6015546001600160a01b031615801590612a5157506001600160a01b03831615155b8015612a5c5750823b155b15610db65760155460405163d54d6ddb60e01b8152600481018390526001600160a01b039091169063d54d6ddb90602401600060405180830381600087803b158015612aa757600080fd5b505af1158015612abb573d6000803e3d6000fd5b50505050505050565b60006001600160a01b0384163b15612bc657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b0890339089908890889060040161357d565b602060405180830381600087803b158015612b2257600080fd5b505af1925050508015612b52575060408051601f3d908101601f19168201909252612b4f918101906133b9565b60015b612bac573d808015612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b508051612ba45760405162461bcd60e51b8152600401610c389061365b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e82565b506001610e82565b60006001600160e01b031982166380ac58cd60e01b1480612bff57506001600160e01b03198216635b5e139f60e01b145b80610b2957506301ffc9a760e01b6001600160e01b0319831614610b29565b6001600160a01b038216612c745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c38565b6000818152600260205260409020546001600160a01b031615612cd95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c38565b612ce560008383612a24565b6001600160a01b0382166000908152600360205260408120805460019290612d0e908490613788565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612dc757612dc281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612dea565b816001600160a01b0316836001600160a01b031614612dea57612dea8382612e29565b6001600160a01b038216612e0657612e0181612ec6565b610db6565b826001600160a01b0316826001600160a01b031614610db657610db68282612f9f565b60006001612e368461150b565b612e4091906137d3565b600083815260076020526040902054909150808214612e93576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ed8906001906137d3565b60008381526009602052604081205460088054939450909284908110612f0e57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612f3d57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f8357634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612faa8361150b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612fef90613816565b90600052602060002090601f0160209004810192826130115760008555613057565b82601f1061302a57805160ff1916838001178555613057565b82800160010185558215613057579182015b8281111561305757825182559160200191906001019061303c565b50613063929150613067565b5090565b5b808211156130635760008155600101613068565b600067ffffffffffffffff831115613096576130966138ac565b6130a9601f8401601f1916602001613733565b90508281528383830111156130bd57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156130e5578081fd5b8135611f48816138c2565b60008060408385031215613102578081fd5b823561310d816138c2565b9150602083013561311d816138c2565b809150509250929050565b60008060006060848603121561313c578081fd5b8335613147816138c2565b92506020840135613157816138c2565b929592945050506040919091013590565b6000806000806080858703121561317d578081fd5b8435613188816138c2565b93506020850135613198816138c2565b925060408501359150606085013567ffffffffffffffff8111156131ba578182fd5b8501601f810187136131ca578182fd5b6131d98782356020840161307c565b91505092959194509250565b600080604083850312156131f7578182fd5b8235613202816138c2565b9150602083013561311d816138d7565b60008060408385031215613224578182fd5b823561322f816138c2565b946020939093013593505050565b6000602080838503121561324f578182fd5b823567ffffffffffffffff811115613265578283fd5b8301601f81018513613275578283fd5b803561328861328382613764565b613733565b80828252848201915084840188868560051b87010111156132a7578687fd5b8694505b838510156132d25780356132be816138c2565b8352600194909401939185019185016132ab565b50979650505050505050565b600060208083850312156132f0578182fd5b823567ffffffffffffffff811115613306578283fd5b8301601f81018513613316578283fd5b803561332461328382613764565b80828252848201915084840188868560051b8701011115613343578687fd5b8694505b838510156132d2578035835260019490940193918501918501613347565b600060208284031215613376578081fd5b8135611f48816138d7565b600060208284031215613392578081fd5b8151611f48816138d7565b6000602082840312156133ae578081fd5b8135611f48816138e5565b6000602082840312156133ca578081fd5b8151611f48816138e5565b6000602082840312156133e6578081fd5b813567ffffffffffffffff8111156133fc578182fd5b8201601f8101841361340c578182fd5b610e828482356020840161307c565b6000806040838503121561342d578182fd5b823561ffff8116811461310d578283fd5b60006020828403121561344f578081fd5b5035919050565b600060208284031215613467578081fd5b5051919050565b60008060408385031215613480578182fd5b50508035926020909101359150565b600081518084526134a78160208601602086016137ea565b601f01601f19169290920160200192915050565b6000845160206134ce8285838a016137ea565b8551918401916134e18184848a016137ea565b85549201918390600181811c90808316806134fd57607f831692505b85831081141561351b57634e487b7160e01b88526022600452602488fd5b80801561352f57600181146135405761356c565b60ff1985168852838801955061356c565b60008b815260209020895b858110156135645781548a82015290840190880161354b565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135b09083018461348f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135f2578351835292840192918401916001016135d6565b50909695505050505050565b600060208252611f48602083018461348f565b6020808252602a908201527f536f727279206672656e2c20796f75206e656564206d6f7265204156415820746040820152696f206d696e7420574c2160b01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561375c5761375c6138ac565b604052919050565b600067ffffffffffffffff82111561377e5761377e6138ac565b5060051b60200190565b6000821982111561379b5761379b613880565b500190565b6000826137af576137af613896565b500490565b60008160001904831182151516156137ce576137ce613880565b500290565b6000828210156137e5576137e5613880565b500390565b60005b838110156138055781810151838201526020016137ed565b83811115611d005750506000910152565b600181811c9082168061382a57607f821691505b6020821081141561384b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561386557613865613880565b5060010190565b60008261387b5761387b613896565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133c57600080fd5b801515811461133c57600080fd5b6001600160e01b03198116811461133c57600080fdfea2646970667358221220a55a8eb802522d3d27ff58dc5f0b7538acb97c03c286f2dd1f1004716b8c54dc64736f6c63430008030033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a46726f67204672656e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044652454e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f7878782f000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a46726f67204672656e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044652454e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f7878782f000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Frog Frens
Arg [1] : _symbol (string): FREN
Arg [2] : _initBaseURI (string): ipfs://xxx/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 46726f67204672656e7300000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4652454e00000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 697066733a2f2f7878782f000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

9866:13147:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11674:239;;;;;;;;;;-1:-1:-1;11674:239:4;;;;;:::i;:::-;;:::i;:::-;;;13183:14:13;;13176:22;13158:41;;13146:2;13131:18;11674:239:4;;;;;;;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11182:32:13;;;11164:51;;11152:2;11137:18;3919:217:3;11119:102:13;12234:93:4;;;;;;;;;;-1:-1:-1;12234:93:4;;;;;:::i;:::-;;:::i;:::-;;3457:401:3;;;;;;;;;;-1:-1:-1;3457:401:3;;;;;:::i;:::-;;:::i;18230:385:4:-;;;;;;;;;;-1:-1:-1;18230:385:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11035:162::-;;;;;;;;;;-1:-1:-1;11035:162:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;13372:33:13;;;13354:52;;13342:2;13327:18;11035:162:4;13309:103:13;2237:111:4;;;;;;;;;;-1:-1:-1;2324:10:4;:17;2237:111;;;26275:25:13;;;26263:2;26248:18;2237:111:4;26230:76:13;17373:127:4;;;;;;;;;;-1:-1:-1;17373:127:4;;;;;:::i;:::-;;:::i;14670:107::-;;;;;;;;;;-1:-1:-1;14670:107:4;;;;;:::i;:::-;;:::i;20678:365::-;;;;;;;;;;-1:-1:-1;20678:365:4;;;;;:::i;:::-;;:::i;4646:330:3:-;;;;;;;;;;-1:-1:-1;4646:330:3;;;;;:::i;:::-;;:::i;9457:292:4:-;;;;;;;;;;-1:-1:-1;9457:292:4;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12291:32:13;;;12273:51;;12355:2;12340:18;;12333:34;;;;12246:18;9457:292:4;12228:145:13;1913:253:4;;;;;;;;;;-1:-1:-1;1913:253:4;;;;;:::i;:::-;;:::i;10406:31::-;;;;;;;;;;-1:-1:-1;10406:31:4;;;;-1:-1:-1;;;;;10406:31:4;;;5042:179:3;;;;;;;;;;-1:-1:-1;5042:179:3;;;;;:::i;:::-;;:::i;2420:230:4:-;;;;;;;;;;-1:-1:-1;2420:230:4;;;;;:::i;:::-;;:::i;14967:164::-;;;;;;;;;;-1:-1:-1;14967:164:4;;;;;:::i;:::-;;:::i;21159:169::-;;;:::i;14407:96::-;;;;;;;;;;-1:-1:-1;14407:96:4;;;;;:::i;:::-;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;19530:101:4:-;;;;;;;;;;-1:-1:-1;19608:16:4;;-1:-1:-1;;;;;19608:16:4;19530:101;;10564:26;;;;;;;;;;-1:-1:-1;10564:26:4;;;;-1:-1:-1;;;10564:26:4;;;;;;10654:50;;;;;;;;;;-1:-1:-1;10654:50:4;;;;;:::i;:::-;;;;;;;;;;;;;;;;22283:142;;;;;;;;;;-1:-1:-1;22283:142:4;;;;;:::i;:::-;;:::i;13198:172::-;;;;;;;;;;-1:-1:-1;13198:172:4;;;;;:::i;:::-;;:::i;1849:205:3:-;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;1661:101:11:-;;;;;;;;;;;;;:::i;21463:237:4:-;;;;;;;;;;-1:-1:-1;21463:237:4;;;;;:::i;:::-;;:::i;13826:96::-;;;;;;;;;;-1:-1:-1;13826:96:4;;;;;:::i;:::-;;:::i;10119:37::-;;;;;;;;;;;;;;;;22097:136;;;;;;;;;;-1:-1:-1;22097:136:4;;;;;:::i;:::-;;:::i;10444:33::-;;;;;;;;;;-1:-1:-1;10444:33:4;;;;-1:-1:-1;;;10444:33:4;;;;;;1029:85:11;;;;;;;;;;-1:-1:-1;1101:6:11;;-1:-1:-1;;;;;1101:6:11;1029:85;;12681:110:4;;;;;;;;;;-1:-1:-1;12681:110:4;;;;;:::i;:::-;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;10710:47:4:-;;;;;;;;;;-1:-1:-1;10710:47:4;;;;;:::i;:::-;;;;;;;;;;;;;;10483:33;;;;;;;;;;-1:-1:-1;10483:33:4;;;;-1:-1:-1;;;10483:33:4;;;;;;12007:72;;;;;;;;;;;;;:::i;21840:208::-;;;;;;;;;;-1:-1:-1;21840:208:4;;;;;:::i;:::-;;:::i;15620:1661::-;;;;;;:::i;:::-;;:::i;4203:153:3:-;;;;;;;;;;-1:-1:-1;4203:153:3;;;;;:::i;:::-;;:::i;10236:38:4:-;;;;;;;;;;;;;;;;12906:184;;;;;;;;;;-1:-1:-1;12906:184:4;;;;;:::i;:::-;;:::i;5287:320:3:-;;;;;;;;;;-1:-1:-1;5287:320:3;;;;;:::i;:::-;;:::i;10522:36:4:-;;;;;;;;;;-1:-1:-1;10522:36:4;;;;-1:-1:-1;;;10522:36:4;;;;;;10032:37;;;;;;;;;;;;;:::i;18830:585::-;;;;;;;;;;-1:-1:-1;18830:585:4;;;;;:::i;:::-;;:::i;13550:102::-;;;;;;;;;;-1:-1:-1;13550:102:4;;;;;:::i;:::-;;:::i;10162:31::-;;;;;;;;;;;;;;;;15346:126;;;;;;;;;;-1:-1:-1;15346:126:4;;;;;:::i;:::-;;:::i;14124:132::-;;;;;;;;;;-1:-1:-1;14124:132:4;;;;;:::i;:::-;;:::i;10199:31::-;;;;;;;;;;;;;;;;11342:93;;;;;;;;;;-1:-1:-1;11342:93:4;;;;;:::i;:::-;;:::i;12475:99::-;;;;;;;;;;-1:-1:-1;12475:99:4;;;;;:::i;:::-;;:::i;10075:38::-;;;;;;;;;;;;;;;;4422:162:3;;;;;;;;;;-1:-1:-1;4422:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;20364:155:4;;;;;;;;;;;;;:::i;1911:198:11:-;;;;;;;;;;-1:-1:-1;1911:198:11;;;;;:::i;:::-;;:::i;11674:239:4:-;11843:4;11870:36;11894:11;11870:23;:36::i;:::-;11863:43;;11674:239;;;;:::o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;4014:73;;;;-1:-1:-1;;;4014:73:3;;22311:2:13;4014:73:3;;;22293:21:13;22350:2;22330:18;;;22323:30;22389:34;22369:18;;;22362:62;-1:-1:-1;;;22440:18:13;;;22433:42;22492:19;;4014:73:3;;;;;;;;;-1:-1:-1;4105:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:3;;3919:217::o;12234:93:4:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;12299:13:4::1;:21:::0;;;::::1;;-1:-1:-1::0;;;12299:21:4::1;-1:-1:-1::0;;;;12299:21:4;;::::1;::::0;;;::::1;::::0;;12234:93::o;3457:401:3:-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:3;:2;-1:-1:-1;;;;;3594:11:3;;;3586:57;;;;-1:-1:-1;;;3586:57:3;;24266:2:13;3586:57:3;;;24248:21:13;24305:2;24285:18;;;24278:30;24344:34;24324:18;;;24317:62;-1:-1:-1;;;24395:18:13;;;24388:31;24436:19;;3586:57:3;24238:223:13;3586:57:3;719:10:1;-1:-1:-1;;;;;3675:21:3;;;;:62;;-1:-1:-1;3700:37:3;3717:5;719:10:1;3724:12:3;640:96:1;3700:37:3;3654:165;;;;-1:-1:-1;;;3654:165:3;;19521:2:13;3654:165:3;;;19503:21:13;19560:2;19540:18;;;19533:30;19599:34;19579:18;;;19572:62;19670:26;19650:18;;;19643:54;19714:19;;3654:165:3;19493:246:13;3654:165:3;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3457:401;;;:::o;18230:385:4:-;18320:16;18352:23;18378:17;18388:6;18378:9;:17::i;:::-;18352:43;;18405:25;18447:15;18433:30;;;;;;-1:-1:-1;;;18433:30:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18433:30:4;;18405:58;;18478:9;18473:111;18493:15;18489:1;:19;18473:111;;;18543:30;18563:6;18571:1;18543:19;:30::i;:::-;18529:8;18538:1;18529:11;;;;;;-1:-1:-1;;;18529:11:4;;;;;;;;;;;;;;;;;;:44;18510:3;;;;:::i;:::-;;;;18473:111;;;-1:-1:-1;18600:8:4;18230:385;-1:-1:-1;;;18230:385:4:o;11035:162::-;-1:-1:-1;;;11035:162:4;;;;;;;:::o;17373:127::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;17456:37:4::1;17475:11;17488:4;17456:18;:37::i;:::-;17373:127:::0;;:::o;14670:107::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;14743:18:4::1;:27:::0;14670:107::o;20678:365::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;20742:13:4::1;::::0;-1:-1:-1;;;20742:13:4;::::1;;;20734:55;;;::::0;-1:-1:-1;;;20734:55:4;;18272:2:13;20734:55:4::1;::::0;::::1;18254:21:13::0;18311:2;18291:18;;;18284:30;18350:31;18330:18;;;18323:59;18399:18;;20734:55:4::1;18244:179:13::0;20734:55:4::1;20799:16;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;20799:25:4;;;;::::1;::::0;;-1:-1:-1;;;;;;20799:25:4::1;-1:-1:-1::0;;;;;20799:25:4;::::1;;::::0;;20852:13:::1;2324:10:::0;:17;2237:111;;20852:13:::1;20835:30:::0;-1:-1:-1;20875:15:4::1;20893:10;20835:30:::0;20902:1:::1;20893:10;:::i;:::-;20875:28;;20914:22;20924:2;20928:7;20914:9;:22::i;:::-;20972:16;::::0;20990:17:::1;::::0;20946:62:::1;::::0;20963:7;;-1:-1:-1;;;;;20972:16:4;;::::1;::::0;20946::::1;:62::i;:::-;-1:-1:-1::0;;;;;21018:16:4;::::1;;::::0;;;:12:::1;:16;::::0;;;;:18;;;::::1;::::0;::::1;:::i;:::-;;;;;;1311:1:11;;20678:365:4::0;:::o;4646:330:3:-;4835:41;719:10:1;4854:12:3;4868:7;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:3;;;;;;;:::i;:::-;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;9457:292:4:-;9574:16;9654:19;;;:10;:19;;;;;;;;9629:44;;;;;;;;;;-1:-1:-1;;;;;9629:44:4;;;;;;;;;;;;;;;9574:16;;9736:5;;9711:21;;:5;:21;:::i;:::-;9710:31;;;;:::i;:::-;9683:59;;;;;9457:292;;;;;:::o;1913:253::-;2010:7;2045:23;2062:5;2045:16;:23::i;:::-;2037:5;:31;2029:87;;;;-1:-1:-1;;;2029:87:4;;15508:2:13;2029:87:4;;;15490:21:13;15547:2;15527:18;;;15520:30;15586:34;15566:18;;;15559:62;-1:-1:-1;;;15637:18:13;;;15630:41;15688:19;;2029:87:4;15480:233:13;2029:87:4;-1:-1:-1;;;;;;2133:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1913:253::o;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;2420:230:4:-;2495:7;2530:30;2324:10;:17;2237:111;;2530:30;2522:5;:38;2514:95;;;;-1:-1:-1;;;2514:95:4;;25086:2:13;2514:95:4;;;25068:21:13;25125:2;25105:18;;;25098:30;25164:34;25144:18;;;25137:62;-1:-1:-1;;;25215:18:13;;;25208:42;25267:19;;2514:95:4;25058:234:13;2514:95:4;2626:10;2637:5;2626:17;;;;;;-1:-1:-1;;;2626:17:4;;;;;;;;;;;;;;;;;2619:24;;2420:230;;;:::o;14967:164::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;15050:14:4::1;::::0;-1:-1:-1;;;15050:14:4;::::1;;;15049:15;15041:52;;;::::0;-1:-1:-1;;;15041:52:4;;21543:2:13;15041:52:4::1;::::0;::::1;21525:21:13::0;21582:2;21562:18;;;21555:30;21621:26;21601:18;;;21594:54;21665:18;;15041:52:4::1;21515:174:13::0;15041:52:4::1;15103:21:::0;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;21159:169::-:0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;21222:12:4::1;21248:7;1101:6:11::0;;-1:-1:-1;;;;;1101:6:11;1029:85;;21248:7:4::1;-1:-1:-1::0;;;;;21240:21:4::1;21269;21240:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21221:74;;;21313:7;21305:16;;;::::0;::::1;;1311:1:11;21159:169:4:o:0;14407:96::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;14475:12:4::1;:21:::0;14407:96::o;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;20357:2:13;2244:73:3;;;20339:21:13;20396:2;20376:18;;;20369:30;20435:34;20415:18;;;20408:62;-1:-1:-1;;;20486:18:13;;;20479:39;20535:19;;2244:73:3;20329:231:13;22283:142:4;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;22362:59:4::1;::::0;-1:-1:-1;;;22362:59:4;;22399:4:::1;22362:59;::::0;::::1;11466:34:13::0;22406:10:4::1;11516:18:13::0;;;11509:43;11568:18;;;11561:34;;;-1:-1:-1;;;;;22362:28:4;::::1;::::0;::::1;::::0;11401:18:13;;22362:59:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22283:142:::0;;:::o;13198:172::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;13280:9:4::1;;13271:6;:18;13263:72;;;::::0;-1:-1:-1;;;13263:72:4;;16339:2:13;13263:72:4::1;::::0;::::1;16321:21:13::0;16378:2;16358:18;;;16351:30;16417:34;16397:18;;;16390:62;-1:-1:-1;;;16468:18:13;;;16461:39;16517:19;;13263:72:4::1;16311:231:13::0;13263:72:4::1;13345:9;:18:::0;13198:172::o;1849:205:3:-;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;19946:2:13;1940:74:3;;;19928:21:13;19985:2;19965:18;;;19958:30;20024:34;20004:18;;;19997:62;-1:-1:-1;;;20075:18:13;;;20068:40;20125:19;;1940:74:3;19918:232:13;1940:74:3;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;1661:101:11:-;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;21463:237:4:-;21532:41;719:10:1;21551:12:4;640:96:1;21532:41:4;21524:102;;;;-1:-1:-1;;;21524:102:4;;25914:2:13;21524:102:4;;;25896:21:13;25953:2;25933:18;;;25926:30;25992:34;25972:18;;;25965:62;-1:-1:-1;;;26043:18:13;;;26036:46;26099:19;;21524:102:4;25886:238:13;21524:102:4;21636:57;21656:10;21676:6;21685:7;21636:19;:57::i;13826:96::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;13894:10:4::1;:21:::0;13826:96::o;22097:136::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;22193:35:4::1;::::0;-1:-1:-1;;;22193:35:4;;22222:4:::1;22193:35;::::0;::::1;11164:51:13::0;-1:-1:-1;;;;;22161:19:4;::::1;::::0;::::1;::::0;22181:10:::1;::::0;22161:19;;22193:20:::1;::::0;11137:18:13;;22193:35:4::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22161:68;::::0;-1:-1:-1;;;;;;22161:68:4::1;::::0;;;;;;-1:-1:-1;;;;;12291:32:13;;;22161:68:4::1;::::0;::::1;12273:51:13::0;12340:18;;;12333:34;12246:18;;22161:68:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12681:110::-:0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;12753:24:4::1;;::::0;;;:18:::1;:24;::::0;;;;:31;;-1:-1:-1;;12753:31:4::1;12780:4;12753:31;::::0;;12681:110::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;12007:72:4:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;12054:14:4::1;:21:::0;;-1:-1:-1;;;;12054:21:4::1;-1:-1:-1::0;;;12054:21:4::1;::::0;;12007:72::o;21840:208::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;21918:9:4::1;21913:129;21937:7;:14;21933:1;:18;21913:129;;;21974:57;21994:7;1101:6:11::0;;-1:-1:-1;;;;;1101:6:11;1029:85;;21994:7:4::1;22011:6;22020:7;22028:1;22020:10;;;;;;-1:-1:-1::0;;;22020:10:4::1;;;;;;;;;;;;;;;21974:19;:57::i;:::-;21953:3:::0;::::1;::::0;::::1;:::i;:::-;;;;21913:129;;15620:1661:::0;15680:14;15697:13;2324:10;:17;2237:111;;15697:13;15782:10;15720:25;15769:24;;;:12;:24;;;;;;15748:18;;15680:30;;-1:-1:-1;15720:25:4;;15748:45;;15769:24;15748:45;:::i;:::-;15720:73;;15832:11;15811:17;:32;;15803:96;;;;-1:-1:-1;;;15803:96:4;;14733:2:13;15803:96:4;;;14715:21:13;14772:2;14752:18;;;14745:30;14811:34;14791:18;;;14784:62;-1:-1:-1;;;14862:18:13;;;14855:49;14921:19;;15803:96:4;14705:241:13;15803:96:4;15918:14;;-1:-1:-1;;;15918:14:4;;;;15917:15;15909:97;;;;-1:-1:-1;;;15909:97:4;;19043:2:13;15909:97:4;;;19025:21:13;19082:2;19062:18;;;19055:30;19121:34;19101:18;;;19094:62;19192:34;19172:18;;;19165:62;-1:-1:-1;;;19243:19:13;;;19236:36;19289:19;;15909:97:4;19015:299:13;15909:97:4;16039:12;;16024:11;:27;;16016:110;;;;-1:-1:-1;;;16016:110:4;;14254:2:13;16016:110:4;;;14236:21:13;14293:2;14273:18;;;14266:30;14332:34;14312:18;;;14305:62;14403:34;14383:18;;;14376:62;-1:-1:-1;;;14454:19:13;;;14447:37;14501:19;;16016:110:4;14226:300:13;16016:110:4;16175:9;;16151:20;16160:11;16151:6;:20;:::i;:::-;:33;;16143:92;;;;-1:-1:-1;;;16143:92:4;;25499:2:13;16143:92:4;;;25481:21:13;25538:2;25518:18;;;25511:30;25577:34;25557:18;;;25550:62;-1:-1:-1;;;25628:18:13;;;25621:44;25682:19;;16143:92:4;25471:236:13;16143:92:4;16251:16;;-1:-1:-1;;;16251:16:4;;;;16246:350;;16306:10;16287:30;;;;:18;:30;;;;;;;;16283:300;;;16374:11;16358:13;;:27;;;;:::i;:::-;16345:9;:40;;16337:95;;;;-1:-1:-1;;;16337:95:4;;;;;;;:::i;:::-;16283:300;;;16498:10;16479:30;;;;:18;:30;;;;;;;;16471:89;;;;-1:-1:-1;;;16471:89:4;;21896:2:13;16471:89:4;;;21878:21:13;21935:2;21915:18;;;21908:30;21974:34;21954:18;;;21947:62;-1:-1:-1;;;22025:18:13;;;22018:44;22079:19;;16471:89:4;21868:236:13;16471:89:4;16618:16;;-1:-1:-1;;;16618:16:4;;;;16614:357;;;16673:10;16654:30;;;;:18;:30;;;;;;;;16650:308;;;16741:11;16725:13;;:27;;;;:::i;:::-;16712:9;:40;;16704:95;;;;-1:-1:-1;;;16704:95:4;;;;;;;:::i;:::-;16650:308;;;16872:11;16859:10;;:24;;;;:::i;:::-;16846:9;:37;;16838:96;;;;-1:-1:-1;;;16838:96:4;;20767:2:13;16838:96:4;;;20749:21:13;20806:2;20786:18;;;20779:30;20845:34;20825:18;;;20818:62;-1:-1:-1;;;20896:18:13;;;20889:44;20950:19;;16838:96:4;20739:236:13;16838:96:4;16998:1;16981:294;17006:11;17001:1;:16;16981:294;;17038:15;17056:10;:6;17065:1;17056:10;:::i;:::-;17038:28;;17080:30;17090:10;17102:7;17080:9;:30::i;:::-;17150:16;;17168:17;;17124:62;;17141:7;;-1:-1:-1;;;;;17150:16:4;;;;17124;:62::i;:::-;17214:10;17201:24;;;;:12;:24;;;;;:26;;;;;;:::i;:::-;;;;-1:-1:-1;;2324:10:4;:17;17242:22;;16981:294;17019:3;;;;;:::i;:::-;;;;16981:294;;;;15620:1661;;;:::o;4203:153:3:-;4297:52;719:10:1;4330:8:3;4340;4297:18;:52::i;12906:184:4:-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;12991:6:4::1;12987:97;13004:4;:11;13001:1;:14;12987:97;;;13067:4;13037:18;:27;13056:4;13061:1;13056:7;;;;;;-1:-1:-1::0;;;13056:7:4::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;13037:27:4::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;13037:27:4;:34;;-1:-1:-1;;13037:34:4::1;::::0;::::1;;::::0;;;::::1;::::0;;13017:3;::::1;::::0;::::1;:::i;:::-;;;;12987:97;;5287:320:3::0;5456:41;719:10:1;5489:7:3;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:3;;;;;;;:::i;:::-;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;10032:37:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18830:585::-;7144:4:3;7167:16;;;:7;:16;;;;;;18943:13:4;;-1:-1:-1;;;;;7167:16:3;18972:76:4;;;;-1:-1:-1;;;18972:76:4;;23495:2:13;18972:76:4;;;23477:21:13;23534:2;23514:18;;;23507:30;23573:34;23553:18;;;23546:62;-1:-1:-1;;;23624:18:13;;;23617:45;23679:19;;18972:76:4;23467:237:13;18972:76:4;19059:28;19090:10;:8;:10::i;:::-;19059:41;;19160:1;19135:14;19129:28;:32;:279;;;;;;;;;;;;;;;;;19250:14;19290:18;:7;:16;:18::i;:::-;19334:13;19208:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19129:279;19110:298;18830:585;-1:-1:-1;;;18830:585:4:o;13550:102::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;13621:13:4::1;:24:::0;13550:102::o;15346:126::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;15432:33:4;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;14124:132::-:0;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;14210:16:4::1;:39:::0;;-1:-1:-1;;;;;;14210:39:4::1;-1:-1:-1::0;;;;;14210:39:4;;;::::1;::::0;;;::::1;::::0;;14124:132::o;11342:93::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;11405:14:4::1;:23:::0;;;::::1;;-1:-1:-1::0;;;11405:23:4::1;-1:-1:-1::0;;;;11405:23:4;;::::1;::::0;;;::::1;::::0;;11342:93::o;12475:99::-;1101:6:11;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;12543:16:4::1;:24:::0;;;::::1;;-1:-1:-1::0;;;12543:24:4::1;-1:-1:-1::0;;;;12543:24:4;;::::1;::::0;;;::::1;::::0;;12475:99::o;20364:155::-;1101:6:11;;20423:7:4;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;20442:15:4::1;20460:19;20465:10;20477:1;20460:4;:19::i;:::-;20442:37;;20496:16;20504:7;20496;:16::i;:::-;20489:23;;;20364:155:::0;:::o;1911:198:11:-;1101:6;;-1:-1:-1;;;;;1101:6:11;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:11;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:11;;16749:2:13;1991:73:11::1;::::0;::::1;16731:21:13::0;16788:2;16768:18;;;16761:30;16827:34;16807:18;;;16800:62;-1:-1:-1;;;16878:18:13;;;16871:36;16924:19;;1991:73:11::1;16721:228:13::0;1991:73:11::1;2074:28;2093:8;2074:18;:28::i;8676:273:4:-:0;8801:4;-1:-1:-1;;;;;;8840:50:4;;-1:-1:-1;;;8840:50:4;;:102;;;8906:36;8930:11;8906:23;:36::i;10930:171:3:-;11004:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11004:29:3;-1:-1:-1;;;;;11004:29:3;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;-1:-1:-1;;;;;11048:46:3;;;;;;;;;;;10930:171;;:::o;17644:461:4:-;17725:14;17742:13;2324:10;:17;2237:111;;17742:13;17797:9;;17725:30;;-1:-1:-1;17773:20:4;;;;17725:30;17773:20;:::i;:::-;:33;;17765:72;;;;-1:-1:-1;;;17765:72:4;;23911:2:13;17765:72:4;;;23893:21:13;23950:2;23930:18;;;23923:30;23989:28;23969:18;;;23962:56;24035:18;;17765:72:4;23883:176:13;17765:72:4;17870:1;17856:243;17878:11;17873:16;;:1;:16;17856:243;;17910:15;17928:10;:6;17937:1;17928:10;:::i;:::-;17910:28;;17952:24;17962:4;17968:7;17952:9;:24::i;:::-;18016:16;;18034:17;;17990:62;;18007:7;;-1:-1:-1;;;;;18016:16:4;;;;17990;:62::i;:::-;-1:-1:-1;2324:10:4;:17;;-1:-1:-1;17891:3:4;;;;:::i;:::-;;;;17856:243;;8036:108:3;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;9180:233:4:-;9318:5;9309;:14;;9301:53;;;;-1:-1:-1;;;9301:53:4;;15153:2:13;9301:53:4;;;15135:21:13;15192:2;15172:18;;;15165:30;15231:28;15211:18;;;15204:56;15277:18;;9301:53:4;15125:176:13;9301:53:4;9381:25;;;;;;;;-1:-1:-1;;;;;9381:25:4;;;;;;;;;;;;-1:-1:-1;9364:14:4;;;:10;:14;;;;:42;;;;-1:-1:-1;;;;;;9364:42:4;;;;;;;;;;-1:-1:-1;9364:42:4;;;;9180:233::o;7362:344:3:-;7455:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;7471:73;;;;-1:-1:-1;;;7471:73:3;;18630:2:13;7471:73:3;;;18612:21:13;18669:2;18649:18;;;18642:30;18708:34;18688:18;;;18681:62;-1:-1:-1;;;18759:18:13;;;18752:42;18811:19;;7471:73:3;18602:234:13;7471:73:3;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:3;:7;-1:-1:-1;;;;;7611:16:3;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:3;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:3;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7666:32;4422:162;10259:560;10413:4;-1:-1:-1;;;;;10386:31:3;:23;10401:7;10386:14;:23::i;:::-;-1:-1:-1;;;;;10386:31:3;;10378:85;;;;-1:-1:-1;;;10378:85:3;;23085:2:13;10378:85:3;;;23067:21:13;23124:2;23104:18;;;23097:30;23163:34;23143:18;;;23136:62;-1:-1:-1;;;23214:18:13;;;23207:39;23263:19;;10378:85:3;23057:231:13;10378:85:3;-1:-1:-1;;;;;10481:16:3;;10473:65;;;;-1:-1:-1;;;10473:65:3;;17513:2:13;10473:65:3;;;17495:21:13;17552:2;17532:18;;;17525:30;17591:34;17571:18;;;17564:62;-1:-1:-1;;;17642:18:13;;;17635:34;17686:19;;10473:65:3;17485:226:13;10473:65:3;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;-1:-1:-1;;;;;10690:15:3;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10720:13:3;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10748:21:3;-1:-1:-1;;;;;10748:21:3;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;2263:187:11:-;2355:6;;;-1:-1:-1;;;;;2371:17:11;;;-1:-1:-1;;;;;;2371:17:11;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2263:187;;:::o;11236:307:3:-;11386:8;-1:-1:-1;;;;;11377:17:3;:5;-1:-1:-1;;;;;11377:17:3;;;11369:55;;;;-1:-1:-1;;;11369:55:3;;17918:2:13;11369:55:3;;;17900:21:13;17957:2;17937:18;;;17930:30;17996:27;17976:18;;;17969:55;18041:18;;11369:55:3;17890:175:13;11369:55:3;-1:-1:-1;;;;;11434:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11434:46:3;;;;;;;;;;11495:41;;13158::13;;;11495::3;;13131:18:13;11495:41:3;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:3;;;;;;;:::i;11562:106:4:-;11622:13;11654:7;11647:14;;;;;:::i;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:12;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;19744:454:4;20056:31;;-1:-1:-1;;8750:2:13;8746:15;;;8742:53;20056:31:4;;;8730:66:13;19822:7:4;;;;20114:12;;20094:15;;8812:12:13;;20056:31:4;;;;;;;;;;;;20046:42;;;;;;20038:51;;20037:73;;;;:::i;:::-;19960:32;;-1:-1:-1;;19977:14:4;8750:2:13;8746:15;8742:53;19960:32:4;;;8730:66:13;20019:14:4;;19999:15;;8812:12:13;;19960:32:4;;;;;;;;;;;;19950:43;;;;;;19942:52;;19941:74;;;;:::i;:::-;19922:16;19892:26;19910:8;19892:15;:26;:::i;:::-;19891:47;;;;:::i;:::-;:125;;;;:::i;:::-;:142;;;;:::i;:::-;:220;;;;:::i;:::-;:235;;;;:::i;:::-;19874:253;;;;;;10960:19:13;;11004:2;10995:12;;10950:63;19874:253:4;;;;-1:-1:-1;;19874:253:4;;;;;;;;;19864:264;;19874:253;19864:264;;;;20176:9;;19864:264;;-1:-1:-1;20156:16:4;20176:9;19864:264;20156:16;:::i;:::-;20155:30;;;;:::i;:::-;20147:39;;:4;:39;:::i;:::-;20146:45;;20190:1;20146:45;:::i;1612:222::-;1714:4;-1:-1:-1;;;;;;1737:50:4;;-1:-1:-1;;;1737:50:4;;:90;;;1791:36;1815:11;1791:23;:36::i;8365:311:3:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:3;;;;;;;:::i;22578:433:4:-;22735:45;22762:4;22768:2;22772:7;22735:26;:45::i;:::-;22837:16;;-1:-1:-1;;;;;22837:16:4;:30;;;;:52;;-1:-1:-1;;;;;;22871:18:4;;;;22837:52;:81;;;;-1:-1:-1;1087:20:0;;1133:8;22837:81:4;22833:172;;;22953:16;;22934:60;;-1:-1:-1;;;22934:60:4;;;;;26275:25:13;;;-1:-1:-1;;;;;22953:16:4;;;;22934:51;;26248:18:13;;22934:60:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22578:433;;;:::o;12096:778:3:-;12246:4;-1:-1:-1;;;;;12266:13:3;;1087:20:0;1133:8;12262:606:3;;12301:72;;-1:-1:-1;;;12301:72:3;;-1:-1:-1;;;;;12301:36:3;;;;;:72;;719:10:1;;12352:4:3;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:3;;;;;;;;-1:-1:-1;;12301:72:3;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:3;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:3;;;;;;;:::i;12536:266::-;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;-1:-1:-1;;;;;;12423:51:3;-1:-1:-1;;;12423:51:3;;-1:-1:-1;12416:58:3;;12262:606;-1:-1:-1;12853:4:3;12846:11;;1490:300;1592:4;-1:-1:-1;;;;;;1627:40:3;;-1:-1:-1;;;1627:40:3;;:104;;-1:-1:-1;;;;;;;1683:48:3;;-1:-1:-1;;;1683:48:3;1627:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:2;;;1747:36:3;829:155:2;8998:372:3;-1:-1:-1;;;;;9077:16:3;;9069:61;;;;-1:-1:-1;;;9069:61:3;;21182:2:13;9069:61:3;;;21164:21:13;;;21201:18;;;21194:30;21260:34;21240:18;;;21233:62;21312:18;;9069:61:3;21154:182:13;9069:61:3;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;:30;9140:58;;;;-1:-1:-1;;;9140:58:3;;17156:2:13;9140:58:3;;;17138:21:13;17195:2;17175:18;;;17168:30;17234;17214:18;;;17207:58;17282:18;;9140:58:3;17128:178:13;9140:58:3;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:3;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9293:21:3;-1:-1:-1;;;;;9293:21:3;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;3246:572:4:-;-1:-1:-1;;;;;3445:18:4;;3441:183;;3479:40;3511:7;4627:10;:17;;4600:24;;;;:15;:24;;;;;:44;;;4654:24;;;;;;;;;;;;4524:161;3479:40;3441:183;;;3548:2;-1:-1:-1;;;;;3540:10:4;:4;-1:-1:-1;;;;;3540:10:4;;3536:88;;3566:47;3599:4;3605:7;3566:32;:47::i;:::-;-1:-1:-1;;;;;3637:16:4;;3633:179;;3669:45;3706:7;3669:36;:45::i;:::-;3633:179;;;3741:4;-1:-1:-1;;;;;3735:10:4;:2;-1:-1:-1;;;;;3735:10:4;;3731:81;;3761:40;3789:2;3793:7;3761:27;:40::i;5302:970::-;5564:22;5614:1;5589:22;5606:4;5589:16;:22::i;:::-;:26;;;;:::i;:::-;5625:18;5646:26;;;:17;:26;;;;;;5564:51;;-1:-1:-1;5776:28:4;;;5772:323;;-1:-1:-1;;;;;5842:18:4;;5820:19;5842:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5891:30;;;;;;:44;;;6007:30;;:17;:30;;;;;:43;;;5772:323;-1:-1:-1;6188:26:4;;;;:17;:26;;;;;;;;6181:33;;;-1:-1:-1;;;;;6231:18:4;;;;;:12;:18;;;;;:34;;;;;;;6224:41;5302:970::o;6560:1061::-;6834:10;:17;6809:22;;6834:21;;6854:1;;6834:21;:::i;:::-;6865:18;6886:24;;;:15;:24;;;;;;7254:10;:26;;6809:46;;-1:-1:-1;6886:24:4;;6809:46;;7254:26;;;;-1:-1:-1;;;7254:26:4;;;;;;;;;;;;;;;;;7232:48;;7316:11;7291:10;7302;7291:22;;;;;;-1:-1:-1;;;7291:22:4;;;;;;;;;;;;;;;;;;;;:36;;;;7395:28;;;:15;:28;;;;;;;:41;;;7564:24;;;;;7557:31;7598:10;:16;;;;;-1:-1:-1;;;7598:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;6560:1061;;;;:::o;4112:217::-;4196:14;4213:20;4230:2;4213:16;:20::i;:::-;-1:-1:-1;;;;;4243:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;4287:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;4112:217:4:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:13;;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:13;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:257::-;;537:2;525:9;516:7;512:23;508:32;505:2;;;558:6;550;543:22;505:2;602:9;589:23;621:31;646:5;621:31;:::i;687:398::-;;;816:2;804:9;795:7;791:23;787:32;784:2;;;837:6;829;822:22;784:2;881:9;868:23;900:31;925:5;900:31;:::i;:::-;950:5;-1:-1:-1;1007:2:13;992:18;;979:32;1020:33;979:32;1020:33;:::i;:::-;1072:7;1062:17;;;774:311;;;;;:::o;1090:466::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1301:9;1288:23;1320:31;1345:5;1320:31;:::i;:::-;1370:5;-1:-1:-1;1427:2:13;1412:18;;1399:32;1440:33;1399:32;1440:33;:::i;:::-;1194:362;;1492:7;;-1:-1:-1;;;1546:2:13;1531:18;;;;1518:32;;1194:362::o;1561:824::-;;;;;1733:3;1721:9;1712:7;1708:23;1704:33;1701:2;;;1755:6;1747;1740:22;1701:2;1799:9;1786:23;1818:31;1843:5;1818:31;:::i;:::-;1868:5;-1:-1:-1;1925:2:13;1910:18;;1897:32;1938:33;1897:32;1938:33;:::i;:::-;1990:7;-1:-1:-1;2044:2:13;2029:18;;2016:32;;-1:-1:-1;2099:2:13;2084:18;;2071:32;2126:18;2115:30;;2112:2;;;2163:6;2155;2148:22;2112:2;2191:22;;2244:4;2236:13;;2232:27;-1:-1:-1;2222:2:13;;2278:6;2270;2263:22;2222:2;2306:73;2371:7;2366:2;2353:16;2348:2;2344;2340:11;2306:73;:::i;:::-;2296:83;;;1691:694;;;;;;;:::o;2390:392::-;;;2516:2;2504:9;2495:7;2491:23;2487:32;2484:2;;;2537:6;2529;2522:22;2484:2;2581:9;2568:23;2600:31;2625:5;2600:31;:::i;:::-;2650:5;-1:-1:-1;2707:2:13;2692:18;;2679:32;2720:30;2679:32;2720:30;:::i;2787:325::-;;;2916:2;2904:9;2895:7;2891:23;2887:32;2884:2;;;2937:6;2929;2922:22;2884:2;2981:9;2968:23;3000:31;3025:5;3000:31;:::i;:::-;3050:5;3102:2;3087:18;;;;3074:32;;-1:-1:-1;;;2874:238:13:o;3117:1022::-;;3232:2;3275;3263:9;3254:7;3250:23;3246:32;3243:2;;;3296:6;3288;3281:22;3243:2;3341:9;3328:23;3374:18;3366:6;3363:30;3360:2;;;3411:6;3403;3396:22;3360:2;3439:22;;3492:4;3484:13;;3480:27;-1:-1:-1;3470:2:13;;3526:6;3518;3511:22;3470:2;3567;3554:16;3590:60;3606:43;3646:2;3606:43;:::i;:::-;3590:60;:::i;:::-;3672:3;3696:2;3691:3;3684:15;3724:2;3719:3;3715:12;3708:19;;3755:2;3751;3747:11;3803:7;3798:2;3792;3789:1;3785:10;3781:2;3777:19;3773:28;3770:41;3767:2;;;3829:6;3821;3814:22;3767:2;3856:6;3847:15;;3871:238;3885:2;3882:1;3879:9;3871:238;;;3956:3;3943:17;3973:31;3998:5;3973:31;:::i;:::-;4017:18;;3903:1;3896:9;;;;;4055:12;;;;4087;;3871:238;;;-1:-1:-1;4128:5:13;3212:927;-1:-1:-1;;;;;;;3212:927:13:o;4144:947::-;;4259:2;4302;4290:9;4281:7;4277:23;4273:32;4270:2;;;4323:6;4315;4308:22;4270:2;4368:9;4355:23;4401:18;4393:6;4390:30;4387:2;;;4438:6;4430;4423:22;4387:2;4466:22;;4519:4;4511:13;;4507:27;-1:-1:-1;4497:2:13;;4553:6;4545;4538:22;4497:2;4594;4581:16;4617:60;4633:43;4673:2;4633:43;:::i;4617:60::-;4699:3;4723:2;4718:3;4711:15;4751:2;4746:3;4742:12;4735:19;;4782:2;4778;4774:11;4830:7;4825:2;4819;4816:1;4812:10;4808:2;4804:19;4800:28;4797:41;4794:2;;;4856:6;4848;4841:22;4794:2;4883:6;4874:15;;4898:163;4912:2;4909:1;4906:9;4898:163;;;4969:17;;4957:30;;4930:1;4923:9;;;;;5007:12;;;;5039;;4898:163;;5096:251;;5205:2;5193:9;5184:7;5180:23;5176:32;5173:2;;;5226:6;5218;5211:22;5173:2;5270:9;5257:23;5289:28;5311:5;5289:28;:::i;5352:255::-;;5472:2;5460:9;5451:7;5447:23;5443:32;5440:2;;;5493:6;5485;5478:22;5440:2;5530:9;5524:16;5549:28;5571:5;5549:28;:::i;5612:255::-;;5723:2;5711:9;5702:7;5698:23;5694:32;5691:2;;;5744:6;5736;5729:22;5691:2;5788:9;5775:23;5807:30;5831:5;5807:30;:::i;5872:259::-;;5994:2;5982:9;5973:7;5969:23;5965:32;5962:2;;;6015:6;6007;6000:22;5962:2;6052:9;6046:16;6071:30;6095:5;6071:30;:::i;6759:480::-;;6881:2;6869:9;6860:7;6856:23;6852:32;6849:2;;;6902:6;6894;6887:22;6849:2;6947:9;6934:23;6980:18;6972:6;6969:30;6966:2;;;7017:6;7009;7002:22;6966:2;7045:22;;7098:4;7090:13;;7086:27;-1:-1:-1;7076:2:13;;7132:6;7124;7117:22;7076:2;7160:73;7225:7;7220:2;7207:16;7202:2;7198;7194:11;7160:73;:::i;7244:433::-;;;7372:2;7360:9;7351:7;7347:23;7343:32;7340:2;;;7393:6;7385;7378:22;7340:2;7437:9;7424:23;7487:6;7480:5;7476:18;7469:5;7466:29;7456:2;;7514:6;7506;7499:22;7682:190;;7794:2;7782:9;7773:7;7769:23;7765:32;7762:2;;;7815:6;7807;7800:22;7762:2;-1:-1:-1;7843:23:13;;7752:120;-1:-1:-1;7752:120:13:o;7877:194::-;;8000:2;7988:9;7979:7;7975:23;7971:32;7968:2;;;8021:6;8013;8006:22;7968:2;-1:-1:-1;8049:16:13;;7958:113;-1:-1:-1;7958:113:13:o;8076:258::-;;;8205:2;8193:9;8184:7;8180:23;8176:32;8173:2;;;8226:6;8218;8211:22;8173:2;-1:-1:-1;;8254:23:13;;;8324:2;8309:18;;;8296:32;;-1:-1:-1;8163:171:13:o;8339:257::-;;8418:5;8412:12;8445:6;8440:3;8433:19;8461:63;8517:6;8510:4;8505:3;8501:14;8494:4;8487:5;8483:16;8461:63;:::i;:::-;8578:2;8557:15;-1:-1:-1;;8553:29:13;8544:39;;;;8585:4;8540:50;;8388:208;-1:-1:-1;;8388:208:13:o;9085:1531::-;;9347:6;9341:13;9373:4;9386:51;9430:6;9425:3;9420:2;9412:6;9408:15;9386:51;:::i;:::-;9500:13;;9459:16;;;;9522:55;9500:13;9459:16;9544:15;;;9522:55;:::i;:::-;9668:13;;9599:20;;;9639:3;;9728:1;9750:18;;;;9803;;;;9830:2;;9908:4;9898:8;9894:19;9882:31;;9830:2;9971;9961:8;9958:16;9938:18;9935:40;9932:2;;;-1:-1:-1;;;9998:33:13;;10054:4;10051:1;10044:15;10084:4;10005:3;10072:17;9932:2;10115:18;10142:110;;;;10266:1;10261:330;;;;10108:483;;10142:110;-1:-1:-1;;10177:24:13;;10163:39;;10222:20;;;;-1:-1:-1;10142:110:13;;10261:330;26779:127;26845:17;;;26895:4;26879:21;;10356:3;10372:169;10386:8;10383:1;10380:15;10372:169;;;10468:14;;10453:13;;;10446:37;10511:16;;;;10403:10;;10372:169;;;10376:3;;10572:8;10565:5;10561:20;10554:27;;10108:483;-1:-1:-1;10607:3:13;;9317:1299;-1:-1:-1;;;;;;;;;;;9317:1299:13:o;11606:488::-;-1:-1:-1;;;;;11875:15:13;;;11857:34;;11927:15;;11922:2;11907:18;;11900:43;11974:2;11959:18;;11952:34;;;12022:3;12017:2;12002:18;;11995:31;;;11606:488;;12043:45;;12068:19;;12060:6;12043:45;:::i;:::-;12035:53;11809:285;-1:-1:-1;;;;;;11809:285:13:o;12378:635::-;12549:2;12601:21;;;12671:13;;12574:18;;;12693:22;;;12378:635;;12549:2;12772:15;;;;12746:2;12731:18;;;12378:635;12818:169;12832:6;12829:1;12826:13;12818:169;;;12893:13;;12881:26;;12962:15;;;;12927:12;;;;12854:1;12847:9;12818:169;;;-1:-1:-1;13004:3:13;;12529:484;-1:-1:-1;;;;;;12529:484:13:o;13417:219::-;;13566:2;13555:9;13548:21;13586:44;13626:2;13615:9;13611:18;13603:6;13586:44;:::i;13641:406::-;13843:2;13825:21;;;13882:2;13862:18;;;13855:30;13921:34;13916:2;13901:18;;13894:62;-1:-1:-1;;;13987:2:13;13972:18;;13965:40;14037:3;14022:19;;13815:232::o;15718:414::-;15920:2;15902:21;;;15959:2;15939:18;;;15932:30;15998:34;15993:2;15978:18;;15971:62;-1:-1:-1;;;16064:2:13;16049:18;;16042:48;16122:3;16107:19;;15892:240::o;22522:356::-;22724:2;22706:21;;;22743:18;;;22736:30;22802:34;22797:2;22782:18;;22775:62;22869:2;22854:18;;22696:182::o;24466:413::-;24668:2;24650:21;;;24707:2;24687:18;;;24680:30;24746:34;24741:2;24726:18;;24719:62;-1:-1:-1;;;24812:2:13;24797:18;;24790:47;24869:3;24854:19;;24640:239::o;26311:275::-;26382:2;26376:9;26447:2;26428:13;;-1:-1:-1;;26424:27:13;26412:40;;26482:18;26467:34;;26503:22;;;26464:62;26461:2;;;26529:18;;:::i;:::-;26565:2;26558:22;26356:230;;-1:-1:-1;26356:230:13:o;26591:183::-;;26684:18;26676:6;26673:30;26670:2;;;26706:18;;:::i;:::-;-1:-1:-1;26751:1:13;26747:14;26763:4;26743:25;;26660:114::o;26911:128::-;;26982:1;26978:6;26975:1;26972:13;26969:2;;;26988:18;;:::i;:::-;-1:-1:-1;27024:9:13;;26959:80::o;27044:120::-;;27110:1;27100:2;;27115:18;;:::i;:::-;-1:-1:-1;27149:9:13;;27090:74::o;27169:168::-;;27275:1;27271;27267:6;27263:14;27260:1;27257:21;27252:1;27245:9;27238:17;27234:45;27231:2;;;27282:18;;:::i;:::-;-1:-1:-1;27322:9:13;;27221:116::o;27342:125::-;;27410:1;27407;27404:8;27401:2;;;27415:18;;:::i;:::-;-1:-1:-1;27452:9:13;;27391:76::o;27472:258::-;27544:1;27554:113;27568:6;27565:1;27562:13;27554:113;;;27644:11;;;27638:18;27625:11;;;27618:39;27590:2;27583:10;27554:113;;;27685:6;27682:1;27679:13;27676:2;;;-1:-1:-1;;27720:1:13;27702:16;;27695:27;27525:205::o;27735:380::-;27814:1;27810:12;;;;27857;;;27878:2;;27932:4;27924:6;27920:17;27910:27;;27878:2;27985;27977:6;27974:14;27954:18;27951:38;27948:2;;;28031:10;28026:3;28022:20;28019:1;28012:31;28066:4;28063:1;28056:15;28094:4;28091:1;28084:15;27948:2;;27790:325;;;:::o;28120:135::-;;-1:-1:-1;;28180:17:13;;28177:2;;;28200:18;;:::i;:::-;-1:-1:-1;28247:1:13;28236:13;;28167:88::o;28260:112::-;;28318:1;28308:2;;28323:18;;:::i;:::-;-1:-1:-1;28357:9:13;;28298:74::o;28377:127::-;28438:10;28433:3;28429:20;28426:1;28419:31;28469:4;28466:1;28459:15;28493:4;28490:1;28483:15;28509:127;28570:10;28565:3;28561:20;28558:1;28551:31;28601:4;28598:1;28591:15;28625:4;28622:1;28615:15;28641:127;28702:10;28697:3;28693:20;28690:1;28683:31;28733:4;28730:1;28723:15;28757:4;28754:1;28747:15;28773:131;-1:-1:-1;;;;;28848:31:13;;28838:42;;28828:2;;28894:1;28891;28884:12;28909:118;28995:5;28988:13;28981:21;28974:5;28971:32;28961:2;;29017:1;29014;29007:12;29032:131;-1:-1:-1;;;;;;29106:32:13;;29096:43;;29086:2;;29153:1;29150;29143:12

Swarm Source

ipfs://a55a8eb802522d3d27ff58dc5f0b7538acb97c03c286f2dd1f1004716b8c54dc
Loading