ETH Price: $3,251.80 (-0.21%)
Gas: 1 Gwei

Contract

0xe732Ef56327c019CE115feBff8B158967778bE60
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From173947792023-06-02 18:20:11421 days ago1685730011IN
0xe732Ef56...67778bE60
0 ETH0.000633828.17650429
Set Approval For...173944712023-06-02 17:16:59421 days ago1685726219IN
0xe732Ef56...67778bE60
0 ETH0.0018497340.09664289
Set Approval For...173944172023-06-02 17:05:59421 days ago1685725559IN
0xe732Ef56...67778bE60
0 ETH0.003132467.90100608
Transfer From162893112022-12-29 8:46:11576 days ago1672303571IN
0xe732Ef56...67778bE60
0 ETH0.0003247114.43550329
Retrieve_earning...159073092022-11-06 0:11:23630 days ago1667693483IN
0xe732Ef56...67778bE60
0 ETH0.0003315610.881027
Mint158024662022-10-22 8:31:23644 days ago1666427483IN
0xe732Ef56...67778bE60
0.05 ETH0.0011935122.92130732
Set Approval For...158012942022-10-22 4:36:11644 days ago1666413371IN
0xe732Ef56...67778bE60
0 ETH0.0008716218.89407387
Set Approval For...158012882022-10-22 4:34:59644 days ago1666413299IN
0xe732Ef56...67778bE60
0 ETH0.0008489318.40225799
Set Approval For...158012762022-10-22 4:32:35644 days ago1666413155IN
0xe732Ef56...67778bE60
0 ETH0.0010616223.01279893
Set Approval For...158012692022-10-22 4:31:11644 days ago1666413071IN
0xe732Ef56...67778bE60
0 ETH0.0008207517.79148223
Set Approval For...158012502022-10-22 4:27:23644 days ago1666412843IN
0xe732Ef56...67778bE60
0 ETH0.0008022817.39110449
Set Approval For...157834702022-10-19 16:53:23647 days ago1666198403IN
0xe732Ef56...67778bE60
0 ETH0.0013686529.66827714
Mint157406382022-10-13 17:18:47653 days ago1665681527IN
0xe732Ef56...67778bE60
0.05 ETH0.0052380818.23057105
Mint157406102022-10-13 17:13:11653 days ago1665681191IN
0xe732Ef56...67778bE60
0.05 ETH0.0056080319.49805611
Mint157368952022-10-13 4:45:47653 days ago1665636347IN
0xe732Ef56...67778bE60
0.05 ETH0.0040959114.25538549
Mint157209782022-10-10 23:27:11656 days ago1665444431IN
0xe732Ef56...67778bE60
0.05 ETH0.0082411628.68249294
Mint157201402022-10-10 20:38:59656 days ago1665434339IN
0xe732Ef56...67778bE60
0.05 ETH0.0106093740.8509938
Set Approval For...156884892022-10-06 10:32:47660 days ago1665052367IN
0xe732Ef56...67778bE60
0 ETH0.000300686.51788176
Transfer156854602022-10-06 0:23:35661 days ago1665015815IN
0xe732Ef56...67778bE60
0.1 ETH0.000201259.55867227
Retrieve_earning...156508312022-10-01 4:09:47665 days ago1664597387IN
0xe732Ef56...67778bE60
0 ETH0.00014876.25547107
Set Approval For...155703872022-09-19 22:00:11677 days ago1663624811IN
0xe732Ef56...67778bE60
0 ETH0.000412048.93187695
Retrieve_earning...154232802022-08-27 18:54:28700 days ago1661626468IN
0xe732Ef56...67778bE60
0 ETH0.000282239.26198297
Mint152978672022-08-07 22:27:35720 days ago1659911255IN
0xe732Ef56...67778bE60
0.05 ETH0.0040896814.23371907
Mint152964182022-08-07 16:56:01720 days ago1659891361IN
0xe732Ef56...67778bE60
0.05 ETH0.004216314.67440369
Mint152609432022-08-02 4:25:02725 days ago1659414302IN
0xe732Ef56...67778bE60
0.05 ETH0.0038911414.97608039
View all transactions

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
159073092022-11-06 0:11:23630 days ago1667693483
0xe732Ef56...67778bE60
0.3 ETH
154232802022-08-27 18:54:28700 days ago1661626468
0xe732Ef56...67778bE60
1.35 ETH
150981442022-07-07 22:43:19751 days ago1657233799
0xe732Ef56...67778bE60
1.4 ETH
150726952022-07-03 23:57:34755 days ago1656892654
0xe732Ef56...67778bE60
0.5 ETH
150670292022-07-03 3:00:25755 days ago1656817225
0xe732Ef56...67778bE60
0.15 ETH
150485492022-06-30 4:23:23758 days ago1656563003
0xe732Ef56...67778bE60
0.8 ETH
150201542022-06-24 20:45:59764 days ago1656103559
0xe732Ef56...67778bE60
1.45 ETH
150098972022-06-22 22:37:45766 days ago1655937465
0xe732Ef56...67778bE60
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Fluid_NFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: LiquidERC721.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";
import "./FluidNFT.sol";


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

    bool luck_editor = true;

    // Token Linking
    address public fluid;
    Fluid fluid_controller;
    address public token;

    function set_fluid(address fluid_) public override onlyAuth {
        fluid = fluid_;
        fluid_controller = Fluid(fluid);
        is_auth[fluid] = true;
    }


    function set_bool_editor(bool is_editor) public onlyAuth {
        luck_editor = is_editor;
    }

    uint minting_price = 50000000000000000; // 0.05 ETH

    /* On Chain Metadata Structures */

    mapping(uint => bool) public tokenProtection;

    string public _baseURI_;
    string public _endpointURI_;

    address ERC20_Token;
    IERC20 erc_token;
    
    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    mapping(address => mapping(uint256 =>bool)) public owned_NFT_Ids;

    mapping(address => uint256) public owned_NFT_count;

    mapping(address => uint256) public owned_protected_count;

    /// Maximum values
    uint public max_mint;

    constructor(string memory name_, string memory symbol_, uint _max_mint, uint initial_mint, address owner_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
        max_mint = _max_mint;
        _initial_mint(msg.sender, initial_mint);
        owner = owner_;
        is_auth[owner] = true;
        is_auth[msg.sender] = true;
    }

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner_) public view override returns (uint256) {
        if (_addressToUint256(owner_) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner_] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner_) internal view returns (uint256) {
        return (_packedAddressData[owner_] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner_) internal view returns (uint256) {
        return (_packedAddressData[owner_] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner_, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner_];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner_] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

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

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

    /**
     * @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 _internal_tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory endpointURI;
        // Rarity and ON CHAIN attributes are added in phase 2
        if(is_phase_2) {
            endpointURI = _endpointURI();
        } else {
            endpointURI = _baseURI();
        }
        return bytes(endpointURI).length != 0 ? string(abi.encodePacked(endpointURI, _toString(tokenId))) : '';
    }

    function set_baseURI(string memory base) public override onlyAuth{
        _baseURI_ = base;
    }

    function set_Fluid_Token(address tkn) public onlyAuth{
        ERC20_Token = tkn;
        erc_token = IERC20(tkn);
        mintable_ooo = tkn;
    }

    function set_endpointURI(string memory endpoint) public override onlyAuth{
        _endpointURI_ = endpoint;
    }

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

    function _endpointURI() internal view virtual returns (string memory) {
        return _endpointURI_;
    }
    
    function set_max_mint(uint maxs) public override onlyAuth {
        max_mint = maxs;
    }

    function set_minting_price_wei(uint price) public override onlyAuth{
        minting_price = price;
    }

    function get_minting_price() public view override returns(uint actual_price) {
        return(minting_price);
    }

    function get_last_index() public view override returns(uint last_index_) {
        return _currentIndex;
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    modifier onlyContract() {
      require(msg.sender==address(this));
      _;
    }

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

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

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

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

        // Fluid operations are held AFTER minting procedures
        fluid_controller.on_nft_minting(to, quantity, startTokenId);
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }


    function retrieve_earnings() public onlyAuth {
        (bool success,) = msg.sender.call{value: address(this).balance}("");
        require(success, "Failed");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */

    function mint() public payable safe returns(uint id) {
        revert("Need mint mode");
        return 0;
    }

    function mint(uint mint_mode) public payable safe returns(uint id) {
        
        /// On phase 1, minting is limited    
        if(!is_phase_2) {
            if(!(is_auth[msg.sender])) {
                require(minters[msg.sender].minted < MAX_MINT_PHASE_1, "You already minted");
            }
        }
        /// On phase 2, rules are different (max 100 per wallet, 1 per day)
        else {
            require((minters[msg.sender].minted < MAX_PER_WALLET) && (block.timestamp > minters[msg.sender].last_mint_timestamp), "Mint limit");
        }

        // Minting with Ethereum
        if(is_eth_mintable) {
            require(msg.value==eth_minting_price, "Eth value mismatch");
        }

        // Minting with custom token 
        if(mint_mode == 0) {
            require(is_token_mintable, "Custom token not enabled"); 
            IERC20 mintable_token_erc = IERC20(mintable_token);
            uint token_decimals = mintable_token_erc.decimals();
            uint required_token_decimal = token_mint_price*(10**token_decimals);
            uint current_allowance = mintable_token_erc.allowance(msg.sender, address(this));
            require(current_allowance >= required_token_decimal, "Allowance");
            mintable_token_erc.transferFrom(msg.sender, address(this), (token_mint_price * (10**token_decimals)));
    
        }
        // Minting with OOO
        else if(mint_mode == 1) {
            require(is_ooo_mintable, "OOO mode is not enabled");
            IERC20 ooo_token = IERC20(mintable_ooo);
            uint current_allowance =  ooo_token.allowance(msg.sender,address(this));
            uint required_ooo_decimal = token_mint_price*(10**18);
            require(current_allowance >= required_ooo_decimal, "Allowance on OOO");
            ooo_token.transferFrom(msg.sender, address(this), required_ooo_decimal);
        }
        // Just OOO holding
        else if(mint_mode == 2) {
            IERC20 ooo_token = IERC20(mintable_ooo);
            uint balance_of_ooo = ooo_token.balanceOf(msg.sender);
            require(balance_of_ooo > 0, "No OOO holding");
        }
        else {
            revert("Minting mode is not valid (please use 0, 1 and 2)");
        }



        require(_currentIndex < max_mint, "Limit reached");
        uint _id = _mint(msg.sender, 1);
        if(!(is_auth[msg.sender])) {
            minters[msg.sender].minted += 1;
            minters[msg.sender].last_mint_timestamp = block.timestamp + MIN_COOLDOWN;
        }
        return _id;
    }

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

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

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

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

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

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

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

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

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

            _currentIndex = updatedIndex;
        }


        if(luck_editor) {
            uint current_balance = erc_token.balanceOf(to);
            fluid_controller.set_luck(to, current_balance);
            uint rarity = fluid_controller.liquid_extractor(to);
            fluid_controller.set_nft_rarity(startTokenId+1, rarity);
        }
        else {
            // Fluid operations are held AFTER minting procedures
            fluid_controller.on_nft_minting(to, quantity, startTokenId);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
        return _currentIndex;
    }

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

        owned_NFT_Ids[from][tokenId] = false;
        owned_NFT_count[from] -= 1;
        owned_NFT_Ids[to][tokenId] = true;
        owned_NFT_count[from] += 1;

        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

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

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

        // Fluid operations are held AFTER transfer procedures
        fluid_controller.on_nft_transfer(from, to, tokenId);
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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


   /*

    On Chain Metadata Functions

   /*

 
    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

    /*

    tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID

    The API will contain a web3 call with ERC721E abi contract and the below method
    returning ERC721 compatible json with imageURI being the url or the svg based on content

    */

    function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes) internal {
        uint _currentIndex_ = _totalMinted();
        Token_Metadata[_currentIndex_].Image_Uri = Image_Uri;
        Token_Metadata[_currentIndex_].SVG_Image = SVG_Image;
        Token_Metadata[_currentIndex_].properties = properties;
        for (uint i; i < attributes.length; i++) {
            Token_Metadata[_currentIndex_].attributes[properties[i]] = attributes[i];
        }
    }

    function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) {
        string memory _svg = Token_Metadata[tokenID].SVG_Image;
        string memory _uri = Token_Metadata[tokenID].Image_Uri;
        string[] memory _properties = Token_Metadata[tokenID].properties;
        string[] memory _attributes;
        for(uint a; a < properties.length; a++) {
            _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]);
        }
        return(_svg, _uri, _properties, _attributes);
    }

}

File 2 of 3: FluidNFT.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";

contract FuidAdvancedNft is protected {

    struct MINTERS {
        uint minted;
        uint last_mint_timestamp;
    }

    mapping(address => MINTERS) minters;

    address public mintable_ooo;
    bool public is_ooo_mintable = false;
    uint public ooo_mint_price = 1;
 
    address public mintable_token;
    bool public is_token_mintable = false;
    uint public token_mint_price;

    bool public is_eth_mintable = true;
    uint public eth_minting_price;

    uint public MAX_PER_WALLET = 100;
    uint public MIN_COOLDOWN = 1 days;
    uint public MAX_MINT_PHASE_1 = 1;

    // Setting limits
    function set_max_per_wallet(uint mpw) public onlyAuth {
        MAX_PER_WALLET = mpw;
    }

    function set_min_cooldown(uint mcd) public onlyAuth {
        MIN_COOLDOWN = mcd;
    }

    function set_max_mint_phase_1(uint mmp1) public onlyAuth {
        MAX_MINT_PHASE_1 = mmp1;
    }


    // Define addresses 

    function set_mintable_token_address(address tkn) public onlyAuth {
        mintable_token = tkn;
    }

    function set_mintable_ooo_address(address ooo) public onlyAuth {
        mintable_ooo = ooo;
    }

    // Define mintables

    function eth_mintable(bool booly) public onlyAuth {
        is_eth_mintable = booly;
    }

    function token_mintable(bool booly) public onlyAuth {
        is_token_mintable = booly;
    }

    function ooo_mintable(bool booly) public onlyAuth {
        is_ooo_mintable = booly;
    }

    // Define prices

    function ooo_price(uint price_wei) public onlyAuth {
        ooo_mint_price = price_wei;
    }

    function eth_price(uint price_wei) public onlyAuth {
        eth_minting_price = price_wei;
    }

    function token_price(uint price_wei) public onlyAuth {
        token_mint_price = price_wei;
    }

    /// PHASES
    bool is_phase_1 = true;
    bool is_phase_2;

    function primitive() public onlyAuth {
        is_phase_1 = true;
        is_phase_2 = false;
    }

    function evolve() public onlyAuth {
        is_phase_1 = false;
        is_phase_2 = true;
    }
}

File 3 of 3: LiquidProtocol.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

/*
----------------------------------------------------------------

ERC721E Section, based on ERC721A

----------------------------------------------------------------
*/

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721E {

    function set_fluid(address fluid_) external;

    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

    // ==============================
    //            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);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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

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

    function _internal_tokenURI(uint256 tokenId) external view returns (string memory);

    function set_baseURI(string memory base) external;
    function set_endpointURI(string memory endpoint) external;

    function mint() external payable returns(uint id);
    function set_minting_price_wei(uint price) external;
    function get_minting_price() external view returns(uint actual_price);

    function get_last_index() external view returns(uint last_index_);

    function set_max_mint(uint maxs) external;
}   

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/*
----------------------------------------------------------------

ERC20 Section

----------------------------------------------------------------
*/

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function set_fluid(address _fluid_) external;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Router01 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);

  function addLiquidity(
      address tokenA,
      address tokenB,
      uint amountADesired,
      uint amountBDesired,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB, uint liquidity);
  function addLiquidityETH(
      address token,
      uint amountTokenDesired,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
  function removeLiquidity(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external returns (uint amountToken, uint amountETH);
  function removeLiquidityWithPermit(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETHWithPermit(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountToken, uint amountETH);
  function swapExactTokensForTokens(
      uint amountIn,
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapTokensForExactTokens(
      uint amountOut,
      uint amountInMax,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);
  function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);

  function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
  function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
  function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
  function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
  function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint);

  function getPair(address tokenA, address tokenB) external view returns (address pair);
  function allPairs(uint) external view returns (address pair);
  function allPairsLength() external view returns (uint);

  function feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

  function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external pure returns (string memory);
  function symbol() external pure returns (string memory);
  function decimals() external pure returns (uint8);
  function totalSupply() external view returns (uint);
  function balanceOf(address owner) external view returns (uint);
  function allowance(address owner, address spender) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);
  function transfer(address to, uint value) external returns (bool);
  function transferFrom(address from, address to, uint value) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);
  function PERMIT_TYPEHASH() external pure returns (bytes32);
  function nonces(address owner) external view returns (uint);

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(
      address indexed sender,
      uint amount0In,
      uint amount1In,
      uint amount0Out,
      uint amount1Out,
      address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);
  function factory() external view returns (address);
  function token0() external view returns (address);
  function token1() external view returns (address);
  function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  function price0CumulativeLast() external view returns (uint);
  function price1CumulativeLast() external view returns (uint);
  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function skim(address to) external;
  function sync() external;
}

interface FluidExtension {
    function delegated_on_transfer(address _from,
                                   address _to, 
                                   uint quantity, 
                                   bool is_buy, 
                                   bool is_sell, 
                                   bool is_transfer) external returns(bool skip);
    
    function delegated_on_nft_transfer(address _from, address _to, uint id) external returns(bool skip);

    function delegated_on_minting(address _from, uint quantity, uint starting_id) external returns(bool skip);
}

interface Fluid {

    function get_luck(address recipient) external view returns (uint luck);

    function stake_tokens(uint quantity) external returns (uint slot);
    function unstake_tokens(uint stake_id) external;

    function set_nft_rarity(uint id, uint rarity) external;
    function get_nft_rarity(uint id) external view returns(uint rarity);
    function get_nft_onchain_attributes(uint id) external view returns(bytes32[] memory);

    function get_stake_status(address actor) external view returns(uint total, bool is_it);

    function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) external;

    function on_nft_transfer(address _from, address _to, uint id) external;
    function on_nft_minting(address _from, uint quantity, uint start_token) external;

    function set_probabilities(uint _rare, uint _particular, uint _uncommon) external;
    function get_probabilities() external view returns(uint rare_, uint particular_, uint uncommon_, uint common_);
    function get_all_lucks() external view returns(uint all_lucks);

    function set_luck(address recipient, uint _luck) external;
    function liquid_extractor(address actor) external view returns(uint rarity);

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"_max_mint","type":"uint256"},{"internalType":"uint256","name":"initial_mint","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_MINT_PHASE_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_COOLDOWN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_endpointURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_internal_tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"eth_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eth_minting_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"eth_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fluid","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"get_last_index","outputs":[{"internalType":"uint256","name":"last_index_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_minting_price","outputs":[{"internalType":"uint256","name":"actual_price","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":"is_eth_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_ooo_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_token_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mint_mode","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintable_ooo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintable_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ooo_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"ooo_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"ooo_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"owned_NFT_Ids","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owned_NFT_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owned_protected_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primitive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"retrieveMetadata","outputs":[{"internalType":"string","name":"SVG","type":"string"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"string[]","name":"properties","type":"string[]"},{"internalType":"string[]","name":"attributes","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieve_earnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"set_Fluid_Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base","type":"string"}],"name":"set_baseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"is_editor","type":"bool"}],"name":"set_bool_editor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"endpoint","type":"string"}],"name":"set_endpointURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fluid_","type":"address"}],"name":"set_fluid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxs","type":"uint256"}],"name":"set_max_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mmp1","type":"uint256"}],"name":"set_max_mint_phase_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mpw","type":"uint256"}],"name":"set_max_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mcd","type":"uint256"}],"name":"set_min_cooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ooo","type":"address"}],"name":"set_mintable_ooo_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"set_mintable_token_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"set_minting_price_wei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"token_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"token_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"token_price","outputs":[],"stateMutability":"nonpayable","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"},{"stateMutability":"payable","type":"receive"}]

60806040526003805460ff60a01b1990811690915560016004819055600580549092169091556007805460ff191682179055606460095562015180600a55600b55600c805462ff00ff19166201000117905566b1a2bc2ec50000600f553480156200006957600080fd5b5060405162003970380380620039708339810160408190526200008c91620002bf565b60186200009a8682620003ef565b506019620000a98582620003ef565b5060006016556021839055620000c0338362000113565b600180546001600160a01b039092166001600160a01b031990921682178155600091825260208290526040808320805460ff1990811684179091553384529220805490921617905550620004bb92505050565b601654826000036200013757604051622e076360e81b815260040160405180910390fd5b81600003620001595760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383166000908152601b602090815260408083208054680100000000000000018702019055838352601a90915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210620001a457506016555b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021a57600080fd5b81516001600160401b0380821115620002375762000237620001f2565b604051601f8301601f19908116603f01168101908282118183101715620002625762000262620001f2565b816040528381526020925086838588010111156200027f57600080fd5b600091505b83821015620002a3578582018301518183018401529082019062000284565b83821115620002b55760008385830101525b9695505050505050565b600080600080600060a08688031215620002d857600080fd5b85516001600160401b0380821115620002f057600080fd5b620002fe89838a0162000208565b965060208801519150808211156200031557600080fd5b50620003248882890162000208565b6040880151606089015160808a0151929750909550935090506001600160a01b03811681146200035357600080fd5b809150509295509295909350565b600181811c908216806200037657607f821691505b6020821081036200039757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001ed57600081815260208120601f850160051c81016020861015620003c65750805b601f850160051c820191505b81811015620003e757828155600101620003d2565b505050505050565b81516001600160401b038111156200040b576200040b620001f2565b62000423816200041c845462000361565b846200039d565b602080601f8311600181146200045b5760008415620004425750858301515b600019600386901b1c1916600185901b178555620003e7565b600085815260208120601f198616915b828110156200048c578886015182559484019460019091019084016200046b565b5085821015620004ab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6134a580620004cb6000396000f3fe6080604052600436106103a25760003560e01c806370a08231116101e5578063c24d96e61161010c578063da4b81ee116100a5578063e985e9c511610077578063e985e9c514610af7578063f714cb4414610b17578063fafb763e14610b2d578063fc0c546a14610b4e578063fec40e8e14610b6e57005b8063da4b81ee14610a67578063da5a75a814610a97578063e09574c614610ab7578063e6009a6b14610ad757005b8063d250522d116100de578063d250522d146107ed578063d551850b14610a05578063d687b3e914610a25578063d7c64e7f14610a5157005b8063c24d96e614610993578063c36cc02c146109a8578063c547e4af146109cf578063c87b56dd146109e557005b8063a0712d681161017e578063afa5704011610150578063afa5704014610904578063b0cc010a14610924578063b88d4fde1461093a578063b91816111461095a57005b8063a0712d681461089c578063a22cb465146108af578063a954e08e146108cf578063abe96a83146108ef57005b8063825a85b5116101b7578063825a85b51461081757806395d89b4114610837578063999e476a1461084c5780639e888da91461086c57005b806370a08231146107b8578063734b8147146107d8578063736bf591146107ed5780637e7701e31461080257005b806338348887116102c957806353e4c94c116102625780636352211e116102345780636352211e1461074257806364d99b481461076257806368dcf01514610782578063695f9a391461079857005b806353e4c94c146106ad5780635caeb579146106c75780635e7057a4146106e7578063618c66321461070757005b8063450f3e2d1161029b578063450f3e2d1461062057806347e674981461064d5780634925407e1461066d5780634acff6fa1461068d57005b806338348887146105b65780633a5bda93146105cb5780633d8adfd0146105eb57806342842e0e1461060057005b806314ca514a1161033b5780632818553f1161030d5780632818553f146105355780632bfe8742146105555780633040e00b146105755780633065fb601461059557005b806314ca514a146104c657806318160ddd146104dc57806323b872dd146104f5578063253c8bd41461051557005b8063095ea7b311610374578063095ea7b31461045a5780630ad78a921461047a5780630f2cdd6c1461049a5780631249c58b146104be57005b806301ffc9a7146103ab5780630587e9ab146103e057806306fdde0314610400578063081812fc1461042257005b366103a957005b005b3480156103b757600080fd5b506103cb6103c6366004612cba565b610b8e565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103a96103fb366004612cd7565b610be0565b34801561040c57600080fd5b50610415610c32565b6040516103d79190612d48565b34801561042e57600080fd5b5061044261043d366004612cd7565b610cc4565b6040516001600160a01b0390911681526020016103d7565b34801561046657600080fd5b506103a9610475366004612d77565b610d08565b34801561048657600080fd5b506103a9610495366004612da1565b610dda565b3480156104a657600080fd5b506104b060095481565b6040519081526020016103d7565b6104b0610e40565b3480156104d257600080fd5b506104b060085481565b3480156104e857600080fd5b50601754601654036104b0565b34801561050157600080fd5b506103a9610510366004612dbc565b610ed5565b34801561052157600080fd5b506103a9610530366004612da1565b610ef1565b34801561054157600080fd5b506103a9610550366004612cd7565b610f57565b34801561056157600080fd5b506103a9610570366004612e06565b610fa0565b34801561058157600080fd5b506103a9610590366004612da1565b61100f565b3480156105a157600080fd5b506003546103cb90600160a01b900460ff1681565b3480156105c257600080fd5b50600f546104b0565b3480156105d757600080fd5b506103a96105e6366004612e3d565b611075565b3480156105f757600080fd5b506104156110d5565b34801561060c57600080fd5b506103a961061b366004612dbc565b611163565b34801561062c57600080fd5b506104b061063b366004612da1565b601f6020526000908152604090205481565b34801561065957600080fd5b506103a9610668366004612cd7565b61118a565b34801561067957600080fd5b506103a9610688366004612e3d565b6111d3565b34801561069957600080fd5b50600354610442906001600160a01b031681565b3480156106b957600080fd5b506007546103cb9060ff1681565b3480156106d357600080fd5b506103a96106e2366004612cd7565b611235565b3480156106f357600080fd5b506103a9610702366004612cd7565b61127e565b34801561071357600080fd5b506103cb610722366004612d77565b601e60209081526000928352604080842090915290825290205460ff1681565b34801561074e57600080fd5b5061044261075d366004612cd7565b6112c7565b34801561076e57600080fd5b506103a961077d366004612e3d565b6112d2565b34801561078e57600080fd5b506104b060065481565b3480156107a457600080fd5b50600554610442906001600160a01b031681565b3480156107c457600080fd5b506104b06107d3366004612da1565b611329565b3480156107e457600080fd5b506103a9611372565b3480156107f957600080fd5b506016546104b0565b34801561080e57600080fd5b506103a96113c7565b34801561082357600080fd5b506103a9610832366004612da1565b61141b565b34801561084357600080fd5b506104156114c0565b34801561085857600080fd5b506103a9610867366004612cd7565b6114cf565b34801561087857600080fd5b506103cb610887366004612cd7565b60106020526000908152604090205460ff1681565b6104b06108aa366004612cd7565b611518565b3480156108bb57600080fd5b506103a96108ca366004612e06565b611c9e565b3480156108db57600080fd5b506103a96108ea366004612cd7565b611d33565b3480156108fb57600080fd5b506103a9611d7c565b34801561091057600080fd5b506103a961091f366004612ee6565b611e44565b34801561093057600080fd5b506104b0600b5481565b34801561094657600080fd5b506103a9610955366004612f2f565b611e98565b34801561096657600080fd5b506103cb610975366004612da1565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099f57600080fd5b50610415611eee565b3480156109b457600080fd5b50600c5461044290630100000090046001600160a01b031681565b3480156109db57600080fd5b506104b060045481565b3480156109f157600080fd5b50610415610a00366004612cd7565b611efb565b348015610a1157600080fd5b506103a9610a20366004612ee6565b611f7a565b348015610a3157600080fd5b506104b0610a40366004612da1565b602080526000908152604090205481565b348015610a5d57600080fd5b506104b060215481565b348015610a7357600080fd5b50610a87610a82366004612cd7565b611fca565b6040516103d79493929190613000565b348015610aa357600080fd5b506103a9610ab2366004612da1565b61231d565b348015610ac357600080fd5b506103a9610ad2366004612e3d565b612397565b348015610ae357600080fd5b50610415610af2366004612cd7565b6123f9565b348015610b0357600080fd5b506103cb610b12366004613058565b61242b565b348015610b2357600080fd5b506104b0600a5481565b348015610b3957600080fd5b506005546103cb90600160a01b900460ff1681565b348015610b5a57600080fd5b50600e54610442906001600160a01b031681565b348015610b7a57600080fd5b506103a9610b89366004612cd7565b612482565b60006301ffc9a760e01b6001600160e01b031983161480610bbf57506380ac58cd60e01b6001600160e01b03198316145b80610bda5750635b5e139f60e01b6001600160e01b03198316145b92915050565b3360009081526020819052604090205460ff1680610c0857506001546001600160a01b031633145b610c2d5760405162461bcd60e51b8152600401610c249061308b565b60405180910390fd5b600455565b606060188054610c41906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906130ae565b8015610cba5780601f10610c8f57610100808354040283529160200191610cba565b820191906000526020600020905b815481529060010190602001808311610c9d57829003601f168201915b5050505050905090565b6000610ccf826124cb565b610cec576040516333d1c03960e21b815260040160405180910390fd5b506000908152601c60205260409020546001600160a01b031690565b6000610d13826124f3565b9050806001600160a01b0316836001600160a01b031603610d475760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d7e57610d61813361242b565b610d7e576040516367d9dca160e11b815260040160405180910390fd5b6000828152601c602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610e0257506001546001600160a01b031633145b610e1e5760405162461bcd60e51b8152600401610c249061308b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615610e895760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b17905560405162461bcd60e51b815260206004820152600e60248201526d4e656564206d696e74206d6f646560901b6044820152606401610c24565b333014610ee157600080fd5b610eec83838361255a565b505050565b3360009081526020819052604090205460ff1680610f1957506001546001600160a01b031633145b610f355760405162461bcd60e51b8152600401610c249061308b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610f7f57506001546001600160a01b031633145b610f9b5760405162461bcd60e51b8152600401610c249061308b565b600655565b3360009081526020819052604090205460ff1680610fc857506001546001600160a01b031633145b610fe45760405162461bcd60e51b8152600401610c249061308b565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b3360009081526020819052604090205460ff168061103757506001546001600160a01b031633145b6110535760405162461bcd60e51b8152600401610c249061308b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff168061109d57506001546001600160a01b031633145b6110b95760405162461bcd60e51b8152600401610c249061308b565b600c8054911515620100000262ff000019909216919091179055565b601180546110e2906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461110e906130ae565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b505050505081565b33301461116f57600080fd5b610eec83838360405180602001604052806000815250611e98565b3360009081526020819052604090205460ff16806111b257506001546001600160a01b031633145b6111ce5760405162461bcd60e51b8152600401610c249061308b565b600855565b3360009081526020819052604090205460ff16806111fb57506001546001600160a01b031633145b6112175760405162461bcd60e51b8152600401610c249061308b565b60058054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526020819052604090205460ff168061125d57506001546001600160a01b031633145b6112795760405162461bcd60e51b8152600401610c249061308b565b600955565b3360009081526020819052604090205460ff16806112a657506001546001600160a01b031633145b6112c25760405162461bcd60e51b8152600401610c249061308b565b600b55565b6000610bda826124f3565b3360009081526020819052604090205460ff16806112fa57506001546001600160a01b031633145b6113165760405162461bcd60e51b8152600401610c249061308b565b6007805460ff1916911515919091179055565b60008160000361134c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601b602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff168061139a57506001546001600160a01b031633145b6113b65760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff1916610100179055565b3360009081526020819052604090205460ff16806113ef57506001546001600160a01b031633145b61140b5760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff19166001179055565b3360009081526020819052604090205460ff168061144357506001546001600160a01b031633145b61145f5760405162461bcd60e51b8152600401610c249061308b565b600c80546301000000600160b81b03191663010000006001600160a01b0393841681029190911791829055600d8054919092049092166001600160a01b0319909216821790556000908152602081905260409020805460ff19166001179055565b606060198054610c41906130ae565b3360009081526020819052604090205460ff16806114f757506001546001600160a01b031633145b6115135760405162461bcd60e51b8152600401610c249061308b565b600f55565b600154600090600160a01b900460ff16156115615760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b179055600c54610100900460ff166115f4573360009081526020819052604090205460ff166115ef57600b5433600090815260026020526040902054106115ef5760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481b5a5b9d195960721b6044820152606401610c24565b61165e565b6009543360009081526002602052604090205410801561162557503360009081526002602052604090206001015442115b61165e5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d081b1a5b5a5d60b21b6044820152606401610c24565b60075460ff16156116af5760085434146116af5760405162461bcd60e51b815260206004820152601260248201527108ae8d040ecc2d8eaca40dad2e6dac2e8c6d60731b6044820152606401610c24565b816000036118ff57600554600160a01b900460ff166117105760405162461bcd60e51b815260206004820152601860248201527f437573746f6d20746f6b656e206e6f7420656e61626c656400000000000000006044820152606401610c24565b6005546040805163313ce56760e01b815290516001600160a01b0390921691600091839163313ce567916004808201926020929091908290030181865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178391906130e8565b60ff169050600061179582600a613205565b6006546117a29190613211565b604051636eb1769f60e11b81523360048201523060248201529091506000906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190613230565b9050818110156118545760405162461bcd60e51b8152602060048201526009602482015268416c6c6f77616e636560b81b6044820152606401610c24565b6001600160a01b0384166323b872dd333061187087600a613205565b60065461187d9190613211565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613249565b5050505050611bdb565b81600103611ab657600354600160a01b900460ff166119605760405162461bcd60e51b815260206004820152601760248201527f4f4f4f206d6f6465206973206e6f7420656e61626c65640000000000000000006044820152606401610c24565b600354604051636eb1769f60e11b81523360048201523060248201526001600160a01b0390911690600090829063dd62ed3e90604401602060405180830381865afa1580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190613230565b90506000600654670de0b6b3a76400006119f19190613211565b905080821015611a365760405162461bcd60e51b815260206004820152601060248201526f416c6c6f77616e6365206f6e204f4f4f60801b6044820152606401610c24565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613249565b50505050611bdb565b81600203611b79576003546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f9190613230565b905060008111611b725760405162461bcd60e51b815260206004820152600e60248201526d4e6f204f4f4f20686f6c64696e6760901b6044820152606401610c24565b5050611bdb565b60405162461bcd60e51b815260206004820152603160248201527f4d696e74696e67206d6f6465206973206e6f742076616c69642028706c656173604482015270652075736520302c203120616e6420322960781b6064820152608401610c24565b60215460165410611c1e5760405162461bcd60e51b815260206004820152600d60248201526c131a5b5a5d081c995858da1959609a1b6044820152606401610c24565b6000611c2b336001612821565b3360009081526020819052604090205490915060ff16611c8b57336000908152600260205260408120805460019290611c65908490613266565b9091555050600a54611c779042613266565b336000908152600260205260409020600101555b6001805460ff60a01b1916905592915050565b336001600160a01b03831603611cc75760405163b06307db60e01b815260040160405180910390fd5b336000818152601d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526020819052604090205460ff1680611d5b57506001546001600160a01b031633145b611d775760405162461bcd60e51b8152600401610c249061308b565b600a55565b3360009081526020819052604090205460ff1680611da457506001546001600160a01b031633145b611dc05760405162461bcd60e51b8152600401610c249061308b565b604051600090339047908381818185875af1925050503d8060008114611e02576040519150601f19603f3d011682016040523d82523d6000602084013e611e07565b606091505b5050905080611e415760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b6044820152606401610c24565b50565b3360009081526020819052604090205460ff1680611e6c57506001546001600160a01b031633145b611e885760405162461bcd60e51b8152600401610c249061308b565b6011611e9482826132c4565b5050565b333014611ea457600080fd5b611eaf84848461255a565b6001600160a01b0383163b15611ee857611ecb84848484612b4b565b611ee8576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601280546110e2906130ae565b600c546060908190610100900460ff1615611f1f57611f18612c37565b9050611f2a565b611f27612c46565b90505b8051600003611f485760405180602001604052806000815250611f73565b80611f5284612c55565b604051602001611f63929190613384565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff1680611fa257506001546001600160a01b031633145b611fbe5760405162461bcd60e51b8152600401610c249061308b565b6012611e9482826132c4565b600081815260156020526040812080546060928392839283929190611fee906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461201a906130ae565b80156120675780601f1061203c57610100808354040283529160200191612067565b820191906000526020600020905b81548152906001019060200180831161204a57829003601f168201915b505050505090506000601560008881526020019081526020016000206001018054612091906130ae565b80601f01602080910402602001604051908101604052809291908181526020018280546120bd906130ae565b801561210a5780601f106120df5761010080835404028352916020019161210a565b820191906000526020600020905b8154815290600101906020018083116120ed57829003601f168201915b50505050509050600060156000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156121f5578382906000526020600020018054612168906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906130ae565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020019060010190612149565b505050509050606060005b865181101561230d57601560008b8152602001908152602001600020600301878281518110612231576122316133b3565b602002602001015160405161224691906133c9565b9081526020016040518091039020805461225f906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461228b906130ae565b80156122d85780601f106122ad576101008083540402835291602001916122d8565b820191906000526020600020905b8154815290600101906020018083116122bb57829003601f168201915b50505050508282815181106122ef576122ef6133b3565b60200260200101819052508080612305906133e5565b915050612200565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061234557506001546001600160a01b031633145b6123615760405162461bcd60e51b8152600401610c249061308b565b601380546001600160a01b039092166001600160a01b031992831681179091556014805483168217905560038054909216179055565b3360009081526020819052604090205460ff16806123bf57506001546001600160a01b031633145b6123db5760405162461bcd60e51b8152600401610c249061308b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060612404826124cb565b61242157604051630a14c4b560e41b815260040160405180910390fd5b6000611f27612c46565b600c546000906001600160a01b03630100000090910481169083160361245357506001610bda565b506001600160a01b039182166000908152601d6020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806124aa57506001546001600160a01b031633145b6124c65760405162461bcd60e51b8152600401610c249061308b565b602155565b600060165482108015610bda5750506000908152601a6020526040902054600160e01b161590565b600081601654811015612541576000818152601a602052604081205490600160e01b8216900361253f575b80600003611f735750600019016000818152601a602052604090205461251e565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0383166000818152601e602090815260408083208584528252808320805460ff19169055928252601f90529081208054600192906125a09084906133fe565b90915550506001600160a01b038083166000908152601e602090815260408083208584528252808320805460ff191660019081179091559387168352601f909152812080549091906125f3908490613266565b9091555060009050612604826124f3565b9050836001600160a01b0316816001600160a01b0316146126375760405162a1148160e81b815260040160405180910390fd5b6000828152601c60205260408120546001600160a01b03908116919086163314806126675750612667863361242b565b8061267a57506001600160a01b03821633145b90508061269a57604051632ce44b5f60e11b815260040160405180910390fd5b846000036126bb57604051633a954ecd60e21b815260040160405180910390fd5b81156126de576000848152601c6020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601b602090815260408083208054600019019055928816825282822080546001019055868252601a9052908120600160e11b4260a01b881781179091558416900361276957600184016000818152601a60205260408120549003612767576016548114612767576000818152601a602052604090208490555b505b600d54604051634b5b0bcd60e11b81526001600160a01b038881166004830152878116602483015260448201879052909116906396b6179a90606401600060405180830381600087803b1580156127bf57600080fd5b505af11580156127d3573d6000803e3d6000fd5b5050505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6016546000908360000361284757604051622e076360e81b815260040160405180910390fd5b826000036128685760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000908152601b602090815260408083208054680100000000000000018802019055838352601a90915290204260a01b85176001851460e11b179055808084015b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106128b35750601655600c5462010000900460ff1615612ad2576014546040516370a0823160e01b81526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a9190613230565b600d546040516302b5e86760e01b81526001600160a01b038881166004830152602482018490529293509116906302b5e86790604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b5050600d546040516310b23add60e31b81526001600160a01b038981166004830152600094509091169150638591d6e890602401602060405180830381865afa158015612a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a539190613230565b600d549091506001600160a01b0316637aa0d8b3612a72856001613266565b836040518363ffffffff1660e01b8152600401612a99929190918252602082015260400190565b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b505050505050612b40565b600d546040516306fc05e960e51b81526001600160a01b03868116600483015260248201869052604482018490529091169063df80bd2090606401600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505b505060165492915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b80903390899088908890600401613415565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb891810190613452565b60015b612c19573d808015612be9576040519150601f19603f3d011682016040523d82523d6000602084013e612bee565b606091505b508051600003612c11576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060128054610c41906130ae565b606060118054610c41906130ae565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c9257600183039250600a81066030018353600a9004612c74565b50819003601f19909101908152919050565b6001600160e01b031981168114611e4157600080fd5b600060208284031215612ccc57600080fd5b8135611f7381612ca4565b600060208284031215612ce957600080fd5b5035919050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115611ee85750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000611f736020830184612d1c565b80356001600160a01b0381168114612d7257600080fd5b919050565b60008060408385031215612d8a57600080fd5b612d9383612d5b565b946020939093013593505050565b600060208284031215612db357600080fd5b611f7382612d5b565b600080600060608486031215612dd157600080fd5b612dda84612d5b565b9250612de860208501612d5b565b9150604084013590509250925092565b8015158114611e4157600080fd5b60008060408385031215612e1957600080fd5b612e2283612d5b565b91506020830135612e3281612df8565b809150509250929050565b600060208284031215612e4f57600080fd5b8135611f7381612df8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8b57612e8b612e5a565b604051601f8501601f19908116603f01168101908282118183101715612eb357612eb3612e5a565b81604052809350858152868686011115612ecc57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef857600080fd5b813567ffffffffffffffff811115612f0f57600080fd5b8201601f81018413612f2057600080fd5b612c2f84823560208401612e70565b60008060008060808587031215612f4557600080fd5b612f4e85612d5b565b9350612f5c60208601612d5b565b925060408501359150606085013567ffffffffffffffff811115612f7f57600080fd5b8501601f81018713612f9057600080fd5b612f9f87823560208401612e70565b91505092959194509250565b600081518084526020808501808196508360051b8101915082860160005b85811015612ff3578284038952612fe1848351612d1c565b98850198935090840190600101612fc9565b5091979650505050505050565b6080815260006130136080830187612d1c565b82810360208401526130258187612d1c565b905082810360408401526130398186612fab565b9050828103606084015261304d8185612fab565b979650505050505050565b6000806040838503121561306b57600080fd5b61307483612d5b565b915061308260208401612d5b565b90509250929050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181811c908216806130c257607f821691505b6020821081036130e257634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130fa57600080fd5b815160ff81168114611f7357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561315c5781600019048211156131425761314261310b565b8085161561314f57918102915b93841c9390800290613126565b509250929050565b60008261317357506001610bda565b8161318057506000610bda565b816001811461319657600281146131a0576131bc565b6001915050610bda565b60ff8411156131b1576131b161310b565b50506001821b610bda565b5060208310610133831016604e8410600b84101617156131df575081810a610bda565b6131e98383613121565b80600019048211156131fd576131fd61310b565b029392505050565b6000611f738383613164565b600081600019048311821515161561322b5761322b61310b565b500290565b60006020828403121561324257600080fd5b5051919050565b60006020828403121561325b57600080fd5b8151611f7381612df8565b600082198211156132795761327961310b565b500190565b601f821115610eec57600081815260208120601f850160051c810160208610156132a55750805b601f850160051c820191505b81811015612819578281556001016132b1565b815167ffffffffffffffff8111156132de576132de612e5a565b6132f2816132ec84546130ae565b8461327e565b602080601f831160018114613327576000841561330f5750858301515b600019600386901b1c1916600185901b178555612819565b600085815260208120601f198616915b8281101561335657888601518255948401946001909101908401613337565b50858210156133745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351613396818460208801612cf0565b8351908301906133aa818360208801612cf0565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600082516133db818460208701612cf0565b9190910192915050565b6000600182016133f7576133f761310b565b5060010190565b6000828210156134105761341061310b565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344890830184612d1c565b9695505050505050565b60006020828403121561346457600080fd5b8151611f7381612ca456fea2646970667358221220e2fe3d09f390965b8cb61cb01d367713e140a75bf4bb38b48404d0ab9a5c112364736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b780000000000000000000000000000000000000000000000000000000000000009466c75696450617373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4f4f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103a25760003560e01c806370a08231116101e5578063c24d96e61161010c578063da4b81ee116100a5578063e985e9c511610077578063e985e9c514610af7578063f714cb4414610b17578063fafb763e14610b2d578063fc0c546a14610b4e578063fec40e8e14610b6e57005b8063da4b81ee14610a67578063da5a75a814610a97578063e09574c614610ab7578063e6009a6b14610ad757005b8063d250522d116100de578063d250522d146107ed578063d551850b14610a05578063d687b3e914610a25578063d7c64e7f14610a5157005b8063c24d96e614610993578063c36cc02c146109a8578063c547e4af146109cf578063c87b56dd146109e557005b8063a0712d681161017e578063afa5704011610150578063afa5704014610904578063b0cc010a14610924578063b88d4fde1461093a578063b91816111461095a57005b8063a0712d681461089c578063a22cb465146108af578063a954e08e146108cf578063abe96a83146108ef57005b8063825a85b5116101b7578063825a85b51461081757806395d89b4114610837578063999e476a1461084c5780639e888da91461086c57005b806370a08231146107b8578063734b8147146107d8578063736bf591146107ed5780637e7701e31461080257005b806338348887116102c957806353e4c94c116102625780636352211e116102345780636352211e1461074257806364d99b481461076257806368dcf01514610782578063695f9a391461079857005b806353e4c94c146106ad5780635caeb579146106c75780635e7057a4146106e7578063618c66321461070757005b8063450f3e2d1161029b578063450f3e2d1461062057806347e674981461064d5780634925407e1461066d5780634acff6fa1461068d57005b806338348887146105b65780633a5bda93146105cb5780633d8adfd0146105eb57806342842e0e1461060057005b806314ca514a1161033b5780632818553f1161030d5780632818553f146105355780632bfe8742146105555780633040e00b146105755780633065fb601461059557005b806314ca514a146104c657806318160ddd146104dc57806323b872dd146104f5578063253c8bd41461051557005b8063095ea7b311610374578063095ea7b31461045a5780630ad78a921461047a5780630f2cdd6c1461049a5780631249c58b146104be57005b806301ffc9a7146103ab5780630587e9ab146103e057806306fdde0314610400578063081812fc1461042257005b366103a957005b005b3480156103b757600080fd5b506103cb6103c6366004612cba565b610b8e565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103a96103fb366004612cd7565b610be0565b34801561040c57600080fd5b50610415610c32565b6040516103d79190612d48565b34801561042e57600080fd5b5061044261043d366004612cd7565b610cc4565b6040516001600160a01b0390911681526020016103d7565b34801561046657600080fd5b506103a9610475366004612d77565b610d08565b34801561048657600080fd5b506103a9610495366004612da1565b610dda565b3480156104a657600080fd5b506104b060095481565b6040519081526020016103d7565b6104b0610e40565b3480156104d257600080fd5b506104b060085481565b3480156104e857600080fd5b50601754601654036104b0565b34801561050157600080fd5b506103a9610510366004612dbc565b610ed5565b34801561052157600080fd5b506103a9610530366004612da1565b610ef1565b34801561054157600080fd5b506103a9610550366004612cd7565b610f57565b34801561056157600080fd5b506103a9610570366004612e06565b610fa0565b34801561058157600080fd5b506103a9610590366004612da1565b61100f565b3480156105a157600080fd5b506003546103cb90600160a01b900460ff1681565b3480156105c257600080fd5b50600f546104b0565b3480156105d757600080fd5b506103a96105e6366004612e3d565b611075565b3480156105f757600080fd5b506104156110d5565b34801561060c57600080fd5b506103a961061b366004612dbc565b611163565b34801561062c57600080fd5b506104b061063b366004612da1565b601f6020526000908152604090205481565b34801561065957600080fd5b506103a9610668366004612cd7565b61118a565b34801561067957600080fd5b506103a9610688366004612e3d565b6111d3565b34801561069957600080fd5b50600354610442906001600160a01b031681565b3480156106b957600080fd5b506007546103cb9060ff1681565b3480156106d357600080fd5b506103a96106e2366004612cd7565b611235565b3480156106f357600080fd5b506103a9610702366004612cd7565b61127e565b34801561071357600080fd5b506103cb610722366004612d77565b601e60209081526000928352604080842090915290825290205460ff1681565b34801561074e57600080fd5b5061044261075d366004612cd7565b6112c7565b34801561076e57600080fd5b506103a961077d366004612e3d565b6112d2565b34801561078e57600080fd5b506104b060065481565b3480156107a457600080fd5b50600554610442906001600160a01b031681565b3480156107c457600080fd5b506104b06107d3366004612da1565b611329565b3480156107e457600080fd5b506103a9611372565b3480156107f957600080fd5b506016546104b0565b34801561080e57600080fd5b506103a96113c7565b34801561082357600080fd5b506103a9610832366004612da1565b61141b565b34801561084357600080fd5b506104156114c0565b34801561085857600080fd5b506103a9610867366004612cd7565b6114cf565b34801561087857600080fd5b506103cb610887366004612cd7565b60106020526000908152604090205460ff1681565b6104b06108aa366004612cd7565b611518565b3480156108bb57600080fd5b506103a96108ca366004612e06565b611c9e565b3480156108db57600080fd5b506103a96108ea366004612cd7565b611d33565b3480156108fb57600080fd5b506103a9611d7c565b34801561091057600080fd5b506103a961091f366004612ee6565b611e44565b34801561093057600080fd5b506104b0600b5481565b34801561094657600080fd5b506103a9610955366004612f2f565b611e98565b34801561096657600080fd5b506103cb610975366004612da1565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099f57600080fd5b50610415611eee565b3480156109b457600080fd5b50600c5461044290630100000090046001600160a01b031681565b3480156109db57600080fd5b506104b060045481565b3480156109f157600080fd5b50610415610a00366004612cd7565b611efb565b348015610a1157600080fd5b506103a9610a20366004612ee6565b611f7a565b348015610a3157600080fd5b506104b0610a40366004612da1565b602080526000908152604090205481565b348015610a5d57600080fd5b506104b060215481565b348015610a7357600080fd5b50610a87610a82366004612cd7565b611fca565b6040516103d79493929190613000565b348015610aa357600080fd5b506103a9610ab2366004612da1565b61231d565b348015610ac357600080fd5b506103a9610ad2366004612e3d565b612397565b348015610ae357600080fd5b50610415610af2366004612cd7565b6123f9565b348015610b0357600080fd5b506103cb610b12366004613058565b61242b565b348015610b2357600080fd5b506104b0600a5481565b348015610b3957600080fd5b506005546103cb90600160a01b900460ff1681565b348015610b5a57600080fd5b50600e54610442906001600160a01b031681565b348015610b7a57600080fd5b506103a9610b89366004612cd7565b612482565b60006301ffc9a760e01b6001600160e01b031983161480610bbf57506380ac58cd60e01b6001600160e01b03198316145b80610bda5750635b5e139f60e01b6001600160e01b03198316145b92915050565b3360009081526020819052604090205460ff1680610c0857506001546001600160a01b031633145b610c2d5760405162461bcd60e51b8152600401610c249061308b565b60405180910390fd5b600455565b606060188054610c41906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906130ae565b8015610cba5780601f10610c8f57610100808354040283529160200191610cba565b820191906000526020600020905b815481529060010190602001808311610c9d57829003601f168201915b5050505050905090565b6000610ccf826124cb565b610cec576040516333d1c03960e21b815260040160405180910390fd5b506000908152601c60205260409020546001600160a01b031690565b6000610d13826124f3565b9050806001600160a01b0316836001600160a01b031603610d475760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d7e57610d61813361242b565b610d7e576040516367d9dca160e11b815260040160405180910390fd5b6000828152601c602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610e0257506001546001600160a01b031633145b610e1e5760405162461bcd60e51b8152600401610c249061308b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615610e895760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b17905560405162461bcd60e51b815260206004820152600e60248201526d4e656564206d696e74206d6f646560901b6044820152606401610c24565b333014610ee157600080fd5b610eec83838361255a565b505050565b3360009081526020819052604090205460ff1680610f1957506001546001600160a01b031633145b610f355760405162461bcd60e51b8152600401610c249061308b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610f7f57506001546001600160a01b031633145b610f9b5760405162461bcd60e51b8152600401610c249061308b565b600655565b3360009081526020819052604090205460ff1680610fc857506001546001600160a01b031633145b610fe45760405162461bcd60e51b8152600401610c249061308b565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b3360009081526020819052604090205460ff168061103757506001546001600160a01b031633145b6110535760405162461bcd60e51b8152600401610c249061308b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff168061109d57506001546001600160a01b031633145b6110b95760405162461bcd60e51b8152600401610c249061308b565b600c8054911515620100000262ff000019909216919091179055565b601180546110e2906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461110e906130ae565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b505050505081565b33301461116f57600080fd5b610eec83838360405180602001604052806000815250611e98565b3360009081526020819052604090205460ff16806111b257506001546001600160a01b031633145b6111ce5760405162461bcd60e51b8152600401610c249061308b565b600855565b3360009081526020819052604090205460ff16806111fb57506001546001600160a01b031633145b6112175760405162461bcd60e51b8152600401610c249061308b565b60058054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526020819052604090205460ff168061125d57506001546001600160a01b031633145b6112795760405162461bcd60e51b8152600401610c249061308b565b600955565b3360009081526020819052604090205460ff16806112a657506001546001600160a01b031633145b6112c25760405162461bcd60e51b8152600401610c249061308b565b600b55565b6000610bda826124f3565b3360009081526020819052604090205460ff16806112fa57506001546001600160a01b031633145b6113165760405162461bcd60e51b8152600401610c249061308b565b6007805460ff1916911515919091179055565b60008160000361134c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601b602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff168061139a57506001546001600160a01b031633145b6113b65760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff1916610100179055565b3360009081526020819052604090205460ff16806113ef57506001546001600160a01b031633145b61140b5760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff19166001179055565b3360009081526020819052604090205460ff168061144357506001546001600160a01b031633145b61145f5760405162461bcd60e51b8152600401610c249061308b565b600c80546301000000600160b81b03191663010000006001600160a01b0393841681029190911791829055600d8054919092049092166001600160a01b0319909216821790556000908152602081905260409020805460ff19166001179055565b606060198054610c41906130ae565b3360009081526020819052604090205460ff16806114f757506001546001600160a01b031633145b6115135760405162461bcd60e51b8152600401610c249061308b565b600f55565b600154600090600160a01b900460ff16156115615760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b179055600c54610100900460ff166115f4573360009081526020819052604090205460ff166115ef57600b5433600090815260026020526040902054106115ef5760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481b5a5b9d195960721b6044820152606401610c24565b61165e565b6009543360009081526002602052604090205410801561162557503360009081526002602052604090206001015442115b61165e5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d081b1a5b5a5d60b21b6044820152606401610c24565b60075460ff16156116af5760085434146116af5760405162461bcd60e51b815260206004820152601260248201527108ae8d040ecc2d8eaca40dad2e6dac2e8c6d60731b6044820152606401610c24565b816000036118ff57600554600160a01b900460ff166117105760405162461bcd60e51b815260206004820152601860248201527f437573746f6d20746f6b656e206e6f7420656e61626c656400000000000000006044820152606401610c24565b6005546040805163313ce56760e01b815290516001600160a01b0390921691600091839163313ce567916004808201926020929091908290030181865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178391906130e8565b60ff169050600061179582600a613205565b6006546117a29190613211565b604051636eb1769f60e11b81523360048201523060248201529091506000906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190613230565b9050818110156118545760405162461bcd60e51b8152602060048201526009602482015268416c6c6f77616e636560b81b6044820152606401610c24565b6001600160a01b0384166323b872dd333061187087600a613205565b60065461187d9190613211565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613249565b5050505050611bdb565b81600103611ab657600354600160a01b900460ff166119605760405162461bcd60e51b815260206004820152601760248201527f4f4f4f206d6f6465206973206e6f7420656e61626c65640000000000000000006044820152606401610c24565b600354604051636eb1769f60e11b81523360048201523060248201526001600160a01b0390911690600090829063dd62ed3e90604401602060405180830381865afa1580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190613230565b90506000600654670de0b6b3a76400006119f19190613211565b905080821015611a365760405162461bcd60e51b815260206004820152601060248201526f416c6c6f77616e6365206f6e204f4f4f60801b6044820152606401610c24565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613249565b50505050611bdb565b81600203611b79576003546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f9190613230565b905060008111611b725760405162461bcd60e51b815260206004820152600e60248201526d4e6f204f4f4f20686f6c64696e6760901b6044820152606401610c24565b5050611bdb565b60405162461bcd60e51b815260206004820152603160248201527f4d696e74696e67206d6f6465206973206e6f742076616c69642028706c656173604482015270652075736520302c203120616e6420322960781b6064820152608401610c24565b60215460165410611c1e5760405162461bcd60e51b815260206004820152600d60248201526c131a5b5a5d081c995858da1959609a1b6044820152606401610c24565b6000611c2b336001612821565b3360009081526020819052604090205490915060ff16611c8b57336000908152600260205260408120805460019290611c65908490613266565b9091555050600a54611c779042613266565b336000908152600260205260409020600101555b6001805460ff60a01b1916905592915050565b336001600160a01b03831603611cc75760405163b06307db60e01b815260040160405180910390fd5b336000818152601d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526020819052604090205460ff1680611d5b57506001546001600160a01b031633145b611d775760405162461bcd60e51b8152600401610c249061308b565b600a55565b3360009081526020819052604090205460ff1680611da457506001546001600160a01b031633145b611dc05760405162461bcd60e51b8152600401610c249061308b565b604051600090339047908381818185875af1925050503d8060008114611e02576040519150601f19603f3d011682016040523d82523d6000602084013e611e07565b606091505b5050905080611e415760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b6044820152606401610c24565b50565b3360009081526020819052604090205460ff1680611e6c57506001546001600160a01b031633145b611e885760405162461bcd60e51b8152600401610c249061308b565b6011611e9482826132c4565b5050565b333014611ea457600080fd5b611eaf84848461255a565b6001600160a01b0383163b15611ee857611ecb84848484612b4b565b611ee8576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601280546110e2906130ae565b600c546060908190610100900460ff1615611f1f57611f18612c37565b9050611f2a565b611f27612c46565b90505b8051600003611f485760405180602001604052806000815250611f73565b80611f5284612c55565b604051602001611f63929190613384565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff1680611fa257506001546001600160a01b031633145b611fbe5760405162461bcd60e51b8152600401610c249061308b565b6012611e9482826132c4565b600081815260156020526040812080546060928392839283929190611fee906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461201a906130ae565b80156120675780601f1061203c57610100808354040283529160200191612067565b820191906000526020600020905b81548152906001019060200180831161204a57829003601f168201915b505050505090506000601560008881526020019081526020016000206001018054612091906130ae565b80601f01602080910402602001604051908101604052809291908181526020018280546120bd906130ae565b801561210a5780601f106120df5761010080835404028352916020019161210a565b820191906000526020600020905b8154815290600101906020018083116120ed57829003601f168201915b50505050509050600060156000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156121f5578382906000526020600020018054612168906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906130ae565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020019060010190612149565b505050509050606060005b865181101561230d57601560008b8152602001908152602001600020600301878281518110612231576122316133b3565b602002602001015160405161224691906133c9565b9081526020016040518091039020805461225f906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461228b906130ae565b80156122d85780601f106122ad576101008083540402835291602001916122d8565b820191906000526020600020905b8154815290600101906020018083116122bb57829003601f168201915b50505050508282815181106122ef576122ef6133b3565b60200260200101819052508080612305906133e5565b915050612200565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061234557506001546001600160a01b031633145b6123615760405162461bcd60e51b8152600401610c249061308b565b601380546001600160a01b039092166001600160a01b031992831681179091556014805483168217905560038054909216179055565b3360009081526020819052604090205460ff16806123bf57506001546001600160a01b031633145b6123db5760405162461bcd60e51b8152600401610c249061308b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060612404826124cb565b61242157604051630a14c4b560e41b815260040160405180910390fd5b6000611f27612c46565b600c546000906001600160a01b03630100000090910481169083160361245357506001610bda565b506001600160a01b039182166000908152601d6020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806124aa57506001546001600160a01b031633145b6124c65760405162461bcd60e51b8152600401610c249061308b565b602155565b600060165482108015610bda5750506000908152601a6020526040902054600160e01b161590565b600081601654811015612541576000818152601a602052604081205490600160e01b8216900361253f575b80600003611f735750600019016000818152601a602052604090205461251e565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0383166000818152601e602090815260408083208584528252808320805460ff19169055928252601f90529081208054600192906125a09084906133fe565b90915550506001600160a01b038083166000908152601e602090815260408083208584528252808320805460ff191660019081179091559387168352601f909152812080549091906125f3908490613266565b9091555060009050612604826124f3565b9050836001600160a01b0316816001600160a01b0316146126375760405162a1148160e81b815260040160405180910390fd5b6000828152601c60205260408120546001600160a01b03908116919086163314806126675750612667863361242b565b8061267a57506001600160a01b03821633145b90508061269a57604051632ce44b5f60e11b815260040160405180910390fd5b846000036126bb57604051633a954ecd60e21b815260040160405180910390fd5b81156126de576000848152601c6020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601b602090815260408083208054600019019055928816825282822080546001019055868252601a9052908120600160e11b4260a01b881781179091558416900361276957600184016000818152601a60205260408120549003612767576016548114612767576000818152601a602052604090208490555b505b600d54604051634b5b0bcd60e11b81526001600160a01b038881166004830152878116602483015260448201879052909116906396b6179a90606401600060405180830381600087803b1580156127bf57600080fd5b505af11580156127d3573d6000803e3d6000fd5b5050505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6016546000908360000361284757604051622e076360e81b815260040160405180910390fd5b826000036128685760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000908152601b602090815260408083208054680100000000000000018802019055838352601a90915290204260a01b85176001851460e11b179055808084015b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106128b35750601655600c5462010000900460ff1615612ad2576014546040516370a0823160e01b81526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a9190613230565b600d546040516302b5e86760e01b81526001600160a01b038881166004830152602482018490529293509116906302b5e86790604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b5050600d546040516310b23add60e31b81526001600160a01b038981166004830152600094509091169150638591d6e890602401602060405180830381865afa158015612a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a539190613230565b600d549091506001600160a01b0316637aa0d8b3612a72856001613266565b836040518363ffffffff1660e01b8152600401612a99929190918252602082015260400190565b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b505050505050612b40565b600d546040516306fc05e960e51b81526001600160a01b03868116600483015260248201869052604482018490529091169063df80bd2090606401600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505b505060165492915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b80903390899088908890600401613415565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb891810190613452565b60015b612c19573d808015612be9576040519150601f19603f3d011682016040523d82523d6000602084013e612bee565b606091505b508051600003612c11576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060128054610c41906130ae565b606060118054610c41906130ae565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c9257600183039250600a81066030018353600a9004612c74565b50819003601f19909101908152919050565b6001600160e01b031981168114611e4157600080fd5b600060208284031215612ccc57600080fd5b8135611f7381612ca4565b600060208284031215612ce957600080fd5b5035919050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115611ee85750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000611f736020830184612d1c565b80356001600160a01b0381168114612d7257600080fd5b919050565b60008060408385031215612d8a57600080fd5b612d9383612d5b565b946020939093013593505050565b600060208284031215612db357600080fd5b611f7382612d5b565b600080600060608486031215612dd157600080fd5b612dda84612d5b565b9250612de860208501612d5b565b9150604084013590509250925092565b8015158114611e4157600080fd5b60008060408385031215612e1957600080fd5b612e2283612d5b565b91506020830135612e3281612df8565b809150509250929050565b600060208284031215612e4f57600080fd5b8135611f7381612df8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8b57612e8b612e5a565b604051601f8501601f19908116603f01168101908282118183101715612eb357612eb3612e5a565b81604052809350858152868686011115612ecc57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef857600080fd5b813567ffffffffffffffff811115612f0f57600080fd5b8201601f81018413612f2057600080fd5b612c2f84823560208401612e70565b60008060008060808587031215612f4557600080fd5b612f4e85612d5b565b9350612f5c60208601612d5b565b925060408501359150606085013567ffffffffffffffff811115612f7f57600080fd5b8501601f81018713612f9057600080fd5b612f9f87823560208401612e70565b91505092959194509250565b600081518084526020808501808196508360051b8101915082860160005b85811015612ff3578284038952612fe1848351612d1c565b98850198935090840190600101612fc9565b5091979650505050505050565b6080815260006130136080830187612d1c565b82810360208401526130258187612d1c565b905082810360408401526130398186612fab565b9050828103606084015261304d8185612fab565b979650505050505050565b6000806040838503121561306b57600080fd5b61307483612d5b565b915061308260208401612d5b565b90509250929050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181811c908216806130c257607f821691505b6020821081036130e257634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130fa57600080fd5b815160ff81168114611f7357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561315c5781600019048211156131425761314261310b565b8085161561314f57918102915b93841c9390800290613126565b509250929050565b60008261317357506001610bda565b8161318057506000610bda565b816001811461319657600281146131a0576131bc565b6001915050610bda565b60ff8411156131b1576131b161310b565b50506001821b610bda565b5060208310610133831016604e8410600b84101617156131df575081810a610bda565b6131e98383613121565b80600019048211156131fd576131fd61310b565b029392505050565b6000611f738383613164565b600081600019048311821515161561322b5761322b61310b565b500290565b60006020828403121561324257600080fd5b5051919050565b60006020828403121561325b57600080fd5b8151611f7381612df8565b600082198211156132795761327961310b565b500190565b601f821115610eec57600081815260208120601f850160051c810160208610156132a55750805b601f850160051c820191505b81811015612819578281556001016132b1565b815167ffffffffffffffff8111156132de576132de612e5a565b6132f2816132ec84546130ae565b8461327e565b602080601f831160018114613327576000841561330f5750858301515b600019600386901b1c1916600185901b178555612819565b600085815260208120601f198616915b8281101561335657888601518255948401946001909101908401613337565b50858210156133745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351613396818460208801612cf0565b8351908301906133aa818360208801612cf0565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600082516133db818460208701612cf0565b9190910192915050565b6000600182016133f7576133f761310b565b5060010190565b6000828210156134105761341061310b565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344890830184612d1c565b9695505050505050565b60006020828403121561346457600080fd5b8151611f7381612ca456fea2646970667358221220e2fe3d09f390965b8cb61cb01d367713e140a75bf4bb38b48404d0ab9a5c112364736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b780000000000000000000000000000000000000000000000000000000000000009466c75696450617373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4f4f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): FluidPass
Arg [1] : symbol_ (string): OOO
Arg [2] : _max_mint (uint256): 10000
Arg [3] : initial_mint (uint256): 1
Arg [4] : owner_ (address): 0xABEa70E445e0cde24e5952B6E343e24e44b78B78

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b78
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 466c756964506173730000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4f4f4f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

617:39159:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6083:607;;;;;;;;;;-1:-1:-1;6083:607:1;;;;;:::i;:::-;;:::i;:::-;;;565:14:3;;558:22;540:41;;528:2;513:18;6083:607:1;;;;;;;;1580:94:0;;;;;;;;;;-1:-1:-1;1580:94:0;;;;;:::i;:::-;;:::i;10993:98:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14398:200::-;;;;;;;;;;-1:-1:-1;14398:200:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:3;;;1674:51;;1662:2;1647:18;14398:200:1;1528:203:3;13869:468:1;;;;;;;;;;-1:-1:-1;13869:468:1;;;;;:::i;:::-;;:::i;1029:102:0:-;;;;;;;;;;-1:-1:-1;1029:102:0;;;;;:::i;:::-;;:::i;571:32::-;;;;;;;;;;;;;;;;;;;2510:25:3;;;2498:2;2483:18;571:32:0;2364:177:3;20142:112:1;;;:::i;535:29:0:-;;;;;;;;;;;;;;;;5168:309:1;;;;;;;;;;-1:-1:-1;5430:12:1;;5414:13;;:28;5168:309;;15434:181;;;;;;;;;;-1:-1:-1;15434:181:1;;;;;:::i;:::-;;:::i;713:91:2:-;;;;;;;;;;-1:-1:-1;713:91:2;;;;;:::i;:::-;;:::i;1783:98:0:-;;;;;;;;;;-1:-1:-1;1783:98:0;;;;;:::i;:::-;;:::i;234:104:2:-;;;;;;;;;;-1:-1:-1;234:104:2;;;;;:::i;:::-;;:::i;1137:98:0:-;;;;;;;;;;-1:-1:-1;1137:98:0;;;;;:::i;:::-;;:::i;303:35::-;;;;;;;;;;-1:-1:-1;303:35:0;;;;-1:-1:-1;;;303:35:0;;;;;;13137:115:1;;;;;;;;;;-1:-1:-1;13231:13:1;;13137:115;;985:97;;;;;;;;;;-1:-1:-1;985:97:1;;;;;:::i;:::-;;:::i;1236:23::-;;;;;;;;;;;;;:::i;15681:192::-;;;;;;;;;;-1:-1:-1;15681:192:1;;;;;:::i;:::-;;:::i;4025:50::-;;;;;;;;;;-1:-1:-1;4025:50:1;;;;;:::i;:::-;;;;;;;;;;;;;;1680:97:0;;;;;;;;;;-1:-1:-1;1680:97:0;;;;;:::i;:::-;;:::i;1362:94::-;;;;;;;;;;-1:-1:-1;1362:94:0;;;;;:::i;:::-;;:::i;270:27::-;;;;;;;;;;-1:-1:-1;270:27:0;;;;-1:-1:-1;;;;;270:27:0;;;495:34;;;;;;;;;;-1:-1:-1;495:34:0;;;;;;;;709:91;;;;;;;;;;-1:-1:-1;709:91:0;;;;;:::i;:::-;;:::i;899:97::-;;;;;;;;;;-1:-1:-1;899:97:0;;;;;:::i;:::-;;:::i;3954:64:1:-;;;;;;;;;;-1:-1:-1;3954:64:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;10789:142;;;;;;;;;;-1:-1:-1;10789:142:1;;;;;:::i;:::-;;:::i;1266:90:0:-;;;;;;;;;;-1:-1:-1;1266:90:0;;;;;:::i;:::-;;:::i;460:28::-;;;;;;;;;;;;;;;;382:29;;;;;;;;;;-1:-1:-1;382:29:0;;;;-1:-1:-1;;;;;382:29:0;;;6749:234:1;;;;;;;;;;-1:-1:-1;6749:234:1;;;;;:::i;:::-;;:::i;2057:96:0:-;;;;;;;;;;;;;:::i;5570:277:1:-;;;;;;;;;;-1:-1:-1;5799:13:1;;5570:277;;1952:99:0;;;;;;;;;;;;;:::i;815:163:1:-;;;;;;;;;;-1:-1:-1;815:163:1;;;;;:::i;:::-;;:::i;11155:102::-;;;;;;;;;;;;;:::i;13026:105::-;;;;;;;;;;-1:-1:-1;13026:105:1;;;;;:::i;:::-;;:::i;1185:44::-;;;;;;;;;;-1:-1:-1;1185:44:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;20260:2520;;;;;;:::i;:::-;;:::i;14665:303::-;;;;;;;;;;-1:-1:-1;14665:303:1;;;;;:::i;:::-;;:::i;806:87:0:-;;;;;;;;;;-1:-1:-1;806:87:0;;;;;:::i;:::-;;:::i;19729:165:1:-;;;;;;;;;;;;;:::i;12095:98::-;;;;;;;;;;-1:-1:-1;12095:98:1;;;;;:::i;:::-;;:::i;648:32:0:-;;;;;;;;;;;;;;;;15939:402:1;;;;;;;;;;-1:-1:-1;15939:402:1;;;;;:::i;:::-;;:::i;132:97:2:-;;;;;;;;;;-1:-1:-1;132:97:2;;;;;:::i;:::-;-1:-1:-1;;;;;209:13:2;186:4;209:13;;;;;;;;;;;;;;132:97;1265:27:1;;;;;;;;;;;;;:::i;734:20::-;;;;;;;;;;-1:-1:-1;734:20:1;;;;;;;-1:-1:-1;;;;;734:20:1;;;344:30:0;;;;;;;;;;;;;;;;11652:437:1;;;;;;;;;;-1:-1:-1;11652:437:1;;;;;:::i;:::-;;:::i;12353:114::-;;;;;;;;;;-1:-1:-1;12353:114:1;;;;;:::i;:::-;;:::i;4082:56::-;;;;;;;;;;-1:-1:-1;4082:56:1;;;;;:::i;:::-;;;;;;;;;;;;;;4168:20;;;;;;;;;;;;;;;;39177:596;;;;;;;;;;-1:-1:-1;39177:596:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;12199:148::-;;;;;;;;;;-1:-1:-1;12199:148:1;;;;;:::i;:::-;;:::i;1462:90:0:-;;;;;;;;;;-1:-1:-1;1462:90:0;;;;;:::i;:::-;;:::i;11323:323:1:-;;;;;;;;;;-1:-1:-1;11323:323:1;;;;;:::i;:::-;;:::i;15034:250::-;;;;;;;;;;-1:-1:-1;15034:250:1;;;;;:::i;:::-;;:::i;609:33:0:-;;;;;;;;;;;;;;;;417:37;;;;;;;;;;-1:-1:-1;417:37:0;;;;-1:-1:-1;;;417:37:0;;;;;;788:20:1;;;;;;;;;;-1:-1:-1;788:20:1;;;;-1:-1:-1;;;;;788:20:1;;;12930:90;;;;;;;;;;-1:-1:-1;12930:90:1;;;;;:::i;:::-;;:::i;6083:607::-;6168:4;-1:-1:-1;;;;;;;;;6463:25:1;;;;:101;;-1:-1:-1;;;;;;;;;;6539:25:1;;;6463:101;:177;;;-1:-1:-1;;;;;;;;;;6615:25:1;;;6463:177;6444:196;6083:607;-1:-1:-1;;6083:607:1:o;1580:94:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;;;;;;;;;1641:14:0::1;:26:::0;1580:94::o;10993:98:1:-;11047:13;11079:5;11072:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10993:98;:::o;14398:200::-;14466:7;14490:16;14498:7;14490;:16::i;:::-;14485:64;;14515:34;;-1:-1:-1;;;14515:34:1;;;;;;;;;;;14485:64;-1:-1:-1;14567:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;14567:24:1;;14398:200::o;13869:468::-;13941:14;13974:27;13993:7;13974:18;:27::i;:::-;13941:62;;14023:6;-1:-1:-1;;;;;14017:12:1;:2;-1:-1:-1;;;;;14017:12:1;;14013:49;;14038:24;;-1:-1:-1;;;14038:24:1;;;;;;;;;;;14013:49;35963:10;-1:-1:-1;;;;;14077:29:1;;;14073:174;;14125:45;14142:6;35963:10;15034:250;:::i;14125:45::-;14120:127;;14197:35;;-1:-1:-1;;;14197:35:1;;;;;;;;;;;14120:127;14257:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;14257:29:1;-1:-1:-1;;;;;14257:29:1;;;;;;;;;14301;;14257:24;;14301:29;;;;;;;13931:406;13869:468;;:::o;1029:102:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1104:14:0::1;:20:::0;;-1:-1:-1;;;;;;1104:20:0::1;-1:-1:-1::0;;;;;1104:20:0;;;::::1;::::0;;;::::1;::::0;;1029:102::o;20142:112:1:-;623:6:2;;20186:7:1;;-1:-1:-1;;;623:6:2;;;;622:7;614:29;;;;-1:-1:-1;;;614:29:2;;8111:2:3;614:29:2;;;8093:21:3;8150:1;8130:18;;;8123:29;-1:-1:-1;;;8168:18:3;;;8161:39;8217:18;;614:29:2;7909:332:3;614:29:2;662:4;653:13;;-1:-1:-1;;;;653:13:2;-1:-1:-1;;;653:13:2;;;20205:24:1::1;::::0;-1:-1:-1;;;20205:24:1;;8448:2:3;20205:24:1::1;::::0;::::1;8430:21:3::0;8487:2;8467:18;;;8460:30;-1:-1:-1;;;8506:18:3;;;8499:44;8560:18;;20205:24:1::1;8246:338:3::0;15434:181:1;15330:10;15350:4;15330:25;15322:34;;;;;;15576:32:::1;15590:4;15596:2;15600:7;15576:13;:32::i;:::-;15434:181:::0;;;:::o;713:91:2:-;390:10;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;780:5:::1;:17:::0;;-1:-1:-1;;;;;;780:17:2::1;-1:-1:-1::0;;;;;780:17:2;;;::::1;::::0;;;::::1;::::0;;713:91::o;1783:98:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1846:16:0::1;:28:::0;1783:98::o;234:104:2:-;390:10;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;310:13:2;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;310:21:2::1;::::0;::::1;;::::0;;;::::1;::::0;;234:104::o;1137:98:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1210:12:0::1;:18:::0;;-1:-1:-1;;;;;;1210:18:0::1;-1:-1:-1::0;;;;;1210:18:0;;;::::1;::::0;;;::::1;::::0;;1137:98::o;985:97:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1052:11:1::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;1052:23:1;;::::1;::::0;;;::::1;::::0;;985:97::o;1236:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15681:192::-;15330:10;15350:4;15330:25;15322:34;;;;;;15827:39:::1;15844:4;15850:2;15854:7;15827:39;;;;;;;;;;;::::0;:16:::1;:39::i;1680:97:0:-:0;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1741:17:0::1;:29:::0;1680:97::o;1362:94::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1424:17:0::1;:25:::0;;;::::1;;-1:-1:-1::0;;;1424:25:0::1;-1:-1:-1::0;;;;1424:25:0;;::::1;::::0;;;::::1;::::0;;1362:94::o;709:91::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;773:14:0::1;:20:::0;709:91::o;899:97::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;966:16:0::1;:23:::0;899:97::o;10789:142:1:-;10853:7;10895:27;10914:7;10895:18;:27::i;1266:90:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1326:15:0::1;:23:::0;;-1:-1:-1;;1326:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;1266:90::o;6749:234:1:-;6814:7;6855:6;6866:1;6837:30;6833:71;;6876:28;;-1:-1:-1;;;6876:28:1;;;;;;;;;;;6833:71;-1:-1:-1;;;;;;6921:26:1;;;;;:18;:26;;;;;;1760:13;6921:55;;6749:234::o;2057:96:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;2101:10:0::1;:18:::0;;-1:-1:-1;;2129:17:0;2101:18:::1;2129:17;::::0;;2057:96::o;1952:99::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1999:10:0::1;:17:::0;;-1:-1:-1;;2026:18:0;2012:4:::1;2026:18:::0;;;1952:99::o;815:163:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;885:5:1::1;:14:::0;;-1:-1:-1;;;;;;885:14:1::1;::::0;-1:-1:-1;;;;;885:14:1;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;909:16:::1;:31:::0;;934:5;;;::::1;::::0;;::::1;-1:-1:-1::0;;;;;;909:31:1;;::::1;::::0;::::1;::::0;;-1:-1:-1;950:14:1;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;950:21:1::1;-1:-1:-1::0;950:21:1::1;::::0;;815:163::o;11155:102::-;11211:13;11243:7;11236:14;;;;;:::i;13026:105::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;13103:13:1::1;:21:::0;13026:105::o;20260:2520::-;623:6:2;;20318:7:1;;-1:-1:-1;;;623:6:2;;;;622:7;614:29;;;;-1:-1:-1;;;614:29:2;;8111:2:3;614:29:2;;;8093:21:3;8150:1;8130:18;;;8123:29;-1:-1:-1;;;8168:18:3;;;8161:39;8217:18;;614:29:2;7909:332:3;614:29:2;662:4;653:13;;-1:-1:-1;;;;653:13:2;-1:-1:-1;;;653:13:2;;;20397:10:1::1;::::0;653:13:2;20397:10:1;::::1;653:13:2::0;20397:10:1::1;20393:422;;20436:10;20428:7;:19:::0;;;::::1;::::0;;;;;;;::::1;;20423:136;;20505:16;::::0;20484:10:::1;20476:19;::::0;;;:7:::1;:19;::::0;;;;:26;:45:::1;20468:76;;;::::0;-1:-1:-1;;;20468:76:1;;8791:2:3;20468:76:1::1;::::0;::::1;8773:21:3::0;8830:2;8810:18;;;8803:30;-1:-1:-1;;;8849:18:3;;;8842:48;8907:18;;20468:76:1::1;8589:342:3::0;20468:76:1::1;20393:422;;;20711:14;::::0;20690:10:::1;20682:19;::::0;;;:7:::1;:19;::::0;;;;:26;:43:::1;20681:108:::0;::::1;;;-1:-1:-1::0;20757:10:1::1;20749:19;::::0;;;:7:::1;:19;::::0;;;;:39:::1;;::::0;20731:15:::1;:57;20681:108;20673:131;;;::::0;-1:-1:-1;;;20673:131:1;;9138:2:3;20673:131:1::1;::::0;::::1;9120:21:3::0;9177:2;9157:18;;;9150:30;-1:-1:-1;;;9196:18:3;;;9189:40;9246:18;;20673:131:1::1;8936:334:3::0;20673:131:1::1;20861:15;::::0;::::1;;20858:104;;;20911:17;;20900:9;:28;20892:59;;;::::0;-1:-1:-1;;;20892:59:1;;9477:2:3;20892:59:1::1;::::0;::::1;9459:21:3::0;9516:2;9496:18;;;9489:30;-1:-1:-1;;;9535:18:3;;;9528:48;9593:18;;20892:59:1::1;9275:342:3::0;20892:59:1::1;21013:9;21026:1;21013:14:::0;21010:1462:::1;;21051:17;::::0;-1:-1:-1;;;21051:17:1;::::1;;;21043:54;;;::::0;-1:-1:-1;;;21043:54:1;;9824:2:3;21043:54:1::1;::::0;::::1;9806:21:3::0;9863:2;9843:18;;;9836:30;9902:26;9882:18;;;9875:54;9946:18;;21043:54:1::1;9622:348:3::0;21043:54:1::1;21147:14;::::0;21198:29:::1;::::0;;-1:-1:-1;;;21198:29:1;;;;-1:-1:-1;;;;;21147:14:1;;::::1;::::0;21112:25:::1;::::0;21147:14;;21198:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;21147:14;21198:29:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21176:51;;::::0;-1:-1:-1;21241:27:1::1;21289:18;21176:51:::0;21289:2:::1;:18;:::i;:::-;21271:16;;:37;;;;:::i;:::-;21347:55;::::0;-1:-1:-1;;;21347:55:1;;21376:10:::1;21347:55;::::0;::::1;12144:34:3::0;21396:4:1::1;12194:18:3::0;;;12187:43;21241:67:1;;-1:-1:-1;21322:22:1::1;::::0;-1:-1:-1;;;;;21347:28:1;::::1;::::0;::::1;::::0;12079:18:3;;21347:55:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21322:80;;21445:22;21424:17;:43;;21416:65;;;::::0;-1:-1:-1;;;21416:65:1;;12632:2:3;21416:65:1::1;::::0;::::1;12614:21:3::0;12671:1;12651:18;;;12644:29;-1:-1:-1;;;12689:18:3;;;12682:39;12738:18;;21416:65:1::1;12430:332:3::0;21416:65:1::1;-1:-1:-1::0;;;;;21495:31:1;::::1;;21527:10;21547:4;21575:18;21579:14:::0;21575:2:::1;:18;:::i;:::-;21555:16;;:39;;;;:::i;:::-;21495:101;::::0;-1:-1:-1;;;;;;21495:101:1::1;::::0;;;;;;-1:-1:-1;;;;;13025:15:3;;;21495:101:1::1;::::0;::::1;13007:34:3::0;13077:15;;;;13057:18;;;13050:43;13109:18;;;13102:34;12942:18;;21495:101:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21029:583;;;;21010:1462;;;21657:9;21670:1;21657:14:::0;21654:818:::1;;21695:15;::::0;-1:-1:-1;;;21695:15:1;::::1;;;21687:51;;;::::0;-1:-1:-1;;;21687:51:1;;13599:2:3;21687:51:1::1;::::0;::::1;13581:21:3::0;13638:2;13618:18;;;13611:30;13677:25;13657:18;;;13650:53;13720:18;;21687:51:1::1;13397:347:3::0;21687:51:1::1;21778:12;::::0;21831:45:::1;::::0;-1:-1:-1;;;21831:45:1;;21851:10:::1;21831:45;::::0;::::1;12144:34:3::0;21870:4:1::1;12194:18:3::0;;;12187:43;-1:-1:-1;;;;;21778:12:1;;::::1;::::0;21752:16:::1;::::0;21778:12;;21831:19:::1;::::0;12079:18:3;;21831:45:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21805:71;;21890:25;21918:16;;21936:6;21918:25;;;;:::i;:::-;21890:53;;21986:20;21965:17;:41;;21957:70;;;::::0;-1:-1:-1;;;21957:70:1;;13951:2:3;21957:70:1::1;::::0;::::1;13933:21:3::0;13990:2;13970:18;;;13963:30;-1:-1:-1;;;14009:18:3;;;14002:46;14065:18;;21957:70:1::1;13749:340:3::0;21957:70:1::1;22041:71;::::0;-1:-1:-1;;;22041:71:1;;22064:10:::1;22041:71;::::0;::::1;13007:34:3::0;22084:4:1::1;13057:18:3::0;;;13050:43;13109:18;;;13102:34;;;-1:-1:-1;;;;;22041:22:1;::::1;::::0;::::1;::::0;12942:18:3;;22041:71:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21673:450;;;21654:818;;;22168:9;22181:1;22168:14:::0;22165:307:::1;;22224:12;::::0;22273:31:::1;::::0;-1:-1:-1;;;22273:31:1;;22293:10:::1;22273:31;::::0;::::1;1674:51:3::0;-1:-1:-1;;;;;22224:12:1;;::::1;::::0;22198:16:::1;::::0;22224:12;;22273:19:::1;::::0;1647:18:3;;22273:31:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22251:53;;22343:1;22326:14;:18;22318:45;;;::::0;-1:-1:-1;;;22318:45:1;;14296:2:3;22318:45:1::1;::::0;::::1;14278:21:3::0;14335:2;14315:18;;;14308:30;-1:-1:-1;;;14354:18:3;;;14347:44;14408:18;;22318:45:1::1;14094:338:3::0;22318:45:1::1;22184:190;;22165:307;;;22402:59;::::0;-1:-1:-1;;;22402:59:1;;14639:2:3;22402:59:1::1;::::0;::::1;14621:21:3::0;14678:2;14658:18;;;14651:30;14717:34;14697:18;;;14690:62;-1:-1:-1;;;14768:18:3;;;14761:47;14825:19;;22402:59:1::1;14437:413:3::0;22165:307:1::1;22508:8;;22492:13;;:24;22484:50;;;::::0;-1:-1:-1;;;22484:50:1;;15057:2:3;22484:50:1::1;::::0;::::1;15039:21:3::0;15096:2;15076:18;;;15069:30;-1:-1:-1;;;15115:18:3;;;15108:43;15168:18;;22484:50:1::1;14855:337:3::0;22484:50:1::1;22544:8;22555:20;22561:10;22573:1;22555:5;:20::i;:::-;22598:10;22590:7;:19:::0;;;::::1;::::0;;;;;;;22544:31;;-1:-1:-1;22590:19:1::1;;22585:169;;22634:10;22626:19;::::0;;;:7:::1;:19;::::0;;;;:31;;22656:1:::1;::::0;22626:19;:31:::1;::::0;22656:1;;22626:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;22731:12:1::1;::::0;22713:30:::1;::::0;:15:::1;:30;:::i;:::-;22679:10;22671:19;::::0;;;:7:::1;:19;::::0;;;;:39:::1;;:72:::0;22585:169:::1;687:6:2::0;:14;;-1:-1:-1;;;;687:14:2;;;22770:3:1;20260:2520;-1:-1:-1;;20260:2520:1:o;14665:303::-;35963:10;-1:-1:-1;;;;;14763:31:1;;;14759:61;;14803:17;;-1:-1:-1;;;14803:17:1;;;;;;;;;;;14759:61;35963:10;14831:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;14831:49:1;;;;;;;;;;;;:60;;-1:-1:-1;;14831:60:1;;;;;;;;;;14906:55;;540:41:3;;;14831:49:1;;35963:10;14906:55;;513:18:3;14906:55:1;;;;;;;14665:303;;:::o;806:87:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;868:12:0::1;:18:::0;806:87::o;19729:165:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;19802:49:1::1;::::0;19785:12:::1;::::0;19802:10:::1;::::0;19825:21:::1;::::0;19785:12;19802:49;19785:12;19802:49;19825:21;19802:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19784:67;;;19869:7;19861:26;;;::::0;-1:-1:-1;;;19861:26:1;;15742:2:3;19861:26:1::1;::::0;::::1;15724:21:3::0;15781:1;15761:18;;;15754:29;-1:-1:-1;;;15799:18:3;;;15792:36;15845:18;;19861:26:1::1;15540:329:3::0;19861:26:1::1;19774:120;19729:165::o:0;12095:98::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12170:9:1::1;:16;12182:4:::0;12170:9;:16:::1;:::i;:::-;;12095:98:::0;:::o;15939:402::-;15330:10;15350:4;15330:25;15322:34;;;;;;16113:32:::1;16127:4;16133:2;16137:7;16113:13;:32::i;:::-;-1:-1:-1::0;;;;;16159:14:1;::::1;;:19:::0;16155:180:::1;;16197:56;16228:4;16234:2;16238:7;16247:5;16197:30;:56::i;:::-;16192:143;;16280:40;;-1:-1:-1::0;;;16280:40:1::1;;;;;;;;;;;16192:143;15939:402:::0;;;;:::o;1265:27::-;;;;;;;:::i;11652:437::-;11851:10;;11725:13;;;;11851:10;;;;;11848:123;;;11891:14;:12;:14::i;:::-;11877:28;;11848:123;;;11950:10;:8;:10::i;:::-;11936:24;;11848:123;11993:11;11987:25;12016:1;11987:30;:95;;;;;;;;;;;;;;;;;12044:11;12057:18;12067:7;12057:9;:18::i;:::-;12027:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11987:95;11980:102;11652:437;-1:-1:-1;;;11652:437:1:o;12353:114::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12436:13:1::1;:24;12452:8:::0;12436:13;:24:::1;:::i;39177:596::-:0;39341:18;39362:23;;;:14;:23;;;;;39341:54;;39237:17;;;;;;;;39341:18;39362:23;39341:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39405:18;39426:14;:23;39441:7;39426:23;;;;;;;;;;;:33;;39405:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39469:27;39499:14;:23;39514:7;39499:23;;;;;;;;;;;:34;;39469:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39543:27;39584:6;39580:133;39596:10;:17;39592:1;:21;39580:133;;;39652:14;:23;39667:7;39652:23;;;;;;;;;;;:34;;39687:10;39698:1;39687:13;;;;;;;;:::i;:::-;;;;;;;39652:49;;;;;;:::i;:::-;;;;;;;;;;;;;39634:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;39646:1;39634:14;;;;;;;;:::i;:::-;;;;;;:68;;;;39615:3;;;;;:::i;:::-;;;;39580:133;;;-1:-1:-1;39729:4:1;;39735;;-1:-1:-1;39735:4:1;-1:-1:-1;39729:4:1;;-1:-1:-1;39177:596:1;-1:-1:-1;;39177:596:1:o;12199:148::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12262:11:1::1;:17:::0;;-1:-1:-1;;;;;12262:17:1;;::::1;-1:-1:-1::0;;;;;;12262:17:1;;::::1;::::0;::::1;::::0;;;12289:9:::1;:23:::0;;;::::1;::::0;::::1;::::0;;12322:12:::1;:18:::0;;;;::::1;;::::0;;12199:148::o;1462:90:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1522:15:0::1;:23:::0;;;::::1;;-1:-1:-1::0;;;1522:23:0::1;-1:-1:-1::0;;;;1522:23:0;;::::1;::::0;;;::::1;::::0;;1462:90::o;11323:323:1:-;11406:13;11436:16;11444:7;11436;:16::i;:::-;11431:59;;11461:29;;-1:-1:-1;;;11461:29:1;;;;;;;;;;;11431:59;11501:21;11525:10;:8;:10::i;15034:250::-;15161:5;;15132:4;;-1:-1:-1;;;;;15161:5:1;;;;;;15151:15;;;;15148:130;;-1:-1:-1;15189:4:1;15182:11;;15148:130;-1:-1:-1;;;;;;15231:26:1;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;15034:250::o;12930:90::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12998:8:1::1;:15:::0;12930:90::o;16587:268::-;16644:4;16731:13;;16721:7;:23;16679:150;;;;-1:-1:-1;;16781:26:1;;;;:17;:26;;;;;;-1:-1:-1;;;16781:43:1;:48;;16587:268::o;8366:1105::-;8433:7;8467;8565:13;;8558:4;:20;8554:853;;;8602:14;8619:23;;;:17;:23;;;;;;;-1:-1:-1;;;8706:23:1;;:28;;8702:687;;9217:111;9224:6;9234:1;9224:11;9217:111;;-1:-1:-1;;;9294:6:1;9276:25;;;;:17;:25;;;;;;9217:111;;8702:687;8580:827;8554:853;9433:31;;-1:-1:-1;;;9433:31:1;;;;;;;;;;;26802:2886;-1:-1:-1;;;;;26917:19:1;;26948:5;26917:19;;;:13;:19;;;;;;;;:28;;;;;;;;:36;;-1:-1:-1;;26917:36:1;;;26963:21;;;:15;:21;;;;;:26;;26917:36;;26948:5;26963:26;;26917:36;;26963:26;:::i;:::-;;;;-1:-1:-1;;;;;;;26999:17:1;;;;;;;:13;:17;;;;;;;;:26;;;;;;;;:33;;-1:-1:-1;;26999:33:1;27028:4;26999:33;;;;;;27042:21;;;;;:15;:21;;;;;:26;;:21;;26999:17;27042:26;;27028:4;;27042:26;:::i;:::-;;;;-1:-1:-1;27079:27:1;;-1:-1:-1;27109:27:1;27128:7;27109:18;:27::i;:::-;27079:57;;27192:4;-1:-1:-1;;;;;27151:45:1;27167:19;-1:-1:-1;;;;;27151:45:1;;27147:86;;27205:28;;-1:-1:-1;;;27205:28:1;;;;;;;;;;;27147:86;27244:23;27270:24;;;:15;:24;;;;;;-1:-1:-1;;;;;27270:24:1;;;;27244:23;27331:27;;35963:10;27331:27;;:86;;-1:-1:-1;27374:43:1;27391:4;35963:10;15034:250;:::i;27374:43::-;27331:140;;;-1:-1:-1;;;;;;27433:38:1;;35963:10;27433:38;27331:140;27305:167;;27488:17;27483:66;;27514:35;;-1:-1:-1;;;27514:35:1;;;;;;;;;;;27483:66;27581:2;27588:1;27563:26;27559:62;;27598:23;;-1:-1:-1;;;27598:23:1;;;;;;;;;;;27559:62;27760:15;27742:39;27738:101;;27804:24;;;;:15;:24;;;;;27797:31;;-1:-1:-1;;;;;;27797:31:1;;;27738:101;-1:-1:-1;;;;;28199:24:1;;;;;;;:18;:24;;;;;;;;28197:26;;-1:-1:-1;;28197:26:1;;;28267:22;;;;;;;;28265:24;;-1:-1:-1;28265:24:1;;;28553:26;;;:17;:26;;;;;-1:-1:-1;;;28639:15:1;2399:3;28639:41;28598:83;;:126;;28553:171;;;28841:46;;:51;;28837:616;;28944:1;28934:11;;28912:19;29065:30;;;:17;:30;;;;;;:35;;29061:378;;29201:13;;29186:11;:28;29182:239;;29346:30;;;;:17;:30;;;;;:52;;;29182:239;28894:559;28837:616;29536:16;;:51;;-1:-1:-1;;;29536:51:1;;-1:-1:-1;;;;;13025:15:3;;;29536:51:1;;;13007:34:3;13077:15;;;13057:18;;;13050:43;13109:18;;;13102:34;;;29536:16:1;;;;:32;;12942:18:3;;29536:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29621:7;29617:2;-1:-1:-1;;;;;29602:27:1;29611:4;-1:-1:-1;;;;;29602:27:1;;;;;;;;;;;29639:42;26906:2782;;;26802:2886;;;:::o;24429:2131::-;24533:13;;24491:8;;24578:2;24585:1;24560:26;24556:58;;24595:19;;-1:-1:-1;;;24595:19:1;;;;;;;;;;;24556:58;24628:8;24640:1;24628:13;24624:44;;24650:18;;-1:-1:-1;;;24650:18:1;;;;;;;;;;;24624:44;-1:-1:-1;;;;;25204:22:1;;;;;;:18;:22;;;;1894:2;25204:22;;;:70;;25242:31;25230:44;;25204:70;;;25510:31;;;:17;:31;;;;;25601:15;2399:3;25601:41;25560:83;;-1:-1:-1;25678:13:1;;2656:3;25663:56;25560:160;25510:210;;:31;25798:23;;;25836:109;25862:40;;25887:14;;;;;-1:-1:-1;;;;;25862:40:1;;;25879:1;;25862:40;;25879:1;;25862:40;25940:3;25925:12;:18;25836:109;;-1:-1:-1;25959:13:1;:28;26012:11;;;;;;;26009:445;;;26062:9;;:23;;-1:-1:-1;;;26062:23:1;;-1:-1:-1;;;;;1692:32:3;;;26062:23:1;;;1674:51:3;26039:20:1;;26062:9;;:19;;1647:18:3;;26062:23:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26099:16;;:46;;-1:-1:-1;;;26099:46:1;;-1:-1:-1;;;;;19428:32:3;;;26099:46:1;;;19410:51:3;19477:18;;;19470:34;;;26039:46:1;;-1:-1:-1;26099:16:1;;;:25;;19383:18:3;;26099:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26173:16:1;;:37;;-1:-1:-1;;;26173:37:1;;-1:-1:-1;;;;;1692:32:3;;;26173:37:1;;;1674:51:3;26159:11:1;;-1:-1:-1;26173:16:1;;;;-1:-1:-1;26173:33:1;;1647:18:3;;26173:37:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26224:16;;26159:51;;-1:-1:-1;;;;;;26224:16:1;:31;26256:14;:12;26224:16;26256:14;:::i;:::-;26272:6;26224:55;;;;;;;;;;;;;;;19689:25:3;;;19745:2;19730:18;;19723:34;19677:2;19662:18;;19515:248;26224:55:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26025:265;;26009:445;;;26384:16;;:59;;-1:-1:-1;;;26384:59:1;;-1:-1:-1;;;;;19988:32:3;;;26384:59:1;;;19970:51:3;20037:18;;;20030:34;;;20080:18;;;20073:34;;;26384:16:1;;;;:31;;19943:18:3;;26384:59:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26009:445;-1:-1:-1;;26540:13:1;;24429:2131;;;;:::o;33417:697::-;33595:88;;-1:-1:-1;;;33595:88:1;;33575:4;;-1:-1:-1;;;;;33595:45:1;;;;;:88;;35963:10;;33662:4;;33668:7;;33677:5;;33595:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33595:88:1;;;;;;;;-1:-1:-1;;33595:88:1;;;;;;;;;;;;:::i;:::-;;;33591:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33873:6;:13;33890:1;33873:18;33869:229;;33918:40;;-1:-1:-1;;;33918:40:1;;;;;;;;;;;33869:229;34058:6;34052:13;34043:6;34039:2;34035:15;34028:38;33591:517;-1:-1:-1;;;;;;33751:64:1;-1:-1:-1;;;33751:64:1;;-1:-1:-1;33591:517:1;33417:697;;;;;;:::o;12813:107::-;12868:13;12900;12893:20;;;;;:::i;12708:99::-;12759:13;12791:9;12784:16;;;;;:::i;36081:1920::-;36546:4;36540:11;;36553:3;36536:21;;36629:17;;;;37313:11;;;37194:5;37443:2;37457;37447:13;;37439:22;37313:11;37426:36;37497:2;37487:13;;37087:668;37515:4;37087:668;;;37686:1;37681:3;37677:11;37670:18;;37736:2;37730:4;37726:13;37722:2;37718:22;37713:3;37705:36;37609:2;37599:13;;37087:668;;;-1:-1:-1;37795:13:1;;;-1:-1:-1;;37908:12:1;;;37966:19;;;37908:12;36081:1920;-1:-1:-1;36081:1920:1:o;14:131:3:-;-1:-1:-1;;;;;;88:32:3;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:3;;592:180;-1:-1:-1;592:180:3:o;777:258::-;849:1;859:113;873:6;870:1;867:13;859:113;;;949:11;;;943:18;930:11;;;923:39;895:2;888:10;859:113;;;990:6;987:1;984:13;981:48;;;-1:-1:-1;;1025:1:3;1007:16;;1000:27;777:258::o;1040:::-;1082:3;1120:5;1114:12;1147:6;1142:3;1135:19;1163:63;1219:6;1212:4;1207:3;1203:14;1196:4;1189:5;1185:16;1163:63;:::i;:::-;1280:2;1259:15;-1:-1:-1;;1255:29:3;1246:39;;;;1287:4;1242:50;;1040:258;-1:-1:-1;;1040:258:3:o;1303:220::-;1452:2;1441:9;1434:21;1415:4;1472:45;1513:2;1502:9;1498:18;1490:6;1472:45;:::i;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:3;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:3:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:118::-;2965:5;2958:13;2951:21;2944:5;2941:32;2931:60;;2987:1;2984;2977:12;3002:315;3067:6;3075;3128:2;3116:9;3107:7;3103:23;3099:32;3096:52;;;3144:1;3141;3134:12;3096:52;3167:29;3186:9;3167:29;:::i;:::-;3157:39;;3246:2;3235:9;3231:18;3218:32;3259:28;3281:5;3259:28;:::i;:::-;3306:5;3296:15;;;3002:315;;;;;:::o;3322:241::-;3378:6;3431:2;3419:9;3410:7;3406:23;3402:32;3399:52;;;3447:1;3444;3437:12;3399:52;3486:9;3473:23;3505:28;3527:5;3505:28;:::i;3568:127::-;3629:10;3624:3;3620:20;3617:1;3610:31;3660:4;3657:1;3650:15;3684:4;3681:1;3674:15;3700:632;3765:5;3795:18;3836:2;3828:6;3825:14;3822:40;;;3842:18;;:::i;:::-;3917:2;3911:9;3885:2;3971:15;;-1:-1:-1;;3967:24:3;;;3993:2;3963:33;3959:42;3947:55;;;4017:18;;;4037:22;;;4014:46;4011:72;;;4063:18;;:::i;:::-;4103:10;4099:2;4092:22;4132:6;4123:15;;4162:6;4154;4147:22;4202:3;4193:6;4188:3;4184:16;4181:25;4178:45;;;4219:1;4216;4209:12;4178:45;4269:6;4264:3;4257:4;4249:6;4245:17;4232:44;4324:1;4317:4;4308:6;4300;4296:19;4292:30;4285:41;;;;3700:632;;;;;:::o;4337:451::-;4406:6;4459:2;4447:9;4438:7;4434:23;4430:32;4427:52;;;4475:1;4472;4465:12;4427:52;4515:9;4502:23;4548:18;4540:6;4537:30;4534:50;;;4580:1;4577;4570:12;4534:50;4603:22;;4656:4;4648:13;;4644:27;-1:-1:-1;4634:55:3;;4685:1;4682;4675:12;4634:55;4708:74;4774:7;4769:2;4756:16;4751:2;4747;4743:11;4708:74;:::i;4793:667::-;4888:6;4896;4904;4912;4965:3;4953:9;4944:7;4940:23;4936:33;4933:53;;;4982:1;4979;4972:12;4933:53;5005:29;5024:9;5005:29;:::i;:::-;4995:39;;5053:38;5087:2;5076:9;5072:18;5053:38;:::i;:::-;5043:48;;5138:2;5127:9;5123:18;5110:32;5100:42;;5193:2;5182:9;5178:18;5165:32;5220:18;5212:6;5209:30;5206:50;;;5252:1;5249;5242:12;5206:50;5275:22;;5328:4;5320:13;;5316:27;-1:-1:-1;5306:55:3;;5357:1;5354;5347:12;5306:55;5380:74;5446:7;5441:2;5428:16;5423:2;5419;5415:11;5380:74;:::i;:::-;5370:84;;;4793:667;;;;;;;:::o;5465:616::-;5517:3;5555:5;5549:12;5582:6;5577:3;5570:19;5608:4;5649:2;5644:3;5640:12;5674:11;5701;5694:18;;5751:6;5748:1;5744:14;5737:5;5733:26;5721:38;;5793:2;5786:5;5782:14;5814:1;5824:231;5838:6;5835:1;5832:13;5824:231;;;5909:5;5903:4;5899:16;5894:3;5887:29;5937:38;5970:4;5961:6;5955:13;5937:38;:::i;:::-;6033:12;;;;5929:46;-1:-1:-1;5998:15:3;;;;5860:1;5853:9;5824:231;;;-1:-1:-1;6071:4:3;;5465:616;-1:-1:-1;;;;;;;5465:616:3:o;6086:831::-;6479:3;6468:9;6461:22;6442:4;6506:46;6547:3;6536:9;6532:19;6524:6;6506:46;:::i;:::-;6600:9;6592:6;6588:22;6583:2;6572:9;6568:18;6561:50;6634:33;6660:6;6652;6634:33;:::i;:::-;6620:47;;6715:9;6707:6;6703:22;6698:2;6687:9;6683:18;6676:50;6749:43;6785:6;6777;6749:43;:::i;:::-;6735:57;;6840:9;6832:6;6828:22;6823:2;6812:9;6808:18;6801:50;6868:43;6904:6;6896;6868:43;:::i;:::-;6860:51;6086:831;-1:-1:-1;;;;;;;6086:831:3:o;6922:260::-;6990:6;6998;7051:2;7039:9;7030:7;7026:23;7022:32;7019:52;;;7067:1;7064;7057:12;7019:52;7090:29;7109:9;7090:29;:::i;:::-;7080:39;;7138:38;7172:2;7161:9;7157:18;7138:38;:::i;:::-;7128:48;;6922:260;;;;;:::o;7187:332::-;7389:2;7371:21;;;7428:1;7408:18;;;7401:29;-1:-1:-1;;;7461:2:3;7446:18;;7439:39;7510:2;7495:18;;7187:332::o;7524:380::-;7603:1;7599:12;;;;7646;;;7667:61;;7721:4;7713:6;7709:17;7699:27;;7667:61;7774:2;7766:6;7763:14;7743:18;7740:38;7737:161;;7820:10;7815:3;7811:20;7808:1;7801:31;7855:4;7852:1;7845:15;7883:4;7880:1;7873:15;7737:161;;7524:380;;;:::o;9975:273::-;10043:6;10096:2;10084:9;10075:7;10071:23;10067:32;10064:52;;;10112:1;10109;10102:12;10064:52;10144:9;10138:16;10194:4;10187:5;10183:16;10176:5;10173:27;10163:55;;10214:1;10211;10204:12;10253:127;10314:10;10309:3;10305:20;10302:1;10295:31;10345:4;10342:1;10335:15;10369:4;10366:1;10359:15;10385:422;10474:1;10517:5;10474:1;10531:270;10552:7;10542:8;10539:21;10531:270;;;10611:4;10607:1;10603:6;10599:17;10593:4;10590:27;10587:53;;;10620:18;;:::i;:::-;10670:7;10660:8;10656:22;10653:55;;;10690:16;;;;10653:55;10769:22;;;;10729:15;;;;10531:270;;;10535:3;10385:422;;;;;:::o;10812:806::-;10861:5;10891:8;10881:80;;-1:-1:-1;10932:1:3;10946:5;;10881:80;10980:4;10970:76;;-1:-1:-1;11017:1:3;11031:5;;10970:76;11062:4;11080:1;11075:59;;;;11148:1;11143:130;;;;11055:218;;11075:59;11105:1;11096:10;;11119:5;;;11143:130;11180:3;11170:8;11167:17;11164:43;;;11187:18;;:::i;:::-;-1:-1:-1;;11243:1:3;11229:16;;11258:5;;11055:218;;11357:2;11347:8;11344:16;11338:3;11332:4;11329:13;11325:36;11319:2;11309:8;11306:16;11301:2;11295:4;11292:12;11288:35;11285:77;11282:159;;;-1:-1:-1;11394:19:3;;;11426:5;;11282:159;11473:34;11498:8;11492:4;11473:34;:::i;:::-;11543:6;11539:1;11535:6;11531:19;11522:7;11519:32;11516:58;;;11554:18;;:::i;:::-;11592:20;;10812:806;-1:-1:-1;;;10812:806:3:o;11623:131::-;11683:5;11712:36;11739:8;11733:4;11712:36;:::i;11759:168::-;11799:7;11865:1;11861;11857:6;11853:14;11850:1;11847:21;11842:1;11835:9;11828:17;11824:45;11821:71;;;11872:18;;:::i;:::-;-1:-1:-1;11912:9:3;;11759:168::o;12241:184::-;12311:6;12364:2;12352:9;12343:7;12339:23;12335:32;12332:52;;;12380:1;12377;12370:12;12332:52;-1:-1:-1;12403:16:3;;12241:184;-1:-1:-1;12241:184:3:o;13147:245::-;13214:6;13267:2;13255:9;13246:7;13242:23;13238:32;13235:52;;;13283:1;13280;13273:12;13235:52;13315:9;13309:16;13334:28;13356:5;13334:28;:::i;15197:128::-;15237:3;15268:1;15264:6;15261:1;15258:13;15255:39;;;15274:18;;:::i;:::-;-1:-1:-1;15310:9:3;;15197:128::o;16000:545::-;16102:2;16097:3;16094:11;16091:448;;;16138:1;16163:5;16159:2;16152:17;16208:4;16204:2;16194:19;16278:2;16266:10;16262:19;16259:1;16255:27;16249:4;16245:38;16314:4;16302:10;16299:20;16296:47;;;-1:-1:-1;16337:4:3;16296:47;16392:2;16387:3;16383:12;16380:1;16376:20;16370:4;16366:31;16356:41;;16447:82;16465:2;16458:5;16455:13;16447:82;;;16510:17;;;16491:1;16480:13;16447:82;;16721:1352;16847:3;16841:10;16874:18;16866:6;16863:30;16860:56;;;16896:18;;:::i;:::-;16925:97;17015:6;16975:38;17007:4;17001:11;16975:38;:::i;:::-;16969:4;16925:97;:::i;:::-;17077:4;;17141:2;17130:14;;17158:1;17153:663;;;;17860:1;17877:6;17874:89;;;-1:-1:-1;17929:19:3;;;17923:26;17874:89;-1:-1:-1;;16678:1:3;16674:11;;;16670:24;16666:29;16656:40;16702:1;16698:11;;;16653:57;17976:81;;17123:944;;17153:663;15947:1;15940:14;;;15984:4;15971:18;;-1:-1:-1;;17189:20:3;;;17307:236;17321:7;17318:1;17315:14;17307:236;;;17410:19;;;17404:26;17389:42;;17502:27;;;;17470:1;17458:14;;;;17337:19;;17307:236;;;17311:3;17571:6;17562:7;17559:19;17556:201;;;17632:19;;;17626:26;-1:-1:-1;;17715:1:3;17711:14;;;17727:3;17707:24;17703:37;17699:42;17684:58;17669:74;;17556:201;-1:-1:-1;;;;;17803:1:3;17787:14;;;17783:22;17770:36;;-1:-1:-1;16721:1352:3:o;18078:470::-;18257:3;18295:6;18289:13;18311:53;18357:6;18352:3;18345:4;18337:6;18333:17;18311:53;:::i;:::-;18427:13;;18386:16;;;;18449:57;18427:13;18386:16;18483:4;18471:17;;18449:57;:::i;:::-;18522:20;;18078:470;-1:-1:-1;;;;18078:470:3:o;18553:127::-;18614:10;18609:3;18605:20;18602:1;18595:31;18645:4;18642:1;18635:15;18669:4;18666:1;18659:15;18685:276;18816:3;18854:6;18848:13;18870:53;18916:6;18911:3;18904:4;18896:6;18892:17;18870:53;:::i;:::-;18939:16;;;;;18685:276;-1:-1:-1;;18685:276:3:o;18966:135::-;19005:3;19026:17;;;19023:43;;19046:18;;:::i;:::-;-1:-1:-1;19093:1:3;19082:13;;18966:135::o;19106:125::-;19146:4;19174:1;19171;19168:8;19165:34;;;19179:18;;:::i;:::-;-1:-1:-1;19216:9:3;;19106:125::o;20118:489::-;-1:-1:-1;;;;;20387:15:3;;;20369:34;;20439:15;;20434:2;20419:18;;20412:43;20486:2;20471:18;;20464:34;;;20534:3;20529:2;20514:18;;20507:31;;;20312:4;;20555:46;;20581:19;;20573:6;20555:46;:::i;:::-;20547:54;20118:489;-1:-1:-1;;;;;;20118:489:3:o;20612:249::-;20681:6;20734:2;20722:9;20713:7;20709:23;20705:32;20702:52;;;20750:1;20747;20740:12;20702:52;20782:9;20776:16;20801:30;20825:5;20801:30;:::i

Swarm Source

ipfs://e2fe3d09f390965b8cb61cb01d367713e140a75bf4bb38b48404d0ab9a5c1123

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.